22 import struct |
22 import struct |
23 import zlib |
23 import zlib |
24 |
24 |
25 PyASN1Availabe = True |
25 PyASN1Availabe = True |
26 |
26 |
27 try : |
27 try: |
28 from pyasn1.codec.der import decoder |
28 from pyasn1.codec.der import decoder |
29 from pyasn1.type import base |
29 from pyasn1.type import base |
30 except ImportError: |
30 except ImportError: |
31 PyASN1Availabe = False |
31 PyASN1Availabe = False |
32 |
32 |
33 def _findItem(item, itemParent, index, objectIdentifier) : |
33 def _findItem(item, itemParent, index, objectIdentifier): |
34 """find Item""" |
34 """find Item""" |
35 if isinstance(item, base.AbstractSimpleAsn1Item) : |
35 if isinstance(item, base.AbstractSimpleAsn1Item): |
36 if item == objectIdentifier : |
36 if item == objectIdentifier: |
37 return itemParent[index + 1] |
37 return itemParent[index + 1] |
38 else: |
38 else: |
39 for i_item in range(len(item)) : |
39 for i_item in range(len(item)): |
40 found = _findItem(item[i_item], item, i_item, objectIdentifier) |
40 found = _findItem(item[i_item], item, i_item, objectIdentifier) |
41 if found: |
41 if found: |
42 return found |
42 return found |
43 |
43 |
44 def findItem(decodedCert, objectIdentifier) : |
44 def findItem(decodedCert, objectIdentifier): |
45 """find item""" |
45 """find item""" |
46 return _findItem(decodedCert, None, 0, objectIdentifier) |
46 return _findItem(decodedCert, None, 0, objectIdentifier) |
47 |
47 |
48 |
48 |
49 class CertificateOrganization : |
49 class CertificateOrganization: |
50 """ This class holds organisation details of certificate issuer or signer """ |
50 """ This class holds organisation details of certificate issuer or signer """ |
51 def __init__(self) : |
51 def __init__(self): |
52 pass |
52 self.commonName = None |
53 |
53 self.countryCode = None |
54 def parse(self, decodedCert) : |
54 self.locality = None |
|
55 self.state = None |
|
56 self.street = None |
|
57 self.organization = None |
|
58 |
|
59 def parse(self, decodedCert): |
55 """parse certificate Organisation""" |
60 """parse certificate Organisation""" |
56 self.commonName = findItem(decodedCert, (2, 5, 4, 3)) |
61 self.commonName = findItem(decodedCert, (2, 5, 4, 3)) |
57 self.countryCode = findItem(decodedCert, (2, 5, 4, 6)) |
62 self.countryCode = findItem(decodedCert, (2, 5, 4, 6)) |
58 self.locality = findItem(decodedCert, (2, 5, 4, 7)) |
63 self.locality = findItem(decodedCert, (2, 5, 4, 7)) |
59 self.state = findItem(decodedCert, (2, 5, 4, 8)) |
64 self.state = findItem(decodedCert, (2, 5, 4, 8)) |
60 self.street = findItem(decodedCert, (2, 5, 4, 9)) |
65 self.street = findItem(decodedCert, (2, 5, 4, 9)) |
61 self.organization = findItem(decodedCert, (2, 5, 4, 10)) |
66 self.organization = findItem(decodedCert, (2, 5, 4, 10)) |
62 |
67 |
63 def readableStr(self) : |
68 def readableStr(self): |
64 """readable String""" |
69 """readable String""" |
65 buf = "" |
70 buf = "" |
66 if self.commonName : |
71 if self.commonName: |
67 buf += self.commonName.prettyPrint() + "\n" |
72 buf += self.commonName.prettyPrint() + "\n" |
68 if self.countryCode : |
73 if self.countryCode: |
69 buf += self.countryCode.prettyPrint() + "\n" |
74 buf += self.countryCode.prettyPrint() + "\n" |
70 if self.locality : |
75 if self.locality: |
71 buf += self.locality.prettyPrint() + "\n" |
76 buf += self.locality.prettyPrint() + "\n" |
72 if self.state : |
77 if self.state: |
73 buf += self.state.prettyPrint() + "\n" |
78 buf += self.state.prettyPrint() + "\n" |
74 if self.street : |
79 if self.street: |
75 buf += self.street.prettyPrint() + "\n" |
80 buf += self.street.prettyPrint() + "\n" |
76 if self.organization : |
81 if self.organization: |
77 buf += self.organization.prettyPrint() |
82 buf += self.organization.prettyPrint() |
78 return buf |
83 return buf |
79 |
84 |
80 class CertificateInfo : |
85 class CertificateInfo: |
81 """ This class holds certificate information such as certificate signer and issuer """ |
86 """ This class holds certificate information such as certificate signer and issuer """ |
82 def __init__(self) : |
87 def __init__(self): |
83 pass |
88 self.issuer = None |
84 |
89 self.signer = None |
85 def parse(self, decodedCert) : |
90 |
|
91 def parse(self, decodedCert): |
86 """parse""" |
92 """parse""" |
87 self.issuer = CertificateOrganization() |
93 self.issuer = CertificateOrganization() |
88 self.issuer.parse(decodedCert[0][3]) |
94 self.issuer.parse(decodedCert[0][3]) |
89 |
95 |
90 self.signer = CertificateOrganization() |
96 self.signer = CertificateOrganization() |
91 self.signer.parse(decodedCert[0][5]) |
97 self.signer.parse(decodedCert[0][5]) |
92 |
98 |
93 def readableStr(self) : |
99 def readableStr(self): |
94 """readable String""" |
100 """readable String""" |
95 buf = "Signer:\n " + "\n ".join(self.signer.readableStr().split('\n')) + "\n" |
101 buf = "Signer:\n " + "\n ".join(self.signer.readableStr().split('\n')) + "\n" |
96 buf += "Issuer:\n " + "\n ".join(self.issuer.readableStr().split('\n')) + "\n" |
102 buf += "Issuer:\n " + "\n ".join(self.issuer.readableStr().split('\n')) + "\n" |
97 return buf |
103 return buf |
98 |
104 |
99 |
105 |
100 class SISFileHeader : |
106 class SISFileHeader: |
101 """ Class SIS File header """ |
107 """ Class SIS File header """ |
102 def __init__(self) : |
108 def __init__(self): |
103 self.uid1 = 0 |
109 self.uid1 = 0 |
104 self.uid2 = 0 |
110 self.uid2 = 0 |
105 self.uid3 = 0 |
111 self.uid3 = 0 |
106 self.uidChecksum = 0 |
112 self.uidChecksum = 0 |
107 |
113 |
108 class SISField : |
114 class SISField: |
109 """ Class SIS Field """ |
115 """ Class SIS Field """ |
110 def __init__(self) : |
116 def __init__(self): |
111 self.type = 0 |
117 self.type_ = 0 |
112 self.length = None |
118 self.length = None |
113 self.subFields = [] |
119 self.subFields = [] |
114 |
120 |
115 def readFieldLength(self, fileReader) : |
121 def readFieldLength(self, fileReader): |
116 """read Field Length""" |
122 """read Field Length""" |
117 length = fileReader.readBytesAsUint(4) |
123 length = fileReader.readBytesAsUint(4) |
118 if length & 0x80000000 > 0 : |
124 if length & 0x80000000 > 0: |
119 length = length << 32 |
125 length = length << 32 |
120 length |= fileReader.readBytesAsUint(4) |
126 length |= fileReader.readBytesAsUint(4) |
121 return length |
127 return length |
122 |
128 |
123 def findField(self, fieldType, startIndex=0) : |
129 def findField(self, fieldType, startIndex=0): |
124 """find Field""" |
130 """find Field""" |
125 result = None |
131 result = None |
126 index = startIndex |
132 index = startIndex |
127 |
133 |
128 for field in self.subFields[startIndex:] : |
134 for field in self.subFields[startIndex:]: |
129 if field.type == fieldType : |
135 if field.type_ == fieldType: |
130 result = field |
136 result = field |
131 break |
137 break |
132 ++ index |
138 index = index + 1 |
133 return (result, index) |
139 return (result, index) |
134 |
140 |
135 def readableStr(self) : |
141 def readableStr(self): |
136 """readable String""" |
142 """readable String""" |
137 return "" |
143 return "" |
138 |
144 |
139 def traverse(self, handler, depth=0) : |
145 def traverse(self, handler, depth=0): |
140 """ traverse""" |
146 """ traverse""" |
141 handler.handleField(self, depth) |
147 handler.handleField(self, depth) |
142 for field in self.subFields : |
148 for field in self.subFields: |
143 field.traverse(handler, depth + 1) |
149 field.traverse(handler, depth + 1) |
144 |
150 |
145 class SISUnsupportedField(SISField) : |
151 class SISUnsupportedField(SISField): |
146 """ Class SIS UnsupportedField """ |
152 """ Class SIS UnsupportedField """ |
147 def __init__(self) : |
153 def __init__(self): |
148 SISField.__init__(self) |
154 SISField.__init__(self) |
149 |
155 |
150 def initFromFile(self, fileReader) : |
156 def initFromFile(self, fileReader): |
151 """initialisation From File""" |
157 """initialisation From File""" |
152 self.length = self.readFieldLength(fileReader) |
158 self.length = self.readFieldLength(fileReader) |
153 fileReader.readPlainBytes(self.length) |
159 fileReader.readPlainBytes(self.length) |
154 |
160 |
155 class SISStringField(SISField) : |
161 class SISStringField(SISField): |
156 """ Class SIS StringField """ |
162 """ Class SIS StringField """ |
157 def __init__(self) : |
163 def __init__(self): |
158 SISField.__init__(self) |
164 SISField.__init__(self) |
159 self.data = None |
165 self.data = None |
160 |
166 |
161 def initFromFile(self, fileReader) : |
167 def initFromFile(self, fileReader): |
162 """initialise From File""" |
168 """initialise From File""" |
163 self.length = self.readFieldLength(fileReader) |
169 self.length = self.readFieldLength(fileReader) |
164 buf = fileReader.readPlainBytes(self.length) |
170 buf = fileReader.readPlainBytes(self.length) |
165 self.data = u"" |
171 self.data = u"" |
166 while len(buf) > 0 : |
172 while len(buf) > 0: |
167 temp = buf[:2] |
173 temp = buf[:2] |
168 buf = buf[2:] |
174 buf = buf[2:] |
169 self.data += unichr(ord(temp[0]) | ord(temp[1]) << 8) |
175 self.data += unichr(ord(temp[0]) | ord(temp[1]) << 8) |
170 |
176 |
171 def readableStr(self) : |
177 def readableStr(self): |
172 """readable String""" |
178 """readable String""" |
173 return self.data |
179 return self.data |
174 |
180 |
175 class SISArrayField(SISField) : |
181 class SISArrayField(SISField): |
176 """ Class SIS ArrayField """ |
182 """ Class SIS ArrayField """ |
177 def __init__(self) : |
183 def __init__(self): |
178 SISField.__init__(self) |
184 SISField.__init__(self) |
179 |
185 |
180 def initFromFile(self, fileReader) : |
186 def initFromFile(self, fileReader): |
181 """initialise From File""" |
187 """initialise From File""" |
182 self.length = self.readFieldLength(fileReader) |
188 self.length = self.readFieldLength(fileReader) |
183 type = fileReader.readBytesAsInt(4) |
189 type_ = fileReader.readBytesAsInt(4) |
184 l_len = self.length - 4 |
190 l_len = self.length - 4 |
185 while l_len > 0 : |
191 while l_len > 0: |
186 field = SISFieldTypes[type]() |
192 field = SISFieldTypes[type_]() |
187 field.type = type |
193 field.type_ = type_ |
188 field.initFromFile(fileReader) |
194 field.initFromFile(fileReader) |
189 self.subFields.append(field) |
195 self.subFields.append(field) |
190 |
196 |
191 l_len -= field.length + 4 # field length + the length field |
197 l_len -= field.length + 4 # field length + the length field |
192 padding = fileReader.skipPadding() |
198 padding = fileReader.skipPadding() |
193 l_len -= padding |
199 l_len -= padding |
194 |
200 |
195 class SISCompressedField(SISField) : |
201 class SISCompressedField(SISField): |
196 """ Class SIS CompressedField """ |
202 """ Class SIS CompressedField """ |
197 def __init__(self) : |
203 def __init__(self): |
198 SISField.__init__(self) |
204 SISField.__init__(self) |
199 self.algorithm = None |
205 self.algorithm = None |
200 self.uncompressedDataSize = None |
206 self.uncompressedDataSize = None |
201 self.data = None |
207 self.data = None |
202 |
208 |
203 def initFromFile(self, fileReader) : |
209 def initFromFile(self, fileReader): |
204 """initialise From File""" |
210 """initialise From File""" |
205 self.length = self.readFieldLength(fileReader) |
211 self.length = self.readFieldLength(fileReader) |
206 self.algorithm = fileReader.readBytesAsUint(4) |
212 self.algorithm = fileReader.readBytesAsUint(4) |
207 self.uncompressedDataSize = fileReader.readBytesAsUint(8) |
213 self.uncompressedDataSize = fileReader.readBytesAsUint(8) |
208 data = fileReader.readPlainBytes(self.length - 4 - 8) |
214 data = fileReader.readPlainBytes(self.length - 4 - 8) |
209 if self.algorithm == 0 : |
215 if self.algorithm == 0: |
210 self.data = data |
216 self.data = data |
211 elif self.algorithm == 1 : |
217 elif self.algorithm == 1: |
212 self.data = zlib.decompress(data) |
218 self.data = zlib.decompress(data) |
213 |
219 |
214 class SISVersionField(SISField) : |
220 class SISVersionField(SISField): |
215 """ Class SIS VersionField """ |
221 """ Class SIS VersionField """ |
216 def __init__(self) : |
222 def __init__(self): |
217 SISField.__init__(self) |
223 SISField.__init__(self) |
218 self.version = (- 1, - 1, - 1) |
224 self.version = (- 1, - 1, - 1) |
219 |
225 |
220 def initFromFile(self, fileReader) : |
226 def initFromFile(self, fileReader): |
221 """initialise From File""" |
227 """initialise From File""" |
222 self.length = self.readFieldLength(fileReader) |
228 self.length = self.readFieldLength(fileReader) |
223 major = fileReader.readBytesAsInt(4) |
229 major = fileReader.readBytesAsInt(4) |
224 minor = fileReader.readBytesAsInt(4) |
230 minor = fileReader.readBytesAsInt(4) |
225 build = fileReader.readBytesAsInt(4) |
231 build = fileReader.readBytesAsInt(4) |
226 self.version = (major, minor, build) |
232 self.version = (major, minor, build) |
227 |
233 |
228 def readableStr(self) : |
234 def readableStr(self): |
229 """readable string""" |
235 """readable string""" |
230 return str(self.version) |
236 return str(self.version) |
231 |
237 |
232 class SISVersionRangeField(SISField) : |
238 class SISVersionRangeField(SISField): |
233 """ Class SIS VersionRangeField """ |
239 """ Class SIS VersionRangeField """ |
234 def __init__(self) : |
240 def __init__(self): |
235 SISField.__init__(self) |
241 SISField.__init__(self) |
236 self.fromVersion = None |
242 self.fromVersion = None |
237 self.toVersion = None |
243 self.toVersion = None |
238 |
244 |
239 def initFromFile(self, fileReader) : |
245 def initFromFile(self, fileReader): |
240 """initialise From File""" |
246 """initialise From File""" |
241 self.length = self.readFieldLength(fileReader) |
247 self.length = self.readFieldLength(fileReader) |
242 fieldParser = SISFieldParser() |
248 fieldParser = SISFieldParser() |
243 self.fromVersion = fieldParser.parseField(fileReader) |
249 self.fromVersion = fieldParser.parseField(fileReader) |
244 if self.length - fieldParser.lastReadBytes > 0 : |
250 if self.length - fieldParser.lastReadBytes > 0 : |
245 self.toVersion = fieldParser.parseField(fileReader) |
251 self.toVersion = fieldParser.parseField(fileReader) |
246 |
252 |
247 class SISDateField(SISField) : |
253 class SISDateField(SISField): |
248 """ Class SIS DateField """ |
254 """ Class SIS DateField """ |
249 def __init__(self) : |
255 def __init__(self): |
250 SISField.__init__(self) |
256 SISField.__init__(self) |
251 self.year = None |
257 self.year = None |
252 self.month = None |
258 self.month = None |
253 self.day = None |
259 self.day = None |
254 |
260 |
255 def initFromFile(self, fileReader) : |
261 def initFromFile(self, fileReader): |
256 """initialise from File""" |
262 """initialise from File""" |
257 self.length = self.readFieldLength(fileReader) |
263 self.length = self.readFieldLength(fileReader) |
258 self.year = fileReader.readBytesAsUint(2) |
264 self.year = fileReader.readBytesAsUint(2) |
259 self.month = fileReader.readBytesAsUint(1) |
265 self.month = fileReader.readBytesAsUint(1) |
260 self.day = fileReader.readBytesAsUint(1) |
266 self.day = fileReader.readBytesAsUint(1) |
261 |
267 |
262 def readableStr(self) : |
268 def readableStr(self): |
263 """readable string""" |
269 """readable string""" |
264 return str(self.year) + "." + str(self.month) + "." + str(self.day) |
270 return str(self.year) + "." + str(self.month) + "." + str(self.day) |
265 |
271 |
266 class SISTimeField(SISField) : |
272 class SISTimeField(SISField): |
267 """ Class SIS TimeField """ |
273 """ Class SIS TimeField """ |
268 def __init__(self) : |
274 def __init__(self): |
269 SISField.__init__(self) |
275 SISField.__init__(self) |
270 self.hours = None |
276 self.hours = None |
271 self.minutes = None |
277 self.minutes = None |
272 self.seconds = None |
278 self.seconds = None |
273 |
279 |
274 def initFromFile(self, fileReader) : |
280 def initFromFile(self, fileReader): |
275 """initialise from File""" |
281 """initialise from File""" |
276 self.length = self.readFieldLength(fileReader) |
282 self.length = self.readFieldLength(fileReader) |
277 self.hours = fileReader.readBytesAsUint(1) |
283 self.hours = fileReader.readBytesAsUint(1) |
278 self.minutes = fileReader.readBytesAsUint(1) |
284 self.minutes = fileReader.readBytesAsUint(1) |
279 self.seconds = fileReader.readBytesAsUint(1) |
285 self.seconds = fileReader.readBytesAsUint(1) |
280 |
286 |
281 def readableStr(self) : |
287 def readableStr(self): |
282 """readable String""" |
288 """readable String""" |
283 return str(self.hours) + ":" + str(self.minutes) + ":" + str(self.seconds) |
289 return str(self.hours) + ":" + str(self.minutes) + ":" + str(self.seconds) |
284 |
290 |
285 class SISDateTimeField(SISField) : |
291 class SISDateTimeField(SISField): |
286 """ Class SIS DateTimeField """ |
292 """ Class SIS DateTimeField """ |
287 def __init__(self) : |
293 def __init__(self): |
288 SISField.__init__(self) |
294 SISField.__init__(self) |
289 self.date = None |
295 self.date = None |
290 self.time = None |
296 self.time = None |
291 |
297 |
292 def initFromFile(self, fileReader) : |
298 def initFromFile(self, fileReader): |
293 """initialise From File""" |
299 """initialise From File""" |
294 self.length = self.readFieldLength(fileReader) |
300 self.length = self.readFieldLength(fileReader) |
295 fieldParser = SISFieldParser() |
301 fieldParser = SISFieldParser() |
296 self.date = fieldParser.parseField(fileReader) |
302 self.date = fieldParser.parseField(fileReader) |
297 self.time = fieldParser.parseField(fileReader) |
303 self.time = fieldParser.parseField(fileReader) |
298 |
304 |
299 class SISUidField(SISField) : |
305 class SISUidField(SISField): |
300 """ Class SIS UidField """ |
306 """ Class SIS UidField """ |
301 def __init__(self) : |
307 def __init__(self): |
302 SISField.__init__(self) |
308 SISField.__init__(self) |
303 self.uid = None |
309 self.uid = None |
304 |
310 |
305 def initFromFile(self, fileReader) : |
311 def initFromFile(self, fileReader): |
306 """initialise From File""" |
312 """initialise From File""" |
307 self.length = self.readFieldLength(fileReader) |
313 self.length = self.readFieldLength(fileReader) |
308 self.uid = fileReader.readBytesAsUint(4) |
314 self.uid = fileReader.readBytesAsUint(4) |
309 |
315 |
310 def readableStr(self) : |
316 def readableStr(self): |
311 """readable String""" |
317 """readable String""" |
312 return hex(self.uid) |
318 return hex(self.uid) |
313 |
319 |
314 class SISLanguageField(SISField) : |
320 class SISLanguageField(SISField): |
315 """ Class SIS LanguageField """ |
321 """ Class SIS LanguageField """ |
316 def __init__(self) : |
322 def __init__(self): |
317 SISField.__init__(self) |
323 SISField.__init__(self) |
318 self.language = None |
324 self.language = None |
319 |
325 |
320 def initFromFile(self, fileReader) : |
326 def initFromFile(self, fileReader): |
321 """initialise From File""" |
327 """initialise From File""" |
322 self.length = self.readFieldLength(fileReader) |
328 self.length = self.readFieldLength(fileReader) |
323 self.language = fileReader.readBytesAsUint(4) |
329 self.language = fileReader.readBytesAsUint(4) |
324 |
330 |
325 def readableStr(self) : |
331 def readableStr(self): |
326 """readable String""" |
332 """readable String""" |
327 return str(self.language) |
333 return str(self.language) |
328 |
334 |
329 class SISContentsField(SISField) : |
335 class SISContentsField(SISField): |
330 """ Class SIS ContentsField """ |
336 """ Class SIS ContentsField """ |
331 def __init__(self) : |
337 def __init__(self): |
332 SISField.__init__(self) |
338 SISField.__init__(self) |
333 |
339 |
334 def initFromFile(self, fileReader) : |
340 def initFromFile(self, fileReader): |
335 """initialise From File""" |
341 """initialise From File""" |
336 self.length = self.readFieldLength(fileReader) |
342 self.length = self.readFieldLength(fileReader) |
337 fieldParser = SISFieldParser() |
343 fieldParser = SISFieldParser() |
338 field = fieldParser.parseField(fileReader) |
344 field = fieldParser.parseField(fileReader) |
339 while field : |
345 while field: |
340 if field.type == 3 : # compressed<conroller> |
346 if field.type_ == 3: # compressed<conroller> |
341 bufferReader = SISBufferReader(field.data) |
347 bufferReader = SISBufferReader(field.data) |
342 field = fieldParser.parseField(bufferReader) |
348 field = fieldParser.parseField(bufferReader) |
343 self.subFields.append(field) |
349 self.subFields.append(field) |
344 field = fieldParser.parseField(fileReader) |
350 field = fieldParser.parseField(fileReader) |
345 |
351 |
346 class SISControllerField(SISField) : |
352 class SISControllerField(SISField): |
347 """ Class SIS ControllerField """ |
353 """ Class SIS ControllerField """ |
348 def __init__(self) : |
354 def __init__(self): |
349 SISField.__init__(self) |
355 SISField.__init__(self) |
350 |
356 |
351 def initFromFile(self, fileReader) : |
357 def initFromFile(self, fileReader): |
352 """initialise From File""" |
358 """initialise From File""" |
353 self.length = self.readFieldLength(fileReader) |
359 self.length = self.readFieldLength(fileReader) |
354 fieldParser = SISFieldParser() |
360 fieldParser = SISFieldParser() |
355 bufferReader = SISBufferReader(fileReader.readPlainBytes(self.length)) |
361 bufferReader = SISBufferReader(fileReader.readPlainBytes(self.length)) |
356 field = fieldParser.parseField(bufferReader) |
362 field = fieldParser.parseField(bufferReader) |
357 while field : |
363 while field: |
358 self.subFields.append(field) |
364 self.subFields.append(field) |
359 field = fieldParser.parseField(bufferReader) |
365 field = fieldParser.parseField(bufferReader) |
360 |
366 |
361 class SISInfoField(SISField) : |
367 class SISInfoField(SISField): |
362 """ Class SIS InfoField """ |
368 """ Class SIS InfoField """ |
363 def __init__(self) : |
369 def __init__(self): |
364 SISField.__init__(self) |
370 SISField.__init__(self) |
365 self.installType = None |
371 self.installType = None |
366 self.installFlags = None |
372 self.installFlags = None |
367 |
373 |
368 def initFromFile(self, fileReader) : |
374 def initFromFile(self, fileReader): |
369 """initialise From File""" |
375 """initialise From File""" |
370 self.length = self.readFieldLength(fileReader) |
376 self.length = self.readFieldLength(fileReader) |
371 fieldParser = SISFieldParser() |
377 fieldParser = SISFieldParser() |
372 self.subFields.append(fieldParser.parseField(fileReader)) # UID |
378 self.subFields.append(fieldParser.parseField(fileReader)) # UID |
373 self.subFields.append(fieldParser.parseField(fileReader)) # Vendor name unique |
379 self.subFields.append(fieldParser.parseField(fileReader)) # Vendor name unique |
376 self.subFields.append(fieldParser.parseField(fileReader)) # version |
382 self.subFields.append(fieldParser.parseField(fileReader)) # version |
377 self.subFields.append(fieldParser.parseField(fileReader)) # creation time |
383 self.subFields.append(fieldParser.parseField(fileReader)) # creation time |
378 self.installType = fileReader.readBytesAsUint(1) |
384 self.installType = fileReader.readBytesAsUint(1) |
379 self.installFlags = fileReader.readBytesAsUint(1) |
385 self.installFlags = fileReader.readBytesAsUint(1) |
380 |
386 |
381 class SISSupportedLanguagesField(SISField) : |
387 class SISSupportedLanguagesField(SISField): |
382 """ Class SISSupportedLanguagesField """ |
388 """ Class SISSupportedLanguagesField """ |
383 def __init__(self) : |
389 def __init__(self): |
384 SISField.__init__(self) |
390 SISField.__init__(self) |
385 |
391 |
386 def initFromFile(self, fileReader) : |
392 def initFromFile(self, fileReader): |
387 """initialise From File""" |
393 """initialise From File""" |
388 self.length = self.readFieldLength(fileReader) |
394 self.length = self.readFieldLength(fileReader) |
389 fieldParser = SISFieldParser() |
395 fieldParser = SISFieldParser() |
390 self.subFields.append(fieldParser.parseField(fileReader)) # languages |
396 self.subFields.append(fieldParser.parseField(fileReader)) # languages |
391 |
397 |
392 class SISSupportedOptionsField(SISField) : |
398 class SISSupportedOptionsField(SISField): |
393 """ Class SISSupportedOptionsField """ |
399 """ Class SISSupportedOptionsField """ |
394 def __init__(self) : |
400 def __init__(self): |
395 SISField.__init__(self) |
401 SISField.__init__(self) |
396 |
402 |
397 def initFromFile(self, fileReader) : |
403 def initFromFile(self, fileReader): |
398 """initialise From File""" |
404 """initialise From File""" |
399 self.length = self.readFieldLength(fileReader) |
405 self.length = self.readFieldLength(fileReader) |
400 fieldParser = SISFieldParser() |
406 fieldParser = SISFieldParser() |
401 self.subFields.append(fieldParser.parseField(fileReader)) # options |
407 self.subFields.append(fieldParser.parseField(fileReader)) # options |
402 |
408 |
403 class SISPrerequisitiesField(SISField) : |
409 class SISPrerequisitiesField(SISField): |
404 """ Class SISPrerequisitiesField """ |
410 """ Class SISPrerequisitiesField """ |
405 def __init__(self) : |
411 def __init__(self): |
406 SISField.__init__(self) |
412 SISField.__init__(self) |
407 |
413 |
408 def initFromFile(self, fileReader) : |
414 def initFromFile(self, fileReader): |
409 """initialise From File""" |
415 """initialise From File""" |
410 self.length = self.readFieldLength(fileReader) |
416 self.length = self.readFieldLength(fileReader) |
411 fieldParser = SISFieldParser() |
417 fieldParser = SISFieldParser() |
412 self.subFields.append(fieldParser.parseField(fileReader)) # target devices |
418 self.subFields.append(fieldParser.parseField(fileReader)) # target devices |
413 self.subFields.append(fieldParser.parseField(fileReader)) # dependencies |
419 self.subFields.append(fieldParser.parseField(fileReader)) # dependencies |
414 |
420 |
415 |
421 |
416 class SISDependencyField(SISField) : |
422 class SISDependencyField(SISField): |
417 """ Class SISDependencyField """ |
423 """ Class SISDependencyField """ |
418 def __init__(self) : |
424 def __init__(self): |
419 SISField.__init__(self) |
425 SISField.__init__(self) |
420 |
426 |
421 def initFromFile(self, fileReader) : |
427 def initFromFile(self, fileReader): |
422 """initialise From File""" |
428 """initialise From File""" |
423 self.length = self.readFieldLength(fileReader) |
429 self.length = self.readFieldLength(fileReader) |
424 fieldParser = SISFieldParser() |
430 fieldParser = SISFieldParser() |
425 self.subFields.append(fieldParser.parseField(fileReader)) # UID |
431 self.subFields.append(fieldParser.parseField(fileReader)) # UID |
426 field = fieldParser.parseField(fileReader) |
432 field = fieldParser.parseField(fileReader) |
427 # Version range field is optional |
433 # Version range field is optional |
428 if field.type == VersionRangeField : |
434 if field.type_ == VersionRangeField: |
429 self.subFields.append(field) # version range |
435 self.subFields.append(field) # version range |
430 self.subFields.append(fieldParser.parseField(fileReader)) # dependency names |
436 self.subFields.append(fieldParser.parseField(fileReader)) # dependency names |
431 else : |
437 else: |
432 self.subFields.append(field) # dependency names |
438 self.subFields.append(field) # dependency names |
433 |
439 |
434 class SISPropertiesField(SISField) : |
440 class SISPropertiesField(SISField): |
435 """ Class SISPropertiesField """ |
441 """ Class SISPropertiesField """ |
436 def __init__(self) : |
442 def __init__(self): |
437 SISField.__init__(self) |
443 SISField.__init__(self) |
438 |
444 |
439 def initFromFile(self, fileReader) : |
445 def initFromFile(self, fileReader): |
440 """initialise From File""" |
446 """initialise From File""" |
441 self.length = self.readFieldLength(fileReader) |
447 self.length = self.readFieldLength(fileReader) |
442 fieldParser = SISFieldParser() |
448 fieldParser = SISFieldParser() |
443 self.subFields.append(fieldParser.parseField(fileReader)) # properties |
449 self.subFields.append(fieldParser.parseField(fileReader)) # properties |
444 |
450 |
445 class SISPropertyField(SISField) : |
451 class SISPropertyField(SISField): |
446 """ Class SISPropertyField """ |
452 """ Class SISPropertyField """ |
447 def __init__(self) : |
453 def __init__(self): |
448 SISField.__init__(self) |
454 SISField.__init__(self) |
449 self.key = None |
455 self.key = None |
450 self.value = None |
456 self.value = None |
451 |
457 |
452 def initFromFile(self, fileReader) : |
458 def initFromFile(self, fileReader): |
453 """initialise From File""" |
459 """initialise From File""" |
454 self.length = self.readFieldLength(fileReader) |
460 self.length = self.readFieldLength(fileReader) |
455 self.key = fileReader.readBytesAsInt(4) |
461 self.key = fileReader.readBytesAsInt(4) |
456 self.value = fileReader.readBytesAsInt(4) |
462 self.value = fileReader.readBytesAsInt(4) |
457 |
463 |
458 class SISSignaturesField(SISUnsupportedField) : |
464 class SISSignaturesField(SISUnsupportedField): |
459 """ Class SISSignaturesField There is a type for this field, but there is no definition of the field contents""" |
465 """ Class SISSignaturesField There is a type for this field, but there is no definition of the field contents""" |
460 pass |
466 pass |
461 |
467 |
462 class SISCertificateChainField(SISField) : |
468 class SISCertificateChainField(SISField): |
463 """ Class SISCertificateChainField """ |
469 """ Class SISCertificateChainField """ |
464 def __init__(self) : |
470 def __init__(self): |
465 SISField.__init__(self) |
471 SISField.__init__(self) |
466 |
472 |
467 def initFromFile(self, fileReader) : |
473 def initFromFile(self, fileReader): |
468 """initialise From File""" |
474 """initialise From File""" |
469 self.length = self.readFieldLength(fileReader) |
475 self.length = self.readFieldLength(fileReader) |
470 fieldParser = SISFieldParser() |
476 fieldParser = SISFieldParser() |
471 self.subFields.append(fieldParser.parseField(fileReader)) # certificate data |
477 self.subFields.append(fieldParser.parseField(fileReader)) # certificate data |
472 |
478 |
473 class SISLogoField(SISField) : |
479 class SISLogoField(SISField): |
474 """ Class SISLogoField """ |
480 """ Class SISLogoField """ |
475 def __init__(self) : |
481 def __init__(self): |
476 SISField.__init__(self) |
482 SISField.__init__(self) |
477 |
483 |
478 def initFromFile(self, fileReader) : |
484 def initFromFile(self, fileReader): |
479 """initialise From File""" |
485 """initialise From File""" |
480 self.length = self.readFieldLength(fileReader) |
486 self.length = self.readFieldLength(fileReader) |
481 fieldParser = SISFieldParser() |
487 fieldParser = SISFieldParser() |
482 self.subFields.append(fieldParser.parseField(fileReader)) # logo file |
488 self.subFields.append(fieldParser.parseField(fileReader)) # logo file |
483 |
489 |
484 class SISFileDescriptionField(SISField) : |
490 class SISFileDescriptionField(SISField): |
485 """ Class SISFileDescriptionField """ |
491 """ Class SISFileDescriptionField """ |
486 def __init__(self) : |
492 def __init__(self): |
487 SISField.__init__(self) |
493 SISField.__init__(self) |
488 self.operation = None |
494 self.operation = None |
489 self.operationOptions = None |
495 self.operationOptions = None |
490 self.compressedLength = None |
496 self.compressedLength = None |
491 self.uncompressedLength = None |
497 self.uncompressedLength = None |
492 self.fileIndex = None |
498 self.fileIndex = None |
493 |
499 |
494 def initFromFile(self, fileReader) : |
500 def initFromFile(self, fileReader): |
495 """initialise From File""" |
501 """initialise From File""" |
496 self.length = self.readFieldLength(fileReader) |
502 self.length = self.readFieldLength(fileReader) |
497 fieldParser = SISFieldParser() |
503 fieldParser = SISFieldParser() |
498 |
504 |
499 self.subFields.append(fieldParser.parseField(fileReader)) |
505 self.subFields.append(fieldParser.parseField(fileReader)) |
500 self.subFields.append(fieldParser.parseField(fileReader)) |
506 self.subFields.append(fieldParser.parseField(fileReader)) |
501 field = fieldParser.parseField(fileReader) |
507 field = fieldParser.parseField(fileReader) |
502 self.subFields.append(field) |
508 self.subFields.append(field) |
503 if field.type == 41 : # read field was capabilities ==> there is one more field left |
509 if field.type_ == 41: # read field was capabilities ==> there is one more field left |
504 self.subFields.append(fieldParser.parseField(fileReader)) |
510 self.subFields.append(fieldParser.parseField(fileReader)) |
505 |
511 |
506 self.operation = fileReader.readBytesAsUint(4) |
512 self.operation = fileReader.readBytesAsUint(4) |
507 self.operationOptions = fileReader.readBytesAsUint(4) |
513 self.operationOptions = fileReader.readBytesAsUint(4) |
508 self.compressedLength = fileReader.readBytesAsUint(8) |
514 self.compressedLength = fileReader.readBytesAsUint(8) |
509 self.uncompressedLength = fileReader.readBytesAsUint(8) |
515 self.uncompressedLength = fileReader.readBytesAsUint(8) |
510 self.fileIndex = fileReader.readBytesAsUint(4) |
516 self.fileIndex = fileReader.readBytesAsUint(4) |
511 |
517 |
512 def readableStr(self) : |
518 def readableStr(self): |
513 """readable string""" |
519 """readable string""" |
514 return "index: " + str(self.fileIndex) |
520 return "index: " + str(self.fileIndex) |
515 |
521 |
516 class SISHashField(SISField) : |
522 class SISHashField(SISField): |
517 """ Class SISHashField """ |
523 """ Class SISHashField """ |
518 def __init__(self) : |
524 def __init__(self): |
519 SISField.__init__(self) |
525 SISField.__init__(self) |
520 self.algorithm = None |
526 self.algorithm = None |
521 |
527 |
522 def initFromFile(self, fileReader) : |
528 def initFromFile(self, fileReader): |
523 """initialise From File""" |
529 """initialise From File""" |
524 self.length = self.readFieldLength(fileReader) |
530 self.length = self.readFieldLength(fileReader) |
525 fieldParser = SISFieldParser() |
531 fieldParser = SISFieldParser() |
526 self.algorithm = fileReader.readBytesAsUint(4) |
532 self.algorithm = fileReader.readBytesAsUint(4) |
527 self.subFields.append(fieldParser.parseField(fileReader)) # logo file |
533 self.subFields.append(fieldParser.parseField(fileReader)) # logo file |
528 |
534 |
529 class SISIfField(SISField) : |
535 class SISIfField(SISField): |
530 """ Class SISIfField """ |
536 """ Class SISIfField """ |
531 def __init__(self) : |
537 def __init__(self): |
532 SISField.__init__(self) |
538 SISField.__init__(self) |
533 |
539 |
534 def initFromFile(self, fileReader) : |
540 def initFromFile(self, fileReader): |
535 """initialise From File""" |
541 """initialise From File""" |
536 self.length = self.readFieldLength(fileReader) |
542 self.length = self.readFieldLength(fileReader) |
537 fieldParser = SISFieldParser() |
543 fieldParser = SISFieldParser() |
538 self.subFields.append(fieldParser.parseField(fileReader)) # expression |
544 self.subFields.append(fieldParser.parseField(fileReader)) # expression |
539 self.subFields.append(fieldParser.parseField(fileReader)) # install block |
545 self.subFields.append(fieldParser.parseField(fileReader)) # install block |
540 self.subFields.append(fieldParser.parseField(fileReader)) # else ifs |
546 self.subFields.append(fieldParser.parseField(fileReader)) # else ifs |
541 |
547 |
542 class SISElseIfField(SISField) : |
548 class SISElseIfField(SISField): |
543 """ Class SISElseIfField """ |
549 """ Class SISElseIfField """ |
544 def __init__(self) : |
550 def __init__(self): |
545 SISField.__init__(self) |
551 SISField.__init__(self) |
546 |
552 |
547 def initFromFile(self, fileReader) : |
553 def initFromFile(self, fileReader): |
548 """initialise From File""" |
554 """initialise From File""" |
549 self.length = self.readFieldLength(fileReader) |
555 self.length = self.readFieldLength(fileReader) |
550 fieldParser = SISFieldParser() |
556 fieldParser = SISFieldParser() |
551 self.subFields.append(fieldParser.parseField(fileReader)) # expression |
557 self.subFields.append(fieldParser.parseField(fileReader)) # expression |
552 self.subFields.append(fieldParser.parseField(fileReader)) # install block |
558 self.subFields.append(fieldParser.parseField(fileReader)) # install block |
553 |
559 |
554 class SISInstallBlockField(SISField) : |
560 class SISInstallBlockField(SISField): |
555 """ Class SISInstallBlockField """ |
561 """ Class SISInstallBlockField """ |
556 def __init__(self) : |
562 def __init__(self): |
557 SISField.__init__(self) |
563 SISField.__init__(self) |
558 self.files = None |
564 self.files = None |
559 self.embeddedSISFiles = None |
565 self.embeddedSISFiles = None |
560 self.ifBlocks = None |
566 self.ifBlocks = None |
561 |
567 |
562 def initFromFile(self, fileReader) : |
568 def initFromFile(self, fileReader): |
563 """initialise From File""" |
569 """initialise From File""" |
564 self.length = self.readFieldLength(fileReader) |
570 self.length = self.readFieldLength(fileReader) |
565 fieldParser = SISFieldParser() |
571 fieldParser = SISFieldParser() |
566 self.subFields.append(fieldParser.parseField(fileReader)) |
572 self.subFields.append(fieldParser.parseField(fileReader)) |
567 self.subFields.append(fieldParser.parseField(fileReader)) |
573 self.subFields.append(fieldParser.parseField(fileReader)) |
568 self.subFields.append(fieldParser.parseField(fileReader)) |
574 self.subFields.append(fieldParser.parseField(fileReader)) |
569 |
575 |
570 class SISExpressionField(SISField) : |
576 class SISExpressionField(SISField): |
571 """ Class SISExpressionField """ |
577 """ Class SISExpressionField """ |
572 def __init__(self) : |
578 def __init__(self): |
573 SISField.__init__(self) |
579 SISField.__init__(self) |
574 self.operator = None |
580 self.operator = None |
575 self.integerValue = None |
581 self.integerValue = None |
576 |
582 |
577 def initFromFile(self, fileReader) : |
583 def initFromFile(self, fileReader): |
578 """initialise From File""" |
584 """initialise From File""" |
579 self.length = self.readFieldLength(fileReader) |
585 self.length = self.readFieldLength(fileReader) |
580 fieldParser = SISFieldParser() |
586 fieldParser = SISFieldParser() |
581 self.operator = fileReader.readBytesAsUint(4) |
587 self.operator = fileReader.readBytesAsUint(4) |
582 self.integerValue = fileReader.readBytesAsInt(4) |
588 self.integerValue = fileReader.readBytesAsInt(4) |
583 |
589 |
584 if self.operator == 10 or self.operator == 13 : |
590 if self.operator == 10 or self.operator == 13: |
585 self.subFields.append(fieldParser.parseField(fileReader)) |
591 self.subFields.append(fieldParser.parseField(fileReader)) |
586 if self.operator == 1 or self.operator == 2 or self.operator == 3 or self.operator == 4 or self.operator == 5 or self.operator == 6 or self.operator == 7 or self.operator == 8 or self.operator == 11 or self.operator == 12 : |
592 if self.operator == 1 or self.operator == 2 or self.operator == 3 or self.operator == 4 or self.operator == 5 or self.operator == 6 or self.operator == 7 or self.operator == 8 or self.operator == 11 or self.operator == 12: |
587 self.subFields.append(fieldParser.parseField(fileReader)) |
593 self.subFields.append(fieldParser.parseField(fileReader)) |
588 if not (self.operator == 13 or self.operator == 14 or self.operator == 15 or self.operator == 16 or self.operator == 10) : |
594 if not (self.operator == 13 or self.operator == 14 or self.operator == 15 or self.operator == 16 or self.operator == 10): |
589 self.subFields.append(fieldParser.parseField(fileReader)) |
595 self.subFields.append(fieldParser.parseField(fileReader)) |
590 |
596 |
591 class SISDataField(SISField) : |
597 class SISDataField(SISField): |
592 """ Class SISDataField """ |
598 """ Class SISDataField """ |
593 def __init__(self) : |
599 def __init__(self): |
594 SISField.__init__(self) |
600 SISField.__init__(self) |
595 |
601 |
596 def initFromFile(self, fileReader) : |
602 def initFromFile(self, fileReader): |
597 """initialise From File""" |
603 """initialise From File""" |
598 self.length = self.readFieldLength(fileReader) |
604 self.length = self.readFieldLength(fileReader) |
599 fieldParser = SISFieldParser() |
605 fieldParser = SISFieldParser() |
600 self.subFields.append(fieldParser.parseField(fileReader)) # data units |
606 self.subFields.append(fieldParser.parseField(fileReader)) # data units |
601 |
607 |
602 class SISDataUnitField(SISField) : |
608 class SISDataUnitField(SISField): |
603 """ Class SISDataUnitField """ |
609 """ Class SISDataUnitField """ |
604 def __init__(self) : |
610 def __init__(self): |
605 SISField.__init__(self) |
611 SISField.__init__(self) |
606 |
612 |
607 def initFromFile(self, fileReader) : |
613 def initFromFile(self, fileReader): |
608 """initialise From File""" |
614 """initialise From File""" |
609 self.length = self.readFieldLength(fileReader) |
615 self.length = self.readFieldLength(fileReader) |
610 fieldParser = SISFieldParser() |
616 fieldParser = SISFieldParser() |
611 self.subFields.append(fieldParser.parseField(fileReader)) # file data |
617 self.subFields.append(fieldParser.parseField(fileReader)) # file data |
612 |
618 |
613 class SISFileDataField(SISField) : |
619 class SISFileDataField(SISField): |
614 """ Class SISFileDataField """ |
620 """ Class SISFileDataField """ |
615 def __init__(self) : |
621 def __init__(self): |
616 SISField.__init__(self) |
622 SISField.__init__(self) |
617 |
623 |
618 def initFromFile(self, fileReader) : |
624 def initFromFile(self, fileReader): |
619 """initialise From File""" |
625 """initialise From File""" |
620 self.length = self.readFieldLength(fileReader) |
626 self.length = self.readFieldLength(fileReader) |
621 fieldParser = SISFieldParser() |
627 fieldParser = SISFieldParser() |
622 self.subFields.append(fieldParser.parseField(fileReader)) # raw file data |
628 self.subFields.append(fieldParser.parseField(fileReader)) # raw file data |
623 |
629 |
624 class SISSupportedOptionField(SISField) : |
630 class SISSupportedOptionField(SISField): |
625 """ Class SISSupportedOptionField """ |
631 """ Class SISSupportedOptionField """ |
626 def __init__(self) : |
632 def __init__(self): |
627 SISField.__init__(self) |
633 SISField.__init__(self) |
628 |
634 |
629 def initFromFile(self, fileReader) : |
635 def initFromFile(self, fileReader): |
630 """initialise From File""" |
636 """initialise From File""" |
631 self.length = self.readFieldLength(fileReader) |
637 self.length = self.readFieldLength(fileReader) |
632 fieldParser = SISFieldParser() |
638 fieldParser = SISFieldParser() |
633 self.subFields.append(fieldParser.parseField(fileReader)) # names |
639 self.subFields.append(fieldParser.parseField(fileReader)) # names |
634 |
640 |
635 class SISControllerChecksumField(SISField) : |
641 class SISControllerChecksumField(SISField): |
636 """ Class SISControllerChecksumField """ |
642 """ Class SISControllerChecksumField """ |
637 def __init__(self) : |
643 def __init__(self): |
638 SISField.__init__(self) |
644 SISField.__init__(self) |
639 self.checksum = None |
645 self.checksum = None |
640 |
646 |
641 def initFromFile(self, fileReader) : |
647 def initFromFile(self, fileReader): |
642 """initialise From File""" |
648 """initialise From File""" |
643 self.length = self.readFieldLength(fileReader) |
649 self.length = self.readFieldLength(fileReader) |
644 self.checksum = fileReader.readBytesAsUint(2) |
650 self.checksum = fileReader.readBytesAsUint(2) |
645 |
651 |
646 class SISDataChecksumField(SISField) : |
652 class SISDataChecksumField(SISField): |
647 """ Class SISDataChecksumField """ |
653 """ Class SISDataChecksumField """ |
648 def __init__(self) : |
654 def __init__(self): |
649 SISField.__init__(self) |
655 SISField.__init__(self) |
650 self.checksum = None |
656 self.checksum = None |
651 |
657 |
652 def initFromFile(self, fileReader) : |
658 def initFromFile(self, fileReader): |
653 """initialise From File""" |
659 """initialise From File""" |
654 self.length = self.readFieldLength(fileReader) |
660 self.length = self.readFieldLength(fileReader) |
655 self.checksum = fileReader.readBytesAsUint(2) |
661 self.checksum = fileReader.readBytesAsUint(2) |
656 |
662 |
657 class SISSignatureField(SISField) : |
663 class SISSignatureField(SISField): |
658 """ Class SISSignatureField """ |
664 """ Class SISSignatureField """ |
659 def __init__(self) : |
665 def __init__(self): |
660 SISField.__init__(self) |
666 SISField.__init__(self) |
661 |
667 |
662 def initFromFile(self, fileReader) : |
668 def initFromFile(self, fileReader): |
663 """initialise From File""" |
669 """initialise From File""" |
664 self.length = self.readFieldLength(fileReader) |
670 self.length = self.readFieldLength(fileReader) |
665 fieldParser = SISFieldParser() |
671 fieldParser = SISFieldParser() |
666 self.subFields.append(fieldParser.parseField(fileReader)) # signature algorithm |
672 self.subFields.append(fieldParser.parseField(fileReader)) # signature algorithm |
667 self.subFields.append(fieldParser.parseField(fileReader)) # signature data |
673 self.subFields.append(fieldParser.parseField(fileReader)) # signature data |
668 |
674 |
669 class SISBlobField(SISField) : |
675 class SISBlobField(SISField): |
670 """ Class SISBlobField """ |
676 """ Class SISBlobField """ |
671 def __init__(self) : |
677 def __init__(self): |
672 SISField.__init__(self) |
678 SISField.__init__(self) |
673 self.data = None |
679 self.data = None |
674 |
680 |
675 def initFromFile(self, fileReader) : |
681 def initFromFile(self, fileReader): |
676 """initialise From File""" |
682 """initialise From File""" |
677 self.length = self.readFieldLength(fileReader) |
683 self.length = self.readFieldLength(fileReader) |
678 self.data = fileReader.readPlainBytes(self.length) |
684 self.data = fileReader.readPlainBytes(self.length) |
679 |
685 |
680 class SISSignatureAlgorithmField(SISField) : |
686 class SISSignatureAlgorithmField(SISField): |
681 """ Class SISSignatureAlgorithmField """ |
687 """ Class SISSignatureAlgorithmField """ |
682 def __init__(self) : |
688 def __init__(self): |
683 SISField.__init__(self) |
689 SISField.__init__(self) |
684 |
690 |
685 def initFromFile(self, fileReader) : |
691 def initFromFile(self, fileReader): |
686 """initialise From File""" |
692 """initialise From File""" |
687 self.length = self.readFieldLength(fileReader) |
693 self.length = self.readFieldLength(fileReader) |
688 fieldParser = SISFieldParser() |
694 fieldParser = SISFieldParser() |
689 self.subFields.append(fieldParser.parseField(fileReader)) # algorithm identifier |
695 self.subFields.append(fieldParser.parseField(fileReader)) # algorithm identifier |
690 |
696 |
691 class SISSignatureCertificateChainField(SISField) : |
697 class SISSignatureCertificateChainField(SISField): |
692 """ Class SISSignatureCertificateChainField """ |
698 """ Class SISSignatureCertificateChainField """ |
693 def __init__(self) : |
699 def __init__(self): |
694 SISField.__init__(self) |
700 SISField.__init__(self) |
695 |
701 |
696 def initFromFile(self, fileReader) : |
702 def initFromFile(self, fileReader): |
697 """initialise From File""" |
703 """initialise From File""" |
698 self.length = self.readFieldLength(fileReader) |
704 self.length = self.readFieldLength(fileReader) |
699 fieldParser = SISFieldParser() |
705 fieldParser = SISFieldParser() |
700 self.subFields.append(fieldParser.parseField(fileReader)) # signatures |
706 self.subFields.append(fieldParser.parseField(fileReader)) # signatures |
701 self.subFields.append(fieldParser.parseField(fileReader)) # certificate chain |
707 self.subFields.append(fieldParser.parseField(fileReader)) # certificate chain |
702 |
708 |
703 class SISDataIndexField(SISField) : |
709 class SISDataIndexField(SISField): |
704 """ Class SISDataIndexField """ |
710 """ Class SISDataIndexField """ |
705 def __init__(self) : |
711 def __init__(self): |
706 SISField.__init__(self) |
712 SISField.__init__(self) |
707 self.dataIndex = None |
713 self.dataIndex = None |
708 |
714 |
709 def initFromFile(self, fileReader) : |
715 def initFromFile(self, fileReader): |
710 """initialise From File""" |
716 """initialise From File""" |
711 self.length = self.readFieldLength(fileReader) |
717 self.length = self.readFieldLength(fileReader) |
712 self.dataIndex = fileReader.readBytesAsUint(4) |
718 self.dataIndex = fileReader.readBytesAsUint(4) |
713 |
719 |
714 class SISCapabilitiesField(SISField) : |
720 class SISCapabilitiesField(SISField): |
715 """ Class SISCapabilitiesField """ |
721 """ Class SISCapabilitiesField """ |
716 def __init__(self) : |
722 def __init__(self): |
717 SISField.__init__(self) |
723 SISField.__init__(self) |
718 self.capabilities = 0 |
724 self.capabilities = 0 |
719 self.readableCaps = [] |
725 self.readableCaps = [] |
720 |
726 |
721 def initFromFile(self, fileReader) : |
727 def initFromFile(self, fileReader): |
722 """initialise From File""" |
728 """initialise From File""" |
723 self.length = self.readFieldLength(fileReader) |
729 self.length = self.readFieldLength(fileReader) |
724 self.capabilities = fileReader.readBytesAsUint(self.length) |
730 self.capabilities = fileReader.readBytesAsUint(self.length) |
725 |
731 |
726 for i in range(20) : |
732 for i in range(20): |
727 if (self.capabilities >> i) & 0x01 : |
733 if (self.capabilities >> i) & 0x01: |
728 self.readableCaps.append(CapabilityNames[i]) |
734 self.readableCaps.append(CapabilityNames[i]) |
729 |
735 |
730 def readableStr(self) : |
736 def readableStr(self): |
731 """readable string""" |
737 """readable string""" |
732 return " ".join(self.readableCaps) |
738 return " ".join(self.readableCaps) |
733 |
739 |
734 SISFieldTypes = { |
740 SISFieldTypes = { |
735 1 : SISStringField, |
741 1: SISStringField, |
736 2 : SISArrayField, |
742 2: SISArrayField, |
737 3 : SISCompressedField, |
743 3: SISCompressedField, |
738 4 : SISVersionField, |
744 4: SISVersionField, |
739 5 : SISVersionRangeField, |
745 5: SISVersionRangeField, |
740 6 : SISDateField, |
746 6: SISDateField, |
741 7 : SISTimeField, |
747 7: SISTimeField, |
742 8 : SISDateTimeField, |
748 8: SISDateTimeField, |
743 9 : SISUidField, |
749 9: SISUidField, |
744 10 : SISUnsupportedField, |
750 10: SISUnsupportedField, |
745 11 : SISLanguageField, |
751 11: SISLanguageField, |
746 12 : SISContentsField, |
752 12: SISContentsField, |
747 13 : SISControllerField, |
753 13: SISControllerField, |
748 14 : SISInfoField, |
754 14: SISInfoField, |
749 15 : SISSupportedLanguagesField, |
755 15: SISSupportedLanguagesField, |
750 16 : SISSupportedOptionsField, |
756 16: SISSupportedOptionsField, |
751 17 : SISPrerequisitiesField, |
757 17: SISPrerequisitiesField, |
752 18 : SISDependencyField, |
758 18: SISDependencyField, |
753 19 : SISPropertiesField, |
759 19: SISPropertiesField, |
754 20 : SISPropertyField, |
760 20: SISPropertyField, |
755 21 : SISSignaturesField, |
761 21: SISSignaturesField, |
756 22 : SISCertificateChainField, |
762 22: SISCertificateChainField, |
757 23 : SISLogoField, |
763 23: SISLogoField, |
758 24 : SISFileDescriptionField, |
764 24: SISFileDescriptionField, |
759 25 : SISHashField, |
765 25: SISHashField, |
760 26 : SISIfField, |
766 26: SISIfField, |
761 27 : SISElseIfField, |
767 27: SISElseIfField, |
762 28 : SISInstallBlockField, |
768 28: SISInstallBlockField, |
763 29 : SISExpressionField, |
769 29: SISExpressionField, |
764 30 : SISDataField, |
770 30: SISDataField, |
765 31 : SISDataUnitField, |
771 31: SISDataUnitField, |
766 32 : SISFileDataField, |
772 32: SISFileDataField, |
767 33 : SISSupportedOptionField, |
773 33: SISSupportedOptionField, |
768 34 : SISControllerChecksumField, |
774 34: SISControllerChecksumField, |
769 35 : SISDataChecksumField, |
775 35: SISDataChecksumField, |
770 36 : SISSignatureField, |
776 36: SISSignatureField, |
771 37 : SISBlobField, |
777 37: SISBlobField, |
772 38 : SISSignatureAlgorithmField, |
778 38: SISSignatureAlgorithmField, |
773 39 : SISSignatureCertificateChainField, |
779 39: SISSignatureCertificateChainField, |
774 40 : SISDataIndexField, |
780 40: SISDataIndexField, |
775 41 : SISCapabilitiesField |
781 41: SISCapabilitiesField |
776 } |
782 } |
777 |
783 |
778 [StringField, |
784 [StringField, |
779 ArrayField, |
785 ArrayField, |
780 CompressedField, |
786 CompressedField, |
816 SignatureCertificateChainField, |
822 SignatureCertificateChainField, |
817 DataIndexField, |
823 DataIndexField, |
818 CapabilitiesField] = range(1, 42) |
824 CapabilitiesField] = range(1, 42) |
819 |
825 |
820 FieldNames = { |
826 FieldNames = { |
821 0 : "ROOT", |
827 0: "ROOT", |
822 StringField : "StringField", |
828 StringField: "StringField", |
823 ArrayField : "ArrayField", |
829 ArrayField: "ArrayField", |
824 CompressedField : "CompressedField", |
830 CompressedField: "CompressedField", |
825 VersionField : "VersionField", |
831 VersionField: "VersionField", |
826 VersionRangeField : "VersionRangeField", |
832 VersionRangeField: "VersionRangeField", |
827 DateField : "DateField", |
833 DateField: "DateField", |
828 TimeField : "TimeField", |
834 TimeField: "TimeField", |
829 DateTimeField : "DateTimeField", |
835 DateTimeField: "DateTimeField", |
830 UidField : "UidField", |
836 UidField: "UidField", |
831 UnusedField : "UnusedField", |
837 UnusedField: "UnusedField", |
832 LanguageField : "LanguageField", |
838 LanguageField: "LanguageField", |
833 ContentsField : "ContentsField", |
839 ContentsField: "ContentsField", |
834 ControllerField : "ControllerField", |
840 ControllerField: "ControllerField", |
835 InfoField : "InfoField", |
841 InfoField: "InfoField", |
836 SupportedLanguagesField : "SupportedLanguagesField", |
842 SupportedLanguagesField: "SupportedLanguagesField", |
837 SupportedOptionsField : "SupportedOptionsField", |
843 SupportedOptionsField: "SupportedOptionsField", |
838 PrerequisitiesField : "PrerequisitiesField", |
844 PrerequisitiesField: "PrerequisitiesField", |
839 DependencyField : "DependencyField", |
845 DependencyField: "DependencyField", |
840 PropertiesField : "PropertiesField", |
846 PropertiesField: "PropertiesField", |
841 PropertyField : "PropertyField", |
847 PropertyField: "PropertyField", |
842 SignaturesField : "SignaturesField", |
848 SignaturesField: "SignaturesField", |
843 CertificateChainField : "CertificateChainField", |
849 CertificateChainField: "CertificateChainField", |
844 LogoField : "LogoField", |
850 LogoField: "LogoField", |
845 FileDescriptionField : "FileDescriptionField", |
851 FileDescriptionField: "FileDescriptionField", |
846 HashField : "HashField", |
852 HashField: "HashField", |
847 IfField : "IfField", |
853 IfField: "IfField", |
848 ElseIfField : "ElseIfField", |
854 ElseIfField: "ElseIfField", |
849 InstallBlockField : "InstallBlockField", |
855 InstallBlockField: "InstallBlockField", |
850 ExpressionField : "ExpressionField", |
856 ExpressionField: "ExpressionField", |
851 DataField : "DataField", |
857 DataField: "DataField", |
852 DataUnitField : "DataUnitField", |
858 DataUnitField: "DataUnitField", |
853 FileDataField : "FileDataField", |
859 FileDataField: "FileDataField", |
854 SupportedOptionField : "SupportedOptionField", |
860 SupportedOptionField: "SupportedOptionField", |
855 ControllerChecksumField : "ControllerChecksumField", |
861 ControllerChecksumField: "ControllerChecksumField", |
856 DataChecksumField : "DataChecksumField", |
862 DataChecksumField: "DataChecksumField", |
857 SignatureField : "SignatureField", |
863 SignatureField: "SignatureField", |
858 BlobField : "BlobField", |
864 BlobField: "BlobField", |
859 SignatureAlgorithmField : "SignatureAlgorithmField", |
865 SignatureAlgorithmField: "SignatureAlgorithmField", |
860 SignatureCertificateChainField : "SignatureCertificateChainField", |
866 SignatureCertificateChainField: "SignatureCertificateChainField", |
861 DataIndexField : "DataIndexField", |
867 DataIndexField: "DataIndexField", |
862 CapabilitiesField : "CapabilitiesField" |
868 CapabilitiesField: "CapabilitiesField" |
863 } |
869 } |
864 |
870 |
865 CapabilityNames = { |
871 CapabilityNames = { |
866 0 : "TCB", |
872 0: "TCB", |
867 1 : "CommDD", |
873 1: "CommDD", |
868 2 : "PowerMgmt", |
874 2: "PowerMgmt", |
869 3 : "MultimediaDD", |
875 3: "MultimediaDD", |
870 4 : "ReadDeviceData", |
876 4: "ReadDeviceData", |
871 5 : "WriteDeviceData", |
877 5: "WriteDeviceData", |
872 6 : "DRM", |
878 6: "DRM", |
873 7 : "TrustedUI", |
879 7: "TrustedUI", |
874 8 : "ProtServ", |
880 8: "ProtServ", |
875 9 : "DiskAdmin", |
881 9: "DiskAdmin", |
876 10 : "NetworkControl", |
882 10: "NetworkControl", |
877 11 : "AllFiles", |
883 11: "AllFiles", |
878 12 : "SwEvent", |
884 12: "SwEvent", |
879 13 : "NetworkServices", |
885 13: "NetworkServices", |
880 14 : "LocalServices", |
886 14: "LocalServices", |
881 15 : "ReadUserData", |
887 15: "ReadUserData", |
882 16 : "WriteUserData", |
888 16: "WriteUserData", |
883 17 : "Location", |
889 17: "Location", |
884 18 : "SurroundingsDD", |
890 18: "SurroundingsDD", |
885 19 : "UserEnvironment" |
891 19: "UserEnvironment" |
886 } |
892 } |
887 |
893 |
888 InstallTypes = { |
894 InstallTypes = { |
889 0: "SA", |
895 0: "SA", |
890 1: "SP", |
896 1: "SP", |
891 2: "PU", |
897 2: "PU", |
892 3: "PA", |
898 3: "PA", |
893 4: "PP" |
899 4: "PP" |
894 } |
900 } |
895 |
901 |
896 class SISReader : |
902 class SISReader: |
897 """ SIS Reader """ |
903 """ SIS Reader """ |
898 def __init__(self) : |
904 def __init__(self): |
899 self.bytesRead = 0 |
905 self.bytesRead = 0 |
900 |
906 |
901 def readUnsignedBytes(self, numBytes) : |
907 def readUnsignedBytes(self, numBytes): |
902 """read Unsigned bytes""" |
908 """read Unsigned bytes""" |
903 buf = self.readPlainBytes(numBytes) |
909 buf = self.readPlainBytes(numBytes) |
904 if len(buf) < numBytes : |
910 if len(buf) < numBytes: |
905 return [] |
911 return [] |
906 |
912 |
907 format = "" |
913 format_ = "" |
908 for _ in range(numBytes) : |
914 for _ in range(numBytes): |
909 format += "B" |
915 format_ += "B" |
910 return struct.unpack(format, buf) |
916 return struct.unpack(format_, buf) |
911 |
917 |
912 def readSignedBytes(self, numBytes) : |
918 def readSignedBytes(self, numBytes): |
913 """read signed bytes""" |
919 """read signed bytes""" |
914 buf = self.readPlainBytes(numBytes) |
920 buf = self.readPlainBytes(numBytes) |
915 if len(buf) < numBytes : |
921 if len(buf) < numBytes: |
916 return [] |
922 return [] |
917 |
923 |
918 format = "" |
924 format_ = "" |
919 for _ in range(numBytes) : |
925 for _ in range(numBytes): |
920 format += "b" |
926 format_ += "b" |
921 return struct.unpack(format, buf) |
927 return struct.unpack(format_, buf) |
922 |
928 |
923 def readBytesAsUint(self, numBytes) : |
929 def readBytesAsUint(self, numBytes): |
924 """read bytes as Unit""" |
930 """read bytes as Unit""" |
925 result = 0 |
931 result = 0 |
926 bytes = self.readUnsignedBytes(numBytes) |
932 bytes_ = self.readUnsignedBytes(numBytes) |
927 if len(bytes) == numBytes : |
933 if len(bytes_) == numBytes: |
928 for i_byte in range(numBytes) : |
934 for i_byte in range(numBytes): |
929 result |= bytes[i_byte] << (i_byte * 8) |
935 result |= bytes_[i_byte] << (i_byte * 8) |
930 |
936 |
931 return result |
937 return result |
932 |
938 |
933 def readBytesAsInt(self, numBytes) : |
939 def readBytesAsInt(self, numBytes): |
934 """read bytes as Integer""" |
940 """read bytes as Integer""" |
935 result = 0 |
941 result = 0 |
936 bytes = self.readSignedBytes(numBytes) |
942 bytes_ = self.readSignedBytes(numBytes) |
937 if len(bytes) == numBytes : |
943 if len(bytes_) == numBytes: |
938 for i_byte in range(numBytes) : |
944 for i_byte in range(numBytes): |
939 result |= bytes[i_byte] << (i_byte * 8) |
945 result |= bytes_[i_byte] << (i_byte * 8) |
940 |
946 |
941 return result |
947 return result |
942 |
948 |
943 def skipPadding(self) : |
949 def skipPadding(self): |
944 """skip padding""" |
950 """skip padding""" |
945 result = 0 |
951 result = 0 |
946 if self.bytesRead % 4 != 0 : |
952 if self.bytesRead % 4 != 0: |
947 paddingLength = 4 - self.bytesRead % 4 |
953 paddingLength = 4 - self.bytesRead % 4 |
948 self.readPlainBytes(paddingLength) |
954 self.readPlainBytes(paddingLength) |
949 result = paddingLength |
955 result = paddingLength |
950 |
956 |
951 return result |
957 return result |
952 |
958 |
953 def readPlainBytes(self, numBytes) : |
959 def readPlainBytes(self, numBytes): |
954 """read plain bytes""" |
960 """read plain bytes""" |
955 pass |
961 pass |
956 |
962 |
957 class SISFileReader(SISReader) : |
963 class SISFileReader(SISReader): |
958 """ SIS File Reader """ |
964 """ SIS File Reader """ |
959 def __init__(self, inStream) : |
965 def __init__(self, inStream): |
960 SISReader.__init__(self) |
966 SISReader.__init__(self) |
961 self.inStream = inStream |
967 self.inStream = inStream |
962 self.eof = False |
968 self.eof = False |
963 self.bytesRead = 0 |
969 self.bytesRead = 0 |
964 |
970 |
965 def readPlainBytes(self, numBytes) : |
971 def readPlainBytes(self, numBytes): |
966 """read Plain byytes""" |
972 """read Plain byytes""" |
967 if self.eof : |
973 if self.eof: |
968 return "" |
974 return "" |
969 |
975 |
970 if numBytes == 0 : |
976 if numBytes == 0: |
971 return "" |
977 return "" |
972 |
978 |
973 buf = "" |
979 buf = "" |
974 buf = self.inStream.read(numBytes) |
980 buf = self.inStream.read(numBytes) |
975 if len(buf) < numBytes : |
981 if len(buf) < numBytes: |
976 self.eof = True |
982 self.eof = True |
977 return "" |
983 return "" |
978 |
984 |
979 self.bytesRead += numBytes |
985 self.bytesRead += numBytes |
980 |
986 |
981 return buf |
987 return buf |
982 |
988 |
983 def isEof(self) : |
989 def isEof(self): |
984 """is it End of File""" |
990 """is it End of File""" |
985 return self.eof |
991 return self.eof |
986 |
992 |
987 class SISBufferReader(SISReader) : |
993 class SISBufferReader(SISReader): |
988 """ SIS Buffer reader """ |
994 """ SIS Buffer reader """ |
989 def __init__(self, buffer) : |
995 def __init__(self, buffer_): |
990 self.buffer = buffer |
996 SISReader.__init__(self) |
|
997 self.buffer_ = buffer_ |
991 self.bytesRead = 0 |
998 self.bytesRead = 0 |
992 |
999 |
993 def readPlainBytes(self, numBytes) : |
1000 def readPlainBytes(self, numBytes): |
994 """read Plain bytes""" |
1001 """read Plain bytes""" |
995 if self.isEof() : |
1002 if self.isEof(): |
996 return "" |
1003 return "" |
997 |
1004 |
998 if numBytes == 0 : |
1005 if numBytes == 0: |
999 return "" |
1006 return "" |
1000 |
1007 |
1001 result = self.buffer[self.bytesRead:self.bytesRead + numBytes] |
1008 result = self.buffer_[self.bytesRead:self.bytesRead + numBytes] |
1002 |
1009 |
1003 self.bytesRead += numBytes |
1010 self.bytesRead += numBytes |
1004 |
1011 |
1005 return result |
1012 return result |
1006 |
1013 |
1007 def isEof(self) : |
1014 def isEof(self): |
1008 """is it End of File""" |
1015 """is it End of File""" |
1009 return self.bytesRead >= len(self.buffer) |
1016 return self.bytesRead >= len(self.buffer_) |
1010 |
1017 |
1011 class SISFieldParser : |
1018 class SISFieldParser: |
1012 """ Parser to read a SIS field """ |
1019 """ Parser to read a SIS field """ |
1013 def __init__(self) : |
1020 def __init__(self): |
1014 self.lastReadBytes = 0 |
1021 self.lastReadBytes = 0 |
1015 |
1022 |
1016 def parseField(self, fileReader) : |
1023 def parseField(self, fileReader): |
1017 """Reads the next field from the fileReader stream and returns it""" |
1024 """Reads the next field from the fileReader stream and returns it""" |
1018 field = None |
1025 field = None |
1019 self.lastReadBytes = 0 |
1026 self.lastReadBytes = 0 |
1020 type = fileReader.readBytesAsUint(4) |
1027 type_ = fileReader.readBytesAsUint(4) |
1021 self.lastReadBytes += 4 |
1028 self.lastReadBytes += 4 |
1022 if type != 0 : |
1029 if type_ != 0: |
1023 field = SISFieldTypes[type]() |
1030 field = SISFieldTypes[type_]() |
1024 field.type = type |
1031 field.type_ = type_ |
1025 field.initFromFile(fileReader) |
1032 field.initFromFile(fileReader) |
1026 self.lastReadBytes += field.length + 4 # Field length + length field |
1033 self.lastReadBytes += field.length + 4 # Field length + length field |
1027 self.lastReadBytes += fileReader.skipPadding() |
1034 self.lastReadBytes += fileReader.skipPadding() |
1028 return field |
1035 return field |
1029 |
1036 |
1030 class SISInfo(SISField) : |
1037 class SISInfo(SISField): |
1031 """ SIS file information """ |
1038 """ SIS file information """ |
1032 def __init__(self) : |
1039 def __init__(self): |
1033 SISField.__init__(self) |
1040 SISField.__init__(self) |
1034 self.fin = None |
1041 self.fin = None |
1035 self.fileHeader = SISFileHeader() |
1042 self.fileHeader = SISFileHeader() |
1036 |
1043 |
1037 def parse(self, filename) : |
1044 def parse(self, filename): |
1038 """parse""" |
1045 """parse""" |
1039 fin = open(filename, 'rb') |
1046 fin = open(filename, 'rb') |
1040 fileReader = SISFileReader(fin) |
1047 fileReader = SISFileReader(fin) |
1041 self.parseHeader(fileReader) |
1048 self.parseHeader(fileReader) |
1042 self.parseSISFields(fileReader) |
1049 self.parseSISFields(fileReader) |
1043 |
1050 |
1044 def parseHeader(self, fileReader) : |
1051 def parseHeader(self, fileReader): |
1045 """parse Holder""" |
1052 """parse Holder""" |
1046 self.fileHeader.uid1 = fileReader.readBytesAsUint(4) |
1053 self.fileHeader.uid1 = fileReader.readBytesAsUint(4) |
1047 self.fileHeader.uid2 = fileReader.readBytesAsUint(4) |
1054 self.fileHeader.uid2 = fileReader.readBytesAsUint(4) |
1048 self.fileHeader.uid3 = fileReader.readBytesAsUint(4) |
1055 self.fileHeader.uid3 = fileReader.readBytesAsUint(4) |
1049 self.fileHeader.uidChecksum = fileReader.readBytesAsUint(4) |
1056 self.fileHeader.uidChecksum = fileReader.readBytesAsUint(4) |
1050 |
1057 |
1051 def parseSISFields(self, fileReader) : |
1058 def parseSISFields(self, fileReader): |
1052 """parse SIS Fileds""" |
1059 """parse SIS Fileds""" |
1053 parser = SISFieldParser() |
1060 parser = SISFieldParser() |
1054 while not fileReader.isEof() : |
1061 while not fileReader.isEof(): |
1055 self.subFields.append(parser.parseField(fileReader)) |
1062 self.subFields.append(parser.parseField(fileReader)) |
1056 |
1063 |
1057 class Handler : |
1064 class Handler: |
1058 """ A handler class """ |
1065 """ A handler class """ |
1059 def __init__(self) : |
1066 def __init__(self): |
1060 self.files = [] |
1067 self.files = [] |
1061 self.fileDatas = [] |
1068 self.fileDatas = [] |
1062 self.signatureCertificateChains = [] |
1069 self.signatureCertificateChains = [] |
1063 |
1070 |
1064 def handleField(self, field, _) : |
1071 def handleField(self, field, _): |
1065 """handle Field""" |
1072 """handle Field""" |
1066 if field.type == FileDescriptionField : |
1073 if field.type_ == FileDescriptionField: |
1067 self.files.append(field) |
1074 self.files.append(field) |
1068 elif field.type == FileDataField : |
1075 elif field.type_ == FileDataField: |
1069 self.fileDatas.append(field) |
1076 self.fileDatas.append(field) |
1070 elif field.type == SignatureCertificateChainField : |
1077 elif field.type_ == SignatureCertificateChainField : |
1071 self.signatureCertificateChains.append(field) |
1078 self.signatureCertificateChains.append(field) |
1072 |
1079 |
1073 def execute(self, options) : |
1080 def execute(self, options): |
1074 """execute""" |
1081 """execute""" |
1075 for f_file in self.files : |
1082 for f_file in self.files: |
1076 if options.info : |
1083 if options.info: |
1077 buf = " " + f_file.findField(StringField)[0].readableStr() |
1084 buf = " " + f_file.findField(StringField)[0].readableStr() |
1078 caps = f_file.findField(CapabilitiesField)[0] |
1085 caps = f_file.findField(CapabilitiesField)[0] |
1079 if caps : |
1086 if caps: |
1080 buf += " [" + " ".join(f_file.findField(CapabilitiesField)[0].readableCaps) + "]" |
1087 buf += " [" + " ".join(f_file.findField(CapabilitiesField)[0].readableCaps) + "]" |
1081 print buf |
1088 print buf |
1082 if options.extract : |
1089 if options.extract: |
1083 parts = f_file.findField(StringField)[0].readableStr().split("\\") |
1090 parts = f_file.findField(StringField)[0].readableStr().split("\\") |
1084 if len(parts[len(parts) - 1]) > 0 : |
1091 if len(parts[len(parts) - 1]) > 0: |
1085 path = os.path.abspath(options.extract) |
1092 path = os.path.abspath(options.extract) |
1086 path += os.sep + os.sep.join(parts[1: - 1]) |
1093 path += os.sep + os.sep.join(parts[1: - 1]) |
1087 if not os.path.exists(path) : |
1094 if not os.path.exists(path): |
1088 os.makedirs(path) |
1095 os.makedirs(path) |
1089 newFile = file(path + os.sep + parts[len(parts) - 1], "wb") |
1096 newFile = file(path + os.sep + parts[len(parts) - 1], "wb") |
1090 newFile.write(self.fileDatas[f_file.fileIndex].findField(CompressedField)[0].data) |
1097 newFile.write(self.fileDatas[f_file.fileIndex].findField(CompressedField)[0].data) |
1091 newFile.close() |
1098 newFile.close() |
1092 for sig in self.signatureCertificateChains : |
1099 for sig in self.signatureCertificateChains: |
1093 if options.certificate: |
1100 if options.certificate: |
1094 buf = sig.findField(CertificateChainField)[0].subFields[0].data |
1101 buf = sig.findField(CertificateChainField)[0].subFields[0].data |
1095 print "Certificate chain:" |
1102 print "Certificate chain:" |
1096 i_num = 1 |
1103 i_num = 1 |
1097 while len(buf) > 0 : |
1104 while len(buf) > 0: |
1098 print " Certificate " + str(i_num) + ":" |
1105 print " Certificate " + str(i_num) + ":" |
1099 i_num += 1 |
1106 i_num += 1 |
1100 decoded = decoder.decode(buf) |
1107 decoded = decoder.decode(buf) |
1101 cer = CertificateInfo() |
1108 cer = CertificateInfo() |
1102 cer.parse(decoded[0]) |
1109 cer.parse(decoded[0]) |
1103 readableStr = cer.readableStr() |
1110 readableStr = cer.readableStr() |
1104 print " " + "\n ".join(readableStr.split('\n')) |
1111 print " " + "\n ".join(readableStr.split('\n')) |
1105 buf = decoded[1] |
1112 buf = decoded[1] |
1106 |
1113 |
1107 class ContentPrinter : |
1114 class ContentPrinter: |
1108 """ A handler class which prints the field contents """ |
1115 """ A handler class which prints the field contents """ |
1109 def __init__(self) : |
1116 def __init__(self): |
1110 pass |
1117 pass |
1111 |
1118 |
1112 def handleField(self, field, depth) : |
1119 def handleField(self, field, depth): |
1113 """handle Field""" |
1120 """handle Field""" |
1114 buf = "" |
1121 buf = "" |
1115 for _ in range(depth) : |
1122 for _ in range(depth): |
1116 buf += " " |
1123 buf += " " |
1117 buf += FieldNames[field.type] + " " |
1124 buf += FieldNames[field.type_] + " " |
1118 if len(field.readableStr()) > 0 : |
1125 if len(field.readableStr()) > 0: |
1119 buf += field.readableStr() |
1126 buf += field.readableStr() |
1120 print buf |
1127 print buf |
1121 |
1128 |
1122 class IADHandler : |
1129 class IADHandler: |
1123 """ IAD handler class """ |
1130 """ IAD handler class """ |
1124 def __init__(self) : |
1131 def __init__(self): |
1125 self.packageVersion = (0, 0, 0) |
1132 self.packageVersion = (0, 0, 0) |
1126 self.packageUid = 0 |
1133 self.packageUid = 0 |
1127 self.vendorName = "" |
1134 self.vendorName = "" |
1128 self.packageNames = [] |
1135 self.packageNames = [] |
1129 self.packageNamesFields = [] |
1136 self.packageNamesFields = [] |
1130 self.languages = [] |
1137 self.languages = [] |
1131 self.platformDependencies = [] |
1138 self.platformDependencies = [] |
1132 self.packageDependencies = [] |
1139 self.packageDependencies = [] |
1133 self.installType = 0 |
1140 self.installType = 0 |
1134 self.installFlags = 0 |
1141 self.installFlags = 0 |
1135 |
1142 self.packageVersionField = None |
1136 def handleDependency(self, field) : |
1143 self.packageUidField = None |
|
1144 self.vendorNameField = None |
|
1145 |
|
1146 def handleDependency(self, field): |
1137 """handle dependancy""" |
1147 """handle dependancy""" |
1138 dep = [0, - 1, - 1, - 1, - 1, - 1, - 1] |
1148 dep = [0, - 1, - 1, - 1, - 1, - 1, - 1] |
1139 dep[0] = field.subFields[0].uid |
1149 dep[0] = field.subFields[0].uid |
1140 if field.subFields[1] and field.subFields[1].type == VersionRangeField : |
1150 if field.subFields[1] and field.subFields[1].type_ == VersionRangeField: |
1141 res = field.subFields[1] |
1151 res = field.subFields[1] |
1142 if res.fromVersion != None : |
1152 if res.fromVersion != None: |
1143 dep[1] = res.fromVersion.version[0] |
1153 dep[1] = res.fromVersion.version[0] |
1144 dep[2] = res.fromVersion.version[1] |
1154 dep[2] = res.fromVersion.version[1] |
1145 dep[3] = res.fromVersion.version[2] |
1155 dep[3] = res.fromVersion.version[2] |
1146 if res.toVersion != None : |
1156 if res.toVersion != None: |
1147 dep[4] = res.toVersion.version[0] |
1157 dep[4] = res.toVersion.version[0] |
1148 dep[5] = res.toVersion.version[1] |
1158 dep[5] = res.toVersion.version[1] |
1149 dep[6] = res.toVersion.version[2] |
1159 dep[6] = res.toVersion.version[2] |
1150 return dep |
1160 return dep |
1151 |
1161 |
1152 def handleField(self, field, _) : |
1162 def handleField(self, field, _): |
1153 """handle Field""" |
1163 """handle Field""" |
1154 if field.type == InfoField : |
1164 if field.type_ == InfoField: |
1155 self.packageVersion = field.subFields[4].version |
1165 self.packageVersion = field.subFields[4].version |
1156 self.packageVersionField = field.subFields[4] |
1166 self.packageVersionField = field.subFields[4] |
1157 self.packageUid = field.subFields[0].uid |
1167 self.packageUid = field.subFields[0].uid |
1158 self.packageUidField = field.subFields[0] |
1168 self.packageUidField = field.subFields[0] |
1159 self.vendorName = field.subFields[1].data |
1169 self.vendorName = field.subFields[1].data |
1160 self.vendorNameField = field.subFields[1] |
1170 self.vendorNameField = field.subFields[1] |
1161 self.installType = field.installType |
1171 self.installType = field.installType |
1162 self.installFlags = field.installFlags |
1172 self.installFlags = field.installFlags |
1163 for name in field.subFields[2].subFields : |
1173 for name in field.subFields[2].subFields: |
1164 self.packageNames.append(name.data) |
1174 self.packageNames.append(name.data) |
1165 elif field.type == LanguageField : |
1175 elif field.type_ == LanguageField: |
1166 self.languages.append(field.language) |
1176 self.languages.append(field.language) |
1167 elif field.type == PrerequisitiesField : |
1177 elif field.type_ == PrerequisitiesField: |
1168 for f_field in field.subFields[0].subFields : |
1178 for f_field in field.subFields[0].subFields: |
1169 dependency = self.handleDependency(f_field) |
1179 dependency = self.handleDependency(f_field) |
1170 self.platformDependencies.append(dependency) |
1180 self.platformDependencies.append(dependency) |
1171 for f_field in field.subFields[1].subFields : |
1181 for f_field in field.subFields[1].subFields: |
1172 dependency = self.handleDependency(f_field) |
1182 dependency = self.handleDependency(f_field) |
1173 self.packageDependencies.append(dependency) |
1183 self.packageDependencies.append(dependency) |
1174 |
1184 |
1175 def getInfo (self, fileName) : |
1185 def getInfo (self, fileName): |
1176 """get Info""" |
1186 """get Info""" |
1177 sisInfo = SISInfo() |
1187 sisInfo = SISInfo() |
1178 sisInfo.parse(fileName) |
1188 sisInfo.parse(fileName) |
1179 handler = IADHandler() |
1189 handler = IADHandler() |
1180 sisInfo.traverse(handler) |
1190 sisInfo.traverse(handler) |