131 lines
4.0 KiB
Python
131 lines
4.0 KiB
Python
from authlib.integrations.flask_client import OAuth, token_update, OAuthError
|
|
from flask import Flask, request, url_for, render_template, redirect, session
|
|
from config import SETTINGS
|
|
import urllib
|
|
import base64
|
|
import hashlib
|
|
import json
|
|
import os
|
|
|
|
def fetch_token(name):
|
|
return session['token']
|
|
|
|
app = Flask(__name__)
|
|
app.secret_key = 'super secret key'
|
|
app.config.from_object(SETTINGS)
|
|
oauth = OAuth(app, fetch_token=fetch_token)
|
|
oauth.register(
|
|
name='gitea',
|
|
access_token_url='https://git.seidlm.at/login/oauth/access_token',
|
|
access_token_params=None,
|
|
authorize_url='https://git.seidlm.at/login/oauth/authorize',
|
|
authorize_params=None,
|
|
api_base_url='https://git.seidlm.at/api/v1/',
|
|
client_kwargs=None,
|
|
)
|
|
|
|
@token_update.connect_via(app)
|
|
def on_token_update(sender, name, token, refresh_token=None, access_token=None):
|
|
if refresh_token:
|
|
item = OAuth2Token.find(name=name, refresh_token=refresh_token)
|
|
elif access_token:
|
|
item = OAuth2Token.find(name=name, access_token=access_token)
|
|
else:
|
|
return
|
|
|
|
# update old token
|
|
item.access_token = token['access_token']
|
|
item.refresh_token = token.get('refresh_token')
|
|
item.expires_at = token['expires_at']
|
|
item.save()
|
|
|
|
@app.errorhandler(OAuthError)
|
|
def handle_error(error):
|
|
return render_template('error.html', error=error)
|
|
|
|
@app.route('/login')
|
|
def login():
|
|
redirect_uri = url_for('authorize', _external=True)
|
|
return oauth.gitea.authorize_redirect(redirect_uri)
|
|
|
|
@app.route('/authorize')
|
|
def authorize():
|
|
token = oauth.gitea.authorize_access_token()
|
|
resp = oauth.gitea.get('user')
|
|
user = resp.json()
|
|
session['token'] = token
|
|
session['user'] = user
|
|
return redirect('/')
|
|
|
|
@app.route('/logout')
|
|
def logout():
|
|
session.pop('token', None)
|
|
session.pop('user', None)
|
|
return redirect('/')
|
|
|
|
@app.route('/')
|
|
def home():
|
|
user = session.get('user')
|
|
files = {}
|
|
path = request.args.get('path')
|
|
if not path:
|
|
path = '/'
|
|
if user:
|
|
resp = oauth.gitea.get(urllib.parse.quote('{}/contents/{}'.format(app.config.get('REPO_URL'), path)))
|
|
files = resp.json()
|
|
|
|
return render_template('home.html', user=user, files=files)
|
|
|
|
@app.route('/edit')
|
|
def test():
|
|
path = request.args.get('path')
|
|
if not path:
|
|
return 'no path given'
|
|
|
|
resp = oauth.gitea.get(urllib.parse.quote('{}/contents/{}'.format(app.config.get('REPO_URL'), path)))
|
|
jresp = resp.json()
|
|
if 'errors' in jresp:
|
|
error = {}
|
|
error['description'] = jresp['errors']
|
|
return render_template('error.html', error=error)
|
|
content = base64.b64decode(jresp['content']).decode('UTF-8')
|
|
sha = jresp['sha']
|
|
user = session.get('user')
|
|
return render_template('edit.html',filecontent=content,sha=sha,path=path, user=user)
|
|
|
|
@app.route('/update', methods=['POST'])
|
|
def update():
|
|
sample = {
|
|
"branch": "master",
|
|
"content": "",
|
|
"sha": "c7ef6a89fe8b888ad897479ac592f1e4841e4f18",
|
|
"message": "Web API Update"}
|
|
content = request.form.get('content')
|
|
content = base64.b64encode(content.encode('UTF-8'))
|
|
sha = request.form.get('sha')
|
|
path = request.form.get('path')
|
|
sample['content'] = content.decode('UTF-8')
|
|
sample['sha'] = sha
|
|
|
|
resp = oauth.gitea.request('PUT', urllib.parse.quote('{}/contents/{}'.format(app.config.get('REPO_URL'), path)), data=json.dumps(sample), headers={'Content-type': 'application/json'})
|
|
print(resp)
|
|
|
|
return str(resp)
|
|
|
|
@app.route('/upload', methods=['POST'])
|
|
def upload():
|
|
file = request.files
|
|
path = request.form.get('path')
|
|
head, tail = os.path.split(path)
|
|
path = head + '/' + file['file'].filename
|
|
image_string = base64.b64encode(file['file'].read())
|
|
payload = {"content": "", "message": "WEB API add file"}
|
|
payload['content'] = image_string.decode('UTF-8')
|
|
resp = oauth.gitea.request('POST', urllib.parse.quote('{}/contents/{}'.format(app.config.get('REPO_URL'), path)), data=json.dumps(payload), headers={'Content-type': 'application/json'})
|
|
|
|
return 'OK'
|
|
|
|
if __name__ == "__main__":
|
|
gitea = oauth.create_client('gitea')
|
|
app.run(debug=True)
|