66fefd9930c3df6a2cefb7c512f5aef9582456aa
[invirt/packages/python-afs.git] / afs / _pts.pyx
1 from afs cimport *
2
3 cdef class PTS:
4     cdef ubik_client * client
5     
6     def __cinit__(self, cell=None, sec=1):
7         cdef afs_int32 code
8         cdef afsconf_dir *cdir
9         cdef afsconf_cell info
10         cdef char * c_cell
11         cdef ktc_principal prin
12         cdef ktc_token token
13         cdef rx_securityClass *sc
14         
15         if cell is None:
16             c_cell = NULL
17         else:
18             c_cell = cell
19         
20         self.client = NULL
21         
22         code = rx_Init(0)
23         if code != 0:
24             raise Exception(code, "Error initializing Rx")
25         
26         cdir = afsconf_Open(AFSDIR_CLIENT_ETC_DIRPATH)
27         if cdir is NULL:
28             raise OSError(errno,
29                           "Error opening configuration directory (%s): %s" % \
30                               (AFSDIR_CLIENT_ETC_DIRPATH, strerror(errno)))
31         code = afsconf_GetCellInfo(cdir, c_cell, "afsprot", &info)
32         if code != 0:
33             raise Exception(code, "GetCellInfo: %s" % error_message(code))
34         
35         if sec > 0:
36             strncpy(prin.cell, info.name, sizeof(prin.cell))
37             prin.instance[0] = 0
38             strncpy(prin.name, "afs", sizeof(prin.name))
39             
40             code = ktc_GetToken(&prin, &token, sizeof(token), NULL);
41             if code != 0:
42                 if sec >= 2:
43                     # No really - we wanted authentication
44                     raise Exception(code, "Failed to get token for service AFS: %s" % error_message(code))
45                 sec = 0
46             else:
47                 if sec == 3:
48                     level = rxkad_crypt
49                 else:
50                     level = rxkad_clear
51                 sc = rxkad_NewClientSecurityObject(level, &token.sessionKey,
52                                                    token.kvno, token.ticketLen,
53                                                    token.ticket)
54         
55         if sec == 0:
56             sc = rxnull_NewClientSecurityObject()
57         else:
58             sec = 2
59         
60         code = rxs_Release(sc)
61     
62     def __dealloc__(self):
63         rx_Finalize()