<> <> DIRECTORY BodyDefs: TYPE USING [maxRNameLength], ConvertUnsafe: TYPE USING [AppendRope, ToRope], Heap: TYPE USING [systemZone], Rope: TYPE USING [Length, ROPE], SpecialTerminal: TYPE USING [TurnOn, TurnOff], UserCredentials: TYPE USING [defaultOptions, LoginOptions, State], UserCredentialsUnsafe: TYPE USING [ ChangeCredentialsState, GetCredentialsState, GetProc, GetUserCredentials, Login, PutProc, SetUserCredentials]; UserCredentialsVeneer: CEDAR PROGRAM IMPORTS ConvertUnsafe, Heap, Rope, SpecialTerminal, UserCredentialsUnsafe EXPORTS UserCredentials = BEGIN State: TYPE = UserCredentials.State; GetCredentialsState: PUBLIC PROC RETURNS [State] = TRUSTED {RETURN[UserCredentialsUnsafe.GetCredentialsState[]]}; ChangeCredentialsState: PUBLIC PROC [new: State] RETURNS [old: State] = TRUSTED {RETURN[UserCredentialsUnsafe.ChangeCredentialsState[new]]}; Login: PUBLIC PROC [options: UserCredentials.LoginOptions _ UserCredentials.defaultOptions] = TRUSTED { On: PROC RETURNS [g: UserCredentialsUnsafe.GetProc, p: UserCredentialsUnsafe.PutProc] = TRUSTED {[g, p] _ SpecialTerminal.TurnOn[]}; Off: PROC = TRUSTED {SpecialTerminal.TurnOff[]}; UserCredentialsUnsafe.Login[ startInteraction: On, endInteraction: Off, options: options ! UNWIND => Off[] ]; }; GetUserCredentials: PUBLIC PROC RETURNS [name, password: Rope.ROPE] = TRUSTED { nameS: LONG STRING _ Heap.systemZone.NEW[StringBody[BodyDefs.maxRNameLength]]; passwordS: LONG STRING _ Heap.systemZone.NEW[StringBody[BodyDefs.maxRNameLength]]; UserCredentialsUnsafe.GetUserCredentials[nameS, passwordS]; name _ ConvertUnsafe.ToRope[nameS]; password _ ConvertUnsafe.ToRope[passwordS]; Heap.systemZone.FREE[@nameS]; Heap.systemZone.FREE[@passwordS]; }; SetUserCredentials: PUBLIC PROC [name, password: Rope.ROPE] = TRUSTED { nameS: LONG STRING _ Heap.systemZone.NEW[StringBody[Rope.Length[name]]]; passwordS: LONG STRING _ Heap.systemZone.NEW[StringBody[Rope.Length[password]]]; ConvertUnsafe.AppendRope[to: nameS, from: name]; ConvertUnsafe.AppendRope[to: passwordS, from: password]; UserCredentialsUnsafe.SetUserCredentials[nameS, passwordS]; Heap.systemZone.FREE[@nameS]; Heap.systemZone.FREE[@passwordS]; }; END.