3 cdef import from "afs/ptuser.h":
14 ctypedef char prname[PR_MAXNAMELEN]
17 unsigned int namelist_len
21 unsigned int prlist_len
25 unsigned int idlist_len
36 char name[PR_MAXNAMELEN]
46 char name[PR_MAXNAMELEN]
49 unsigned int prentries_len
50 prlistentries *prentries_val
52 int ubik_PR_NameToID(ubik_client *, afs_int32, namelist *, idlist *)
53 int ubik_PR_IDToName(ubik_client *, afs_int32, idlist *, namelist *)
54 int ubik_PR_INewEntry(ubik_client *, afs_int32, char *, afs_int32, afs_int32)
55 int ubik_PR_NewEntry(ubik_client *, afs_int32, char *, afs_int32, afs_int32, afs_int32 *)
56 int ubik_PR_Delete(ubik_client *, afs_int32, afs_int32)
57 int ubik_PR_AddToGroup(ubik_client *, afs_int32, afs_int32, afs_int32)
58 int ubik_PR_RemoveFromGroup(ubik_client *, afs_int32, afs_int32, afs_int32)
59 int ubik_PR_ListElements(ubik_client *, afs_int32, afs_int32, prlist *, afs_int32 *)
60 int ubik_PR_ListOwned(ubik_client *, afs_int32, afs_int32, prlist *, afs_int32 *)
61 int ubik_PR_ListEntry(ubik_client *, afs_int32, afs_int32, prcheckentry *)
62 int ubik_PR_ChangeEntry(ubik_client *, afs_int32, afs_int32, char *, afs_int32, afs_int32)
63 int ubik_PR_IsAMemberOf(ubik_client *, afs_int32, afs_int32, afs_int32, afs_int32 *)
64 int ubik_PR_ListMax(ubik_client *, afs_int32, afs_int32 *, afs_int32 *)
65 int ubik_PR_SetMax(ubik_client *, afs_int32, afs_int32, afs_int32)
66 int ubik_PR_ListEntries(ubik_client *, afs_int32, afs_int32, afs_int32, prentries *, afs_int32 *)
67 int ubik_PR_SetFieldsEntry(ubik_client *, afs_int32, afs_int32, afs_int32, afs_int32, afs_int32, afs_int32, afs_int32, afs_int32)
69 cdef import from "afs/pterror.h":
74 void initialize_PT_error_table()
77 cdef public afs_int32 flags
78 cdef public afs_int32 id
79 cdef public afs_int32 owner
80 cdef public afs_int32 creator
81 cdef public afs_int32 ngroups
82 cdef public afs_int32 nusers
83 cdef public afs_int32 count
84 cdef public object name
88 return '<PTEntry: %s>' % self.name
90 return '<PTEntry: PTS ID %s>' % self.id
92 cdef int _ptentry_from_checkentry(PTEntry p_entry, prcheckentry c_entry) except -1:
97 p_entry.flags = c_entry.flags
98 p_entry.id = c_entry.id
99 p_entry.owner = c_entry.owner
100 p_entry.creator = c_entry.creator
101 p_entry.ngroups = c_entry.ngroups
102 p_entry.nusers = c_entry.nusers
103 p_entry.count = c_entry.count
104 p_entry.name = c_entry.name
107 cdef int _ptentry_to_checkentry(prcheckentry * c_entry, PTEntry p_entry) except -1:
112 c_entry.flags = p_entry.flags
113 c_entry.id = p_entry.id
114 c_entry.owner = p_entry.owner
115 c_entry.creator = p_entry.creator
116 c_entry.ngroups = p_entry.ngroups
117 c_entry.nusers = p_entry.nusers
118 c_entry.count = p_entry.count
119 strncpy(c_entry.name, p_entry.name, sizeof(c_entry.name))
122 cdef int _ptentry_from_listentry(PTEntry p_entry, prlistentries c_entry) except -1:
127 p_entry.flags = c_entry.flags
128 p_entry.id = c_entry.id
129 p_entry.owner = c_entry.owner
130 p_entry.creator = c_entry.creator
131 p_entry.ngroups = c_entry.ngroups
132 p_entry.nusers = c_entry.nusers
133 p_entry.count = c_entry.count
134 p_entry.name = c_entry.name
137 cdef int _ptentry_to_listentry(prlistentries * c_entry, PTEntry p_entry) except -1:
142 c_entry.flags = p_entry.flags
143 c_entry.id = p_entry.id
144 c_entry.owner = p_entry.owner
145 c_entry.creator = p_entry.creator
146 c_entry.ngroups = p_entry.ngroups
147 c_entry.nusers = p_entry.nusers
148 c_entry.count = p_entry.count
149 strncpy(c_entry.name, p_entry.name, sizeof(c_entry.name))
154 A PTS object is essentially a handle to talk to the server in a
157 cell defaults to None. If no argument is passed for cell, PTS
158 connects to the home cell.
160 sec is the security level, an integer from 0 to 3:
161 - 0: unauthenticated connection
162 - 1: try authenticated, then fall back to unauthenticated
163 - 2: fail if an authenticated connection can't be established
164 - 3: same as 2, plus encrypt all traffic to the protection
167 cdef ubik_client * client
169 def __cinit__(self, cell=None, sec=1):
171 cdef afsconf_dir *cdir
172 cdef afsconf_cell info
174 cdef ktc_principal prin
176 cdef rx_securityClass *sc
177 cdef rx_connection *serverconns[MAXSERVERS]
180 initialize_PT_error_table()
191 raise Exception(code, "Error initializing Rx")
193 cdir = afsconf_Open(AFSDIR_CLIENT_ETC_DIRPATH)
196 "Error opening configuration directory (%s): %s" % \
197 (AFSDIR_CLIENT_ETC_DIRPATH, strerror(errno)))
198 code = afsconf_GetCellInfo(cdir, c_cell, "afsprot", &info)
200 raise Exception(code, "GetCellInfo: %s" % afs_error_message(code))
203 strncpy(prin.cell, info.name, sizeof(prin.cell))
205 strncpy(prin.name, "afs", sizeof(prin.name))
207 code = ktc_GetToken(&prin, &token, sizeof(token), NULL);
210 # No really - we wanted authentication
211 raise Exception(code, "Failed to get token for service AFS: %s" % afs_error_message(code))
218 sc = rxkad_NewClientSecurityObject(level, &token.sessionKey,
219 token.kvno, token.ticketLen,
223 sc = rxnull_NewClientSecurityObject()
227 memset(serverconns, 0, sizeof(serverconns))
228 for 0 <= i < info.numServers:
229 serverconns[i] = rx_NewConnection(info.hostAddr[i].sin_addr.s_addr,
230 info.hostAddr[i].sin_port,
235 code = ubik_ClientInit(serverconns, &self.client)
237 raise Exception("Failed to initialize ubik connection to Protection server: %s" % afs_error_message(code))
239 code = rxs_Release(sc)
241 def __dealloc__(self):
242 ubik_ClientDestroy(self.client)
245 def NameToId(self, name):
247 Converts a user or group to an AFS ID.
251 cdef afs_int32 code, id
255 lids.idlist_val = NULL
256 lnames.namelist_len = 1
257 lnames.namelist_val = <prname *>malloc(PR_MAXNAMELEN)
258 strncpy(lnames.namelist_val[0], name, PR_MAXNAMELEN)
259 code = ubik_PR_NameToID(self.client, 0, &lnames, &lids)
260 if lids.idlist_val is not NULL:
261 id = lids.idlist_val[0]
262 free(lids.idlist_val)
263 if id == ANONYMOUSID:
266 raise Exception("Failed to lookup PTS name: %s" % afs_error_message(code))
269 def IdToName(self, id):
271 Convert an AFS ID to the name of a user or group.
276 cdef char name[PR_MAXNAMELEN]
279 lids.idlist_val = <afs_int32 *>malloc(sizeof(afs_int32))
280 lids.idlist_val[0] = id
281 lnames.namelist_len = 0
282 lnames.namelist_val = NULL
283 code = ubik_PR_IDToName(self.client, 0, &lids, &lnames)
284 if lnames.namelist_val is not NULL:
285 strncpy(name, lnames.namelist_val[0], sizeof(name))
286 free(lnames.namelist_val)
287 if lids.idlist_val is not NULL:
288 free(lids.idlist_val)
292 raise Exception("Failed to lookup PTS ID: %s" % afs_error_message(code))
295 def CreateUser(self, name, id=None):
297 Create a new user in the protection database. If an ID is
298 provided, that one will be used.
302 name = name[:PR_MAXNAMELEN].lower()
308 code = ubik_PR_INewEntry(self.client, 0, name, cid, 0)
310 code = ubik_PR_NewEntry(self.client, 0, name, 0, 0, &cid)
313 raise Exception("Failed to create user: %s" % afs_error_message(code))
316 def CreateGroup(self, name, owner, id=None):
318 Create a new group in the protection database. If an ID is
319 provided, that one will be used.
321 cdef afs_int32 code, cid
323 name = name[:PR_MAXNAMELEN].lower()
324 oid = self.NameToId(owner)
328 code = ubik_PR_INewEntry(self.client, 0, name, cid, oid)
330 code = ubik_PR_NewEntry(self.client, 0, name, PRGRP, oid, &cid)
333 raise Exception("Failed to create group: %s" % afs_error_message(code))
336 def Delete(self, id):
338 Delete the protection database entry with the provided ID.
342 code = ubik_PR_Delete(self.client, 0, id)
344 raise Exception("Failed to delete user: %s" % afs_error_message(code))
346 def AddToGroup(self, uid, gid):
348 Add the user with the given ID to the group with the given ID.
352 code = ubik_PR_AddToGroup(self.client, 0, uid, gid)
354 raise Exception("Failed to add user to group: %s" % afs_error_message(code))
356 def RemoveFromGroup(self, uid, gid):
358 Remove the user with the given ID from the group with the given ID.
362 code = ubik_PR_RemoveFromGroup(self.client, 0, uid, gid)
364 raise Exception("Failed to remove user from group: %s" % afs_error_message(code))
366 def ListMembers(self, id):
368 Get the membership of an entity.
370 If id is a group ID, this returns the users that are in that
373 If id is a user ID, this returns the list of groups that user
376 This returns a list of PTS IDs.
378 cdef afs_int32 code, over
381 cdef object members = []
384 alist.prlist_val = NULL
386 code = ubik_PR_ListElements(self.client, 0, id, &alist, &over)
388 if alist.prlist_val is not NULL:
389 for i in range(alist.prlist_len):
390 members.append(alist.prlist_val[i])
391 free(alist.prlist_val)
396 raise Exception("Failed to get group membership: %s" % afs_error_message(code))
400 def ListOwned(self, oid):
402 Get all groups owned by an entity.
404 cdef afs_int32 code, over
407 cdef object owned = []
410 alist.prlist_val = NULL
412 code = ubik_PR_ListOwned(self.client, 0, oid, &alist, &over)
414 if alist.prlist_val is not NULL:
415 for i in range(alist.prlist_len):
416 owned.append(alist.prlist_val[i])
417 free(alist.prlist_val)
422 raise Exception("Failed to get owned entities: %s" % afs_error_message(code))
426 def ListEntry(self, id):
428 Load a PTEntry instance with information about the provided
432 cdef prcheckentry centry
433 cdef object entry = PTEntry()
435 code = ubik_PR_ListEntry(self.client, 0, id, ¢ry)
437 raise Exception("Error getting entity info: %s" % afs_error_message(code))
439 _ptentry_from_checkentry(entry, centry)
442 def ChangeEntry(self, id, newname=None, newid=None, newoid=None):
444 Change the name, ID, and/or owner of a PTS entity.
446 For any of newname, newid, and newoid which aren't specified
447 or ar None, the value isn't changed.
450 cdef afs_int32 c_newid = 0, c_newoid = 0
451 cdef char * c_newname
454 newname = self.IdToName(id)
456 if newid is not None:
458 if newoid is not None:
461 code = ubik_PR_ChangeEntry(self.client, 0, id, c_newname, c_newoid, c_newid)
463 raise Exception("Error changing entity info: %s" % afs_error_message(code))
465 def IsAMemberOf(self, uid, gid):
467 Return True if the given uid is a member of the given gid.
472 code = ubik_PR_IsAMemberOf(self.client, 0, uid, gid, &flag)
474 raise Exception("Error testing membership: %s" % afs_error_message(code))
480 Return a tuple of the maximum user ID and the maximum group
481 ID currently assigned.
483 cdef afs_int32 code, uid, gid
485 code = ubik_PR_ListMax(self.client, 0, &uid, &gid)
487 raise Exception("Error looking up max uid/gid: %s" % afs_error_message(code))
491 def SetMaxUserId(self, id):
493 Set the maximum currently assigned user ID (the next
494 automatically assigned UID will be id + 1)
498 code = ubik_PR_SetMax(self.client, 0, id, 0)
500 raise Exception("Error setting max uid: %s" % afs_error_message(code))
502 def SetMaxGroupId(self, id):
504 Set the maximum currently assigned user ID (the next
505 automatically assigned UID will be id + 1)
509 code = ubik_PR_SetMax(self.client, 0, id, PRGRP)
511 raise Exception("Error setting max gid: %s" % afs_error_message(code))
513 def ListEntries(self, users=None, groups=None):
515 Return a list of PTEntry instances representing all entries in
518 Returns just users by default, but can return just users, just
522 cdef afs_int32 flag = 0, startindex = 0, nentries, nextstartindex
523 cdef prentries centries
526 cdef object entries = []
528 if groups is None or users is True:
533 while startindex != -1:
534 centries.prentries_val = NULL
535 centries.prentries_len = 0
538 code = ubik_PR_ListEntries(self.client, 0, flag, startindex, ¢ries, &nextstartindex)
539 if centries.prentries_val is not NULL:
540 for i in range(centries.prentries_len):
542 _ptentry_from_listentry(e, centries.prentries_val[i])
544 free(centries.prentries_val)
546 raise Exception("Unable to list entries: %s" % afs_error_message(code))
548 startindex = nextstartindex
552 def SetFields(self, id, access=None, groups=None, users=None):
554 Update the fields for an entry.
556 Valid fields are the privacy flags (access), the group quota
557 (groups), or the "foreign user quota" (users), which doesn't
558 actually seem to do anything, but is included for
562 cdef afs_int32 mask = 0, flags = 0, nusers = 0, ngroups = 0
564 if access is not None:
566 mask |= PR_SF_ALLBITS
567 if groups is not None:
569 mask |= PR_SF_NGROUPS
570 if users is not None:
572 mask |= PR_SF_NGROUPS
574 code = ubik_PR_SetFieldsEntry(self.client, 0, id, mask, flags, ngroups, nusers, 0, 0)
576 raise Exception("Unable to set fields: %s" % afs_error_message(code))