X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/python-afs.git/blobdiff_plain/b96524d6b92de2d8aeb8b1aa5f83f2dbc822f5f2..fa8b281a9e135ed7b0380d783ec2b1e81594508e:/afs/_pts.pyx diff --git a/afs/_pts.pyx b/afs/_pts.pyx index 107bf85..c347037 100644 --- a/afs/_pts.pyx +++ b/afs/_pts.pyx @@ -1,5 +1,6 @@ from afs cimport * from afs import pyafs_error +import re cdef import from "afs/ptuser.h": enum: @@ -77,7 +78,7 @@ cdef import from "krb5/krb5.h": struct krb5_principal_data: pass - ctypedef _krb5_context krb5_context + ctypedef _krb5_context * krb5_context ctypedef krb5_principal_data * krb5_principal ctypedef long krb5_int32 @@ -138,6 +139,28 @@ cdef int _ptentry_to_c(prcheckentry * c_entry, PTEntry p_entry) except -1: strncpy(c_entry.name, p_entry.name, sizeof(c_entry.name)) return 0 +cdef object kname_re = re.compile(r'^([^.].*?)(?malloc(40) + k4_name[0] = '\0' + k4_inst = malloc(40) + k4_inst[0] = '\0' + k4_realm = malloc(40) + k4_realm[0] = '\0' + + code = krb5_init_context(&ctx) + try: + pyafs_error(code) + + code = krb5_parse_name(ctx, krb5_name, &k5_princ) + try: + pyafs_error(code) + + code = krb5_524_conv_principal(ctx, k5_princ, k4_name, k4_inst, k4_realm) + pyafs_error(code) + + afs_princ = kname_unparse(k4_name, k4_inst, k4_realm) + afs_name, afs_realm = afs_princ.rsplit('@', 1) + + if k4_realm == self.realm: + return afs_name + else: + return '%s@%s' % (afs_name, afs_realm.lower()) + finally: + if k5_princ is not NULL: + krb5_free_principal(ctx, k5_princ) + finally: + if ctx is not NULL: + krb5_free_context(ctx)