-- GrapevineUser (Cedar) - Client access to the R-Server database -- GVNames.mesa -- Andrew Birrell August 31, 1982 9:17 am DIRECTORY GVBasics USING[ Connect, GVString, oldestTime, Password, MakeKey, Remark, RName, Timestamp ], NameInfoDefs USING[ ListType, Membership, MembershipGrade, MembershipLevel, NameType, Outcome ], ProtocolDefs USING[ RNameType, RSOperation ], Rope USING[ ROPE ]; GVNames: CEDAR DEFINITIONS IMPORTS GVBasics = BEGIN NameType: TYPE = NameInfoDefs.NameType; -->>> { noChange, -->>> group, individual, notFound, allDown, -->>> badPwd, badUser }; -- Sub-types of this represent the results of operations -- -- "RLists" are sequences of R-Names returned from the server -- RListHandle: TYPE = LIST OF GVBasics.RName; -- "Expand" returns mailbox site names for individuals, membership list -- for groups. If the old stamp is still current, returns "noChange". Will -- not return "noChange" if the old stamp is defaulted. -- ExpandInfo: TYPE = RECORD[ SELECT type: NameType[noChange..allDown] FROM noChange => NULL, group => [ members: RListHandle, stamp: GVBasics.Timestamp, count: CARDINAL ], individual => [ sites: RListHandle, stamp: GVBasics.Timestamp, count: CARDINAL ], notFound => NULL, allDown => NULL, ENDCASE ]; Expand: PROC[name: GVBasics.RName, oldStamp: GVBasics.Timestamp _ GVBasics.oldestTime] RETURNS[ ExpandInfo ]; -- "GetMembers" returns the membership list for a group. If the old stamp -- is still current, returns "noChange". Will not return "noChange" if -- the old stamp is defaulted. -- MemberInfo: TYPE = RECORD[ SELECT type: NameType[noChange..allDown] FROM noChange => NULL, group => [ members: RListHandle, stamp: GVBasics.Timestamp, count: CARDINAL ], individual => NULL, notFound => NULL, allDown => NULL, ENDCASE ]; GetMembers: PROC[name: GVBasics.RName, oldStamp: GVBasics.Timestamp _ GVBasics.oldestTime] RETURNS[MemberInfo] = INLINE { RETURN[ GetList[name, oldStamp, members] ] }; GetOwners: PROC[name: GVBasics.RName, oldStamp: GVBasics.Timestamp _ GVBasics.oldestTime] RETURNS[MemberInfo] = INLINE { RETURN[ GetList[name, oldStamp, owners] ] }; GetFriends: PROC[name: GVBasics.RName, oldStamp: GVBasics.Timestamp _ GVBasics.oldestTime] RETURNS[MemberInfo] = INLINE { RETURN[ GetList[name, oldStamp, friends] ] }; GetList: PROC[name: GVBasics.RName, oldStamp: GVBasics.Timestamp, list: ListType] RETURNS[MemberInfo]; -- "CheckStamp" performs basic name validation, also telling the caller the -- name type. If the old stamp is still current, returns "noChange". Will -- not return "noChange" if the old stamp is defaulted. -- -- The "reporter" should normally be NIL; consult a wizard before using it. StampInfo: TYPE = NameInfoDefs.NameType[noChange..allDown]; CheckStamp: PROC[name: GVBasics.RName, oldStamp: GVBasics.Timestamp _ GVBasics.oldestTime, reporter: ReporterProc _ NIL] RETURNS[ StampInfo ]; -- "GetConnect" returns the connect-site for an individual. "connect" is -- undisturbed if the result is not "individual". The connect-site is -- either an NLS name or a net-address. -- ConnectInfo: TYPE = NameInfoDefs.NameType[group..allDown]; GetConnect: PROC[name: GVBasics.RName] RETURNS[info: ConnectInfo, connect: GVBasics.Connect]; -- "GetRemark" returns the remark for a group. The remark is a human readable -- string. -- RemarkInfo: TYPE = NameInfoDefs.NameType[group..allDown]; GetRemark: PROC[name: GVBasics.RName] RETURNS[info: RemarkInfo, remark: GVBasics.Remark]; -- "GetEntry" is mainly for use by Maintain. It returns the -- entire contents of a database entry. Consult a wizard before using GetEntry -- GetEntryInfo: TYPE = RECORD[ name: GVBasics.RName, stamp: GVBasics.Timestamp, body: SELECT type: ProtocolDefs.RNameType FROM group => [ remark: GVBasics.Remark, remarkStamp: GVBasics.Timestamp, members: GetEntryList, owners: GetEntryList, friends: GetEntryList], individual => [ password: GVBasics.Password, passwordStamp: GVBasics.Timestamp, connect: GVBasics.Connect, connectStamp: GVBasics.Timestamp, forward: GetEntryList, sites: GetEntryList], notFound => NULL, dead => NULL, ENDCASE ]; GetEntryList: TYPE = RECORD[ current: RListHandle, currentStamps: LIST OF GVBasics.Timestamp, deleted: RListHandle, deletedStamps: LIST OF GVBasics.Timestamp]; GetEntry: PRIVATE PROC[name: GVBasics.RName, reporter: ReporterProc _ NIL] RETURNS[rc: NameInfoDefs.NameType[group..allDown], info: REF GetEntryInfo]; -- "Authenticate" checks a user name and password (insecurely!). -- AuthenticateInfo: TYPE = NameInfoDefs.NameType[group..badPwd]; Authenticate: PROC[name: GVBasics.RName, password: Rope.ROPE] RETURNS[ AuthenticateInfo ] = INLINE { RETURN[ AuthenticateKey[name, GVBasics.MakeKey[password]] ] }; AuthenticateKey:PROC[name: GVBasics.RName, key: GVBasics.Password] RETURNS[ AuthenticateInfo ]; -- Access control primitives -- Membership: TYPE = NameInfoDefs.Membership; -- { yes, no, notGroup, allDown }; IsMemberDirect: PROC[name: GVBasics.RName, member: GVBasics.RName] RETURNS[ Membership ] = INLINE { RETURN[ IsInList[name, member, direct, self, members] ] }; IsOwnerDirect: PROC[name: GVBasics.RName, owner: GVBasics.RName] RETURNS[ Membership ] = INLINE { RETURN[ IsInList[name, owner, direct, self, owners] ] }; IsFriendDirect: PROC[name: GVBasics.RName, friend: GVBasics.RName] RETURNS[ Membership ] = INLINE { RETURN[ IsInList[name, friend, closure, self, friends] ] }; IsMemberClosure:PROC[name: GVBasics.RName, member: GVBasics.RName] RETURNS[ Membership ] = INLINE { RETURN[ IsInList[name, member, closure, self, members] ] }; IsOwnerClosure: PROC[name: GVBasics.RName, owner: GVBasics.RName] RETURNS[ Membership ] = INLINE { RETURN[ IsInList[name, owner, closure, self, owners] ] }; IsFriendClosure:PROC[name: GVBasics.RName, friend: GVBasics.RName] RETURNS[ Membership ] = INLINE { RETURN[ IsInList[name, friend, closure, self, friends] ] }; IsMemberUpArrow:PROC[name: GVBasics.RName, member: GVBasics.RName] RETURNS[ Membership ] = INLINE { RETURN[ IsInList[name, member, upArrow, self, members] ] }; IsOwnerUpArrow: PROC[name: GVBasics.RName, owner: GVBasics.RName] RETURNS[ Membership ] = INLINE { RETURN[ IsInList[name, owner, upArrow, self, owners] ] }; IsFriendUpArrow:PROC[name: GVBasics.RName, friend: GVBasics.RName] RETURNS[ Membership ] = INLINE { RETURN[ IsInList[name, friend, upArrow, self, friends] ] }; MembershipLevel: TYPE = NameInfoDefs.MembershipLevel; MembershipGrade: TYPE = NameInfoDefs.MembershipGrade; ListType: TYPE = NameInfoDefs.ListType; IsInList: PROC[name: GVBasics.RName, member: GVBasics.RName, level: MembershipLevel, grade: MembershipGrade, acl: ListType] RETURNS[Membership]; -- Updates -- -- Creation and Deletion -- Outcome: TYPE = NameInfoDefs.Outcome; CreateIndividual: PROC[user: GVBasics.RName, password: GVBasics.Password, individual: GVBasics.RName, newPwd: GVBasics.Password ] RETURNS[Outcome] = INLINE { RETURN[ Update[user, password, CreateIndividual, individual, NIL, newPwd] ] }; DeleteIndividual: PROC[user: GVBasics.RName, password: GVBasics.Password, individual: GVBasics.RName] RETURNS[Outcome] = INLINE { RETURN[ Update[user, password, DeleteIndividual, individual] ] }; CreateGroup: PROC[user: GVBasics.RName, password: GVBasics.Password, group: GVBasics.RName] RETURNS[Outcome] = INLINE { RETURN[ Update[user, password, CreateGroup, group] ] }; DeleteGroup: PROC[user: GVBasics.RName, password: GVBasics.Password, group: GVBasics.RName] RETURNS[Outcome] = INLINE { RETURN[ Update[user, password, DeleteGroup, group] ] }; -- Updates to single-valued components -- SetPassword: PROC[user: GVBasics.RName, password: GVBasics.Password, individual: GVBasics.RName, newPwd: GVBasics.Password] RETURNS[Outcome] = INLINE { RETURN[ Update[user, password, ChangePassword, individual, NIL, newPwd] ] }; SetConnect: PROC[user: GVBasics.RName, password: GVBasics.Password, individual: GVBasics.RName, connect: GVBasics.Connect] RETURNS[Outcome] = INLINE { RETURN[ Update[user, password, ChangeConnect, individual, connect] ] }; SetRemark: PROC[user: GVBasics.RName, password: GVBasics.Password, group: GVBasics.RName, remark: GVBasics.Remark] RETURNS[Outcome] = INLINE { RETURN[ Update[user, password, ChangeRemark, group, remark] ] }; -- Adding to list-valued components -- AddMailbox: PROC[user: GVBasics.RName, password: GVBasics.Password, individual: GVBasics.RName, site: GVBasics.RName] RETURNS[Outcome] = INLINE { RETURN[ Update[user, password, AddMailBox, individual, site] ] }; AddForward: PROC[user: GVBasics.RName, password: GVBasics.Password, individual: GVBasics.RName, dest: GVBasics.RName] RETURNS[Outcome] = INLINE { RETURN[ Update[user, password, AddForward, individual, dest] ] }; AddMember: PROC[user: GVBasics.RName, password: GVBasics.Password, group: GVBasics.RName, member: GVBasics.RName] RETURNS[Outcome] = INLINE { RETURN[ Update[user, password, AddMember, group, member] ] }; AddOwner: PROC[user: GVBasics.RName, password: GVBasics.Password, group: GVBasics.RName, owner: GVBasics.RName] RETURNS[Outcome] = INLINE { RETURN[ Update[user, password, AddOwner, group, owner] ] }; AddFriend: PROC[user: GVBasics.RName, password: GVBasics.Password, group: GVBasics.RName, friend: GVBasics.RName] RETURNS[Outcome] = INLINE { RETURN[ Update[user, password, AddFriend, group, friend] ] }; -- Removing from list-valued components -- RemoveMailbox: PROC[user: GVBasics.RName, password: GVBasics.Password, individual: GVBasics.RName, site: GVBasics.RName] RETURNS[Outcome] = INLINE { RETURN[ Update[user, password, DeleteMailBox, individual, site] ] }; RemoveForward: PROC[user: GVBasics.RName, password: GVBasics.Password, individual: GVBasics.RName, dest: GVBasics.RName] RETURNS[Outcome] = INLINE { RETURN[ Update[user, password, DeleteForward, individual, dest] ] }; RemoveMember: PROC[user: GVBasics.RName, password: GVBasics.Password, group: GVBasics.RName, member: GVBasics.RName] RETURNS[Outcome] = INLINE { RETURN[ Update[user, password, DeleteMember, group, member] ] }; RemoveOwner: PROC[user: GVBasics.RName, password: GVBasics.Password, group: GVBasics.RName, owner: GVBasics.RName] RETURNS[Outcome] = INLINE { RETURN[ Update[user, password, DeleteOwner, group, owner] ] }; RemoveFriend: PROC[user: GVBasics.RName, password: GVBasics.Password, group: GVBasics.RName, friend: GVBasics.RName] RETURNS[Outcome] = INLINE { RETURN[ Update[user, password, DeleteFriend, group, friend] ] }; Update: PRIVATE PROC[user: GVBasics.RName, password: GVBasics.Password, op: ProtocolDefs.RSOperation, target: GVBasics.RName, value: GVBasics.GVString _ NIL, newPwd: GVBasics.Password _ NULL, reporter: ReporterProc _ NIL] RETURNS[Outcome]; -- "ReporterProc" is primarily to allow Maintain to report progress -- to its user. Consult a wizard before using this facility. ReporterProc: TYPE = PROC[Rope.ROPE]; -- "SetServer" provides a server hint, primarily used by Maintain. -- Consult a wizard before using this facility. SetServerInfo: TYPE = { badName, allDown, noRoute, ok }; SetServer: PRIVATE PROC[Rope.ROPE] RETURNS[ SetServerInfo ]; END. Κž– "Mesa" style˜Iprocš¬ΟcBœœ+œΟk œ žœtžœ]žœ$žœžœΟbœžœž œžœ žœ žœ]œ;œ@œžœžœžœΞœžœžœžœ#žœ$žœ žœ₯žœ'žœ$žœžœΟnœžœ`žœ³œžœžœžœ#žœ$žœ žœ)žœ%žœ$žœžœ  œžœežœžœžœ)  œžœcžœžœžœ(  œžœežœžœžœ* œžœHžœΡœLœ žœ.  œžœ†žœžœ»œžœ+  œžœžœ2\œžœ+  œžœžœ0œžœžœ?žœžœŸžœžœžœžœžœ+žœžœ>žœžœ œž œAžœžœ2žœCœžœ*  œžœ&žœ žœžœžœ: œžœ6žœœžœ#œ œžœ1žœžœžœ6  œžœ0žœžœžœ4 œžœ1žœžœžœ7 œžœ1žœžœžœ7 œžœ0žœžœžœ5 œžœ1žœžœžœ7 œžœ1žœžœžœ7 œžœ0žœžœžœ5 œžœ1žœžœžœHžœ2žœ2žœ œžœ…žœ œœ žœ œžœ€žœ žœžœ7žœ œžœ[žœ žœžœ=  œžœTžœ žœžœ3  œžœTžœ žœžœ8)œ  œžœtžœ žœžœ5žœ  œžœtžœ žœžœC  œžœmžœ žœžœ?&œ  œžœožœ žœžœ=  œžœožœ žœžœ=  œžœlžœ žœžœ9 œžœkžœ žœžœ7  œžœlžœ žœžœ<*œ  œžœožœ žœžœ@  œžœožœ žœžœ@  œžœlžœ žœžœ<  œžœkžœ žœžœ:  œžœlžœ žœžœ= œžœžœνžœ6žœ0žœžœ‚œ  œžœžœžœsœžœ'  œžœžœžœžœžœ˜Ι`—…—0L4π