PYTHON   19
app py
Guest on 27th August 2023 05:49:54 AM


  1. # coding: utf-8
  2.  
  3. from flask import Response
  4. from datetime import datetime, timedelta
  5. from flask import Flask
  6. from flask import session, request
  7. from flask import render_template, redirect, jsonify
  8. from flask_sqlalchemy import SQLAlchemy
  9. from werkzeug.security import gen_salt
  10. from flask_oauthlib.provider import OAuth2Provider
  11. import re
  12.  
  13. #mysql://username:password@server/db
  14. app = Flask(__name__, template_folder='templates')
  15. app.debug = True
  16. app.secret_key = 'secret'
  17. app.config.update({
  18.     'SQLALCHEMY_POOL_RECYCLE':7,
  19.     'SQLALCHEMY_DATABASE_URI': 'mysql://root:82282578@localhost:3306/amazon',
  20. })
  21. db = SQLAlchemy(app)
  22. oauth = OAuth2Provider(app)
  23.  
  24.  
  25. class User(db.Model):
  26.     id = db.Column(db.Integer, primary_key=True)
  27.     pin = db.Column(db.String(255), unique=True)
  28.  
  29.  
  30. class Client(db.Model):
  31.     id = db.Column(db.Integer, primary_key=True)
  32.     client_id = db.Column(db.String(100))
  33.  
  34.     user_id = db.Column(db.ForeignKey('user.id'))
  35.     user = db.relationship('User')
  36.  
  37.     state = db.Column(db.Text)
  38.     _redirect_uris = db.Column(db.Text)
  39.     _default_scopes = db.Column(db.Text)
  40.  
  41.     @property
  42.     def client_type(self):
  43.         return 'public'
  44.  
  45.     @property
  46.     def redirect_uris(self):
  47.         if self._redirect_uris:
  48.             return self._redirect_uris.split()
  49.         return []
  50.  
  51.     @property
  52.     def default_redirect_uri(self):
  53.         return self.redirect_uris[0]
  54.  
  55.     @property
  56.     def default_scopes(self):
  57.         if self._default_scopes:
  58.             return self._default_scopes.split()
  59.         return []
  60.     @property
  61.     def default_scope(self):
  62.         if self.default_scopes:
  63.             return self.default_scopes[0]
  64.         return ''
  65.        
  66. class Grant(db.Model):
  67.     id = db.Column(db.Integer, primary_key=True)
  68.  
  69.     user_id = db.Column(
  70.         db.Integer, db.ForeignKey('user.id', ondelete='CASCADE')
  71.     )
  72.     user = db.relationship('User')
  73.  
  74.     client_id = db.Column(
  75.         db.String(100), db.ForeignKey('client.client_id'),
  76.         nullable=False,
  77.     )
  78.     client = db.relationship('Client')
  79.  
  80.     code = db.Column(db.String(255), index=True, nullable=False)
  81.  
  82.     redirect_uri = db.Column(db.String(255))
  83.     expires = db.Column(db.DateTime)
  84.  
  85.     _scopes = db.Column(db.Text)
  86.  
  87.     # state = db.Column(db.String(100))
  88.  
  89.     def delete(self):
  90.         db.session.delete(self)
  91.         db.session.commit()
  92.         return self
  93.  
  94.     @property
  95.     def scopes(self):
  96.         if self._scopes:
  97.             return self._scopes.split()
  98.         return []
  99.  
  100.  
  101. class Token(db.Model):
  102.     id = db.Column(db.Integer, primary_key=True)
  103.     client_id = db.Column(
  104.         db.String(100), db.ForeignKey('client.client_id'),
  105.         nullable=False,
  106.     )
  107.     client = db.relationship('Client')
  108.  
  109.     user_id = db.Column(
  110.         db.Integer, db.ForeignKey('user.id')
  111.     )
  112.     user = db.relationship('User')
  113.  
  114.     # currently only bearer is supported
  115.     token_type = db.Column(db.String(40))
  116.  
  117.     access_token = db.Column(db.String(255), unique=True)
  118.     refresh_token = db.Column(db.String(255), unique=True)
  119.     expires = db.Column(db.DateTime)
  120.     _scopes = db.Column(db.Text)
  121.  
  122.     @property
  123.     def scopes(self):
  124.         if self._scopes:
  125.             return self._scopes.split()
  126.         return []
  127.  
  128. class Error:
  129.     def __init__(self, description ,code):
  130.         self.description = description
  131.         self.code = code
  132.  
  133.  
  134. def current_user():
  135.     if 'id' in session:
  136.         uid = session['id']
  137.         return User.query.get(uid)
  138.     return None
  139.  
  140. def validateEmail(email):
  141.     if email != None and len(email) > 7:
  142.         email = email.replace(' ','')
  143.         if re.match("^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$", email) != None:
  144.             return True
  145.     return False
  146.  
  147. @app.route('/', methods=('GET', 'POST'))
  148. def home():
  149.     if request.method == 'POST':
  150.         pin = request.form.get('pin')
  151.         client = Client(
  152.                     client_id=request.form.get('client_id'),
  153.                     _redirect_uris=request.form.get('redirect_uri'),
  154.                     _default_scopes=request.form.get('scope'),
  155.                     state = request.form.get('state'),
  156.             )
  157.  
  158.         # 瑼X葫 email �聢撘�
  159.  �聢撘�
  160.         if (validateEmail(email=pin)):
  161.             try:
  162.                 user = User.query.filter_by(pin=pin).first()
  163.             except:
  164.                 db.session.rollback()
  165.                 db.session.close()
  166.                 user = User.query.filter_by(pin=pin).first()
  167.  
  168.             if not user:
  169.                 err = Error(code=5, description='Your account is not registered, please use App to register again.')
  170.                 return render_template('home.html', error=err,client=client)
  171.             else:
  172.                 client.user_id = user.id
  173.                 session['id'] = user.id
  174.                 return render_template('authorize.html', user=user,client=client)
  175.         else:
  176.             err = Error(code=4, description='Unqualified email format')
  177.             return render_template('home.html', error=err,client=client)
  178.        
  179.     if request.method == 'GET':
  180.         client = Client(
  181.             client_id=request.args.get('client_id'),
  182.             _redirect_uris=request.args.get('redirect_uri'),
  183.             _default_scopes=request.args.get('scope'),
  184.             state = request.args.get('state'),
  185.         )
  186.         return render_template('home.html',client=client)
  187.  
  188. @oauth.clientgetter
  189. def load_client(client_id):
  190.     return Client.query.filter_by(client_id=client_id).first()
  191.  
  192.  
  193. @oauth.grantgetter
  194. def load_grant(client_id, code):
  195.     return Grant.query.filter_by(client_id=client_id, code=code).first()
  196.  
  197.  
  198. @oauth.grantsetter
  199. def save_grant(client_id, code, request, *args, *#grants = Grant.query.filter_by(client_id=request.client.client_id)
  200. nt.cl#for g in grants:
  201.  g i#   g.delete()
  202.    g.# decide the expires time yourself
  203. time yourself
  204.     expires = datetime.utcnow() + timedelta(seconds=100)
  205.     grant = Grant(
  206.         client_id=client_id,
  207.         code=code['code'],
  208.         redirect_uri=request.redirect_uri,
  209.         _scopes=' '.join(request.sco# state = request.state,
  210. equest.state,
  211.         user=current_user(),
  212.         expires=expires
  213.     )
  214.     db.session.add(grant)
  215.     db.session.commit()
  216.     return grant
  217.  
  218.  
  219. @oauth.tokengetter
  220. def load_token(access_token=None, refresh_token=None):
  221.     if access_token:
  222.         return Token.query.filter_by(access_token=access_token).first()
  223.     elif refresh_token:
  224.         return Token.query.filter_by(refresh_token=refresh_token).first()
  225.  
  226.  
  227. @oauth.tokensetter
  228. def save_token(token, request, *args, **kwargs):
  229.     toks = Token.query.filter_by(
  230.         client_id=request.client.client_id,
  231.         user_id=request.user# make sure that every client has only one token connected to a user
  232. ted to a user
  233.     for t in toks:
  234.         db.session.delete(t)
  235.  
  236.     expires_in = token.pop('expires_in')
  237.     expires = datetime.utcnow() + timedelta(seconds=expires_in)
  238.  
  239.     tok = Token(
  240.         access_token=token['access_token'],
  241.         refresh_token=token['],
  242.        token_type=token['n_type=token['token_type'],
  243.         _scopes=token['scope'],
  244.         expires=expires,
  245.         client_id=request.client.client_id,
  246.         user_id=request.user.i#user = User.query.filter_by(id=tok.user_id).first()
  247. r_id#tokenLog = open(r'/var/www/oauth2/token.log','a')
  248. ken.#tokenLog.write('save_token user_pin:%s access_token:%s refresh token:%s \n' % (user.pin,tok.access_token,tok.refresh_token))
  249. fres#tokenLog.close()
  250. enLog.close()
  251.  
  252.     db.session.add(tok)
  253.     db.session.commit()
  254.     return tok
  255.  
  256.  
  257. @app.route('/oauth/token', methods=['GET', 'POST'])
  258. @oauth.token_handler
  259. def access_token():
  260.     return None
  261.  
  262.  
  263. @app.route('/oauth/authorize', methods=['GET','POST'])
  264. @oauth.authorize_handler
  265. def authorize(*args, **kwargs):
  266.     if request.method == 'POST':
  267.         user_id = request.form.get('user_id')
  268.         client = Client(
  269.                 client_id=request.form.get('client_id'),
  270.                 _redirect_uris=request.form.get('redirect_uri'),
  271.                 _default_scopes=request.form.get('scope'),
  272.                 state = request.form.get('state')
  273.         )
  274.         if request.form.get('yes'irm') == 'yes':
  275.             client.user_id = user_id
  276.             dbClient = Client.query.filter_by(client_id=client.client_id).first()
  277.             if not dbClient:
  278.                 db.session.add(client)
  279.             else:
  280.                 dbClient.user_id = user_id
  281.                 dbClient._redirect_uris = request.form.get('redirect_uri')
  282.                 dbClient._default_scopes = request.form.get('scope')
  283.                 dbClient.state = request.form.get('state')
  284.             db.session.commit()
  285.             db.session.close()
  286.             confirm = request.form.get('confirm','no')
  287.             return confirm == 'yes'
  288.         else:
  289.             err = Error(code=3, description='Authorization failed.')
  290.             return render_template('home.html', error=err,client=client)
  291.  
  292. @app.route('/echo/privacy-policy')
  293. def privacy():
  294.     return render_template('privacy.html')
  295.  
  296. @app.route('/dnvalidation/')
  297. def dnvalidation():
  298.     return render_template('DN_CHECK_FILE.htm')
  299.  
  300. @app.route('/echo/faq')
  301. def faq():
  302.     return render_template('amazonFAQ.html')
  303.  
  304.  
  305. @app.route('/api/me')
  306. @oauth.require_oauth()
  307. def me():
  308.     user = request.oauth.user
  309.     return jsonify(pin=user.pin)
  310.  
  311. @app.teardown_appcontext
  312. def shutdown_session(exception=None):
  313.     db.session.remove()
  314.     if exception and db.session.is_active:
  315.         db.session.rollback()
  316.  
  317. if __name__ == '__main__':
  318.     app.run(port=443,host='amazon.ioshop.co

Raw Paste

Login or Register to edit or fork this paste. It's free.