-- Registration Server - Defs for operations on a registry. -- [Ibis]<Grapevine>Pilot>RegServerDefs.mesa -- HGM, 13-Nov-84 1:53:58 -- J. Dion, September 8, 1979 -- Andrew Birrell 27-Oct-82 15:48:41 -- Brenda Hankins 14-Aug-84 16:16:46 (Klamath update) DIRECTORY BodyDefs USING [oldestTime, RName, Timestamp], HeapDefs USING [ObjectNumber, ReaderHandle, WriterHandle], ProtocolDefs USING [ Connect, Password, Remark, ReturnCode, RNameType, RSOperation], RegBTreeDefs USING [RegistryObject]; RegServerDefs: DEFINITIONS = BEGIN -- Module that handles incoming connections - Registration: RegistrationInit: PROCEDURE; RegistrationLocal: PROCEDURE; RegistrationAll: PROCEDURE; -- Module for generating RS-internal mail for updates - RegMail: RegMailInit: PROCEDURE; RegMailEnableUpdates: PROCEDURE; CreateIndividual: PROCEDURE [ name: BodyDefs.RName, password: ProtocolDefs.Password] RETURNS [ProtocolDefs.ReturnCode]; -- creates a new individual entry with no mailbox sites DeleteIndividual: PROCEDURE [name: BodyDefs.RName] RETURNS [ProtocolDefs.ReturnCode]; -- deletes an individual entry. CreateGroup: PROCEDURE [name, caller: BodyDefs.RName] RETURNS [ProtocolDefs.ReturnCode]; -- creates a new group entry with no members and a single -- maintainer, the creator. DeleteGroup: PROCEDURE [name: BodyDefs.RName] RETURNS [ProtocolDefs.ReturnCode]; -- deletes a group if caller has sufficient privilege. CreateRegistry: PROCEDURE [entry, caller: BodyDefs.RName] RETURNS [ProtocolDefs.ReturnCode]; -- creates a new registry. DeleteRegistry: PROCEDURE [entry: BodyDefs.RName] RETURNS [ProtocolDefs.ReturnCode]; -- deletes a registry (must it be empty?). ChangePassword: PROCEDURE [entry: BodyDefs.RName, pw: ProtocolDefs.Password] RETURNS [ProtocolDefs.ReturnCode]; -- changes the password of an individual. ChangeConnect: PROCEDURE [entry: BodyDefs.RName, connect: ProtocolDefs.Connect] RETURNS [ProtocolDefs.ReturnCode]; -- changes the connect-site of an individual. ChangeRemark: PROCEDURE [entry: BodyDefs.RName, remark: ProtocolDefs.Remark] RETURNS [ProtocolDefs.ReturnCode]; -- changes the remark for a group. AddMailbox: PROCEDURE [name, entry: BodyDefs.RName] RETURNS [ProtocolDefs.ReturnCode]; -- adds a mailbox to an individual. DeleteMailbox: PROCEDURE [name, entry: BodyDefs.RName] RETURNS [ProtocolDefs.ReturnCode]; -- Deletes a mailbox from an individual. AddForward: PROCEDURE [name, entry: BodyDefs.RName] RETURNS [ProtocolDefs.ReturnCode]; -- adds a forwarding for an individual. DeleteForward: PROCEDURE [name, entry: BodyDefs.RName] RETURNS [ProtocolDefs.ReturnCode]; -- Deletes forwarding from an individual. AddMember: PROCEDURE [name, entry: BodyDefs.RName] RETURNS [ProtocolDefs.ReturnCode]; -- adds a member to a group. DeleteMember: PROCEDURE [name, entry: BodyDefs.RName] RETURNS [ProtocolDefs.ReturnCode]; -- Deletes a member from a group. AddOwner: PROCEDURE [name, entry: BodyDefs.RName] RETURNS [ProtocolDefs.ReturnCode]; -- adds an owner to a group. DeleteOwner: PROCEDURE [name, entry: BodyDefs.RName] RETURNS [ProtocolDefs.ReturnCode]; -- Deletes an owner from a group. AddFriend: PROCEDURE [name, entry: BodyDefs.RName] RETURNS [ProtocolDefs.ReturnCode]; -- adds a member to the "friends" acl of a group. DeleteFriend: PROCEDURE [name, entry: BodyDefs.RName] RETURNS [ProtocolDefs.ReturnCode]; -- Deletes a member from the "friends" acl of a group. AddListOfMembers: PROC [name: BodyDefs.RName, reader: HeapDefs.ReaderHandle] RETURNS [ProtocolDefs.ReturnCode]; -- "reader" is sublist containing desired R-Names -- NewName: PROC [new, old: BodyDefs.RName] RETURNS [ProtocolDefs.ReturnCode]; UpdateSublist: PROCEDURE [ name, element: BodyDefs.RName, op: ProtocolDefs.RSOperation, prevStamp: BodyDefs.Timestamp ← BodyDefs.oldestTime] RETURNS [rc: ProtocolDefs.ReturnCode, regLocal: BOOLEAN ← TRUE]; -- Update a sublist of entry; inform other R-Servers iff "prevStamp=oldestTime" -- Update: PROCEDURE [object: HeapDefs.ObjectNumber]; -- updates a registry entry with the heap object 'object' -- which is a possibly more recent version of the entry. The result -- which replaces the entry is constructed by merging the old and new -- versions on the basis of the timestamps of their components. CheckRName: PROCEDURE [ entry: BodyDefs.RName, stamp: POINTER TO BodyDefs.Timestamp] RETURNS [ProtocolDefs.ReturnCode]; -- checks whether the R-Name is known -- Read: PROCEDURE [entry: BodyDefs.RName] RETURNS [ reader: HeapDefs.ReaderHandle, rc: ProtocolDefs.ReturnCode, components, password: CARDINAL]; -- returns a reader for the entire registry entry for the -- group or individual -- Expand: PROCEDURE [entry: BodyDefs.RName, stamp: POINTER TO BodyDefs.Timestamp] RETURNS [HeapDefs.ReaderHandle, ProtocolDefs.ReturnCode]; -- returns a reader for the member list of a group or the -- mailbox list for an individual. ReadMembers: PROCEDURE [ entry: BodyDefs.RName, stamp: POINTER TO BodyDefs.Timestamp] RETURNS [HeapDefs.ReaderHandle, ProtocolDefs.ReturnCode]; -- returns a reader for the member list of a group. ReadOwners: PROCEDURE [ entry: BodyDefs.RName, stamp: POINTER TO BodyDefs.Timestamp] RETURNS [HeapDefs.ReaderHandle, ProtocolDefs.ReturnCode]; -- returns a reader for the "owners list of a group ReadFriends: PROCEDURE [ entry: BodyDefs.RName, stamp: POINTER TO BodyDefs.Timestamp] RETURNS [HeapDefs.ReaderHandle, ProtocolDefs.ReturnCode]; -- returns a reader for the "friends" list of a group ReadRegistryMembers: PROCEDURE [ entry: BodyDefs.RName, stamp: POINTER TO BodyDefs.Timestamp] RETURNS [HeapDefs.ReaderHandle, ProtocolDefs.ReturnCode]; -- returns a reader for the member list of a group's registry. ReadRegistryOwners: PROCEDURE [ entry: BodyDefs.RName, stamp: POINTER TO BodyDefs.Timestamp] RETURNS [HeapDefs.ReaderHandle, ProtocolDefs.ReturnCode]; -- returns a reader for the "owners" list of a group's registry ReadRegistryFriends: PROCEDURE [ entry: BodyDefs.RName, stamp: POINTER TO BodyDefs.Timestamp] RETURNS [HeapDefs.ReaderHandle, ProtocolDefs.ReturnCode]; -- returns a reader for the "friends" list of a group's registry ReadPassword: PROCEDURE [entry: BodyDefs.RName] RETURNS [ProtocolDefs.Password, ProtocolDefs.ReturnCode]; -- returns the password of an individual. ReadConnect: PROCEDURE [entry: BodyDefs.RName, connect: ProtocolDefs.Connect] RETURNS [ProtocolDefs.ReturnCode]; -- returns the connect-site of an individual. ReadRemark: PROCEDURE [entry: BodyDefs.RName, remark: ProtocolDefs.Remark] RETURNS [ProtocolDefs.ReturnCode]; -- Access control operations -- Membership: TYPE = {yes, no, badList --includes WrongServer-- }; MembershipGrade: TYPE = MACHINE DEPENDENT{self(0), registry(1)}; MembershipAcl: TYPE = MACHINE DEPENDENT{members(0), owners(1), friends(2)}; MembershipLevel: TYPE = MACHINE DEPENDENT{direct(0), closure(1), upArrow(2)}; -- direct looks only in the specified list -- -- upArrow is closure by following names of form "foo↑.reg" -- -- closure is general closure operation -- -- self looks in the specified group, registry looks in its registry -- -- members, owners, friends look in the appropriate sub-list -- IsInList: PROCEDURE [ entry: BodyDefs.RName, member: BodyDefs.RName, level: MembershipLevel, grade: MembershipGrade, acl: MembershipAcl] RETURNS [membership: Membership, rc: ProtocolDefs.ReturnCode]; -- general "IsMember" function -- IsMember: PROCEDURE [ entry: BodyDefs.RName, member: BodyDefs.RName, level: MembershipLevel] RETURNS [membership: Membership, rc: ProtocolDefs.ReturnCode] = INLINE { [membership, rc] ← IsInList[entry, member, level, self, members]}; IsOwner: PROCEDURE [ entry: BodyDefs.RName, member: BodyDefs.RName, level: MembershipLevel] RETURNS [membership: Membership, rc: ProtocolDefs.ReturnCode] = INLINE { [membership, rc] ← IsInList[entry, member, level, self, owners]}; IsFriend: PROCEDURE [ entry: BodyDefs.RName, member: BodyDefs.RName, level: MembershipLevel] RETURNS [membership: Membership, rc: ProtocolDefs.ReturnCode] = INLINE { [membership, rc] ← IsInList[entry, member, level, self, friends]}; MailUpdate: PROC [ entry: BodyDefs.RName, stamp: BodyDefs.Timestamp, element: BodyDefs.RName, op: ProtocolDefs.RSOperation, rsMailObj: HeapDefs.ObjectNumber]; -- sends entry to other R-Servers then frees object -- ReadMail: PROC; -- infinite loop reading R-Server internal mail -- ConsiderPurging: PROC [RegBTreeDefs.RegistryObject, BodyDefs.Timestamp] RETURNS [BOOLEAN]; -- says whether entry may be worth purging -- ReallyPurge: PROC [ BodyDefs.RName, RegBTreeDefs.RegistryObject, BodyDefs.Timestamp] RETURNS [BOOLEAN, HeapDefs.WriterHandle]; -- purges old deleted info from entry. Returns writer on new entry; -- Doesn't change the timestamp -- -- enumeration for registry removal in RegAccess -- EnumeratedMembers: PROC [name: BodyDefs.RName, type: ProtocolDefs.RNameType] RETURNS [reader: HeapDefs.ReaderHandle]; END.