Xit is a Python program that applies XOR to files. It's not designed to be used for cryptographic stuff, unless you know what you're doing or you want to hide from your little sister.
https://sbgodin.fr/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.3 KiB
79 lines
2.3 KiB
import re |
|
|
|
class Sha1File: |
|
""" Manages file names such as "name-{5}.txt" """ |
|
|
|
DIGEST_LEN = 40 |
|
|
|
def __init__(self, fileName): |
|
self._fileName = fileName |
|
res = re.findall(r'{(\d+)}', fileName) |
|
self._ok = bool(res) and len(res)==1 and int(res[0])>0 |
|
self._occurences = int(res[0]) if self._ok else None |
|
self._left, self._right = re.split(r'{\d+}', fileName) if self._ok else (None, None) |
|
|
|
def __bool__(self): return self._ok |
|
|
|
def __repr__(self): return self._fileName |
|
|
|
def __int__(self): return self._occurences |
|
|
|
def __len__(self): |
|
if self._ok: |
|
return self.DIGEST_LEN + len(self._left+self._right) |
|
else: |
|
return len(self._fileName) |
|
|
|
def nameWithSha1(self, sha1): |
|
assert(len(sha1)==self.DIGEST_LEN) |
|
return self._left + sha1 + self._right |
|
|
|
|
|
class StrKey: |
|
""" Manages string key parameters enclosed by underscores such _string key_ """ |
|
|
|
def __init__(self, strKey): |
|
m = re.match('^_(.+)_$', strKey) |
|
self._ok, self._value = (True, m.group(1)) if m else (False, None) |
|
|
|
def __bool__(self): return self._ok |
|
|
|
def __repr__(self): return self._value |
|
|
|
def __len__(self): return len(self._value) |
|
|
|
|
|
def evalMultiple(size): |
|
""" Takes size as "123k" and return "123000", same for m, g, and t. |
|
1024 multiples are also supported: ki, mi, gi, ti |
|
Raises ValueError if size malformed |
|
""" |
|
|
|
size = ''.join(size.split()).lower() # remove any blank caracter |
|
multiples = {"ki":1024, "mi":1024**2, "gi":1024**3, "ti":1024**4, |
|
"k":1000, "m":1000**2, "g":1000**3, "t":1000**4, } |
|
for m in multiples: |
|
if size.endswith(m): |
|
size = int(size[:-len(m)]) * multiples[m] |
|
break |
|
return int(size) |
|
|
|
|
|
def splitList(L, needle): |
|
""" Splits a list in chuncks around the needle |
|
[1,2,3], 2 --> [ [1], [3] ] |
|
[1,2,2,3], 2 --> [ [1], [], [3] ] |
|
[2,1,2], 2 --> [ [], [1], [] ] |
|
[4,5,6], 2 --> [ [4, 5, 6] ] |
|
""" |
|
output, lastPos = [], 0 |
|
while True: |
|
try: |
|
pos = L.index(needle, lastPos) |
|
output.append(L[lastPos:pos]) |
|
lastPos = pos+1 |
|
except ValueError: |
|
output.append(L[lastPos:]) |
|
break |
|
return output |
|
|
|
|