1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 import hashlib
21 import time
22 import string
23 import sys
24
25 from spacewalk.common.rhnConfig import CFG
26 from spacewalk.common.usix import raise_with_tb
27
28 import rhnSQL
29
30
33
34
37
38
40
42 self.session_id = session_id
43 self.expires = None
44 self.uid = None
45 self.duration = None
46
47 - def generate(self, duration=None, web_user_id=None):
53
55
56 return list(map(lambda x, cfg=CFG: getattr(cfg, 'session_secret_%s' % x),
57 range(1, 5)))
58
60
61 secrets = self._get_secrets()
62 if len(secrets) != len([_f for _f in secrets if _f]):
63
64 raise Exception("Secrets not set in the config file")
65 return secrets
66
68 if self.session_id is None:
69 raise ValueError("session id not supplied")
70
71 secrets = self.get_secrets()
72
73 ctx = hashlib.new('sha256')
74 ctx.update(string.join(secrets[:2] + [str(self.session_id)] +
75 secrets[2:], ':'))
76
77 return string.join(["%02x" % ord(a) for a in ctx.digest()], '')
78
80 return "%sx%s" % (self.session_id, self.digest())
81
83 if uid:
84 self.uid = uid
85 return self.uid
86
87 - def load(self, session):
88 arr = string.split(session, 'x', 1)
89 if len(arr) != 2:
90 raise InvalidSessionError("Invalid session string")
91
92 digest = arr[1]
93 if len(digest) != 64:
94 raise InvalidSessionError("Invalid session string (wrong length)")
95
96 try:
97 self.session_id = int(arr[0])
98 except ValueError:
99 raise_with_tb(InvalidSessionError("Invalid session identifier"), sys.exc_info()[2])
100
101 if digest != self.digest():
102 raise InvalidSessionError("Bad session checksum")
103
104 h = rhnSQL.prepare("""
105 select web_user_id, expires, value
106 from pxtSessions
107 where id = :session_id
108 """)
109 h.execute(session_id=self.session_id)
110
111 row = h.fetchone_dict()
112 if row:
113
114 if time.time() < row['expires']:
115
116 self.expires = row['expires']
117 self.uid = row['web_user_id']
118 return self
119
120
121 h = rhnSQL.prepare("""
122 delete from pxtSessions where id = :session_id
123 """)
124 h.execute(session_id=self.session_id)
125 rhnSQL.commit()
126
127 raise ExpiredSessionError("Session not found")
128
130 expires = int(time.time()) + self.duration
131
132 h = rhnSQL.prepare("""
133 insert into PXTSessions (id, web_user_id, expires, value)
134 values (:id, :web_user_id, :expires, :value)
135 """)
136 h.execute(id=self.session_id, web_user_id=self.uid,
137 expires=expires, value='RHNAPP')
138 rhnSQL.commit()
139 return self
140
141
142 -def load(session_string):
144
145
146 -def generate(web_user_id=None, duration=None):
148