mirror of
https://github.com/ChronosX88/PyNesca.git
synced 2024-10-18 14:41:00 +00:00
47 lines
1.8 KiB
Python
47 lines
1.8 KiB
Python
|
from core.prototypes.AbstractAddressGenerator import AbstractAddressGenerator
|
||
|
from core.prototypes.AbstractModuleClass import internal
|
||
|
|
||
|
class GDocsAddressGenerator(AbstractAddressGenerator):
|
||
|
def set_parsed_fields(self, prefix:"gdocs_prefix",
|
||
|
ranges:"gdocs_hash_ranges") -> None:
|
||
|
self.alphabet = list(
|
||
|
'-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz'
|
||
|
)
|
||
|
self.revsymbols = {symb:i for i, symb in enumerate(self.alphabet)}
|
||
|
self.prefix = prefix
|
||
|
self.ranges = ranges
|
||
|
self.hashlen = len(ranges[0][0])
|
||
|
self.currange = self.ranges.pop(0)
|
||
|
|
||
|
@internal
|
||
|
def hash2int(self, gdhash):
|
||
|
alen = len(self.alphabet)
|
||
|
res = 0
|
||
|
for symb in gdhash:
|
||
|
res *= alen
|
||
|
res += self.revsymbols[symb]
|
||
|
return res
|
||
|
|
||
|
@internal
|
||
|
def int2hash(self, hint):
|
||
|
alen = len(self.alphabet)
|
||
|
reshash = [self.alphabet[0]]*self.hashlen
|
||
|
for i in range(-1, -self.hashlen-1, -1):
|
||
|
hint, rest = divmod(hint, alen)
|
||
|
reshash[i] = self.alphabet[rest]
|
||
|
return "".join(reshash)
|
||
|
|
||
|
def get_next_address(self, prev_url:'url') -> {"url"}:
|
||
|
if not prev_url:
|
||
|
return {'url':self.prefix + self.currange[0]}
|
||
|
prev_hash = prev_url[prev_url.rfind('/') + 1:]
|
||
|
if self.hash2int(self.currange[1]) <= self.hash2int(prev_hash):
|
||
|
if not self.ranges: return None
|
||
|
self.currange = self.ranges.pop(0)
|
||
|
return {'url' : self.prefix + self.currange[0]}
|
||
|
return {'url' : self.prefix + self.int2hash(self.hash2int(prev_hash) +
|
||
|
1)}
|
||
|
|
||
|
def get_all_addresses(self) -> {'gdocs_prefix', 'gdocs_hash_ranges'}:
|
||
|
return {'gdocs_prefix':self.prefix, 'gdocs_hash_ranges': self.ranges}
|