-- Transport mechanism:  Client reading of R-Server database

-- [Indigo]<Grapevine>MS>NameInfoDefs.mesa

-- Andrew Birrell  August 27, 1982 3:00 pm

DIRECTORY

BodyDefs	USING[ Connect, oldestTime, Password, Remark, RName,
		       Timestamp ];

NameInfoDefs: DEFINITIONS =

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[SIZE[POINTER]];

Enumerate:	PROC[list: RListHandle,
		     work: PROC[BodyDefs.RName]RETURNS[done: BOOLEAN] ];

Close:		PROC[list: RListHandle];




-- "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: BodyDefs.Timestamp ],
			individual => [ sites: RListHandle,
				   stamp: BodyDefs.Timestamp ],
			notFound => NULL,
			protocolError => NULL,
			wrongServer => NULL,
			allDown => NULL,
			ENDCASE ];

Expand:		PROC[name: BodyDefs.RName,
		     oldStamp: BodyDefs.Timestamp ← BodyDefs.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: BodyDefs.Timestamp ],
			individual => NULL,
			notFound => NULL,
			protocolError => NULL,
			wrongServer => NULL,
			allDown => NULL,
			ENDCASE ];

GetMembers:	PROC[name: BodyDefs.RName,
		     oldStamp: BodyDefs.Timestamp ← BodyDefs.oldestTime]
		RETURNS[ MemberInfo ];

GetOwners:	PROC[name: BodyDefs.RName,
		     oldStamp: BodyDefs.Timestamp ← BodyDefs.oldestTime]
		RETURNS[ MemberInfo ];

GetFriends:	PROC[name: BodyDefs.RName,
		     oldStamp: BodyDefs.Timestamp ← BodyDefs.oldestTime]
		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. --

StampInfo:	TYPE = NameType[noChange..allDown];

CheckStamp:	PROC[name: BodyDefs.RName,
		     oldStamp: BodyDefs.Timestamp ← BodyDefs.oldestTime]
		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.  "connect.maxlength" should equal
-- "BodyDefs.maxConnectLength". --

ConnectInfo:	TYPE = NameType[group..allDown];

GetConnect:	PROC[name: BodyDefs.RName, connect: BodyDefs.Connect]
		RETURNS[ ConnectInfo ];




-- "GetRemark" returns the remark for a group.  "remark" is
-- undisturbed if the result is not "group".  The remark is a human readable
-- string.  "remark.maxlength" should equal "BodyDefs.maxRemarkLength". --

RemarkInfo:	TYPE = NameType[group..allDown];

GetRemark:	PROC[name: BodyDefs.RName, remark: BodyDefs.Remark]
		RETURNS[ RemarkInfo ];



-- "Authenticate" checks a user name and password. --

AuthenticateInfo: TYPE = NameType[group..badPwd];

Authenticate:	PROC[name: BodyDefs.RName, password: STRING]
		RETURNS[ AuthenticateInfo ];

AuthenticateKey:PROC[name: BodyDefs.RName, key: BodyDefs.Password]
		RETURNS[ AuthenticateInfo ];



-- Access control primitives --

Membership:	 TYPE = { yes, no, notGroup, allDown };
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: BodyDefs.RName, member: BodyDefs.RName,
               level: MembershipLevel, grade: MembershipGrade, acl: ListType]
        RETURNS[Membership];

IsMemberDirect:	PROC[name: BodyDefs.RName, member: BodyDefs.RName]
		RETURNS[ Membership ] = INLINE
  { RETURN[IsInList[name, member, direct, self, members]] };

IsOwnerDirect:	PROC[name: BodyDefs.RName, owner: BodyDefs.RName]
		RETURNS[ Membership ] = INLINE
  { RETURN[IsInList[name, owner, direct, self, owners]] };

IsFriendDirect:	PROC[name: BodyDefs.RName, friend: BodyDefs.RName]
		RETURNS[ Membership ] = INLINE
  { RETURN[IsInList[name, friend, direct, self, friends]] };

IsMemberClosure:PROC[name: BodyDefs.RName, member: BodyDefs.RName]
		RETURNS[ Membership ] = INLINE
  { RETURN[IsInList[name, member, closure, self, members]] };

IsOwnerClosure:	PROC[name: BodyDefs.RName, owner: BodyDefs.RName]
		RETURNS[ Membership ] = INLINE
  { RETURN[IsInList[name, owner, closure, self, owners]] };

IsFriendClosure:PROC[name: BodyDefs.RName, friend: BodyDefs.RName]
		RETURNS[ Membership ] = INLINE
  { RETURN[IsInList[name, friend, closure, self, friends]] };

IsMemberUpArrow:PROC[name: BodyDefs.RName, member: BodyDefs.RName]
		RETURNS[ Membership ] = INLINE
  { RETURN[IsInList[name, member, upArrow, self, members]] };

IsOwnerUpArrow:	PROC[name: BodyDefs.RName, owner: BodyDefs.RName]
		RETURNS[ Membership ] = INLINE
  { RETURN[IsInList[name, owner, upArrow, self, owners]] };

IsFriendUpArrow:PROC[name: BodyDefs.RName, friend: BodyDefs.RName]
		RETURNS[ Membership ] = INLINE
  { RETURN[IsInList[name, friend, upArrow, self, friends]] };


END.