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":
75 cdef public afs_int32 flags
76 cdef public afs_int32 id
77 cdef public afs_int32 owner
78 cdef public afs_int32 creator
79 cdef public afs_int32 ngroups
80 cdef public afs_int32 nusers
81 cdef public afs_int32 count
82 cdef public object name
86 return '<PTEntry: %s>' % self.name
88 return '<PTEntry: PTS ID %s>' % self.id
90 cdef int _ptentry_from_c(PTEntry p_entry, prcheckentry * c_entry) except -1:
95 p_entry.flags = c_entry.flags
96 p_entry.id = c_entry.id
97 p_entry.owner = c_entry.owner
98 p_entry.creator = c_entry.creator
99 p_entry.ngroups = c_entry.ngroups
100 p_entry.nusers = c_entry.nusers
101 p_entry.count = c_entry.count
102 p_entry.name = c_entry.name
105 cdef int _ptentry_to_c(prcheckentry * c_entry, PTEntry p_entry) except -1:
110 c_entry.flags = p_entry.flags
111 c_entry.id = p_entry.id
112 c_entry.owner = p_entry.owner
113 c_entry.creator = p_entry.creator
114 c_entry.ngroups = p_entry.ngroups
115 c_entry.nusers = p_entry.nusers
116 c_entry.count = p_entry.count
117 strncpy(c_entry.name, p_entry.name, sizeof(c_entry.name))
122 A PTS object is essentially a handle to talk to the server in a
125 cell defaults to None. If no argument is passed for cell, PTS
126 connects to the home cell.
128 sec is the security level, an integer from 0 to 3:
129 - 0: unauthenticated connection
130 - 1: try authenticated, then fall back to unauthenticated
131 - 2: fail if an authenticated connection can't be established
132 - 3: same as 2, plus encrypt all traffic to the protection
135 cdef ubik_client * client
137 def __cinit__(self, cell=None, sec=1):
139 cdef afsconf_dir *cdir
140 cdef afsconf_cell info
142 cdef ktc_principal prin
144 cdef rx_securityClass *sc
145 cdef rx_connection *serverconns[MAXSERVERS]
148 initialize_PT_error_table()
159 raise Exception(code, "Error initializing Rx")
161 cdir = afsconf_Open(AFSDIR_CLIENT_ETC_DIRPATH)
164 "Error opening configuration directory (%s): %s" % \
165 (AFSDIR_CLIENT_ETC_DIRPATH, strerror(errno)))
166 code = afsconf_GetCellInfo(cdir, c_cell, "afsprot", &info)
168 raise Exception(code, "GetCellInfo: %s" % afs_error_message(code))
171 strncpy(prin.cell, info.name, sizeof(prin.cell))
173 strncpy(prin.name, "afs", sizeof(prin.name))
175 code = ktc_GetToken(&prin, &token, sizeof(token), NULL);
178 # No really - we wanted authentication
179 raise Exception(code, "Failed to get token for service AFS: %s" % afs_error_message(code))
186 sc = rxkad_NewClientSecurityObject(level, &token.sessionKey,
187 token.kvno, token.ticketLen,
191 sc = rxnull_NewClientSecurityObject()
195 memset(serverconns, 0, sizeof(serverconns))
196 for 0 <= i < info.numServers:
197 serverconns[i] = rx_NewConnection(info.hostAddr[i].sin_addr.s_addr,
198 info.hostAddr[i].sin_port,
203 code = ubik_ClientInit(serverconns, &self.client)
205 raise Exception("Failed to initialize ubik connection to Protection server: %s" % afs_error_message(code))
207 code = rxs_Release(sc)
209 def __dealloc__(self):
210 ubik_ClientDestroy(self.client)
213 def NameOrId(self, ident):
215 Given an identifier, convert it to a PTS ID by looking up the
216 name if it's a string, or otherwise just converting it to an
219 if isinstance(ident, (str, unicode)):
220 return self.NameToId(ident)
224 def NameToId(self, name):
226 Converts a user or group to an AFS ID.
230 cdef afs_int32 code, id
234 lids.idlist_val = NULL
235 lnames.namelist_len = 1
236 lnames.namelist_val = <prname *>malloc(PR_MAXNAMELEN)
237 strncpy(lnames.namelist_val[0], name, PR_MAXNAMELEN)
238 code = ubik_PR_NameToID(self.client, 0, &lnames, &lids)
239 if lids.idlist_val is not NULL:
240 id = lids.idlist_val[0]
241 free(lids.idlist_val)
242 if id == ANONYMOUSID:
245 raise Exception("Failed to lookup PTS name: %s" % afs_error_message(code))
248 def IdToName(self, id):
250 Convert an AFS ID to the name of a user or group.
255 cdef char name[PR_MAXNAMELEN]
258 lids.idlist_val = <afs_int32 *>malloc(sizeof(afs_int32))
259 lids.idlist_val[0] = id
260 lnames.namelist_len = 0
261 lnames.namelist_val = NULL
262 code = ubik_PR_IDToName(self.client, 0, &lids, &lnames)
263 if lnames.namelist_val is not NULL:
264 strncpy(name, lnames.namelist_val[0], sizeof(name))
265 free(lnames.namelist_val)
266 if lids.idlist_val is not NULL:
267 free(lids.idlist_val)
271 raise Exception("Failed to lookup PTS ID: %s" % afs_error_message(code))
274 def CreateUser(self, name, id=None):
276 Create a new user in the protection database. If an ID is
277 provided, that one will be used.
281 name = name[:PR_MAXNAMELEN].lower()
287 code = ubik_PR_INewEntry(self.client, 0, name, cid, 0)
289 code = ubik_PR_NewEntry(self.client, 0, name, 0, 0, &cid)
292 raise Exception("Failed to create user: %s" % afs_error_message(code))
295 def CreateGroup(self, name, owner, id=None):
297 Create a new group in the protection database. If an ID is
298 provided, that one will be used.
300 cdef afs_int32 code, cid
302 name = name[:PR_MAXNAMELEN].lower()
303 oid = self.NameOrId(owner)
307 code = ubik_PR_INewEntry(self.client, 0, name, cid, oid)
309 code = ubik_PR_NewEntry(self.client, 0, name, PRGRP, oid, &cid)
312 raise Exception("Failed to create group: %s" % afs_error_message(code))
315 def Delete(self, ident):
317 Delete the protection database entry with the provided
321 cdef afs_int32 id = self.NameOrId(ident)
323 code = ubik_PR_Delete(self.client, 0, id)
325 raise Exception("Failed to delete user: %s" % afs_error_message(code))
327 def AddToGroup(self, user, group):
329 Add the given user to the given group.
332 cdef afs_int32 uid = self.NameOrId(user), gid = self.NameOrId(group)
334 code = ubik_PR_AddToGroup(self.client, 0, uid, gid)
336 raise Exception("Failed to add user to group: %s" % afs_error_message(code))
338 def RemoveFromGroup(self, user, group):
340 Remove the given user from the given group.
343 cdef afs_int32 uid = self.NameOrId(user), gid = self.NameOrId(group)
345 code = ubik_PR_RemoveFromGroup(self.client, 0, uid, gid)
347 raise Exception("Failed to remove user from group: %s" % afs_error_message(code))
349 def ListMembers(self, ident):
351 Get the membership of an entity.
353 If id is a group, this returns the users that are in that
356 If id is a user, this returns the list of groups that user is
359 This returns a list of PTS IDs.
361 cdef afs_int32 code, over
364 cdef object members = []
366 cdef afs_int32 id = self.NameOrId(ident)
369 alist.prlist_val = NULL
371 code = ubik_PR_ListElements(self.client, 0, id, &alist, &over)
373 if alist.prlist_val is not NULL:
374 for i in range(alist.prlist_len):
375 members.append(alist.prlist_val[i])
376 free(alist.prlist_val)
381 raise Exception("Failed to get group membership: %s" % afs_error_message(code))
385 def ListOwned(self, owner):
387 Get all groups owned by an entity.
389 cdef afs_int32 code, over
392 cdef object owned = []
394 cdef afs_int32 oid = self.NameOrId(owner)
397 alist.prlist_val = NULL
399 code = ubik_PR_ListOwned(self.client, 0, oid, &alist, &over)
401 if alist.prlist_val is not NULL:
402 for i in range(alist.prlist_len):
403 owned.append(alist.prlist_val[i])
404 free(alist.prlist_val)
409 raise Exception("Failed to get owned entities: %s" % afs_error_message(code))
413 def ListEntry(self, ident):
415 Load a PTEntry instance with information about the provided
419 cdef prcheckentry centry
420 cdef object entry = PTEntry()
422 cdef afs_int32 id = self.NameOrId(ident)
424 code = ubik_PR_ListEntry(self.client, 0, id, ¢ry)
426 raise Exception("Error getting entity info: %s" % afs_error_message(code))
428 _ptentry_from_c(entry, ¢ry)
431 def ChangeEntry(self, ident, newname=None, newid=None, newoid=None):
433 Change the name, ID, and/or owner of a PTS entity.
435 For any of newname, newid, and newoid which aren't specified
436 or ar None, the value isn't changed.
439 cdef afs_int32 c_newid = 0, c_newoid = 0
440 cdef char * c_newname
442 cdef afs_int32 id = self.NameOrId(ident)
445 newname = self.IdToName(id)
447 if newid is not None:
449 if newoid is not None:
452 code = ubik_PR_ChangeEntry(self.client, 0, id, c_newname, c_newoid, c_newid)
454 raise Exception("Error changing entity info: %s" % afs_error_message(code))
456 def IsAMemberOf(self, user, group):
458 Return True if the given user is a member of the given group.
463 cdef afs_int32 uid = self.NameOrId(user), gid = self.NameOrId(group)
465 code = ubik_PR_IsAMemberOf(self.client, 0, uid, gid, &flag)
467 raise Exception("Error testing membership: %s" % afs_error_message(code))
473 Return a tuple of the maximum user ID and the maximum group
474 ID currently assigned.
476 cdef afs_int32 code, uid, gid
478 code = ubik_PR_ListMax(self.client, 0, &uid, &gid)
480 raise Exception("Error looking up max uid/gid: %s" % afs_error_message(code))
484 def SetMaxUserId(self, id):
486 Set the maximum currently assigned user ID (the next
487 automatically assigned UID will be id + 1)
491 code = ubik_PR_SetMax(self.client, 0, id, 0)
493 raise Exception("Error setting max uid: %s" % afs_error_message(code))
495 def SetMaxGroupId(self, id):
497 Set the maximum currently assigned user ID (the next
498 automatically assigned UID will be id + 1)
502 code = ubik_PR_SetMax(self.client, 0, id, PRGRP)
504 raise Exception("Error setting max gid: %s" % afs_error_message(code))
506 def ListEntries(self, users=None, groups=None):
508 Return a list of PTEntry instances representing all entries in
511 Returns just users by default, but can return just users, just
515 cdef afs_int32 flag = 0, startindex = 0, nentries, nextstartindex
516 cdef prentries centries
519 cdef object entries = []
521 if groups is None or users is True:
526 while startindex != -1:
527 centries.prentries_val = NULL
528 centries.prentries_len = 0
531 code = ubik_PR_ListEntries(self.client, 0, flag, startindex, ¢ries, &nextstartindex)
532 if centries.prentries_val is not NULL:
533 for i in range(centries.prentries_len):
535 _ptentry_from_c(e, <prcheckentry *>¢ries.prentries_val[i])
537 free(centries.prentries_val)
539 raise Exception("Unable to list entries: %s" % afs_error_message(code))
541 startindex = nextstartindex
545 def SetFields(self, ident, access=None, groups=None, users=None):
547 Update the fields for an entry.
549 Valid fields are the privacy flags (access), the group quota
550 (groups), or the "foreign user quota" (users), which doesn't
551 actually seem to do anything, but is included for
555 cdef afs_int32 mask = 0, flags = 0, nusers = 0, ngroups = 0
557 cdef afs_int32 id = self.NameOrId(ident)
559 if access is not None:
561 mask |= PR_SF_ALLBITS
562 if groups is not None:
564 mask |= PR_SF_NGROUPS
565 if users is not None:
567 mask |= PR_SF_NGROUPS
569 code = ubik_PR_SetFieldsEntry(self.client, 0, id, mask, flags, ngroups, nusers, 0, 0)
571 raise Exception("Unable to set fields: %s" % afs_error_message(code))