예제 #1
0
    def servePage(self, view, url, params):
        self.requirePageResources(
            ['button-compose.png', 'default.css', 'jquery-3.1.1.js'])
        DbI.exportAllAvatars(Config.getWebCacheDir())

        messageList = None
        if url == "/send":
            print("send message of type '%(messageType)s' to id '%(sendTo)s'" %
                  params)
            if params['messageType'] == "contactresponse":
                torId = params['sendTo']
                if params.get("accept", "0") == "1":
                    ContactMaker.handleAccept(torId)
                    # Make sure this new contact has an empty avatar
                    DbI.exportAllAvatars(Config.getWebCacheDir())
                    outmsg = message.ContactResponseMessage(
                        message=params['messageBody'])
                else:
                    ContactMaker.handleDeny(torId)
                    outmsg = message.ContactDenyMessage()
                # Construct a ContactResponse message object for sending
                outmsg.recipients = [params['sendTo']]
                DbI.addToOutbox(outmsg)
        elif url.startswith("/delete/"):
            DbI.deleteFromInbox(params.get("msgId", ""))
        elif url in ["/search", "/search/"]:
            messageList = DbI.searchInboxMessages(params.get("searchTerm"))

        # Make dictionary to convert ids to names
        contactNames = {
            c['torid']: c['displayName']
            for c in DbI.getProfiles()
        }
        unknownSender = I18nManager.getText("messages.sender.unknown")
        unknownRecpt = I18nManager.getText("messages.recpt.unknown")
        # Get contact requests, responses and mails from inbox
        conreqs = []
        conresps = []
        mailTree = MessageTree()
        if messageList is None:
            messageList = DbI.getInboxMessages()
        # TODO: Paging options?
        for m in messageList:
            if not m:
                continue
            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'] = DbI.getProfile(m['fromId'])["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 = DbI.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:
                    replyAll = recpts.split(",")
                    m['recipients'] = ", ".join(
                        [contactNames.get(i, unknownRecpt) for i in replyAll])
                    replyAll.append(senderId)
                    m['replyAll'] = ",".join(replyAll)
                else:
                    m['recipients'] = unknownRecpt
                    m['replyAll'] = ""
                mailTree.addMsg(m)
        mails = mailTree.build()
        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)
예제 #2
0
    def servePage(self, view, url, params):
        print("Compose: %s, params %s" % (url, repr(params)))
        if url == "/start":
            self.requirePageResources(['default.css', 'jquery-3.1.1.js'])
            DbI.exportAllAvatars(Config.getWebCacheDir())
            parentHash = params.get("reply", None)
            recpts = params.get("sendto", None)
            # Build list of contacts to whom we can send
            userboxes = []
            for p in DbI.getMessageableProfiles():
                box = Bean()
                box.dispName = p['displayName']
                box.torid = p['torid']
                userboxes.append(box)
            pageParams = {
                "contactlist": userboxes,
                "parenthash": parentHash if parentHash else "",
                "webcachedir": Config.getWebCacheDir(),
                "recipientids": recpts
            }
            contents = self.buildPage({
                'pageTitle':
                I18nManager.getText("composemessage.title"),
                'pageBody':
                self.composetemplate.getHtml(pageParams),
                'pageFooter':
                "<p>Footer</p>"
            })
            view.setHtml(contents)
            # If we've got no friends, then warn, can't send to anyone
            if not DbI.hasFriends():
                view.page().mainFrame().evaluateJavaScript(
                    "window.alert('No friends :(');")

        elif url == "/send":
            print("Submit new message with params:", params)
            msgBody = params[
                'messagebody']  # TODO: check body isn't empty, throw an exception?
            parentHash = params.get("parenthash", None)
            recpts = params['sendto']
            # Make a corresponding message object and pass it on
            msg = message.RegularMessage(sendTo=recpts,
                                         messageBody=msgBody,
                                         replyToHash=parentHash)
            msg.recipients = recpts.split(",")
            DbI.addToOutbox(msg)
            # Save a copy of the sent message
            sentMessage = {
                "messageType": "normal",
                "fromId": DbI.getOwnTorid(),
                "messageBody": msgBody,
                "timestamp": msg.timestamp,
                "messageRead": True,
                "messageReplied": False,
                "recipients": recpts,
                "parentHash": parentHash
            }
            DbI.addToInbox(sentMessage)
            # Close window after successful send
            contents = self.buildPage({
                'pageTitle':
                I18nManager.getText("messages.title"),
                'pageBody':
                self.closingtemplate.getHtml(),
                'pageFooter':
                "<p>Footer</p>"
            })
            view.setHtml(contents)
예제 #3
0
    def servePage(self, view, url, params):
        self.requirePageResources([
            'button-addperson.png', 'button-drawgraph.png', 'avatar-none.jpg'
        ])
        DbI.exportAllAvatars(Config.getWebCacheDir())
        if url == "/add" or url == "/add/":
            contents = self.generateAddPage()
            view.setHtml(contents)
            return
        elif url == "/submitaddrequest":
            print("Submit add request!:", url)
            if len(params) > 0:
                # request to add a new friend
                recipientid = params.get('murmeliid', '')
                dispname = params.get('displayname', '')
                intromessage = params.get('intromessage', '')
                if len(recipientid) == 16:
                    # TODO: How to react if: person already added (untrusted/trusted); request already sent (requested)
                    # update the database accordingly
                    ContactMaker.handleInitiate(recipientid, dispname)
                    print("I should send an add request to '%s' now." %
                          recipientid)
                    outmsg = message.ContactRequestMessage(
                        introMessage=intromessage)
                    outmsg.recipients = [recipientid]
                    DbI.addToOutbox(outmsg)
                else:
                    print("Hmm, show an error message here?")
                # in any case, go back to contact list
                url = "/" + recipientid
                # ensure that picture is generated for new id
                DbI.exportAllAvatars(Config.getWebCacheDir())
        contents = None
        userid = None
        pageParams = {}
        # Split url into components /userid/command
        command = [i for i in url.split("/") if i != ""]
        if len(command) > 0 and len(command[0]) == 16 and re.match(
                "([a-zA-Z0-9]+)$", command[0]):
            userid = command[0]
            # check for command edit or submit-edit
            if len(command) == 2:
                if command[1] == "edit":
                    contents = self.generateListPage(
                        doEdit=True, userid=userid)  # show edit fields
                elif command[1] == "submitedit":
                    DbI.updateProfile(userid, params, Config.getWebCacheDir())
                    # TODO: If we've updated our own details, can we trigger a broadcast?
                    # don't generate contents, go back to details
                elif command[1] == "delete":
                    ContactMaker.handleDeleteContact(userid)
                    userid = None
                elif command[1] == "checkfingerprint":
                    contents = self.generateFingerprintsPage(userid)
                elif command[1] == "checkedfingerprint":
                    givenAnswer = int(params.get('answer', -1))
                    fc = self._makeFingerprintChecker(userid)
                    expectedAnswer = fc.getCorrectAnswer()
                    if expectedAnswer == givenAnswer:
                        ContactMaker.keyFingerprintChecked(userid)
                        # Show page again
                        contents = self.generateFingerprintsPage(userid)
                    else:
                        # Add a message to show when the list page is re-generated
                        pageParams['fingerprint_check_failed'] = True
            elif len(command) == 3 and command[1] == "refer" and len(
                    command[2]) == 16:
                intro = str(params.get('introMessage', ""))
                ContactMaker.sendReferralMessages(command[0], command[2],
                                                  intro)
                pageParams['message_sent'] = True
                # go back to details page
            elif len(command) == 3 and command[1] == "requestrefer" and len(
                    command[2]) == 16:
                intro = str(params.get('introMessage', ""))
                ContactMaker.sendReferRequestMessage(command[0], command[2],
                                                     intro)
                pageParams['message_sent'] = True
                # go back to details page

        # If we haven't got any contents yet, then do a show details
        if not contents:
            # Show details for selected userid (or for self if userid is None)
            contents = self.generateListPage(doEdit=False,
                                             userid=userid,
                                             extraParams=pageParams)

        view.setHtml(contents)