Пример #1
0
class RibbitResponse:
	"""
	A response to a RibbitRequest.

	The request that created that response is available on the .request attribute.
	"""

	def __init__(
		self, request: RibbitRequest, data: bytes, *, verify: bool = True
	) -> None:
		self.request = request
		self.data = data
		self.date = datetime.utcnow()

		self.message = BytesParser().parsebytes(data)  # type: ignore # (typeshed#2502)
		self.checksum = parse_checksum(self.message.epilogue)

		# The bytes of everything except the checksum (the epilogue)
		# The checksum is of those bytes
		self.content_bytes = data[:-len(self.message.epilogue)]
		if verify:
			content_checksum = sha256(self.content_bytes).hexdigest()
			if self.checksum != content_checksum:
				raise IntegrityVerificationError("ribbit response", content_checksum, self.checksum)

		self.content = self.message.get_payload(0).get_payload()
		self.signature = self.message.get_payload(1).get_payload()
Пример #2
0
    def get_eml(self, file_path):
        with open(file_path, 'rb') as emlFile:
            msg = BytesParser(policy=policy.default).parse(emlFile)

            if msg.get_body(preferencelist='html') is not None:
                body = msg.get_body(preferencelist='html').get_content()
            elif msg.get_payload(decode=True) is not None:
                body = msg.get_payload(decode=True).decode('UTF-8')
            else:
                body = ''
            body = re.split('-*\s*Original Message', body)[0]
            pattern = '<head.*/head>|<style.*/style>|<!-.+?->|<.+?>|&nbsp;|\t|\r|\u200b'
            body = re.sub(pattern, '', body, 0, re.I | re.S)
            # body = ' '.join(body.splitlines())

            return msg['Date'], msg['Subject'], body
Пример #3
0
 def split_email(self, raw_email):
     parsed_email = BytesParser().parsebytes(raw_email)
     to_keep = []
     attachments = []
     if parsed_email.is_multipart():
         for p in parsed_email.get_payload():
             if p.get_filename():
                 filename = decode_header(p.get_filename())
                 if filename[0][1]:
                     filename = filename[0][0].decode(filename[0][1])
                 else:
                     filename = filename[0][0]
                 attachments.append(File(p.get_payload(decode=True), filename))
             else:
                 to_keep.append(p)
     else:
         to_keep.append(parsed_email.get_payload())
     return to_keep, attachments, parsed_email
Пример #4
0
 def split_email(self, raw_email):
     parsed_email = BytesParser().parsebytes(raw_email)
     to_keep = []
     attachments = []
     if parsed_email.is_multipart():
         for p in parsed_email.get_payload():
             if p.get_filename():
                 filename = decode_header(p.get_filename())
                 if filename[0][1]:
                     filename = filename[0][0].decode(filename[0][1])
                 else:
                     filename = filename[0][0]
                 attachments.append(File(p.get_payload(decode=True), filename))
             else:
                 to_keep.append(p)
     else:
         to_keep.append(parsed_email.get_payload())
     return to_keep, attachments, parsed_email
Пример #5
0
def download_eml_attachment(eml_file, dest_path, move_eml=True):
    is_success = False
    attachment_counter = 0
    dir_path = os.path.dirname(os.path.realpath(__file__))
    with open(eml_file, 'rb') as fp:
        msg = BytesParser(policy=policy.default).parse(fp)
        count_attachments = len(msg.get_payload())
        if count_attachments > 0:
            for i in range(1, len(msg.get_payload())):
                attachment = msg.get_payload()[i]
                attachment_name = attachment.get_filename()
                attachment_name = attachment_name.replace("\t", "")
                print(attachment_name)
                try:
                    open(attachment_name,
                         'wb').write(attachment.get_payload(decode=True))
                    attachment_name_old = attachment_name
                    attachment_name = attachment_name.replace(",", "")
                    attachment_name = attachment_name.replace("&", "")
                    attachment_name = attachment_name.replace(";", "")
                    ext = attachment_name.split(".")[-1]
                    if (len(attachment_name) >= 60):
                        attachment_name = attachment_name[:60] + "." + ext
                        os.rename(attachment_name_old, attachment_name)
                    if os.path.isdir(dest_path):
                        shutil.move(os.path.join(dir_path, attachment_name),
                                    os.path.join(dest_path, attachment_name))
                        attachment_counter += 1
                except FileNotFoundError:
                    print('Possibly invalid character in the attachment file')
                print(os.path.isfile(os.path.join(dir_path, attachment_name)))
        fp.close()
        if count_attachments > 0:
            if attachment_counter == count_attachments - 1:
                is_success = True
            if is_success and move_eml == True:
                print('All attachment succesfully downloaded')
            else:
                print('Failed to download some attachment')
            if (len(eml_file) >= 60):
                eml_file_new = eml_file[:60] + "." + 'eml'
                os.rename(eml_file, eml_file_new)
            shutil.move(os.path.join(dir_path, eml_file_new),
                        os.path.join(dest_path, eml_file_new))
Пример #6
0
def parse(raw: bytes):
    try:
        request_line, headers_alone = raw.split(b'\r\n', 1)
    except:
        return None
    headers = BytesParser().parsebytes(headers_alone)
    body = headers.get_payload()
    parsed_body = {}
    if body != "":
        try:
            parsed_body = json.loads(body)
        except Exception as e:
            raise IncorrectJsonError(body)
    method, url, ver = request_line.decode(ENCODING).split()
    path, params = get_params(url)
    return Request(method, path, ver, headers, params, parsed_body)
Пример #7
0
def read(fp):
    """Deserialize an OOPS from an RFC822 format message."""
    msg = BytesParser().parse(fp, headersonly=True)
    id = msg.get('oops-id')
    exc_type = msg.get('exception-type')
    exc_value = msg.get('exception-value')
    datestr = msg.get('date')
    if datestr is not None:
        date = iso8601.parse_date(msg.get('date'))
    else:
        date = None
    topic = msg.get('topic')
    if topic is None:
        topic = msg.get('page-id')
    username = msg.get('user')
    url = msg.get('url')
    try:
        duration = float(msg.get('duration', '-1'))
    except ValueError:
        duration = float(-1)
    informational = msg.get('informational')
    branch_nick = msg.get('branch')
    revno = msg.get('revision')
    reporter = msg.get('oops-reporter')

    # Explicitly use an iterator so we can process the file sequentially.
    lines = iter(msg.get_payload().splitlines(True))

    statement_pat = re.compile(r'^(\d+)-(\d+)(?:@([\w-]+))?\s+(.*)')

    def is_req_var(line):
        return "=" in line and not statement_pat.match(line)

    def is_traceback(line):
        return line.lower().startswith('traceback') or line.startswith(
            '== EXTRA DATA ==')

    req_vars = []
    statements = []
    first_tb_line = ''
    for line in lines:
        first_tb_line = line
        line = line.strip()
        if line == '':
            continue
        else:
            match = statement_pat.match(line)
            if match is not None:
                start, end, db_id, statement = match.groups()
                if db_id is not None:
                    db_id = intern(db_id)  # This string is repeated lots.
                statements.append([int(start), int(end), db_id, statement])
            elif is_req_var(line):
                key, value = line.split('=', 1)
                req_vars.append([unquote(key), unquote(value)])
            elif is_traceback(line):
                break
    req_vars = dict(req_vars)

    # The rest is traceback.
    tb_text = ''.join([first_tb_line] + list(lines))

    result = dict(id=id,
                  type=exc_type,
                  value=exc_value,
                  time=date,
                  topic=topic,
                  tb_text=tb_text,
                  username=username,
                  url=url,
                  duration=duration,
                  req_vars=req_vars,
                  timeline=statements,
                  branch_nick=branch_nick,
                  revno=revno)
    if informational is not None:
        result['informational'] = informational
    if reporter is not None:
        result['reporter'] = reporter
    return result
Пример #8
0
argument = 1
while (argument < len(sys.argv)):
    skore = 1
    with open(sys.argv[argument], 'rb') as fp:
        msg = BytesParser(policy=policy.default).parse(fp)
    text = ""
    text2 = ""
    try:
        try:
            text = msg.get_body(
                preferencelist=('plain')).get_content()  # čistý text
            #print("metoda 1")
        except:
            if msg.is_multipart():
                for payload in msg.get_payload():
                    #print("metoda 2a")
                    # if payload.is_multipart(): ...
                    text2 = payload.get_payload()
            else:
                text2 = msg.get_payload()
                #print("metoda 2b")
            text = html2text.html2text(text2)
    except:
        text = ""
    #print(text2)
    text = text.replace('\n', ' ')
    #print(text)
    odesilatel = msg['from']  # odesílatel
    prijemce = msg['to']  # příjemce
    predmet = msg['subject']  # předmět
Пример #9
0
            data[host_zoom_user_email] = {
                "zoom_host_password": zoom_host_password,
                "type": row_type,
            }
        else:
            print("skipping row {}".format(row_data))

default_password = "******"
default_type = "Talk"

schedule_data = data

for eml in emls:
    fp = open(eml, 'rb')
    msg = BytesParser().parse(fp)
    html = msg.get_payload(decode=True).decode("UTF-8")
    soup = bs(html, features="lxml")
    links = soup.findAll("a")
    login_email = soup.find("table").find("table").find("table").findAll(
        "td")[0].text.strip().replace("Hello ", "").strip(",")
    print(login_email)
    schedulexlsx_info = schedule_data.get(login_email, {})

    Password = schedulexlsx_info.get("zoom_host_password", default_password)
    Lastname = schedulexlsx_info.get("type", default_type)

    # Exclude links that aren't activation links
    links = [
        link['href'] for link in links if "zoom.us/activate" in link['href']
    ]
    # There may be more than one activation link; get only the first one.
Пример #10
0
with open(input_file, 'rb') as fp:
    msg = BytesParser(policy=policy.default).parse(fp)
    # txt = msg.get_body(preferencelist=('plain')).get_content()

    if msg.is_multipart():
        for part in msg.walk():
            content_type = part.get_content_type()
            content_disposition = str(part.get('Content-Disposition'))

            # skip any text/plain (txt) attachments
            if content_type == 'text/plain' and 'attachment' not in content_disposition:
                body = part.get_payload(decode=True)  # decode
                break
    # not multipart - i.e. plain text, no attachments, keeping fingers crossed
    else:
        body = msg.get_payload(decode=True)

    received = msg['Received']
    received_datetime = received[received.rindex(';'):]
    datetime = parser.parse(received_datetime)
    from_line = msg['from']
    from_line_address_start = from_line.find("<")
    if from_line_address_start != -1:
        from_name = from_line[:from_line_address_start - 1]
        from_address = from_line[from_line_address_start + 1:-1]
    else:
        from_name = ""
        from_address = from_line

    to_line = msg['to']
    to_line_address_start = to_line.find("<")
Пример #11
0
#  Now the header items can be accessed as a dictionary:
# print('To: {}'.format(eml['to']))
# print('From: {}'.format(eml['from']))
template['from'] = eml['from']
# print('Subject: {}'.format(eml['subject']))
template['subject'] = eml['subject']

# You can also access the parts of the addresses:
# print('Recipient username: {}'.format(eml['to'].addresses[0].username))
# print('Sender name: {}'.format(eml['from'].addresses[0].display_name))
template['from_display_name'] = eml['from'].addresses[0].display_name

ctype = eml.get_content_maintype()
if ctype == 'multipart':
    for part in eml.get_payload():
        subctype = part.get_content_maintype()
        if subctype == 'text':
            if part.get_content_subtype() == 'plain':
                template['content_text'] = part.get_payload()
            elif part.get_content_subtype() == 'html':
                template['content_html'] = part.get_payload()
elif ctype == 'text':
    if eml.get_content_subtype() == 'plain':
        template['content_text'] = eml.get_payload()
    elif eml.get_content_subtype == 'html':
        template['content_html'] = eml.get_payload()
else:
    print('nope...')

templates = []