parse_sessionsstore.py
| changeset 20: |
b6b0e9bc226d |
| author: |
Greg Darke <greg+laptop@tsukasa.net.au> |
| date: |
Thu Apr 16 00:45:45 2009 +1000 (15 months ago) |
| permissions: |
-rwxr-xr-x |
| description: |
Ignore some stuff |
2# Copyright 2008 Greg Darke <greg+laptop@tsukasa.net.au> 3# Licensed for distribution under the GPL version 2, check COPYING for details 4# Program to parse Firefox 3's sessionstore.js file (the list of webpages to restore) 8class ParseException(Exception): 11class JSBooleanTrue(object): 18 assert data.popleft() == 't' 19 assert data.popleft() == 'r' 20 assert data.popleft() == 'u' 21 assert data.popleft() == 'e' 24class JSBooleanFalse(object): 31 assert data.popleft() == 'f' 32 assert data.popleft() == 'a' 33 assert data.popleft() == 'l' 34 assert data.popleft() == 's' 35 assert data.popleft() == 'e' 38class JSDigits(object): 45 assert data[0].isdigit() 48 while data[0].isdigit(): 49 ret.append(data.popleft()) 51 return int(''.join(ret)) 53class JSDoubleString(object): 60 assert data.popleft() == '"' 64 ret.append(data.popleft()) 65 assert data.popleft() == '"' 76 VALID_VALUES = (JSDict, ) 77 assert data.popleft() == '[' 81 for valueType in VALID_VALUES: 82 if valueType.isValidStart(data[0]): 83 value = valueType.parse(data) 86 raise ParseException, 'Unknown valueType start "%s"' % (data[0], ) 91 data.popleft() # There are more entries 97 assert data.popleft() == ']' 100class JSDictIdentifier(object): 101 _validChars = "_abcdefghijklmnopqrstuvwxyABCDEFGHIJKLMNOPQRSTUVWXYZ'" 103 def isValidStart(cls, ch): 104 return ch in cls._validChars 107 def parse(cls, data): 108 if data[0] not in cls._validChars: 109 raise ParseException, 'Expected character, but got "%s"' % (data[0], ) 112 if data[0] == "'": # Data is quoted 113 assert data.popleft() == "'" 114 while data[0] != "'": 115 ret.append(data.popleft()) 116 assert data.popleft() == "'" 118 while data[0] != ':': 119 ret.append(data.popleft()) 125 def isValidStart(ch): 135 JSBooleanTrue, JSBooleanFalse, 137 assert data.popleft() == '{' 145 identifier = JSDictIdentifier.parse(data) 146 assert data.popleft() == ':' 148 for valueType in VALID_VALUES: 149 if valueType.isValidStart(data[0]): 150 value = valueType.parse(data) 153 raise ParseException, 'Unknown valueType start %s' % (data[0], ) 155 if identifier in ret: 156 raise ParseException, 'The identifier "%s" is already in the dict' % (identifier, ) 158 ret[identifier] = value 160 data.popleft() # There are more entires 161 while data[0] == ' ': 166 assert data.popleft() == '}' 170def parseSessionStore(data): 171 data = collections.deque(data) 172 assert data.popleft() == '(' 173 ret = JSDict.parse(data) 174 assert data.popleft() == ')' 175 assert len(data) == 0 181 cgitb.enable(format='text') 183 pprint.pprint(parseSessionStore(file(filename).read())) 185if __name__ == "__main__": 188 filename = sys.argv[1] 190 print >>sys.stderr, 'Usage: %s path_to_sessionstore.js' % (sys.argv[0], ) 194__all__ = ('parseSessionStore', )