def construct(payload, isEncrypted=True): '''Factory constructor using a given payload and extracting the fields''' if not payload: return None signatureKey = None if isEncrypted: # Decrypt the payload with our key decrypted, signatureKey = CryptoClient.decryptAndCheckSignature(payload) else: decrypted = payload if decrypted: print("Asymmetric message, length of decrypted is", len(decrypted)) else: print("Asymmetric message has no decrypted") # Separate fields of message into common ones and the type-specific payload msgType, subpayload, tstmp = AsymmetricMessage._stripFields(decrypted) print("Recovered timestamp='", tstmp, "' (", len(tstmp), ")") # Find a suitable subclass to call using the messageType msg = None if msgType == Message.TYPE_CONTACT_RESPONSE: msg = ContactResponseMessage.constructFrom(subpayload) elif msgType == Message.TYPE_STATUS_NOTIFY: msg = StatusNotifyMessage.constructFrom(subpayload) elif msgType == Message.TYPE_ASYM_MESSAGE: msg = RegularMessage.constructFrom(subpayload) elif msgType == Message.TYPE_INFO_REQUEST: msg = InfoRequestMessage.constructFrom(subpayload) elif msgType == Message.TYPE_INFO_RESPONSE: msg = InfoResponseMessage.constructFrom(subpayload) elif msgType == Message.TYPE_FRIEND_REFERRAL: msg = ContactReferralMessage.constructFrom(subpayload) # Ask the message if it's ok to have no signature if isEncrypted and msg: if msg.acceptUnrecognisedSignature(): # Save the encrypted contents so we can verify it later msg.encryptedContents = payload elif not signatureKey: msg = None if msg: try: msgTimestamp = tstmp.decode('utf-8') except: msgTimestamp = msg.makeCurrentTimestamp() msg.timestamp = Message.convertTimestampFromString(msgTimestamp) msg.signatureKeyId = signatureKey if signatureKey: print("Asymm setting senderId because I've got a signatureKey: '%s'" % signatureKey) signatureId = DbClient.findUserIdFromKeyId(signatureKey) if signatureId: msg.senderId = signatureId return msg
def servePage(self, view, url, params): DbClient.exportAvatars(Config.getWebCacheDir()) if url == "/send": print("send message of type '%(messageType)s' to id '%(sendTo)s'" % params) elif url.startswith("/delete/"): DbClient.deleteMessageFromInbox(params.get("msgId", "")) # Make dictionary to convert ids to names contactNames = {c['torid']:c['displayName'] for c in DbClient.getContactList()} unknownSender = I18nManager.getText("messages.sender.unknown") unknownRecpt = I18nManager.getText("messages.recpt.unknown") # Get contact requests, responses and mails from inbox conreqs = [] conresps = [] mails = [] for m in DbClient.getInboxMessages(): m['msgId'] = str(m.get("_id", "")) if m['messageType'] == "contactrequest": conreqs.append(m) elif m['messageType'] == "contactrefer": senderId = m.get('fromId', None) m['senderName'] = contactNames.get(senderId, unknownSender) conreqs.append(m) elif m['messageType'] == "contactresponse": if not m.get('accepted', False): m['messageBody'] = I18nManager.getText("messages.contactrequest.refused") m['fromName'] = DbClient.getProfile(m['fromId'], True).get("displayName") elif not m.get('messageBody', False): m['messageBody'] = I18nManager.getText("messages.contactrequest.accepted") conresps.append(m) else: senderId = m.get('fromId', None) if not senderId and m.get('signatureKeyId', None): senderId = DbClient.findUserIdFromKeyId(m['signatureKeyId']) m['senderName'] = contactNames.get(senderId, unknownSender) m['sentTimeStr'] = self.makeLocalTimeString(m['timestamp']) # Split m['recipients'] by commas, and look up each id with contactNames recpts = m.get('recipients', '') if recpts: m['recipients'] = ", ".join([contactNames.get(i, unknownRecpt) for i in recpts.split(",")]) else: m['recipients'] = unknownRecpt mails.append(m) bodytext = self.messagestemplate.getHtml({"contactrequests":conreqs, "contactresponses":conresps, "mails":mails, "nummessages":len(conreqs)+len(conresps)+len(mails), "webcachedir" : Config.getWebCacheDir()}) contents = self.buildPage({'pageTitle' : I18nManager.getText("messages.title"), 'pageBody' : bodytext, 'pageFooter' : "<p>Footer</p>"}) view.setHtml(contents)