source: titan/mediathek/localhoster/lib/jjdecode.py @ 38962

Last change on this file since 38962 was 38962, checked in by obi, 6 years ago

localhoster add needed libs

File size: 12.9 KB
Line 
1#!/usr/bin/env python
2#
3# Python version of the jjdecode function written by Syed Zainudeen
4# http://csc.cs.utm.my/syed/images/files/jjdecode/jjdecode.html
5#
6# +NCR/CRC! [ReVeRsEr] - crackinglandia@gmail.com
7# Thanks to Jose Miguel Esparza (@EternalTodo) for the final push to make it work!
8#
9
10import re
11
12class JJDecoder(object):
13
14    def __init__(self, jj_encoded_data):
15        self.encoded_str = jj_encoded_data
16
17    def clean(self):
18        return re.sub('^\s+|\s+$', '', self.encoded_str)
19
20    def checkPalindrome(self, Str):
21        startpos = -1
22        endpos = -1
23        gv, gvl = -1, -1
24
25        index = Str.find('"\'\\"+\'+",')
26
27        if index == 0:
28            startpos = Str.find('$$+"\\""+') + 8
29            endpos = Str.find('"\\"")())()')
30            gv = Str[Str.find('"\'\\"+\'+",') + 9:Str.find('=~[]')]
31            gvl = len(gv)
32        else:
33            gv = Str[0:Str.find('=')]
34            gvl = len(gv)
35            startpos = Str.find('"\\""+') + 5
36            endpos = Str.find('"\\"")())()')
37
38        return (startpos, endpos, gv, gvl)
39
40    def decode(self):
41
42        self.encoded_str = self.clean()
43        startpos, endpos, gv, gvl = self.checkPalindrome(self.encoded_str)
44
45        if startpos == endpos:
46            raise Exception('No data!')
47
48        data = self.encoded_str[startpos:endpos]
49
50        b = ['___+', '__$+', '_$_+', '_$$+', '$__+', '$_$+', '$$_+', '$$$+', '$___+', '$__$+', '$_$_+', '$_$$+', '$$__+', '$$_$+', '$$$_+', '$$$$+']
51
52        str_l = '(![]+"")[' + gv + '._$_]+'
53        str_o = gv + '._$+'
54        str_t = gv + '.__+'
55        str_u = gv + '._+'
56
57        str_hex = gv + '.'
58
59        str_s = '"'
60        gvsig = gv + '.'
61
62        str_quote = '\\\\\\"'
63        str_slash = '\\\\\\\\'
64
65        str_lower = '\\\\"+'
66        str_upper = '\\\\"+' + gv + '._+'
67
68        str_end = '"+'
69
70        out = ''
71        while data != '':
72            # l o t u
73            if data.find(str_l) == 0:
74                data = data[len(str_l):]
75                out += 'l'
76                continue
77            elif data.find(str_o) == 0:
78                data = data[len(str_o):]
79                out += 'o'
80                continue
81            elif data.find(str_t) == 0:
82                data = data[len(str_t):]
83                out += 't'
84                continue
85            elif data.find(str_u) == 0:
86                data = data[len(str_u):]
87                out += 'u'
88                continue
89
90            # 0123456789abcdef
91            if data.find(str_hex) == 0:
92                data = data[len(str_hex):]
93
94                for i in range(len(b)):
95                    if data.find(b[i]) == 0:
96                        data = data[len(b[i]):]
97                        out += '%x' % i
98                        break
99                continue
100
101            # start of s block
102            if data.find(str_s) == 0:
103                data = data[len(str_s):]
104
105                # check if "R
106                if data.find(str_upper) == 0:  # r4 n >= 128
107                    data = data[len(str_upper):]  # skip sig
108                    ch_str = ''
109                    for i in range(2):  # shouldn't be more than 2 hex chars
110                        # gv + "."+b[ c ]
111                        if data.find(gvsig) == 0:
112                            data = data[len(gvsig):]
113                            for k in range(len(b)):  # for every entry in b
114                                if data.find(b[k]) == 0:
115                                    data = data[len(b[k]):]
116                                    ch_str = '%x' % k
117                                    break
118                        else:
119                            break
120
121                    out += chr(int(ch_str, 16))
122                    continue
123
124                elif data.find(str_lower) == 0:  # r3 check if "R // n < 128
125                    data = data[len(str_lower):]  # skip sig
126
127                    ch_str = ''
128                    ch_lotux = ''
129                    temp = ''
130                    b_checkR1 = 0
131                    for j in range(3):  # shouldn't be more than 3 octal chars
132                        if j > 1:  # lotu check
133                            if data.find(str_l) == 0:
134                                data = data[len(str_l):]
135                                ch_lotux = 'l'
136                                break
137                            elif data.find(str_o) == 0:
138                                data = data[len(str_o):]
139                                ch_lotux = 'o'
140                                break
141                            elif data.find(str_t) == 0:
142                                data = data[len(str_t):]
143                                ch_lotux = 't'
144                                break
145                            elif data.find(str_u) == 0:
146                                data = data[len(str_u):]
147                                ch_lotux = 'u'
148                                break
149
150                        # gv + "."+b[ c ]
151                        if data.find(gvsig) == 0:
152                            temp = data[len(gvsig):]
153                            for k in range(8):  # for every entry in b octal
154                                if temp.find(b[k]) == 0:
155                                    if int(ch_str + str(k), 8) > 128:
156                                        b_checkR1 = 1
157                                        break
158
159                                    ch_str += str(k)
160                                    data = data[len(gvsig):]  # skip gvsig
161                                    data = data[len(b[k]):]
162                                    break
163
164                            if b_checkR1 == 1:
165                                if data.find(str_hex) == 0:  # 0123456789abcdef
166                                    data = data[len(str_hex):]
167                                    # check every element of hex decode string for a match
168                                    for i in range(len(b)):
169                                        if data.find(b[i]) == 0:
170                                            data = data[len(b[i]):]
171                                            ch_lotux = '%x' % i
172                                            break
173                                    break
174                        else:
175                            break
176
177                    out += chr(int(ch_str, 8)) + ch_lotux
178                    continue
179
180                else:  # "S ----> "SR or "S+
181                    # if there is, loop s until R 0r +
182                    # if there is no matching s block, throw error
183
184                    match = 0
185                    n = None
186
187                    # searching for matching pure s block
188                    while True:
189                        n = ord(data[0])
190                        if data.find(str_quote) == 0:
191                            data = data[len(str_quote):]
192                            out += '"'
193                            match += 1
194                            continue
195                        elif data.find(str_slash) == 0:
196                            data = data[len(str_slash):]
197                            out += '\\'
198                            match += 1
199                            continue
200                        elif data.find(str_end) == 0:  # reached end off S block ? +
201                            if match == 0:
202                                raise '+ no match S block: ' + data
203                            data = data[len(str_end):]
204                            break  # step out of the while loop
205                        elif data.find(str_upper) == 0:  # r4 reached end off S block ? - check if "R n >= 128
206                            if match == 0:
207                                raise 'no match S block n>128: ' + data
208                            data = data[len(str_upper):]  # skip sig
209
210                            ch_str = ''
211                            ch_lotux = ''
212
213                            for j in range(10):  # shouldn't be more than 10 hex chars
214                                if j > 1:  # lotu check
215                                    if data.find(str_l) == 0:
216                                        data = data[len(str_l):]
217                                        ch_lotux = 'l'
218                                        break
219                                    elif data.find(str_o) == 0:
220                                        data = data[len(str_o):]
221                                        ch_lotux = 'o'
222                                        break
223                                    elif data.find(str_t) == 0:
224                                        data = data[len(str_t):]
225                                        ch_lotux = 't'
226                                        break
227                                    elif data.find(str_u) == 0:
228                                        data = data[len(str_u):]
229                                        ch_lotux = 'u'
230                                        break
231
232                                # gv + "."+b[ c ]
233                                if data.find(gvsig) == 0:
234                                    data = data[len(gvsig):]  # skip gvsig
235                                    for k in range(len(b)):  # for every entry in b
236                                        if data.find(b[k]) == 0:
237                                            data = data[len(b[k]):]
238                                            ch_str += '%x' % k
239                                            break
240                                else:
241                                    break  # done
242                            out += chr(int(ch_str, 16))
243                            break  # step out of the while loop
244                        elif data.find(str_lower) == 0:  # r3 check if "R // n < 128
245                            if match == 0:
246                                raise 'no match S block n<128: ' + data
247
248                            data = data[len(str_lower):]  # skip sig
249
250                            ch_str = ''
251                            ch_lotux = ''
252                            temp = ''
253                            b_checkR1 = 0
254
255                            for j in range(3):  # shouldn't be more than 3 octal chars
256                                if j > 1:  # lotu check
257                                    if data.find(str_l) == 0:
258                                        data = data[len(str_l):]
259                                        ch_lotux = 'l'
260                                        break
261                                    elif data.find(str_o) == 0:
262                                        data = data[len(str_o):]
263                                        ch_lotux = 'o'
264                                        break
265                                    elif data.find(str_t) == 0:
266                                        data = data[len(str_t):]
267                                        ch_lotux = 't'
268                                        break
269                                    elif data.find(str_u) == 0:
270                                        data = data[len(str_u):]
271                                        ch_lotux = 'u'
272                                        break
273
274                                # gv + "."+b[ c ]
275                                if data.find(gvsig) == 0:
276                                    temp = data[len(gvsig):]
277                                    for k in range(8):  # for every entry in b octal
278                                        if temp.find(b[k]) == 0:
279                                            if int(ch_str + str(k), 8) > 128:
280                                                b_checkR1 = 1
281                                                break
282
283                                            ch_str += str(k)
284                                            data = data[len(gvsig):]  # skip gvsig
285                                            data = data[len(b[k]):]
286                                            break
287
288                                    if b_checkR1 == 1:
289                                        if data.find(str_hex) == 0:  # 0123456789abcdef
290                                            data = data[len(str_hex):]
291                                            # check every element of hex decode string for a match
292                                            for i in range(len(b)):
293                                                if data.find(b[i]) == 0:
294                                                    data = data[len(b[i]):]
295                                                    ch_lotux = '%x' % i
296                                                    break
297                                else:
298                                    break
299                            out += chr(int(ch_str, 8)) + ch_lotux
300                            break  # step out of the while loop
301                        elif (0x21 <= n and n <= 0x2f) or (0x3A <= n and n <= 0x40) or (0x5b <= n and n <= 0x60) or (0x7b <= n and n <= 0x7f):
302                            out += data[0]
303                            data = data[1:]
304                            match += 1
305                    continue
306            print 'No match : ' + data
307            break
308        return out
Note: See TracBrowser for help on using the repository browser.