class GPGEncryption(): def __init__(self, encrypt_or_decrypt, iterable = None, user = None, passphrase = None, test_branch = False): self.test_branch = test_branch cmd = 'gpg -a -r ' + user + ' -e' #cmd = 'cat' self.total_sent = 0 self.term_char = chr(0) self.chunk_size = CHUNK_SIZE self.stream_iter = iterable self.stream_iter_read = iterable.read self.gpg_closed = False self.padded = False self.finished_read = False self.first_read = True #shared variable between threads self.finished_write = False self.p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds = True, bufsize = CHUNK_SIZE) self.my_buffer = '' self.finished_write = False self.finished_read = False self.semaphore = threading.Semaphore() def print_errors(self): print self.p.readerr() def stringIterate(self, text, chunk_size): index = 0 while index < len(text): yield text[index : index + chunk_size] index += chunk_size def padder(self, text, div, pad = chr(0)): size = (div - len(text) % div) + len(text) diff = size - len(text) text += pad * diff return text def readFromStream(self, read_size): chunk = self.stream_iter_read(read_size) while chunk: self.p.stdin.write(chunk) chunk = self.stream_iter_read(read_size) self.p.stdin.close() def read(self, read_size): read_size = self.chunk_size if self.first_read: self.first_read = False t = Thread(target = self.readFromStream, args = (read_size, )) t.start() chunk = self.p.stdout.read(read_size) if chunk and len(chunk) < read_size: chunk = self.padder(chunk, read_size) self.total_sent += len(chunk) #print 'returning chunk = ' + str(len(chunk)) return chunk