cli search
This commit is contained in:
parent
54cd707836
commit
c9460a5e49
18
impra/cli.py
18
impra/cli.py
|
@ -49,7 +49,7 @@ transfert process is transparent. Just vizualize locally the index of
|
|||
stored files and simply select files to download or upload.
|
||||
ImpraStorage automatically launch the parts to download, then merge parts
|
||||
in the appropriate way to rebuild the original file. Inversely, a file
|
||||
to upload is splitt -in several parts with addition of noise data), and
|
||||
to upload is split (in several parts with addition of noise data), and
|
||||
ImpraStorage randomly upload each parts then update the index.
|
||||
|
||||
"""
|
||||
|
@ -250,9 +250,12 @@ you can remove index but all presents files on the box %s will be unrecoverable
|
|||
if uid == None : uid = 'EMPTY'
|
||||
if date == None : date = ''
|
||||
if impst.index != None:
|
||||
impst.index.print(True,'-'*120+'\n -- INDEX(`'+uid+'`) boxname :`'+impst.rootBox+'` '+date+'\n'+'-'*120)
|
||||
impst.index.print('-'*120+'\n -- INDEX(`'+uid+'`) boxname :`'+impst.rootBox+'` '+date+'\n'+'-'*120)
|
||||
#encData = impst.index.impraEncrypt(impst.index.toString())
|
||||
#~ dd = """coucou mon joli coeur :*:* je s"""
|
||||
#~ dd = """coucou mon joli coeur :*:* je sais que je te saoule avec ça mais bon putain tu va te planter ou merde"""
|
||||
#~ dd = """01234567890123456789012345678901234567890123456789#"""
|
||||
#~
|
||||
#~
|
||||
#~ kg = crypt.KeyGen(256)
|
||||
#~ print('-- key --')
|
||||
#~ print(kg.key)
|
||||
|
@ -260,7 +263,7 @@ you can remove index but all presents files on the box %s will be unrecoverable
|
|||
#~ print(kg.mark)
|
||||
#~ km = crypt.Kirmah(kg.key, kg.mark)
|
||||
#~ encData = km.encrypt(dd,'.index',22)
|
||||
#~ print('*'+encData+'*')
|
||||
#~ #print('*'+encData+'*')
|
||||
#~ decData = km.decrypt(encData,'.index',22)
|
||||
#~ print('*'+decData+'*')
|
||||
|
||||
|
@ -277,8 +280,11 @@ you can remove index but all presents files on the box %s will be unrecoverable
|
|||
else: print(o.get_by_id+' a is not valid id')
|
||||
|
||||
elif o.search :
|
||||
print(o.search)
|
||||
|
||||
label = impst.index.searchByPattern(o.search)
|
||||
if label==None:
|
||||
print(' -- no match found for pattern `%s` --' % o.search)
|
||||
else:
|
||||
impst.index.print('-'*120+'\n -- SEARCH: `'+o.search+'` -- found '+str(len(label))+' results --\n'+'-'*120,label)
|
||||
elif o.remove :
|
||||
print(o.remove)
|
||||
|
||||
|
|
158
impra/core.py
158
impra/core.py
|
@ -37,16 +37,17 @@ from email.mime.base import MIMEBase
|
|||
from email.mime.multipart import MIMEMultipart
|
||||
from email.mime.text import MIMEText
|
||||
from email.utils import formatdate
|
||||
from json import dump as jdump, load as jload, dumps as jdumps, loads as jloads
|
||||
from math import ceil, floor
|
||||
from mmap import mmap
|
||||
from os import remove, urandom, sep
|
||||
from os.path import abspath, dirname, join, realpath, basename, getsize, splitext
|
||||
from re import split as regsplit
|
||||
from re import split as regsplit, match as regmatch, compile as regcompile, search as regsearch
|
||||
from impra.imap import ImapHelper, ImapConfig
|
||||
from impra.util import __CALLER__, RuTime, formatBytes, randomFrom, bstr, quote_escape, stack, run, file_exists, get_file_content
|
||||
from impra.util import __CALLER__, RuTime, formatBytes, randomFrom, bstr, quote_escape, stack, run, file_exists, get_file_content, DEBUG, DEBUG_ALL, DEBUG_LEVEL, DEBUG_NOTICE, DEBUG_WARN
|
||||
from impra.crypt import Kirmah, ConfigKey, Noiser, Randomiz, hash_sha256
|
||||
|
||||
DEBUG = True
|
||||
|
||||
|
||||
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
@ -59,10 +60,9 @@ class FSplitter :
|
|||
""""""
|
||||
self.ck = ck
|
||||
self.wkdir = wkdir
|
||||
self.DIR_CACHE = self.wkdir+sep+'cache'+sep
|
||||
self.DIR_INBOX = self.wkdir+sep+'inbox'+sep
|
||||
self.DIR_OUTBOX = self.wkdir+sep+'outbox'+sep
|
||||
self.DIR_DEPLOY = self.wkdir+sep+'deploy'+sep
|
||||
self.DIR_INBOX = join(self.wkdir,'inbox')+sep
|
||||
self.DIR_OUTBOX = join(self.wkdir,'outbox')+sep
|
||||
self.DIR_DEPLOY = join(self.wkdir,'deploy')+sep
|
||||
|
||||
def addFile(self, fromPath, label, fixCount = False):
|
||||
""""""
|
||||
|
@ -70,8 +70,8 @@ class FSplitter :
|
|||
fsize = getsize(fromPath)
|
||||
count = ceil(fsize/self.ck.psize)
|
||||
minp, maxp = 52, 62
|
||||
if fsize < 4800000 : minp, maxp = 8, 12
|
||||
elif fsize < 22200000 : minp, maxp = 12, 22
|
||||
if fsize < 4800000 : minp, maxp = 8, 16
|
||||
elif fsize < 22200000 : minp, maxp = 16, 22
|
||||
elif fsize < 48000000 : minp, maxp = 22, 32
|
||||
elif fsize < 222000000 : minp, maxp = 32, 42
|
||||
if not fixCount :
|
||||
|
@ -91,7 +91,7 @@ class FSplitter :
|
|||
m = mmap(f.fileno(), 0)
|
||||
p = 0
|
||||
psize = ceil(getsize(fromPath)/hlst['head'][1])
|
||||
print(str(psize))
|
||||
print(formatBytes(psize)+' '+str(len(hlst['data']))+' parts')
|
||||
while m.tell() < m.size():
|
||||
self._splitPart(m,p,psize,hlst['data'][p])
|
||||
p += 1
|
||||
|
@ -217,30 +217,16 @@ class ImpraIndex:
|
|||
`mark` : str
|
||||
appropriate mark to check correct key
|
||||
`encdata` : str
|
||||
initial content of the index encrypted with rsa
|
||||
initial content of the index encrypted with Kirmah Algorythm
|
||||
and representing a dic index as json string
|
||||
"""
|
||||
self.km = Kirmah(key, mark)
|
||||
self.dic = {}
|
||||
self.id = id
|
||||
if encdata =='' : data = encdata
|
||||
else : data = self.decrypt(encdata)
|
||||
data = data.replace(self.QUOTE_REPL, '\'')
|
||||
ld = regsplit('\n?\r? ?'+self.SEP_CATEGORY+' ?\n\r??',data)
|
||||
l = regsplit(self.SEP_ITEM,ld[0])
|
||||
for row in l:
|
||||
d = regsplit(self.SEP_TOKEN,row)
|
||||
del d[7:]
|
||||
# key : count, hash, ext, usr, cat
|
||||
if len(d)>5 and d!='':
|
||||
self.dic[d[1]] = d
|
||||
if len(ld)>1:
|
||||
l = regsplit(self.SEP_ITEM,ld[1].lstrip('\n\r'))
|
||||
for row in l:
|
||||
d = regsplit(' ?= ?',row,1)
|
||||
if len(d)> 1 and len(d[0]) > 3 :
|
||||
self.dic[d[0].lstrip('\n\r')] = d[1]
|
||||
else:
|
||||
for k in dicCategory :
|
||||
if encdata =='' : self.dic = {}
|
||||
else : self.dic = self.decrypt(encdata)
|
||||
for k in dicCategory :
|
||||
if not self.SEP_KEY_INTERN+k in self.dic:
|
||||
self.dic[self.SEP_KEY_INTERN+k] = dicCategory[k]
|
||||
|
||||
def add(self,key, label, count, ext='', usr='', cat=''):
|
||||
|
@ -253,6 +239,22 @@ class ImpraIndex:
|
|||
else :
|
||||
print(label+' already exist')
|
||||
|
||||
def addUser(self, nameFrom, hashName):
|
||||
""""""
|
||||
if not self.SEP_KEY_INTERN+'users' in self.dic:
|
||||
self.dic[self.SEP_KEY_INTERN+'users'] = {}
|
||||
if not hashName in self.dic[self.SEP_KEY_INTERN+'users']:
|
||||
self.dic[self.SEP_KEY_INTERN+'users'][hashName] = nameFrom
|
||||
|
||||
def getUser(self, hashName):
|
||||
""""""
|
||||
usrName = 'Anonymous'
|
||||
if not str(self.SEP_KEY_INTERN+'users') in self.dic:
|
||||
self.dic[self.SEP_KEY_INTERN+'users'] = {}
|
||||
elif hashName in self.dic[self.SEP_KEY_INTERN+'users']:
|
||||
usrName = self.dic[self.SEP_KEY_INTERN+'users'][hashName]
|
||||
return usrName
|
||||
|
||||
def rem(self,label):
|
||||
"""Remove the selected label from the index"""
|
||||
self.dic.pop(label, None)
|
||||
|
@ -263,50 +265,63 @@ class ImpraIndex:
|
|||
|
||||
def searchById(self,sid):
|
||||
"""Search the corresponding label in the index"""
|
||||
rt = RuTime(eval(__CALLER__()))
|
||||
rt = RuTime(eval(__CALLER__(sid)))
|
||||
l = None
|
||||
r = [v for i, v in enumerate(self.dic) if self.dic[v][6] == str(sid)]
|
||||
if len(r)>0: l = r[0]
|
||||
r = [v for i, v in enumerate(self.dic) if not v.startswith(self.SEP_KEY_INTERN) and self.dic[v][6] == int(sid)]
|
||||
if len(r)==1: l = r[0]
|
||||
rt.stop()
|
||||
return l
|
||||
|
||||
def toString(self, withoutCatg=False, idFirst=False):
|
||||
def searchByPattern(self,pattern):
|
||||
""""""
|
||||
rt = RuTime(eval(__CALLER__(pattern)))
|
||||
l = None
|
||||
r = [ v for i,v in enumerate(self.dic) if not v.startswith(self.SEP_KEY_INTERN) and regsearch(pattern,self.dic[v][1]) is not None ]
|
||||
l = [self.dic[k][6] for k in r]
|
||||
rt.stop()
|
||||
return l
|
||||
|
||||
def toString(self,matchIds):
|
||||
"""Make a string representation of the index as it was store on the server"""
|
||||
data = cdata = ''
|
||||
for k in sorted(self.dic):
|
||||
data = ''
|
||||
r = [k for i, k in enumerate(self.dic) if not k.startswith(self.SEP_KEY_INTERN)]
|
||||
for k in r :
|
||||
v = self.dic.get(k)
|
||||
k = k.lstrip('\n\r')
|
||||
if k[0]==self.SEP_KEY_INTERN and len(k)>1:
|
||||
cdata += k+'='+v+self.SEP_ITEM
|
||||
else :
|
||||
if not idFirst :
|
||||
for i in v:
|
||||
data += str(i)+self.SEP_TOKEN
|
||||
else :
|
||||
if not k[0]==self.SEP_KEY_INTERN and len(k)>1:
|
||||
if matchIds==None or v[6] in matchIds:
|
||||
data += str(v[6]).rjust(1+ceil(len(str(v[6]))/10),' ')+' '
|
||||
data += str(v[0])[0:42]+'... '
|
||||
data += str(v[1]).ljust(30,' ')+' '
|
||||
for i in v[2:-1]:
|
||||
data += str(i)+' '
|
||||
data = data.rstrip(self.SEP_TOKEN)+self.SEP_ITEM
|
||||
if not withoutCatg :
|
||||
data += self.SEP_CATEGORY+'\n'+cdata
|
||||
data += str(v[0])[0:12]+'... '
|
||||
data += str(v[1]).ljust(42,' ')+' '
|
||||
data += str(v[2]).rjust(2,'0')+' '
|
||||
data += str(v[3]).ljust(5,' ')+' '
|
||||
data += self.getUser(str(v[4])).ljust(15,' ')+' '
|
||||
data += str(v[5])+' '
|
||||
#~ elif len(k)>1:
|
||||
#~ print(k,'=',v)
|
||||
data = data+self.SEP_ITEM
|
||||
return data;
|
||||
|
||||
def encrypt(self):
|
||||
""""""
|
||||
return self.km.encrypt(self.toString().replace('\'', self.QUOTE_REPL),'.index',22)
|
||||
#~ print('encrypting index :')
|
||||
jdata = jdumps(self.dic)
|
||||
#~ print(jdata)
|
||||
return self.km.encrypt(jdata,'.index',22)
|
||||
|
||||
def decrypt(self,data):
|
||||
""""""
|
||||
if data!='': data = self.km.decrypt(data,'.index',22)
|
||||
#~ print('decrypting index : ')
|
||||
jdata = self.km.decrypt(data,'.index',22)
|
||||
#~ print(jdata)
|
||||
data = jloads(jdata)
|
||||
return data
|
||||
|
||||
def print(self,withoutCatg=False, header=''):
|
||||
def print(self,header='', matchIds=None):
|
||||
"""Print index content as formated bloc"""
|
||||
data = self.toString(withoutCatg,True).split(';')
|
||||
data = self.toString(matchIds).split(self.SEP_ITEM)
|
||||
print(header)
|
||||
print('id'+' '*2+'hash'+' '*43+'label'+' '*26+'part'+' '*2+'type'+' '*3+'from'+' '*11+'category')
|
||||
print('id'+' '*2+'hash'+' '*13+'label'+' '*40+'part'+' '*2+'type'+' '*2+'owner'+' '*12+'category')
|
||||
print('-'*120)
|
||||
for row in data:
|
||||
if row.rstrip('\n') != '': print(row)
|
||||
|
@ -366,25 +381,27 @@ class ImpraStorage:
|
|||
|
||||
def getIndex(self):
|
||||
""""""
|
||||
rt = RuTime(eval(__CALLER__()))
|
||||
from impra.util import DEBUG, DEBUG_LEVEL, DEBUG_WARN, DEBUG_INFO
|
||||
rt = RuTime(eval(__CALLER__()),DEBUG_INFO)
|
||||
index = None
|
||||
encData = ''
|
||||
uid = self.conf.get('uid' ,'index')
|
||||
date = self.conf.get('date','index')
|
||||
nid = self.conf.get('nid' ,'index')
|
||||
if nid==None : nid = 0
|
||||
if uid !=None : print(uid+' - '+date+' - ['+(str(nid))+']')
|
||||
self._getIdIndex()
|
||||
if self.idx :
|
||||
# getFromFile
|
||||
if uid != None and int(self.idx) == int(uid) and file_exists(self.pathInd):
|
||||
encData = get_file_content(self.pathInd)
|
||||
print('cache')
|
||||
print(' index in cache')
|
||||
else:
|
||||
encData = self._getCryptIndex()
|
||||
with open(self.pathInd, mode='w', encoding='utf-8') as o:
|
||||
o.write(encData)
|
||||
index = ImpraIndex(self.conf.get('key','keys'),self.conf.get('mark','keys'), encData, {'catg':self.conf.get('types','catg')}, int(nid))
|
||||
usrName = self.conf.get('name','infos')
|
||||
usrHash = self.mb.getHashName(usrName)
|
||||
index = ImpraIndex(self.conf.get('key','keys'),self.conf.get('mark','keys'), encData, {'catg':self.conf.get('types','catg'), 'users':{ ('%s' % self.mb.getHashName('all')) : 'all', ('%s' % usrHash) : usrName}}, int(nid))
|
||||
rt.stop()
|
||||
return index
|
||||
|
||||
|
@ -397,14 +414,14 @@ class ImpraStorage:
|
|||
|
||||
def saveIndex(self):
|
||||
""""""
|
||||
global DEBUG
|
||||
rt = RuTime(eval(__CALLER__()))
|
||||
from impra.util import DEBUG, DEBUG_LEVEL, DEBUG_NOTICE, DEBUG_WARN, DEBUG_INFO
|
||||
rt = RuTime(eval(__CALLER__()),DEBUG_INFO)
|
||||
if self.idx != None :
|
||||
self.ih.delete(self.idx, True)
|
||||
for i in self.delids : self.ih.delete(i, True)
|
||||
encData = self.index.encrypt()
|
||||
msgIndex = self.mb.buildIndex(encData)
|
||||
if DEBUG: print(msgIndex.as_string())
|
||||
if DEBUG and DEBUG_LEVEL <= DEBUG_NOTICE : print(msgIndex.as_string())
|
||||
ids = self.ih.send(msgIndex.as_string(), self.rootBox)
|
||||
date = self.ih.headerField('date', ids[1], True)
|
||||
self.conf.set('uid',ids[1],'index')
|
||||
|
@ -417,8 +434,8 @@ class ImpraStorage:
|
|||
|
||||
def addFile(self, path, label, usr='all', catg=''):
|
||||
""""""
|
||||
global DEBUG
|
||||
rt = RuTime(eval(__CALLER__('"%s","%s","%s"' % (path[:13]+'...',label,usr))))
|
||||
from impra.util import DEBUG, DEBUG_LEVEL, DEBUG_NOTICE, DEBUG_WARN, DEBUG_INFO
|
||||
rt = RuTime(eval(__CALLER__('"%s","%s","%s"' % (path[:13]+'...',label,usr))),DEBUG_INFO)
|
||||
|
||||
#~ hlst = self.fsplit.addFile(path,label)
|
||||
#~ self.fsplit.deployFile(hlst,True)
|
||||
|
@ -426,11 +443,13 @@ class ImpraStorage:
|
|||
try:
|
||||
if self.index.search(label)==None :
|
||||
hlst = self.fsplit.addFile(path,label)
|
||||
if DEBUG :
|
||||
if DEBUG and DEBUG_LEVEL <= DEBUG_NOTICE :
|
||||
print(hlst['head'])
|
||||
for v in hlst['data']:
|
||||
print(v)
|
||||
nameFrom = self.conf.ini.get('name',self.conf.profile+'.infos')
|
||||
nameFrom = self.conf.get('name','infos')
|
||||
self.index.addUser(nameFrom, self.mb.getHashName(nameFrom))
|
||||
|
||||
for row in hlst['data'] :
|
||||
msg = self.mb.build(nameFrom,usr,hlst['head'][2],self.fsplit.DIR_OUTBOX+row[1]+'.ipr')
|
||||
self.ih.send(msg.as_string(), self.rootBox)
|
||||
|
@ -446,8 +465,9 @@ class ImpraStorage:
|
|||
|
||||
def getFile(self,label):
|
||||
""""""
|
||||
global DEBUG
|
||||
rt = RuTime(eval(__CALLER__('"%s"' % label)))
|
||||
from impra.util import DEBUG, DEBUG_LEVEL, DEBUG_NOTICE, DEBUG_WARN, DEBUG_INFO
|
||||
|
||||
rt = RuTime(eval(__CALLER__('"%s"' % label)),DEBUG_INFO)
|
||||
if label==None :
|
||||
print(str(label)+' unexist')
|
||||
else :
|
||||
|
@ -463,7 +483,7 @@ class ImpraStorage:
|
|||
if to == self.mb.getHashName('all')+'@'+self.mb.DOMAIN_NAME or to == self.mb.getHashName(self.conf.ini.get('name',self.conf.profile+'.infos'))+'@'+self.mb.DOMAIN_NAME :
|
||||
for mid in ids :
|
||||
self.ih.downloadAttachment(mid,self.fsplit.DIR_INBOX)
|
||||
if DEBUG :
|
||||
if DEBUG and DEBUG_LEVEL <= DEBUG_NOTICE :
|
||||
print(hlst['head'])
|
||||
for v in hlst['data']:
|
||||
print(v)
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
# You should have received a copy of the GNU General Public License
|
||||
# along with ImpraStorage. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from impra.util import RuTime, __CALLER__, stack
|
||||
from impra.util import RuTime, __CALLER__, stack, DEBUG
|
||||
from base64 import urlsafe_b64encode, b64decode
|
||||
from binascii import b2a_base64, a2b_base64
|
||||
from hashlib import sha256
|
||||
|
@ -219,17 +219,19 @@ class Kirmah:
|
|||
dataEnc = ''
|
||||
psize = ceil(len(data)/cpart)
|
||||
cp = 0
|
||||
|
||||
for row in hlst['data']:
|
||||
#~ print(row)
|
||||
#~ print('ns:%i - dataLength:%i - dataEncLength:%i - ne:%i' % (row[2],len(data), len(dataEnc), row[3]))
|
||||
#~ print(data[cp*psize:cp*psize+psize])
|
||||
dataEnc += self.ck.noiser.getNoise(row[2],True)+data[cp*psize:cp*psize+psize]+self.ck.noiser.getNoise(row[3],True)
|
||||
cp += 1
|
||||
|
||||
dataEnc = str(b2a_base64(bytes(dataEnc,'utf-8')),'utf-8')
|
||||
rt.stop()
|
||||
|
||||
#~ dataEnc = self.subenc(odata)
|
||||
with open('./.KirmahENC', mode='w') as o:
|
||||
o.write(dataEnc)
|
||||
|
||||
rt.stop()
|
||||
return dataEnc
|
||||
|
||||
def decrypt(self, data, label, cpart):
|
||||
|
@ -244,24 +246,31 @@ class Kirmah:
|
|||
rsz += row[2]+row[3]
|
||||
|
||||
psize = ceil((len(data)-rsz)/cpart)
|
||||
|
||||
for row in hlst['data']:
|
||||
si = ni + row[2]
|
||||
ei = si + psize
|
||||
#~ print(row)
|
||||
#~ print('si:%i - ei:%i - datalength:%i - dataDeclength:%i' % (si,ei,len(data),len(dataDec)))
|
||||
if cp == cpart-1 :
|
||||
ei = -row[3]
|
||||
if si > len(data)+ei :
|
||||
if not si > len(data)+ei : pass
|
||||
### to delete #si = len(data)+ei
|
||||
#~ print('si:%i - ei:%i' % (si,ei))
|
||||
else :
|
||||
#~ print('si: - ei:%i' % (len(data)+ei-si))
|
||||
dataDec=dataDec[:len(data)+ei-si]
|
||||
break
|
||||
si = len(data)+ei
|
||||
#~ print(data[si:ei])
|
||||
dataDec += data[si:ei]
|
||||
ni = ei + row[3]
|
||||
cp += 1
|
||||
dataDec = self.subdec(dataDec)
|
||||
|
||||
#~ dataDec = self.subdec(data)
|
||||
|
||||
with open('./.KirmahDEC', mode='w') as o:
|
||||
o.write(dataDec)
|
||||
rt.stop()
|
||||
#~ dataDec = self.subdec(data)
|
||||
return dataDec
|
||||
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
|
|
@ -298,20 +298,23 @@ class ImapHelper:
|
|||
|
||||
def deleteBin(self):
|
||||
""""""
|
||||
from impra.util import DEBUG_NOTICE, DEBUG, DEBUG_LEVEL
|
||||
rt = RuTime(eval(__CALLER__()))
|
||||
self.srv.select(self.BOX_BIN)
|
||||
ids = self.search('ALL',True)
|
||||
if len(ids) > 0 and ids[0]!='' and ids[0]!=None:
|
||||
#print(str(ids[0],'utf-8').split())
|
||||
for mid in ids:
|
||||
print('deleting msg '+str(mid))
|
||||
#~ uid = bytes(mid)
|
||||
#~ print(type(mid))
|
||||
#~ print(mid)
|
||||
#status, resp = self.srv.store(mid, '+FLAGS', '\\Deleted')
|
||||
status, resp = self.srv.uid('store', mid, '+FLAGS', '\\Deleted' )
|
||||
print(status)
|
||||
print(resp)
|
||||
|
||||
if DEBUG and DEBUG_LEVEL <= DEBUG_NOTICE:
|
||||
print('deleting msg '+str(mid))
|
||||
print(status)
|
||||
print(resp)
|
||||
self.srv.expunge()
|
||||
self.srv.select(self.rootBox)
|
||||
rt.stop()
|
||||
|
@ -331,12 +334,13 @@ class ImapHelper:
|
|||
|
||||
def downloadAttachment(self, msg, toDir='./'):
|
||||
""""""
|
||||
rt = RuTime(eval(__CALLER__('%i' % int(msg))))
|
||||
from impra.util import DEBUG, DEBUG_LEVEL, DEBUG_NOTICE, DEBUG_INFO
|
||||
rt = RuTime(eval(__CALLER__('%i' % int(msg))),DEBUG_INFO)
|
||||
if not isinstance(msg, Message) :
|
||||
msg = self.email(msg)
|
||||
for part in msg.walk():
|
||||
filename = part.get_filename()
|
||||
if filename != None : print(filename)
|
||||
if filename != None and DEBUG and DEBUG_LEVEL <= DEBUG_NOTICE : print(filename)
|
||||
if part.get_content_maintype() == 'multipart' or not filename : continue
|
||||
fp = open(join(toDir, filename), 'wb')
|
||||
#print(part.get_payload(decode=True)[::-1])
|
||||
|
@ -346,7 +350,8 @@ class ImapHelper:
|
|||
|
||||
def send(self, msg, box='INBOX'):
|
||||
""""""
|
||||
rt = RuTime(eval(__CALLER__()))
|
||||
from impra.util import DEBUG_INFO
|
||||
rt = RuTime(eval(__CALLER__()),DEBUG_INFO)
|
||||
mid = None
|
||||
date = Time2Internaldate(time())
|
||||
status, resp = self.srv.append(box, '\Draft', date, bytes(msg,'utf-8'))
|
||||
|
|
144
impra/util.py
144
impra/util.py
|
@ -41,7 +41,13 @@ from inspect import stack
|
|||
from subprocess import PIPE, Popen
|
||||
from sys import stderr, executable as pyexec
|
||||
|
||||
DEBUG_ALL = 0
|
||||
DEBUG_WARN = 1
|
||||
DEBUG_NOTICE = 2
|
||||
DEBUG_INFO = 3
|
||||
|
||||
DEBUG = True
|
||||
DEBUG_LEVEL = DEBUG_INFO
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
# ~~ methods ~~
|
||||
|
||||
|
@ -150,92 +156,42 @@ def __CALLER__(args=''):
|
|||
|
||||
:Returns: `str`
|
||||
"""
|
||||
global DEBUG_LEVEL, DEBUG, DEBUG_WARN
|
||||
#~ print(inspect.stack()[1][3])
|
||||
#~ print(print(args))
|
||||
#~ print('-----')
|
||||
#~ print(inspect.stack())
|
||||
#~ print('---------------')
|
||||
val = "self.__class__.__name__+'.%s' % stack()[1][3]+'("+quote_escape(args)+") l:'+str(stack()[1][2])"
|
||||
val = "self.__class__.__name__+'.%s' % stack()[1][3]+'("+quote_escape(args)+") "
|
||||
if DEBUG and DEBUG_LEVEL<=DEBUG_WARN : val += "l:'+str(stack()[1][2])"
|
||||
else: val += "'"
|
||||
return val
|
||||
|
||||
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
# ~~ class Noiser ~~
|
||||
|
||||
class Noiser:
|
||||
""""""
|
||||
|
||||
KEY_LEN = 256
|
||||
""""""
|
||||
|
||||
def __init__(self, key, part=0):
|
||||
""""""
|
||||
|
||||
#~ if len(key)!=self.KEY_LEN :
|
||||
#~ raise Exception('Invalid Pass length')
|
||||
#~ else :
|
||||
self.key = key
|
||||
self.build(part)
|
||||
|
||||
def build(self, part):
|
||||
""""""
|
||||
if not part < self.KEY_LEN-1 : raise Exception('part exceed limit')
|
||||
else :
|
||||
self.part, v = part, 0
|
||||
v = int(ceil((self.key[22]+v)/4.20583))
|
||||
self.lns = int(ceil(v/2))-self.key[self.part]+self.key[7]
|
||||
self.lne = int(v-self.lns-self.key[self.part+2]-self.key[44]/2.1934)
|
||||
|
||||
def getNoise(self, l):
|
||||
""""""
|
||||
return urandom(l)
|
||||
|
||||
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
# ~~ class Randomiz ~~
|
||||
|
||||
class Randomiz:
|
||||
""""""
|
||||
|
||||
def __init__(self,count,chl=None):
|
||||
""""""
|
||||
if chl ==None : self.lst = list(range(0,count))
|
||||
else: self.lst = chl
|
||||
self.count = len(self.lst)
|
||||
|
||||
def new(self,count=None, chl=None):
|
||||
""""""
|
||||
if count : self.count = count
|
||||
self.__init__(self.count,chl)
|
||||
|
||||
def get(self,single=True):
|
||||
""""""
|
||||
pos = choice(self.lst)
|
||||
if single: del self.lst[self.lst.index(pos)]
|
||||
return pos
|
||||
|
||||
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
# ~~ class RuTime ~~
|
||||
|
||||
class RuTime:
|
||||
"""Give basics time stats"""
|
||||
|
||||
def __init__(self,label):
|
||||
def __init__(self,label,lvl=DEBUG_NOTICE):
|
||||
"""Initialize duration with appropriate label"""
|
||||
self.label = label
|
||||
from impra.util import DEBUG, DEBUG_LEVEL, DEBUG_INFO
|
||||
self.debug = DEBUG and DEBUG_LEVEL <= lvl
|
||||
self.debugStart = self.debug and lvl < DEBUG_INFO
|
||||
self.lvl = lvl
|
||||
self.label = label
|
||||
self._start()
|
||||
|
||||
def _start(self):
|
||||
from impra.core import DEBUG
|
||||
if DEBUG :print(' ==> '+self.label)
|
||||
|
||||
if self.debugStart :print(' ==> '+self.label)
|
||||
self.sc = time()
|
||||
|
||||
def stop(self):
|
||||
"""Stop duration and print basics stats duration on console"""
|
||||
from impra.core import DEBUG
|
||||
self.ec = time()
|
||||
if DEBUG:self._stats()
|
||||
if self.debug: self._stats()
|
||||
|
||||
def _stats(self):
|
||||
print(' <== '+self.label+(' [%.9f s]' % (self.ec - self.sc)))
|
||||
|
@ -340,68 +296,6 @@ class IniFile:
|
|||
class BadKeysException(BaseException):
|
||||
pass
|
||||
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
# ~~ class Rsa ~~
|
||||
|
||||
class Rsa:
|
||||
""""""
|
||||
|
||||
def __init__(self, prvKey=None, pubKey=None, dpath='./', forceKeyGen=False):
|
||||
""""""
|
||||
self.cpath = join(dirname(dirname(realpath(__file__))),'desurveil','scripts')+sep
|
||||
self.prvKey = prvKey
|
||||
self.pubKey = pubKey
|
||||
self.dpath = realpath(dpath)+sep
|
||||
if prvKey == None or pubKey==None : self.key(forceKeyGen)
|
||||
|
||||
def key(self,force=False):
|
||||
""""""
|
||||
cmd = self.cpath+'desurveil key -a '+self.dpath+'.impra_id_rsa -l '+self.dpath+'.impra_id_rsa.pub'
|
||||
try :
|
||||
with open(self.dpath+'.impra_id_rsa','rt') as f: pass
|
||||
if force:d = popen(cmd).read()
|
||||
except IOError as e:
|
||||
d = popen(pyexec+' '+cmd).read()
|
||||
#print(pyexec+' '+cmd)
|
||||
self.prvKey = get_file_content(self.dpath+'.impra_id_rsa')
|
||||
self.pubKey = get_file_content(self.dpath+'.impra_id_rsa.pub')
|
||||
#~ print('pubKey : \n'+self.pubKey)
|
||||
#~ print('prvKey : \n'+self.prvKey)
|
||||
|
||||
def encrypt(self,data):
|
||||
""""""
|
||||
key = ''
|
||||
#if self.pubKey != None : key = ' -CI "'+self.pubKey+'"'
|
||||
if self.pubKey != None : key = ' -C "'+self.dpath+'.impra_id_rsa.pub"'
|
||||
with open(self.dpath+'.tmpdecd', mode='w', encoding='utf-8') as o:
|
||||
o.write(data)
|
||||
cmd = self.cpath+'desurveil encrypt "'+self.dpath+'.tmpdecd'+'" '+key
|
||||
#print(pyexec+' '+cmd)
|
||||
rs = run(pyexec+' '+cmd)
|
||||
if rs[0]==1:
|
||||
print(rs)
|
||||
raise BadKeysException('bad key to encrypt')
|
||||
else :
|
||||
encData = str(rs[1],'utf-8')
|
||||
return encData
|
||||
|
||||
def decrypt(self,data):
|
||||
""""""
|
||||
key = ''
|
||||
#if self.prvKey != None : key = ' -CI "'+self.prvKey+'"'
|
||||
if self.prvKey != None : key = ' -C "'+self.dpath+'.impra_id_rsa"'
|
||||
with open(self.dpath+'.tmpencd', mode='w', encoding='utf-8') as o:
|
||||
o.write(data)
|
||||
cmd = self.cpath+'desurveil decrypt "'+self.dpath+'.tmpencd'+'" '+key
|
||||
#print(pyexec+' '+cmd)
|
||||
rs = run(pyexec+' '+cmd)
|
||||
if rs[0]==1:
|
||||
print(rs)
|
||||
raise BadKeysException('bad key to decrypt')
|
||||
else :
|
||||
decData = str(rs[1],'utf-8')
|
||||
return decData
|
||||
|
||||
|
||||
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
# ~~ class StrIterator ~~
|
||||
|
|
|
@ -27,44 +27,12 @@
|
|||
# along with ImpraStorage. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from impra.core import ImpraConf, ImpraStorage
|
||||
from impra.util import IniFile, Rsa, RuTime, get_file_path
|
||||
from impra.util import IniFile, RuTime, get_file_path
|
||||
from impra.cli import Cli
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
Cli(get_file_path(__file__ ))
|
||||
#~ rt = RuTime(__name__+'()')
|
||||
#~ conf = ImpraConf(IniFile('./impra.ini'))
|
||||
#~ rsa = Rsa(conf.ini.get('prvKey',conf.profile+'.keys'),conf.ini.get('pubKey',conf.profile+'.keys'))
|
||||
#~ impst = ImpraStorage(rsa, conf)
|
||||
#~
|
||||
#~ print('\n -- INDEX DATA -- ')
|
||||
#~ impst.index.print()
|
||||
#~ print('-- LIST BOX --')
|
||||
#~ lb = impst.ih.listBox('/')
|
||||
#~ print(lb)
|
||||
#~
|
||||
#~ #print('-- DELETE BIN --')
|
||||
#~ #impst.ih.deleteBin()
|
||||
#~
|
||||
#~ filePath = '/media/Data/dev/big_toph3.jpg'
|
||||
#~
|
||||
#~ lab = 'Meuf\'bonne aussi4'
|
||||
#~
|
||||
#~ print('\n -- ADD FILE -- ')
|
||||
#~ impst.addFile(filePath,lab,conf.ini.get('name',conf.profile+'.infos'),'images')
|
||||
#~
|
||||
#~ print('\n -- GET FILE -- ')
|
||||
#~ impst.getFile(lab)
|
||||
#~
|
||||
#~ print('\n -- INDEX DATA -- ')
|
||||
#~ impst.index.print()
|
||||
#~
|
||||
#~ print('\n -- CLEAN -- ')
|
||||
#~ impst.clean()
|
||||
#~
|
||||
#~ rt.stop()
|
||||
|
||||
#python -O -m compileall impra/*.py
|
||||
|
|
Loading…
Reference in New Issue
Block a user