예제 #1
0
파일: __init__.py 프로젝트: atduskgreg/wire
def send_message(recipient=False):
    try:
        g.user.username
    except AttributeError:
        abort(401)

    t = Thread(redis=g.r, user=g.user)
    m = Message(redis=g.r, key=False, user=g.user)
    if recipient:
        try:
            t.parse_recipients(recipient)
        except InvalidRecipients:
            pass

    if request.method == "POST":
        try:
            t.subject = request.form["subject"]
            m.update(request.form)
            t.parse_recipients(request.form["recipients"])
            t.save()
            t.add_message(m)
            m.send()
            flash(
                "Your message has been successfully wired, \
                    and should arrive shortly.",
                "success",
            )
            return redirect(url_for("view_thread", thread_id=t.key))
        except MessageValidationError:
            for error in m.validation_errors:
                flash(error, "error")
        except InvalidRecipients:
            for recipient in t.invalid_recipients:
                flash("%s is not a valid recipient" % recipient, "error")
    return render_template("forms/message.html", new=True, message=m, thread=t, recipients=t.get_form_recipients())
예제 #2
0
파일: thread.py 프로젝트: atduskgreg/wire
 def load(self, key):
     self.messages = []
     self.key = key
     message_keys = self.redis.lrange('thread:%s:messages' % key, 0, -1)
     self._update_recipients()
     data = self.redis.get('thread:%s:data' % key)
     if not data:
         raise ThreadError("Thread %s data doesn't exist." % self.key)
     data = json.loads(data)
     self.subject = data['subject']
     self.encrypted = data['encrypted']
     if self.encrypted:
         self.decrypted = False
     for message_key in message_keys:
         m = Message(redis=self.redis, user=self.user)
         try:
             m.load(message_key)
         except MessageError:
             pass
         self.messages.append(m)
     if len(self.messages) < 1:
         self.delete()
         raise DestroyedThreadError
     try:
         self.sender = self.messages[0].data['sender']
     except KeyError:
         self.delete_message(self.messages[0])
예제 #3
0
파일: __init__.py 프로젝트: atduskgreg/wire
def delete_message(message_id, thread_id):
    if request.method == "POST":
        t = Thread(redis=g.r, user=g.user)
        t.load(thread_id)
        m = Message(redis=g.r, user=g.user, key=message_id)
        m.load()
        if g.r.get("username:%s" % m.sender.username) != g.user.key:
            abort(401)
        t.delete_message(m)
        flash(u"Message deleted", "success")
        return redirect(url_for("view_thread", thread_id=thread_id))
    else:
        return render_template(
            "confirm.html",
            _message="Are you sure you want to delete this message?",
            _ok=url_for("delete_message", thread_id=thread_id, message_id=message_id),
            _cancel=url_for("view_thread", thread_id=thread_id),
        )
예제 #4
0
파일: __init__.py 프로젝트: atduskgreg/wire
def view_thread(thread_id):
    encryption_key = False
    if str(thread_id) not in g.user.get_threads():
        abort(401)

    t = Thread(redis=g.r, user=g.user)
    try:
        t.load(thread_id)
        if request.method == "POST":
            if request.form["action"] == "reply":
                m = Message(redis=g.r, key=False, user=g.user)
                m.update(request.form)
                t.save()
                t.add_message(m)
                m.send()
                t.load(thread_id)
                flash("Reply has been sent.", "success")
                return redirect(url_for("view_thread", thread_id=t.key))
            try:
                encryption_key = request.form["encryption_key"]
                t.decrypt(encryption_key)
                flash("Thread successfully decrypted.", "success")
            except DecryptFailed:
                flash("Decryption was unsuccessful.", "error")
                return redirect(url_for("view_thread", thread_id=thread_id))
            except DestroyedThreadError:
                flash("System error. Message lost.", "error")
                return redirect(url_for("inbox"))
            except KeyError:
                pass
        if t.decrypted:
            t.reset_unread_count()
        return render_template(
            "thread.html",
            messages=t.messages,
            thread=t,
            decrypted=t.decrypted,
            encryption_key=encryption_key,
            subject=t.subject,
        )
    except ThreadError:
        abort(404)