summaryrefslogtreecommitdiff
path: root/postgresqleu/util/views.py
blob: 92666c617ab5a945cd13e221d6b7e4a0096f59bd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
from django.views.decorators.csrf import csrf_exempt
from django.shortcuts import get_object_or_404
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse, Http404, HttpResponseRedirect
from django.conf import settings

from postgresqleu.confreg.models import MessagingProvider
from postgresqleu.util.messaging import get_messaging
from postgresqleu.util.messaging.twitter import process_twitter_webhook
from postgresqleu.util.markup import pgmarkdown

import json


# Anybody logged in can do a markdown preview, since it's a safe operation
# and this way we don't need any db access.
@login_required
@csrf_exempt
def markdown_preview(request):
    if request.method != 'POST':
        return HttpResponse("POST only please", status=405)

    if request.headers.get('x-preview', None) != 'md':
        raise Http404()

    return HttpResponse(pgmarkdown(request.body.decode('utf8', 'ignore')))


@csrf_exempt
def oauth_return(request, providerid=None):
    if 'code' not in request.GET:
        raise Http404('Code missing')

    if providerid is None:
        # If it's none, we expect it in the state, followed by an underscore
        if '_' not in request.GET.get('state', ''):
            raise Http404('State is missing or invalid')
        statepid, rest = request.GET['state'].split('_', 1)
        providerid = int(statepid)
    else:
        providerid = providerid.rstrip('/')

    provider = get_object_or_404(MessagingProvider, id=providerid)
    impl = get_messaging(provider)
    if hasattr(impl, 'oauth_return'):
        err = impl.oauth_return(request)
        if err:
            return HttpResponse(err)
        else:
            if provider.series_id:
                return HttpResponseRedirect('{}/events/admin/_series/{}/messaging/{}/'.format(
                    settings.SITEBASE,
                    provider.series_id,
                    provider.id,
                ))
            else:
                return HttpResponseRedirect('{}/admin/news/messagingproviders/{}/'.format(
                    settings.SITEBASE,
                    provider.id,
                ))

    else:
        return HttpResponse('Unconfigured')


@csrf_exempt
def messaging_webhook(request, providerid, token):
    provider = get_object_or_404(MessagingProvider, id=providerid, config__webhook__token=token)
    impl = get_messaging(provider)
    return impl.process_webhook(request)


# Twitter needs a special webhook URL since it's global and not per provider
@csrf_exempt
def twitter_webhook(request):
    return process_twitter_webhook(request)


# Assetlinks to confirm to Google Play that we are the authors of our Android app
# (contents of file are suggestions from google play console)
def assetlinks(request):
    return HttpResponse(
        json.dumps([
            {
                "relation": [
                    "delegate_permission/common.handle_all_urls"
                ],
                "target": {
                    "namespace": "android_app",
                    "package_name": "eu.postgresql.android.conferencescanner",
                    "sha256_cert_fingerprints": [
                        "F3:F7:29:8B:4D:B4:2E:9E:B8:3B:C6:E3:8B:C0:69:FE:19:9E:2C:24:D4:6B:AE:C7:1E:83:D7:07:47:7E:CA:EB"
                    ]
                }
            }
        ]), content_type='application/json')