DIRECTORY Commander USING [CommandProc, Handle, Register], CommanderBackdoor USING [AdamOrEve], EnvironmentVariables USING [Get], InstallationComforts USING [ProcName], IO, Rope USING [Concat, Length, ROPE], RuntimeError USING [UnboundProcedureFault, UNCAUGHT], SimpleFeedback USING [Append], SystemSite USING [Get, Names, Set], TypeScript USING [BackSpace, IsATypeScript], ViewerClasses USING [Viewer], ViewerIO USING [GetViewerFromStream], XNSAuth USING [AuthenticationError, CallError, GetIdentityDetails, Identity, MakeIdentity, Name], XNSCHName USING [Name, NameFromRope, RopeFromName], XNSCredentials; XNSCredentialsImpl: CEDAR MONITOR IMPORTS Commander, CommanderBackdoor, EnvironmentVariables, InstallationComforts, IO, Rope, RuntimeError, SimpleFeedback, SystemSite, TypeScript, ViewerIO, XNSAuth, XNSCHName EXPORTS XNSCredentials ~ { ROPE: TYPE ~ Rope.ROPE; XNSCredentialsChangeProc: TYPE ~ XNSCredentials.XNSCredentialsChangeProc; Identity: TYPE = XNSAuth.Identity; currentIdentity: Identity ฌ NIL; GetIdentity: PUBLIC ENTRY PROC RETURNS [Identity] ~ { RETURN[currentIdentity] }; SetIdentity: PUBLIC ENTRY PROC[id: XNSAuth.Identity] ~ { ENABLE UNWIND => NULL; InternalSetIdentity[id, XNSAuth.GetIdentityDetails[id].name]; }; XNSLoginFromNameAndPassword: PUBLIC ENTRY PROC[name, password: ROPE, strongCredentials: BOOL ฌ TRUE] RETURNS[identityWasSet: BOOL ฌ FALSE] ~ { ENABLE UNWIND => NULL; xnsName: XNSCHName.Name; { ENABLE { XNSAuth.AuthenticationError => GOTO notDone; XNSAuth.CallError => GOTO notDone; }; IF ( name # NIL ) AND ( password # NIL ) THEN { newId: XNSAuth.Identity; xnsName ฌ XNSCHName.NameFromRope[name]; newId ฌ XNSAuth.MakeIdentity[xnsName, password, IF strongCredentials THEN strong ELSE simple, TRUE]; InternalSetIdentity[newId, xnsName]; RETURN[TRUE]; }; EXITS notDone => RETURN[FALSE]; }; }; XNSLogin: Commander.CommandProc = { [] ฌ ReallyDoLogin[cmd: cmd, strongCredentials: TRUE, source: NARROW[cmd.procData.clientData]]; }; SimpleLogin: Commander.CommandProc = { [] ฌ ReallyDoLogin[cmd: cmd, strongCredentials: FALSE, source: NARROW[cmd.procData.clientData]]; }; DoLogin: PUBLIC PROC[cmd: Commander.Handle, strongCredentials: BOOL] RETURNS[identityWasSet: BOOL ฌ FALSE] = { RETURN[ReallyDoLogin[cmd, strongCredentials]]; }; ReallyDoLogin: ENTRY PROC[cmd: Commander.Handle, strongCredentials: BOOL, source: ATOMฌNIL] RETURNS[identityWasSet: BOOL ฌ FALSE] = { ENABLE UNWIND => NULL; name, passwd: Rope.ROPE; xnsName: XNSCHName.Name; IF source=$keyboard THEN cmd ฌ CommanderBackdoor.AdamOrEve[cmd]; -- Use original in/out streams BEGIN ENABLE BEGIN XNSAuth.AuthenticationError => { what: Rope.ROPE ฌ SELECT problem FROM credentialsInvalid => "credentialsInvalid", verifierInvalid => "verifierInvalid", verifierExpired => "verifierExpired", verifierReused => "verifierReused", credentialsExpired => "credentialsExpired", inappropriateCredentials => "inappropriateCredentials", ENDCASE => IO.PutFR1["\nUnknown error (%g)\n", [integer[ORD[problem]]] ]; cmd.out.PutF1["\nXNSAuth.AuthenticationError (%g)\n", [rope[what]] ]; GOTO notDone; }; XNSAuth.CallError => { IF ( problem = strongKeyDoesNotExist ) AND ( whichArg = initiator ) THEN cmd.out.PutF1["\nXNSAuth.CallError: %g is probably an invalid name\n", [rope[XNSCHName.RopeFromName[xnsName]]] ] ELSE { what: Rope.ROPE ฌ SELECT problem FROM tooBusy => "tooBusy", accessRightsInsufficient => "accessRightsInsufficient", keysUnavailable => "keysUnavailable", strongKeyDoesNotExist => "strongKeyDoesNotExist", simpleKeyDoesNotExist => "simpleKeyDoesNotExist", strongKeyAlreadyRegistered => "strongKeyAlreadyRegistered", simpleKeyAlreadyRegistered => "simpleKeyAlreadyRegistered", domainForNewKeyUnavailable => "domainForNewKeyUnavailable", domainForNewKeyUnknown => "domainForNewKeyUnknown", badKey => "badKey", badName => "badName", databaseFull => "databaseFull", other => "other catchall error", ENDCASE => IO.PutFR1["\nUnknown XNSAuth.CallError.problem (%g)\n", [integer[ORD[problem]]] ]; which: Rope.ROPE ฌ SELECT whichArg FROM notApplicable => "notApplicable", initiator => "initiator", recipient => "recipient", client => "client", ENDCASE => IO.PutFR1["\nUnknown XNSAuth.CallError.whichArg (%g)\n", [integer[ORD[whichArg]]] ]; cmd.out.PutF["\nXNSAuth.CallError: problem %g, whichArg: %g\n", [rope[what]], [rope[which]] ]; }; GOTO notDone; }; END; name ฌ PromptForLine[in: cmd.in, out: cmd.out, prompt: "user name", echo: TRUE]; IF name = NIL THEN RETURN; passwd ฌ PromptForLine[in: cmd.in, out: cmd.out, prompt: "password", echo: FALSE]; IF passwd = NIL THEN RETURN; IF ( name # NIL ) AND ( passwd # NIL ) THEN { newId: Identity; xnsName ฌ XNSCHName.NameFromRope[name]; newId ฌ XNSAuth.MakeIdentity[xnsName, passwd, IF strongCredentials THEN strong ELSE simple, TRUE]; InternalSetIdentity[newId, xnsName]; RETURN[TRUE]; }; EXITS notDone => NULL; END; }; PromptForLine: PROC [in, out: IO.STREAM, prompt: Rope.ROPE, echo: BOOL ฌ TRUE] RETURNS [line: Rope.ROPE ฌ NIL] ~ { lookHidden: IO.Value ~ IO.rope["h"]; lookShiftHidden: IO.Value ~ IO.rope["H"]; TypeScriptHackery: PROC ~ { ENABLE RuntimeError.UnboundProcedureFault => { GOTO NoViewers }; viewer: ViewerClasses.Viewer ~ ViewerIO.GetViewerFromStream[out]; out.PutF1["%l", lookShiftHidden]; IF TypeScript.IsATypeScript[viewer] THEN { TypeScript.BackSpace[viewer, line.Length[] + 1]; out.PutRope["****\n"]; in.Reset[]; }; EXITS NoViewers => { NULL }; }; IO.PutF1[out, " %g: ", [rope[prompt]]]; IF NOT echo THEN { IO.PutF1[out, "%l", lookHidden]; }; BEGIN ENABLE UNWIND => IF NOT echo THEN out.PutF1["%l", lookShiftHidden]; BEGIN ENABLE BEGIN IO.EndOfStream => CONTINUE; IO.Rubout => { IF NOT echo THEN out.PutF1["%l", lookShiftHidden]; out.PutRope[" \n"]; in.Reset[]; CONTINUE; }; END; line ฌ IO.GetLineRope[in]; END; IF line = NIL THEN { IF NOT echo THEN out.PutF1["%l", lookShiftHidden]; RETURN; }; IF NOT echo THEN TypeScriptHackery[]; END; }; RegisterForChange: PUBLIC ENTRY PROC [proc: XNSCredentialsChangeProc, clientData: REF ANY ฌ NIL] = { procList ฌ CONS[[proc, clientData], procList]; }; changeProc: TYPE = RECORD[proc: XNSCredentialsChangeProc, clientData: REF ANY]; procList: LIST OF changeProc ฌ NIL; InternalSetIdentity: INTERNAL PROC [this: Identity, xnsName: XNSCHName.Name] ~ { currentIdentity ฌ this; SystemSite.Set[ [ SystemSite.Get[].registry, xnsName.domain, xnsName.organization ] ]; FOR pL: LIST OF changeProc ฌ procList, pL.rest UNTIL pL = NIL DO pL.first.proc[this, pL.first.clientData ! RuntimeError.UNCAUGHT => { SimpleFeedback.Append[$XNSCredentials, $oneLiner, $info, Rope.Concat["\tUncaught error while executing XNSCredentialsChangeProc: ", InstallationComforts.ProcName[pL.first.proc]] ]; CONTINUE }]; ENDLOOP; }; GetIdentityName: Commander.CommandProc = { name: XNSAuth.Name ~ XNSAuth.GetIdentityDetails[GetIdentity[]].name; IO.PutRope[cmd.out, XNSCHName.RopeFromName[name]]; IO.PutRope[cmd.out, "\n"]; }; PrintSystemSiteValues: Commander.CommandProc = { names: SystemSite.Names ฌ SystemSite.Get[]; cmd.out.PutF["\nSystemSite [domain: %g, organization: %g]\n", [rope[names.domain]], [rope[names.organization]] ]; }; SetDefaults: PROC = { envDom, envOrg: ROPE; defaultNames: SystemSite.Names ฌ SystemSite.Get[]; envDom ฌ EnvironmentVariables.Get["XNSDOMAIN"]; envOrg ฌ EnvironmentVariables.Get["XNSORG"]; IF envDom # NIL THEN defaultNames.domain ฌ envDom; IF envOrg # NIL THEN defaultNames.organization ฌ envOrg; SystemSite.Set[defaultNames]; }; Commander.Register[ "GetIdentityName", GetIdentityName]; Commander.Register[ "PrintSystemSiteValues", PrintSystemSiteValues]; Commander.Register[ "XNSUser", GetIdentityName]; Commander.Register[ "XNSLogin", XNSLogin, "Allows one to set one's xns credentials"]; Commander.Register[ "SimpleLogin", SimpleLogin, "Allows one to set one's simple xns credentials"]; Commander.Register[ "XNSLoginFromKeyboard", XNSLogin, "Allows one to set one's xns credentials", $keyboard]; Commander.Register[ "SimpleLoginFromKeyboard", SimpleLogin, "Allows one to set one's simple xns credentials", $keyboard]; SetDefaults[]; }.  XNSCredentialsImpl.mesa Copyright ำ 1989, 1990, 1991, 1992, 1993 by Xerox Corporation. All rights reserved. Willie-sue, March 27, 1992 5:12 pm PST Bill Jackson (bj), May 22, 1990 7:37 pm PDT Swinehar, December 4, 1990 2:23 pm PST Michael Plass, February 10, 1992 4:35 pm PST Christian Jacobi, March 15, 1993 1:10 pm PST Credentials keeping Swinehart December 4, 1990 2:16:04 pm PST: Added XNSLoginFromKeyboard and SimpleLoginFromKeyboard commands, which set source=$keyboard. There is no programming interface to this capability yet. ส C•NewlineDelimiter –(cedarcode) style™šœ™Icodešœ ฯeœI™TK™&K™+K™&K™,K™,K˜—šฯk ˜ Kšœ žœ!˜0Kšœžœ ˜$Kšœžœ˜!Kšœžœ ˜&Kšžœ˜Kšœžœžœ˜"Kšœ žœžœ˜5Kšœžœ ˜Kšœ žœ˜#Kšœ žœ˜,Kšœžœ ˜Kšœ žœ˜%KšœžœT˜aKšœ žœ$˜3K˜K˜—šะblœžœžœ˜"KšžœKžœZ˜ฎšžœ˜K˜—Kšžœžœžœ˜Kšœžœ+˜Ihead™Kšœ žœ˜"Kšœžœ˜ K˜š ฯn œžœžœžœžœ ˜3Kšœžœ˜K˜—š  œžœžœžœ˜8Kšžœžœžœ˜Kšœ=˜=K˜K˜—š  œžœž œžœžœžœ˜dKšžœžœžœ˜)Kšžœžœžœ˜K˜šœ˜šžœ˜Kšœ žœ ˜-Kšœžœ ˜"K˜—š žœ žœžœžœžœ˜/Kšœ˜K˜'Kš œ0žœžœžœ žœ˜eKšœ$˜$Kšžœžœ˜ K˜—Kšžœ žœžœ˜K˜—K˜—K˜š œ˜#Kšœ0žœ žœ˜_Kšœ˜K˜—š  œ˜&Kšœ0žœ žœ˜`Kšœ˜K˜—š œžœžœ+žœžœžœžœ˜nKšžœ(˜.K˜K˜—š  œžœžœ+žœ žœžœžœžœžœ˜…Kšžœžœžœ˜Kšœžœ˜Kšœ˜K™ยšžœž˜Kšœ(ฯc˜F—šžœžœž˜šœ!˜!šœ žœžœ ž˜%Kšœ+˜+Kšœ%˜%Kšœ%˜%Kšœ#˜#Kšœ+˜+Kšœ7˜7Kšžœžœ+žœ˜I—K˜EKšžœ ˜ K˜—šœ˜šžœ%žœžœq˜นšžœ˜šœ žœžœ ž˜%Kšœฯtœข˜Kšœขœข˜7Kšœขœข˜%Kšœขœข˜1Kšœขœข˜1Kšœขœข˜;Kšœขœข˜;Kšœขœข˜;Kšœขœข˜3Kšœขœข˜Kšœขœข˜Kšœ ขœ ข˜Kšœขœข˜ Kšžœžœ?žœ˜]—šœ žœžœ ž˜'Kšœ!˜!Kšœ˜Kšœ˜Kšœ˜Kšžœžœ@žœ˜_—K˜^K˜—Kšžœ ˜ K˜—Kšžœ˜—KšœJžœ˜PKšžœžœžœžœ˜KšœKžœ˜RKšžœ žœžœžœ˜š žœ žœžœ žœžœ˜-Kšœ˜K˜'Kš œ.žœžœžœ žœ˜cK˜$Kšžœžœ˜ K˜—Kšžœ žœ˜Kšžœ˜—K˜K˜—š  œžœ žœžœžœžœžœžœ žœžœ˜rKšœ žœ žœ ˜$Kšœžœ žœ ˜)š œžœ˜Kšžœ)žœ ˜@KšœA˜AK˜!šžœ"žœ˜*Kšœ0˜0K˜K˜ K˜—Kšžœžœ˜K˜—Kšžœ&˜(šžœžœžœ˜Kšžœ˜ Kšœ˜—š žœžœžœžœžœžœ"˜Išžœžœž˜Kšžœžœ˜šžœ ˜Kšžœžœžœ"˜2Kšœ˜K˜ Kšžœ˜ K˜—Kšžœ˜Kšœžœ˜Kšžœ˜—šžœžœžœ˜Kšžœžœžœ"˜2Kšžœ˜K˜—Kšžœžœžœ˜%—Kšžœ˜K˜K˜—š œžœžœžœ.žœžœžœ˜dKšœ žœ˜.K˜K˜—Kš œ žœžœ-žœžœ˜Ošœ žœžœžœ˜#K˜—š œžœžœ.˜PK˜K˜Vš žœžœžœ žœžœž˜@šœ7žœ˜DK˜ดKšž˜K˜—Kšžœ˜—K˜K˜—š œ˜*K˜DKšžœ0˜2Kšžœ˜K˜K˜—š œ˜0K˜+Kšœq˜qK˜K˜—š  œžœ˜Kšœžœ˜K˜2K˜/K˜,K˜Kšžœ žœžœ˜2Kšžœ žœžœ$˜8Kšœ˜K˜—K˜Kšœ8˜8KšœD˜DKšœ0˜0K˜KšœU˜UKšœb˜bKšœl˜lKšœy˜yK˜—šœ˜K˜K˜—K˜——…—~*แ