diff --git a/app/config.py b/app/config.py index bf773783..7bfb6433 100644 --- a/app/config.py +++ b/app/config.py @@ -412,3 +412,5 @@ PHONE_PROVIDER_1_SECRET = os.environ.get("PHONE_PROVIDER_1_SECRET") PHONE_PROVIDER_2_HEADER = os.environ.get("PHONE_PROVIDER_2_HEADER") PHONE_PROVIDER_2_SECRET = os.environ.get("PHONE_PROVIDER_2_SECRET") + +ZENDESK_HOST=os.environ.get('ZENDESK_HOST', 'noone.zendesk.com') diff --git a/app/dashboard/views/support.py b/app/dashboard/views/support.py index 565cfabc..d59932ec 100644 --- a/app/dashboard/views/support.py +++ b/app/dashboard/views/support.py @@ -1,27 +1,60 @@ import json +import urllib.parse +from typing import Union import requests from flask import render_template, request, flash, url_for, redirect from flask_login import login_required, current_user +from werkzeug.datastructures import FileStorage + from app.dashboard.base import dashboard_bp -from app.db import Session from app.log import LOG -from app.models import Alias, Mailbox +from app.models import Mailbox +from app.config import ZENDESK_HOST + +VALID_MIME_TYPES = ['text/plain', 'message/rfc822'] @dashboard_bp.route("/support", methods=["GET"]) @login_required def show_support_dialog(): - return render_template( "dashboard/support.html" ) + mailbox = Mailbox.get(current_user.default_mailbox_id) + return render_template("dashboard/support.html", ticketEmail=mailbox.email) -def createZendeskTicket(email: str, contents: str): +def upload_file_to_zendesk(file: FileStorage) -> Union[None, str]: + if file.mimetype not in VALID_MIME_TYPES and not file.mimetype.startswith('image/'): + flash('File {} is not an image, text or an email'.format(file.filename), "warning") + return None + escaped_filename = urllib.parse.urlencode({'filename': file.filename}) + url = 'https://{}/api/v2/uploads?{}'.format(ZENDESK_HOST, escaped_filename) + headers = {'content-type': file.mimetype} + response = requests.post(url, headers=headers, data=file.stream) + if response.status_code != 201: + if response.status_code == 401 or 422: + LOG.debug('Could not authenticate') + return None + else: + LOG.debug('Problem with the request. Status ' + str(response.status_code)) + return None + data = response.json() + return data['upload']['token'] + + +def create_zendesk_request(email: str, contents: str, files: [FileStorage]) -> bool: + tokens = [] + for file in files: + token = upload_file_to_zendesk(file) + if token is None: + return False + tokens.append(token) data = { 'request': { 'subject': 'Ticket created for user {}'.format(current_user.id), 'comment': { 'type': 'Comment', - 'body': contents + 'body': contents, + 'uploads': tokens }, 'requester': { 'name': "SimpleLogin user {}".format(current_user.id), @@ -29,17 +62,19 @@ def createZendeskTicket(email: str, contents: str): } } } - url = 'https://simplelogin.zendesk.com/api/v2/requests.json' + url = 'https://{}/api/v2/requests.json'.format(ZENDESK_HOST) headers = {'content-type': 'application/json'} r = requests.post(url, data=json.dumps(data), headers=headers) if r.status_code != 201: if r.status_code == 401 or 422: LOG.debug('Could not authenticate') + return False else: LOG.debug('Problem with the request. Status ' + str(r.status_code)) - else: - flash("Ticket was created. You should receive an email notification", "success") - LOG.debug('Ticket created') + return False + flash("Ticket was created. You should receive an email notification", "success") + LOG.debug('Ticket created') + return True @dashboard_bp.route("/support", methods=["POST"]) @@ -53,5 +88,6 @@ def process_support_dialog(): if not email: flash("Please add an email", "warning") return render_template("dashboard/support.html", ticketContents=contents) - createZendeskTicket(email, contents) - return redirect(url_for('dashboard.index')) + if create_zendesk_request(email, contents, request.files.getlist('ticketFiles')): + return render_template("dashboard/support_ticket_created.html", ticketEmail=email) + return render_template("dashboard/support.html", ticketEmail=email, ticketContents=contents) diff --git a/templates/dashboard/support.html b/templates/dashboard/support.html index 22826dfe..8797d52d 100644 --- a/templates/dashboard/support.html +++ b/templates/dashboard/support.html @@ -19,7 +19,7 @@ {% endblock %} @@ -50,7 +60,7 @@
A support ticket will be created in Zendesk. Please do not include any sensitive information in the ticket.
-
+
@@ -58,8 +68,9 @@
Attach files to support request
+
Only images, text and emails are accepted
- +
@@ -68,7 +79,7 @@
Conversations related to this ticket will be sent to this address. Feel free to use an alias here.
-
+
diff --git a/templates/dashboard/support_ticket_created.html b/templates/dashboard/support_ticket_created.html new file mode 100644 index 00000000..e1679531 --- /dev/null +++ b/templates/dashboard/support_ticket_created.html @@ -0,0 +1,37 @@ +{% extends 'default.html' %} + +{% set active_page = None %} + +{% block title %} + Support +{% endblock %} + +{% block head %} + +{% endblock %} + +{% block default_content %} + +
+ +
+
+
Support ticket has been created for {{ ticketEmail }}
+
+ Head back to your dashboard +
+
+
+ +
+ +{% endblock %} + + + diff --git a/templates/footer.html b/templates/footer.html index 6fa0c4f6..12a15ec8 100644 --- a/templates/footer.html +++ b/templates/footer.html @@ -66,6 +66,7 @@ href="https://github.com/simple-login/app/projects/1">Roadmap
  • Contact Us
  • +
  • Support
  • Imprint