Initialize the security object.
[invirt/packages/python-afs.git] / afs / _pts.pyx
1 cimport afs as a
2
3 cdef class PTS:
4     cdef a.ubik_client * client
5     
6     def __cinit__(self, cell=None, sec=1):
7         cdef a.afs_int32 code
8         cdef a.afsconf_dir *cdir
9         cdef a.afsconf_cell info
10         cdef char * c_cell
11         cdef a.ktc_principal prin
12         cdef a.ktc_token token
13         cdef a.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 = a.rx_Init(0)
23         if code != 0:
24             raise Exception(code, "Error initializing Rx")
25         
26         cdir = a.afsconf_Open(a.AFSDIR_CLIENT_ETC_DIRPATH)
27         if cdir is NULL:
28             raise OSError(a.errno,
29                           "Error opening configuration directory (%s): %s" % \
30                               (a.AFSDIR_CLIENT_ETC_DIRPATH, a.strerror(a.errno)))
31         code = a.afsconf_GetCellInfo(cdir, c_cell, "afsprot", &info)
32         if code != 0:
33             raise Exception(code, "GetCellInfo: %s" % a.error_message(code))
34         
35         if sec > 0:
36             a.strncpy(prin.cell, info.name, sizeof(prin.cell))
37             prin.instance[0] = 0
38             a.strncpy(prin.name, "afs", sizeof(prin.name))
39             
40             code = a.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" % a.error_message(code))
45                 sec = 0
46             else:
47                 if sec == 3:
48                     level = a.rxkad_crypt
49                 else:
50                     level = a.rxkad_clear
51                 sc = a.rxkad_NewClientSecurityObject(level, &token.sessionKey,
52                                                    token.kvno, token.ticketLen,
53                                                    token.ticket)
54         
55         if sec == 0:
56             sc = a.rxnull_NewClientSecurityObject()
57         else:
58             sec = 2
59         
60         code = a.rxs_Release(sc)
61     
62     def __dealloc__(self):
63         a.rx_Finalize()