DIRECTORY GVBasics USING[ Connect, GVString, oldestTime, Password, MakeKey, Remark, RName, Timestamp ], Rope USING[ ROPE ]; GVNames: CEDAR DEFINITIONS IMPORTS GVBasics = BEGIN Outcome: TYPE = { -- possible outcomes of RS operations -- noChange, -- updates and timestamped enquiries -- group, individual, notFound, -- any -- protocolError, wrongServer, allDown, -- any -- badPwd, -- authentication and updates -- outOfDate, notAllowed -- updates -- }; NameType: TYPE = Outcome[noChange..badPwd]; -- outcomes for enquiries -- -- "RLists" are sequences of R-Names returned from the server -- RListHandle: TYPE = LIST OF GVBasics.RName; -- 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: INT ], individual => [ sites: RListHandle, stamp: GVBasics.Timestamp, count: INT ], notFound => NULL, protocolError => NULL, wrongServer => NULL, allDown => NULL, ENDCASE ]; Expand: PROC[name: GVBasics.RName, oldStamp: GVBasics.Timestamp _ GVBasics.oldestTime, reporter: ReporterProc _ NIL] RETURNS[ ExpandInfo ]; -- the old stamp is defaulted. -- MemberInfo: TYPE = RECORD[ SELECT type: NameType[noChange..allDown] FROM noChange => NULL, group => [ members: RListHandle, stamp: GVBasics.Timestamp, count: INT ], individual => NULL, notFound => NULL, protocolError => NULL, wrongServer => 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, reporter: ReporterProc _ NIL] RETURNS[MemberInfo]; StampInfo: TYPE = NameType[noChange..allDown]; CheckStamp: PROC[name: GVBasics.RName, oldStamp: GVBasics.Timestamp _ GVBasics.oldestTime, reporter: ReporterProc _ NIL] RETURNS[ StampInfo ]; ConnectInfo: TYPE = NameType[group..allDown]; GetConnect: PROC[name: GVBasics.RName, reporter: ReporterProc _ NIL] RETURNS[ info: ConnectInfo, connect: GVBasics.Connect ]; RemarkInfo: TYPE = NameType[group..allDown]; GetRemark: PROC[name: GVBasics.RName, reporter: ReporterProc _ NIL] RETURNS[ info: RemarkInfo, remark: GVBasics.Remark ]; GetEntryInfo: TYPE = RECORD[ name: GVBasics.RName, stamp: GVBasics.Timestamp, body: SELECT type: * 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: NameType[group..allDown], info: REF GetEntryInfo]; AuthenticateInfo: TYPE = 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, reporter: ReporterProc _ NIL] RETURNS[ AuthenticateInfo ]; Membership: TYPE = { 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, direct, 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 = MACHINE DEPENDENT { direct(0), closure(1), upArrow(2) }; MembershipGrade: TYPE = MACHINE DEPENDENT { self(0), registry(1) }; ListType: TYPE = MACHINE DEPENDENT { members(0), owners(1), friends(2) }; IsInList: PROC[name: GVBasics.RName, member: GVBasics.RName, level: MembershipLevel, grade: MembershipGrade, acl: ListType, reporter: ReporterProc _ NIL] RETURNS[Membership]; 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] ] }; 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] ] }; 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: PROC[ user: GVBasics.RName, password: GVBasics.Password, op: RSOperation, target: GVBasics.RName, value: GVBasics.GVString _ NIL, newPwd: GVBasics.Password _ NULL, list: RListHandle _ NIL, reporter: ReporterProc _ NIL] RETURNS[Outcome]; RSOperation: TYPE = MACHINE DEPENDENT { NoOp(0), Expand(1), ReadMembers(2), ReadOwners(3), ReadFriends(4), ReadEntry(5), CheckStamp(6), ReadConnect(7), ReadRemark(8), Authenticate(9), CreateRegistry(10), -- not implemented DeleteRegistry(11), -- not implemented CreateIndividual(12), DeleteIndividual(13), CreateGroup(14), DeleteGroup(15), ChangePassword(16), ChangeConnect(17), ChangeRemark(18), AddMember(19), AddMailBox(20), AddForward(21), AddOwner(22), AddFriend(23), DeleteMember(24), DeleteMailBox(25), DeleteForward(26), DeleteOwner(27), DeleteFriend(28), AddSelf(29), DeleteSelf(30), AddListOfMembers(31), NewName(32), IdentifyCaller(33),--internal to GVNamesImpl IsMemberDirect(40), -- archaic IsOwnerDirect(41), -- archaic IsFriendDirect(42), -- archaic IsMemberClosure(43), -- archaic IsOwnerClosure(44), -- archaic IsFriendClosure(45), -- archaic IsInList(46), ReadMailboxes(60), -- not implemented (255) }; ReporterProc: TYPE = PROC[Rope.ROPE]; SetServerInfo: TYPE = { badName, allDown, noRoute, ok }; SetServer: PROC[Rope.ROPE] RETURNS[ SetServerInfo ]; END. ¬GrapevineUser: Client access to the R-Server database GVNames.mesa Andrew Birrell June 22, 1983 5:58 pm Last Edited by: Levin, September 22, 1983 10:25 am "Expand" returns mailbox site names for individuals, membership list for groups. If the old stamp is still current, returns "noChange". Will "GetMembers" returns the membership list for a group. If the old stamp is still current, returns "noChange". Will not return "noChange" if "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. "GetConnect" returns the connect-site for an individual. The connect-site is either an NLS name or a net-address. "GetRemark" returns the remark for a group. The remark is a human readable string.. "GetEntry" is mainly for use by Maintain. It returns the entire contents of a database entry. Consult a wizard before using GetEntry "Authenticate" checks a user name and password. Access control primitives Updates Creation and Deletion Updates to single-valued components Adding to list-valued components Enquiries (also 60..69) Updates 60..69 reserved for more enquiries "ReporterProc" is primarily to allow Maintain to report progress to its user. Consult a wizard before using this facility. "SetServer" provides a server hint, primarily used by Maintain. Consult a wizard before using this facility. Ê õ˜JšœÏc œ™6Jšœ™ Jšœ%™%J™2šÏk ˜ Jšœ žœO˜]Jšœžœžœ˜J˜—šœ žœž ˜Jšžœ ˜—J˜Jšž˜J˜šœ žœ(˜:Jšœ '˜1Jšœ ˜&Jšœ% ˜.Jšœ ˜(Jšœ ˜#J˜J˜—Jšœ žœ˜HJ˜J˜J˜Jš@˜@J˜Jšœ žœžœžœ˜+J˜J˜J˜J˜JšœD™DJšœH™HJš:˜:J˜šœ žœžœžœ#ž˜HJšœ žœ˜˜ J˜Jšœžœ˜ —˜#J˜Jšœžœ˜ —Jšœ žœ˜Jšœžœ˜Jšœžœ˜Jšœ žœ˜Jšžœ˜ J˜—šÏnœžœdžœžœ˜‹J˜J˜J˜—JšœF™FJšœD™DJš!˜!J˜šœ žœžœžœ#ž˜HJšœ žœ˜˜ J˜Jšœžœ˜ —Jšœžœ˜Jšœ žœ˜Jšœžœ˜Jšœžœ˜Jšœ žœ˜Jšžœ˜ J˜—šŸ œžœ˜&J˜3Jšžœž˜Jšœžœ'˜/J˜—šŸ œžœ˜%J˜3Jšžœž˜Jšœžœ&˜.J˜—šŸ œžœ˜&J˜3Jšžœž˜Jšœžœ'˜/—J˜šŸœžœ^žœžœ ˜„J˜J˜J˜—JšœÅ™ÅJ˜Jšœ žœ˜.J˜šŸ œžœdžœžœ˜ŽJ˜J˜J˜—JšœXžœ™rJ˜Jšœ žœ˜-J˜šŸ œžœ0žœžœ1˜}J˜J˜J˜J˜—JšœT™TJ˜Jšœ žœ˜,J˜šŸ œžœ0žœ˜CJšžœ.˜5J˜J˜J˜—Jšœ†™†J˜šœžœžœ˜Jšœ˜Jšœ˜šœžœ ž˜šœ ˜ Jšœ˜Jšœ ˜ Jšœ˜Jšœ˜Jšœ˜—šœ˜Jšœ˜Jšœ"˜"Jšœ˜Jšœ!˜!Jšœ˜Jšœ˜—Jšœ žœ˜Jšœžœ˜ —Jšžœ˜ —J˜šœžœžœ˜Jšœ˜Jšœžœžœ˜*Jšœ˜Jšœžœžœ˜+—J˜š Ÿœž œ0žœžœ%žœ˜‰J˜J˜J˜—Jšœ/™/J˜Jšœžœ˜1J˜šŸ œžœ&žœ˜=Jšžœž˜$Jšœžœ8˜@J˜—šŸœžœHžœ˜aJšžœ˜J˜J˜J˜—Jšœ™J˜Jšœ žœ"˜2šŸœžœ.˜BJšžœž˜Jšœžœ2˜:J˜—šŸ œžœ-˜@Jšžœž˜Jšœžœ0˜8J˜—šŸœžœ.˜BJšžœž˜Jšœžœ2˜:J˜—šŸœžœ.˜CJšžœž˜Jšœžœ3˜;J˜—šŸœžœ-˜AJšžœž˜Jšœžœ1˜9J˜—šŸœžœ.˜BJšžœž˜Jšœžœ3˜;J˜—šŸœžœ.˜BJšžœž˜Jšœžœ3˜;J˜—šŸœžœ-˜AJšžœž˜Jšœžœ1˜9J˜—šŸœžœ.˜BJšžœž˜Jšœžœ3˜;—J˜Jšœžœžœž œ'˜PJšœžœžœž œ˜CJšœ žœžœž œ'˜IJ˜šŸœžœ.˜˜FJ˜—šŸ œžœežœ ž˜’Jšœžœ>˜FJ˜—šŸ œžœbžœ ž˜ŽJšœžœ:˜BJ˜—šŸ œžœažœ ž˜ŒJšœžœ8˜@J˜—šŸ œžœbžœ ž˜ŽJšœžœ:˜BJ˜J˜—šŸœžœ˜ Jšœ˜J˜J˜J˜Jšœžœ˜Jšœžœ˜!Jšœžœ˜Jšœžœ˜Jšžœ ˜J˜—šœ žœžœž œ˜'Jšœ˜šœ™Jšœ ˜ Jšœ˜Jšœ˜Jšœ˜Jšœ ˜ Jšœ˜Jšœ˜Jšœ˜Jšœ˜—šœ™Jšœ˜&Jšœ˜&Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ ˜ Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ ˜ Jšœ˜Jšœ˜Jšœ ˜ Jšœ˜,Jšœ ˜Jšœ ˜Jšœ ˜Jšœ ˜Jšœ ˜Jšœ ˜Jšœ ˜ —šœ"™"Jšœ˜%—Jšœ˜J˜J˜J˜—Jšœ@™@Jšœ:™:J˜JšŸ œžœžœžœ˜%J˜J˜J˜J˜Jšœ?™?Jšœ,™,J˜Jšœžœ%˜8J˜šŸ œžœžœžœ˜4J˜J˜J˜—Jšžœ˜J˜J˜J˜—…—)Š;+