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] 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] RETURNS[ StampInfo ]; ConnectInfo: TYPE = NameType[group..allDown]; GetConnect: PROC[name: GVBasics.RName] RETURNS[ info: ConnectInfo, connect: GVBasics.Connect ]; RemarkInfo: TYPE = NameType[group..allDown]; GetRemark: PROC[name: GVBasics.RName] 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] 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] 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, 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. xGrapevineUser: Client access to the R-Server database GVNames.mesa Andrew Birrell June 22, 1983 5:58 pm "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˜šÏ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œžœKžœ˜mJ˜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˜šŸ œžœJžœ˜pJ˜J˜J˜—JšœXžœ™rJ˜Jšœ žœ˜-J˜šŸ œžœžœ1˜_J˜J˜J˜J˜—JšœT™TJ˜Jšœ žœ˜,J˜šŸ œžœ˜%Jšžœ.˜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˜—šŸœžœ.˜BJšžœ˜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˜šŸœžœ.˜Jšžœ ˜J˜J˜J˜J˜—Jšœ™J˜J˜Jšœ™J˜šŸœžœk˜Jšžœ ž˜Jšœžœ7žœ˜PJ˜—šŸœžœOžœ ž˜Jšœžœ;˜CJ˜—šŸ œžœJžœ ž˜uJšœžœ1˜9J˜—šŸ œžœJžœ ž˜uJšœžœ3˜;J˜J˜J˜J˜—Jšœ#™#J˜šŸ œžœjžœ ž˜•Jšœžœ5žœ˜NJ˜—šŸ œžœjžœ ž˜”JšœžœA˜IJ˜—šŸ œžœcžœ ž˜ŒJšœžœ:˜BJ˜J˜J˜J˜—Jšœ ™ J˜šŸ œžœežœ ž˜Jšœžœ;˜CJ˜—šŸ œžœežœ ž˜Jšœžœ;˜CJ˜—šŸ œžœbžœ ž˜‹Jšœžœ7˜?J˜—šŸœžœažœ ž˜‰Jšœžœ5˜=J˜—šŸ œžœbžœ ž˜‹Jšœžœ7˜?J˜J˜J˜J˜—Jš*˜*J˜šŸ œžœežœ ž˜’Jšœžœ>˜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šœžœ%˜8J˜šŸ œžœžœžœ˜4J˜J˜J˜—Jšžœ˜J˜J˜J˜—…—(¾: