-- /ivy/binding/hickory/hickoryOwnerImpl.mesa -- to validate access to the hickory segment. -- Last edited by: Binding, August 10, 1984 8:53:56 am PDT DIRECTORY BasicTime USING [ nullGMT], DB USING [ Aborted, Relship, RelshipSet, RelationSubset, NextRelship, SetF, GetF, V2S, S2V, ReleaseRelshipSet, MarkTransaction, TransactionOf, T2V, DeclareRelship], Hickory USING [ Error], HickoryOwner, HickorySupport USING [ StartTransaction, RestartTransaction], HickoryStorage USING [ protData], Rope USING [ ROPE, Equal] ; HickoryOwnerImpl: CEDAR MONITOR LOCKS HickoryStorage.protData IMPORTS HickoryStorage, HickorySupport, DB, Rope, Hickory EXPORTS HickoryOwner SHARES HickorySupport = BEGIN OPEN DB, HickoryStorage.protData, Hickory; userCredentials: RECORD [ -- cached info userName: Rope.ROPE _ NIL, passWord: Rope.ROPE _ NIL ]; VerifyAccess: PUBLIC INTERNAL PROCEDURE [ userName, passWord: Rope.ROPE] RETURNS [ owner: BOOLEAN] = BEGIN OPEN administrativeRel; rs: RelshipSet; tuple: Relship; un, pw: Rope.ROPE; success: BOOLEAN _ FALSE; IF userCredentials.userName # NIL THEN RETURN[ userCredentials.passWord = passWord AND userCredentials.userName = userName]; WHILE NOT success DO ENABLE Aborted => { HickorySupport.RestartTransaction[]; success _ FALSE; LOOP }; HickorySupport.StartTransaction[]; rs _ RelationSubset[ Rel]; tuple _ NextRelship[ rs]; -- there is only one or none IF tuple = NIL THEN BEGIN -- it's the very first time we ever access administrativeRel tuple _ DeclareRelship[ r: Rel, version: NewOnly]; SetF[ tuple, CleanTime, T2V[ LOOPHOLE[ BasicTime.nullGMT]]]; SetF[ tuple, Owner, S2V[ userName]]; SetF[ tuple, PassWord, S2V[ passWord]]; pw _ passWord; un _ userName; END ELSE BEGIN pw _ V2S[ GetF[ tuple, PassWord]]; un _ V2S[ GetF[ tuple, Owner]]; IF Rope.Equal[ pw, ""] OR Rope.Equal[ un, ""] THEN BEGIN SetF[ tuple, Owner, S2V[ userName]]; SetF[ tuple, PassWord, S2V[ passWord]]; pw _ passWord; un _ userName; END; END; ReleaseRelshipSet[ rs]; MarkTransaction[ TransactionOf[ $Hickory]]; success _ TRUE; ENDLOOP; -- Transaction userCredentials _ [ un, pw]; RETURN[ Rope.Equal[ un, userName] AND Rope.Equal[ pw, passWord]]; END; -- VerifyAccess UpdateOwnerInfo: PUBLIC ENTRY PROCEDURE [ userName, passWord: Rope.ROPE] = BEGIN OPEN administrativeRel; rs: RelshipSet; tuple: Relship; un, pw: Rope.ROPE; success: BOOLEAN _ FALSE; IF userCredentials.userName # NIL AND NOT Rope.Equal[ userName, userCredentials.userName] THEN ERROR Error[ NotOwner, userName]; WHILE NOT success DO ENABLE DB.Aborted => { HickorySupport.RestartTransaction[]; success _ FALSE; LOOP;}; HickorySupport.StartTransaction[]; rs _ RelationSubset[ Rel]; tuple _ NextRelship[ rs]; -- there is only one or none IF tuple = NIL THEN BEGIN -- it's the very first time we ever access administrativeRel tuple _ DeclareRelship[ r: Rel, version: NewOnly]; SetF[ tuple, CleanTime, T2V[ LOOPHOLE[ BasicTime.nullGMT]]]; SetF[ tuple, Owner, S2V[ userName]]; SetF[ tuple, PassWord, S2V[ passWord]]; HickoryStorage.protData.owner _ TRUE; END ELSE BEGIN pw _ V2S[ GetF[ tuple, PassWord]]; un _ V2S[ GetF[ tuple, PassWord]]; IF un = userName AND pw # passWord THEN BEGIN -- password has changed SetF[ tuple, PassWord, S2V[ passWord]]; userCredentials _ [ un, passWord]; HickoryStorage.protData.owner _ TRUE; END ELSE HickoryStorage.protData.owner _ FALSE; END; ReleaseRelshipSet[ rs]; MarkTransaction[ TransactionOf[ $Hickory]]; success _ TRUE; ENDLOOP; -- Transaction END; -- UpdateOwnerInfoAccess END. ªquery the user credentials from data base only CleanTime was set! updates passWord value in administrativeRel if the useName is the same as the one that is stored. Ê¢˜J˜-J˜-J˜:J˜šÏk ˜ Jšœ œ ˜Jšœœœ˜¤Jšœœ ˜J˜ Jšœœ)˜=Jšœœ ˜!Jšœœœ˜J˜J˜—šœœ˜Jšœ˜Jšœ!œ˜9Jšœ ˜Jšœ˜J˜J˜—šœœœœ#˜2J˜˜)J˜J˜J˜—J˜šÏn œœœ œœœ œ˜jJšœ)™)Jšœ˜J˜J˜J˜J˜J˜J˜šœœ˜&Jšœ&œ&˜U—˜Jšœ=œœ˜QJ˜J˜"J˜JšœÏc˜6š œ œœœŸ<˜VJ˜2Jšœœ˜