예제 #1
0
파일: dmail.py 프로젝트: fps/morphis-mirror
    def dbcall():
        with handler.node.db.open_session() as sess:
            handler.node.db.lock_table(sess, DmailMessage)

            q = sess.query(func.count("*"))\
                .filter(DmailMessage.data_key == dmail_key)

            if q.scalar():
                return False

            q = sess.query(DmailAddress.id)\
                .filter(DmailAddress.site_key == dmail_addr)

            dmail_address = q.first()

            msg = DmailMessage()
            msg.dmail_address_id = dmail_address.id
            msg.data_key = dmail_key
            msg.sender_dmail_key =\
                enc.generate_ID(dmailobj.sender_pubkey)\
                    if dmailobj.sender_pubkey else None
            msg.sender_valid = valid_sig
            msg.subject = dmailobj.subject
            msg.date = mutil.parse_iso_datetime(dmailobj.date)

            msg.hidden = False
            msg.read = False

            tag = DmailTag()
            tag.name = "Inbox"
            msg.tags = [tag]

            msg.parts = []

            for part in dmailobj.parts:
                dbpart = DmailPart()
                dbpart.mime_type = part.mime_type
                dbpart.data = part.data
                msg.parts.append(dbpart)

            sess.add(msg)

            sess.commit()
예제 #2
0
파일: dmail.py 프로젝트: tailsjoin/morphis
def _read_dmail_post(dispatcher, data):
    charset = dispatcher.handler.headers["Content-Type"]
    if charset:
        p0 = charset.find("charset=")
        if p0 > -1:
            p0 += 8
            p1 = charset.find(" ", p0 + 8)
            if p1 == -1:
                p1 = charset.find(";", p0 + 8)
            if p1 > -1:
                charset = charset[p0:p1].strip()
            else:
                charset = charset[p0:].strip()

            if log.isEnabledFor(logging.DEBUG):
                log.debug("Form charset=[{}].".format(charset))
        else:
            charset = "UTF-8"

    qs = data.decode(charset)
    dd = parse_qs(qs, keep_blank_values=True)

    if log.isEnabledFor(logging.DEBUG):
        log.debug("dd=[{}].".format(dd))

    if not dispatcher.check_csrf_token(dd["csrf_token"][0]):
        return None, None

    dm = DmailMessage()

    subject = dd.get("subject")
    if subject:
        dm.subject = subject[0]
    else:
        dm.subject = ""

    sender_dmail_id = dd.get("sender")
    if sender_dmail_id:
        sender_dmail_id = sender_dmail_id[0]

        if log.isEnabledFor(logging.DEBUG):
            log.debug("sender_dmail_id=[{}].".format(sender_dmail_id))

        if sender_dmail_id and sender_dmail_id != "":
            sender_dmail_id = int(sender_dmail_id)

            dmail_address = yield from _load_dmail_address(dispatcher, sender_dmail_id)

            dm.address = dmail_address
            dm.sender_valid = True

            dm.sender_dmail_key = dm.address.site_key

    if not dm.address:
        owner_if_anon = dd.get("owner_if_anon")
        if owner_if_anon and owner_if_anon[0]:
            dmail_address = yield from _load_dmail_address(dispatcher, owner_if_anon[0])
            dm.address = dmail_address

        if dm.address:
            dm.sender_valid = True
        else:
            dm.sender_valid = False

    #        sender_asymkey = rsakey.RsaKey(\
    #            privdata=dmail_address.site_privatekey)\
    #                if dmail_address else None
    #    else:
    #        sender_asymkey = None

    dest_addr_enc = dd.get("destination")
    if dest_addr_enc:
        dm.destination_dmail_key, dm.destination_significant_bits = mutil.decode_key(dest_addr_enc[0])
    #            mbase32.decode(dest_addr_enc[0])

    #   dispatcher.send_error("You must specify a destination.", 400)

    content = dd.get("content")
    if content:
        dp = DmailPart()
        dp.mime_type = "text/plain"
        dp.data = content[0].encode()
        dm.parts.append(dp)

    dm.date = mutil.utc_datetime()

    dm.hidden = False
    dm.read = True
    dm.deleted = False

    submit = dd.get("submit")
    if submit:
        return dm, submit[0]
    else:
        return dm, None