Skip to content

Commit 59db9f3

Browse files
committed
initial releases
1 parent c0fab24 commit 59db9f3

18 files changed

+3262
-40
lines changed

application/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,4 @@
1111
GAEMiniProfiler(app)
1212

1313
import urls
14+

application/apis.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
"""
2+
apis.py
3+
4+
LangDev Links API Handler
5+
6+
"""
7+
8+
9+
from flask import render_template, flash, url_for, redirect, request, jsonify
10+
from decorators import api_auth_required
11+
12+
from models import Link
13+
from datetime import datetime
14+
15+
import hashlib
16+
import logging
17+
18+
@api_auth_required
19+
def post_link():
20+
21+
link = request.values.get('q')
22+
author = request.values.get('author')
23+
24+
25+
key = hashlib.md5(link).hexdigest()
26+
27+
exists = Link.get_by_key_name(key)
28+
try:
29+
if not exists:
30+
link = Link(key_name=key,
31+
link_url=link,
32+
authors=[author])
33+
link.put()
34+
else:
35+
36+
if author not in exists.authors:
37+
exists.authors.append(author)
38+
exists.updated_at = datetime.now()
39+
exists.put()
40+
41+
return jsonify({'result': True})
42+
except:
43+
logging.exception('api call failed')
44+
return jsonify({'result': False})

application/decorators.py

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,18 @@
88
from functools import wraps
99
from google.appengine.api import users
1010
from flask import redirect, request
11-
11+
from utils import check_langdev_sso, authenticate, check_links_auth, api_forbidden
12+
# code...
1213

1314
def login_required(func):
14-
"""Requires standard login credentials"""
15-
@wraps(func)
16-
def decorated_view(*args, **kwargs):
17-
if not users.get_current_user():
18-
return redirect(users.create_login_url(request.url))
19-
return func(*args, **kwargs)
20-
return decorated_view
21-
15+
"""Requires langdev login credentials"""
16+
@wraps(func)
17+
def decorate(*args, **kwargs):
18+
auth = request.authorization
19+
if not auth or not check_langdev_sso(auth.username, auth.password):
20+
return authenticate()
21+
return func(*args, **kwargs)
22+
return decorate
2223

2324
def admin_required(func):
2425
"""Requires App Engine admin credentials"""
@@ -29,3 +30,12 @@ def decorated_view(*args, **kwargs):
2930
return func(*args, **kwargs)
3031
return decorated_view
3132

33+
def api_auth_required(func):
34+
"""Requires Links API authority"""
35+
@wraps(func)
36+
def decorate(*args, **kwargs):
37+
if not request.headers.has_key('X-LINKS-AUTH') or \
38+
not check_links_auth(request.headers['X-LINKS-AUTH'], request.values):
39+
return api_forbidden()
40+
return func(*args, **kwargs)
41+
return decorate

0 commit comments

Comments
 (0)