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()
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