it actually seems to work now
parent
cbc5a41893
commit
18211e05a8
57
socialist.py
57
socialist.py
|
@ -1,9 +1,8 @@
|
|||
import json
|
||||
import urllib
|
||||
import requests
|
||||
import functools
|
||||
import oauth2 as oauth
|
||||
from flask import Flask, request, abort, jsonify, render_template
|
||||
from flask import Flask, request, abort, jsonify, render_template, make_response, json
|
||||
|
||||
app = Flask('socialist')
|
||||
app.config.from_pyfile('socialist.cfg')
|
||||
|
@ -30,31 +29,36 @@ def api_access(f):
|
|||
return func
|
||||
|
||||
def get_login():
|
||||
return request.form['login']
|
||||
return request.login
|
||||
|
||||
def plain_error(text='Unauthorized', code=401):
|
||||
return make_response(text, error, { 'Content-Type': 'text/plain' })
|
||||
return make_response(text, code, { 'Content-Type': 'text/plain' })
|
||||
|
||||
def json_error(errors=[{'message': 'Unauthorized', 'code':401}], status_code=401):
|
||||
res = jsonify(errors = errors)
|
||||
res.status_code = status_code
|
||||
return res
|
||||
|
||||
def require_role(role, login_source = get_login, error_func = plain_error):
|
||||
def decorator(f):
|
||||
@functools.wraps(f)
|
||||
def func(*a, **kw):
|
||||
res = requests.get('/'.join((cap_url, role, get_login())))
|
||||
if res.code == 200:
|
||||
res = requests.get('/'.join((cap_url, role, get_login())), verify = False) # T_T
|
||||
if res.status_code == 200:
|
||||
return f(*a, **kw)
|
||||
else:
|
||||
return error_func()
|
||||
return func
|
||||
return decorator
|
||||
|
||||
def irc_dereference(from_parameter = 'nick', to_parameter = 'login', error_func = plain_error):
|
||||
def irc_dereference(from_parameter = 'nick', to_attribute = 'login', error_func = plain_error):
|
||||
def decorator(f):
|
||||
@functools.wraps(f)
|
||||
def func(*a, **kw):
|
||||
res = requests.post(auth_url + '/irc',
|
||||
data = { 'nick': requests.form[from_parameter] })
|
||||
if res.code == 200:
|
||||
requests.form[to_parameter] = res.text
|
||||
res = requests.post(auth_url + '/irc', verify = False, # T_T
|
||||
data = { 'nick': request.form[from_parameter] })
|
||||
if res.status_code == 200:
|
||||
request.login = res.text
|
||||
return f(*a, **kw)
|
||||
else:
|
||||
return error_func()
|
||||
|
@ -93,12 +97,35 @@ def motd():
|
|||
def test_form():
|
||||
return render_template('tweet_form.html')
|
||||
|
||||
def irc_authorize(role, role_error):
|
||||
def decorator(f):
|
||||
mkerr = lambda ermsg: [{'messages': ermsg, 'code': 401}]
|
||||
return api_access(
|
||||
irc_dereference(error_func = lambda: json_error(mkerr('Unknown nick')))(
|
||||
require_role(role, error_func = lambda: json_error(mkerr(role_error)))(
|
||||
f)))
|
||||
return decorator
|
||||
|
||||
@app.route('/socialist/tweet', methods=['POST'])
|
||||
@api_access
|
||||
@irc_dereference(error_func = lambda: plain_error('Unknown nick'))
|
||||
@require_role(twitter_role, error_func = lambda: plain_error('Unauthorized to tweet'))
|
||||
@irc_authorize(twitter_role, 'Unauthorized to tweet')
|
||||
def irc_tweet():
|
||||
pass
|
||||
tw_res = oauth_req('https://api.twitter.com/1.1/statuses/update.json', 'POST',
|
||||
{ 'status': request.form['text'] })
|
||||
print tw_res
|
||||
return make_response(tw_res[1], tw_res[0].status, { 'Content-Type': 'application/json'})
|
||||
|
||||
@app.route('/socialist/detweet/<tid>', methods=['POST'])
|
||||
@irc_authorize(twitter_role, 'Unauthorized to remove tweets')
|
||||
def irc_detweet(tid):
|
||||
tw_res = oauth_req('https://api.twitter.com/1.1/statuses/destroy/%s.json' % tid, 'POST')
|
||||
return make_response(tw_res[1], tw_res[0].status, { 'Content-Type': 'application/json'})
|
||||
|
||||
@app.route('/socialist/test', methods=['POST'])
|
||||
@irc_authorize(twitter_role, "test error")
|
||||
def irc_test():
|
||||
return json_error()
|
||||
|
||||
app.debug = True
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run('0.0.0.0', port=8083, debug=True)
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
<form action="" method="POST">
|
||||
<label for="nick">nick<input type="text" name="nick"/></label></br>
|
||||
<label for="text">text<input type="text" name="text"/></label></br>
|
||||
<input type="submit" value="tweet"/>
|
||||
</form>
|
Loading…
Reference in New Issue