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')
|