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_c(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_c(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))
124 A PTS object is essentially a handle to talk to the server in a
127 cell defaults to None. If no argument is passed for cell, PTS
128 connects to the home cell.
130 sec is the security level, an integer from 0 to 3:
131 - 0: unauthenticated connection
132 - 1: try authenticated, then fall back to unauthenticated
133 - 2: fail if an authenticated connection can't be established
134 - 3: same as 2, plus encrypt all traffic to the protection
137 cdef ubik_client * client
139 def __cinit__(self, cell=None, sec=1):
141 cdef afsconf_dir *cdir
142 cdef afsconf_cell info
144 cdef ktc_principal prin
146 cdef rx_securityClass *sc
147 cdef rx_connection *serverconns[MAXSERVERS]
150 initialize_PT_error_table()
161 raise Exception(code, "Error initializing Rx")
163 cdir = afsconf_Open(AFSDIR_CLIENT_ETC_DIRPATH)
166 "Error opening configuration directory (%s): %s" % \
167 (AFSDIR_CLIENT_ETC_DIRPATH, strerror(errno)))
168 code = afsconf_GetCellInfo(cdir, c_cell, "afsprot", &info)
170 raise Exception(code, "GetCellInfo: %s" % afs_error_message(code))
173 strncpy(prin.cell, info.name, sizeof(prin.cell))
175 strncpy(prin.name, "afs", sizeof(prin.name))
177 code = ktc_GetToken(&prin, &token, sizeof(token), NULL);
180 # No really - we wanted authentication
181 raise Exception(code, "Failed to get token for service AFS: %s" % afs_error_message(code))
188 sc = rxkad_NewClientSecurityObject(level, &token.sessionKey,
189 token.kvno, token.ticketLen,
193 sc = rxnull_NewClientSecurityObject()
197 memset(serverconns, 0, sizeof(serverconns))
198 for 0 <= i < info.numServers:
199 serverconns[i] = rx_NewConnection(info.hostAddr[i].sin_addr.s_addr,
200 info.hostAddr[i].sin_port,
205 code = ubik_ClientInit(serverconns, &self.client)
207 raise Exception("Failed to initialize ubik connection to Protection server: %s" % afs_error_message(code))
209 code = rxs_Release(sc)
211 def __dealloc__(self):
212 ubik_ClientDestroy(self.client)
215 def NameToId(self, name):
217 Converts a user or group to an AFS ID.
221 cdef afs_int32 code, id
225 lids.idlist_val = NULL
226 lnames.namelist_len = 1
227 lnames.namelist_val = <prname *>malloc(PR_MAXNAMELEN)
228 strncpy(lnames.namelist_val[0], name, PR_MAXNAMELEN)
229 code = ubik_PR_NameToID(self.client, 0, &lnames, &lids)
230 if lids.idlist_val is not NULL:
231 id = lids.idlist_val[0]
232 free(lids.idlist_val)
233 if id == ANONYMOUSID:
236 raise Exception("Failed to lookup PTS name: %s" % afs_error_message(code))
239 def IdToName(self, id):
241 Convert an AFS ID to the name of a user or group.
246 cdef char name[PR_MAXNAMELEN]
249 lids.idlist_val = <afs_int32 *>malloc(sizeof(afs_int32))
250 lids.idlist_val[0] = id
251 lnames.namelist_len = 0
252 lnames.namelist_val = NULL
253 code = ubik_PR_IDToName(self.client, 0, &lids, &lnames)
254 if lnames.namelist_val is not NULL:
255 strncpy(name, lnames.namelist_val[0], sizeof(name))
256 free(lnames.namelist_val)
257 if lids.idlist_val is not NULL:
258 free(lids.idlist_val)
262 raise Exception("Failed to lookup PTS ID: %s" % afs_error_message(code))
265 def CreateUser(self, name, id=None):
267 Create a new user in the protection database. If an ID is
268 provided, that one will be used.
272 name = name[:PR_MAXNAMELEN].lower()
278 code = ubik_PR_INewEntry(self.client, 0, name, cid, 0)
280 code = ubik_PR_NewEntry(self.client, 0, name, 0, 0, &cid)
283 raise Exception("Failed to create user: %s" % afs_error_message(code))
286 def CreateGroup(self, name, owner, id=None):
288 Create a new group in the protection database. If an ID is
289 provided, that one will be used.
291 cdef afs_int32 code, cid
293 name = name[:PR_MAXNAMELEN].lower()
294 oid = self.NameToId(owner)
298 code = ubik_PR_INewEntry(self.client, 0, name, cid, oid)
300 code = ubik_PR_NewEntry(self.client, 0, name, PRGRP, oid, &cid)
303 raise Exception("Failed to create group: %s" % afs_error_message(code))
306 def Delete(self, id):
308 Delete the protection database entry with the provided ID.
312 code = ubik_PR_Delete(self.client, 0, id)
314 raise Exception("Failed to delete user: %s" % afs_error_message(code))
316 def AddToGroup(self, uid, gid):
318 Add the user with the given ID to the group with the given ID.
322 code = ubik_PR_AddToGroup(self.client, 0, uid, gid)
324 raise Exception("Failed to add user to group: %s" % afs_error_message(code))
326 def RemoveFromGroup(self, uid, gid):
328 Remove the user with the given ID from the group with the given ID.
332 code = ubik_PR_RemoveFromGroup(self.client, 0, uid, gid)
334 raise Exception("Failed to remove user from group: %s" % afs_error_message(code))
336 def ListMembers(self, id):
338 Get the membership of an entity.
340 If id is a group ID, this returns the users that are in that
343 If id is a user ID, this returns the list of groups that user
346 This returns a list of PTS IDs.
348 cdef afs_int32 code, over
351 cdef object members = []
354 alist.prlist_val = NULL
356 code = ubik_PR_ListElements(self.client, 0, id, &alist, &over)
358 if alist.prlist_val is not NULL:
359 for i in range(alist.prlist_len):
360 members.append(alist.prlist_val[i])
361 free(alist.prlist_val)
366 raise Exception("Failed to get group membership: %s" % afs_error_message(code))
370 def ListOwned(self, oid):
372 Get all groups owned by an entity.
374 cdef afs_int32 code, over
377 cdef object owned = []
380 alist.prlist_val = NULL
382 code = ubik_PR_ListOwned(self.client, 0, oid, &alist, &over)
384 if alist.prlist_val is not NULL:
385 for i in range(alist.prlist_len):
386 owned.append(alist.prlist_val[i])
387 free(alist.prlist_val)
392 raise Exception("Failed to get owned entities: %s" % afs_error_message(code))
396 def ListEntry(self, id):
398 Load a PTEntry instance with information about the provided
402 cdef prcheckentry centry
403 cdef object entry = PTEntry()
405 code = ubik_PR_ListEntry(self.client, 0, id, ¢ry)
407 raise Exception("Error getting entity info: %s" % afs_error_message(code))
409 _ptentry_from_c(entry, ¢ry)
412 def ChangeEntry(self, id, newname=None, newid=None, newoid=None):
414 Change the name, ID, and/or owner of a PTS entity.
416 For any of newname, newid, and newoid which aren't specified
417 or ar None, the value isn't changed.
420 cdef afs_int32 c_newid = 0, c_newoid = 0
421 cdef char * c_newname
424 newname = self.IdToName(id)
426 if newid is not None:
428 if newoid is not None:
431 code = ubik_PR_ChangeEntry(self.client, 0, id, c_newname, c_newoid, c_newid)
433 raise Exception("Error changing entity info: %s" % afs_error_message(code))
435 def IsAMemberOf(self, uid, gid):
437 Return True if the given uid is a member of the given gid.
442 code = ubik_PR_IsAMemberOf(self.client, 0, uid, gid, &flag)
444 raise Exception("Error testing membership: %s" % afs_error_message(code))
450 Return a tuple of the maximum user ID and the maximum group
451 ID currently assigned.
453 cdef afs_int32 code, uid, gid
455 code = ubik_PR_ListMax(self.client, 0, &uid, &gid)
457 raise Exception("Error looking up max uid/gid: %s" % afs_error_message(code))
461 def SetMaxUserId(self, id):
463 Set the maximum currently assigned user ID (the next
464 automatically assigned UID will be id + 1)
468 code = ubik_PR_SetMax(self.client, 0, id, 0)
470 raise Exception("Error setting max uid: %s" % afs_error_message(code))
472 def SetMaxGroupId(self, id):
474 Set the maximum currently assigned user ID (the next
475 automatically assigned UID will be id + 1)
479 code = ubik_PR_SetMax(self.client, 0, id, PRGRP)
481 raise Exception("Error setting max gid: %s" % afs_error_message(code))
483 def ListEntries(self, users=None, groups=None):
485 Return a list of PTEntry instances representing all entries in
488 Returns just users by default, but can return just users, just
492 cdef afs_int32 flag = 0, startindex = 0, nentries, nextstartindex
493 cdef prentries centries
496 cdef object entries = []
498 if groups is None or users is True:
503 while startindex != -1:
504 centries.prentries_val = NULL
505 centries.prentries_len = 0
508 code = ubik_PR_ListEntries(self.client, 0, flag, startindex, ¢ries, &nextstartindex)
509 if centries.prentries_val is not NULL:
510 for i in range(centries.prentries_len):
512 _ptentry_from_c(e, <prcheckentry *>¢ries.prentries_val[i])
514 free(centries.prentries_val)
516 raise Exception("Unable to list entries: %s" % afs_error_message(code))
518 startindex = nextstartindex
522 def SetFields(self, id, access=None, groups=None, users=None):
524 Update the fields for an entry.
526 Valid fields are the privacy flags (access), the group quota
527 (groups), or the "foreign user quota" (users), which doesn't
528 actually seem to do anything, but is included for
532 cdef afs_int32 mask = 0, flags = 0, nusers = 0, ngroups = 0
534 if access is not None:
536 mask |= PR_SF_ALLBITS
537 if groups is not None:
539 mask |= PR_SF_NGROUPS
540 if users is not None:
542 mask |= PR_SF_NGROUPS
544 code = ubik_PR_SetFieldsEntry(self.client, 0, id, mask, flags, ngroups, nusers, 0, 0)
546 raise Exception("Unable to set fields: %s" % afs_error_message(code))