예제 #1
0
파일: api.py 프로젝트: tuxx/findex-gui
from flask_yoloapi import endpoint, parameter
from sqlalchemy import func

from findex_common.static_variables import FileProtocols
from findex_gui.web import app, db
from findex_gui.bin import validators
from findex_gui.bin.reachability import TestReachability
from findex_gui.orm.models import ResourceGroup
from findex_gui.controllers.amqp.amqp import MqController
from findex_gui.controllers.resources.resources import ResourceController
from findex_gui.controllers.resources.groups import ResourceGroupController
from findex_gui.controllers.user.decorators import admin_required


@app.route("/api/v2/resource/add", methods=["POST"])
@endpoint.api(parameter("server_name", type=str, required=False),
              parameter("server_address", type=str, required=False),
              parameter("server_id", type=int, required=False),
              parameter("resource_port", type=int, required=True),
              parameter("resource_protocol",
                        type=int,
                        required=False,
                        validator=validators.server_protocol),
              parameter("auth_user", type=str, required=False),
              parameter("auth_pass", type=str, required=False),
              parameter("auth_type", type=str, required=False),
              parameter("user_agent", type=str, required=False),
              parameter("recursive_sizes", type=bool, required=False),
              parameter("basepath", type=str, required=True),
              parameter("display_url", type=str, required=False),
              parameter("description", type=str, required=False),
예제 #2
0
import flask
from flask_yoloapi import endpoint, parameter

from findex_gui.web import app, locales
from findex_gui.bin import validators
from findex_gui.orm.models import User
from findex_gui.controllers.auth.auth import get_current_user_data
from findex_gui.controllers.user.decorators import login_required
from findex_gui.controllers.user.user import UserController


@app.route("/api/v2/user/delete", methods=["POST"])
@endpoint.api(
    parameter("username", type=str, required=True)
)
def api_user_delete(username):
    """
    Deletes an user.
    :param username: the username in question
    :return:
    """
    user = UserController.user_delete(username=username)
    return "user '%s' deleted" % username


@app.route("/api/v2/user/register", methods=["POST"])
@endpoint.api(
    parameter("username", type=str, required=True),
    parameter("password", type=str, required=True, validator=validators.strong_password)
)
def api_user_register(username, password):
예제 #3
0
from flask_yoloapi import endpoint, parameter

from findex_gui.web import app
from findex_gui.controllers.news.news import NewsController
from findex_gui.controllers.user.decorators import admin_required


@app.route("/api/v2/news/add", methods=["POST"])
@admin_required
@endpoint.api(parameter("content", type=str, required=True),
              parameter("title", type=str, required=True))
def api_news_add(content, title):
    NewsController.add(content=content, title=title)
    return "post added"


@app.route("/api/v2/news/update", methods=["POST"])
@admin_required
@endpoint.api(parameter("uid", type=int, required=True),
              parameter("content", type=str, required=False),
              parameter("title", type=str, required=False))
def api_news_update(uid, content, title):
    NewsController.update(uid=uid, content=content, title=title)
    return "post updated"
예제 #4
0
def create_app():
    app = Flask(__name__)

    @app.route('/api/test_get')
    @endpoint.api(parameter('name', type=str, required=True))
    def api_test_get(name):
        return name

    @app.route('/api/test_get_coerce')
    @endpoint.api(parameter('name', type=str, required=True),
                  parameter('age', type=int, required=True))
    def api_test_get_coerce(name, age):
        return [name, age]

    @app.route('/api/test_any')
    @endpoint.api(parameter('name', type=ANY, required=True))
    def api_test_any(name):
        return name

    @app.route('/api/test_post', methods=['POST'])
    @endpoint.api(parameter('name', type=str))
    def api_test_post(name):
        return name

    @app.route('/api/test_get_default')
    @endpoint.api(parameter('name', type=str, default='default'))
    def api_test_get_default(name):
        return name

    @app.route('/api/test_datetime')
    @endpoint.api(parameter('date', type=datetime, required=True))
    def api_test_datetime(date):
        return date

    @app.route('/api/test_bool', methods=['GET', 'POST'])
    @endpoint.api(parameter('flag', type=bool, required=True))
    def api_test_bool(flag):
        return flag

    def age_validator(value):
        # test custom exception
        if value >= 150:
            raise Exception("you can't possibly be that old!")

        # test custom response
        if value >= 120:
            return Response('all lies', status=403)

        # test invalid response
        if value >= 110:
            return 1, 1

    @app.route('/api/test_validator')
    @endpoint.api(
        parameter('age', type=int, required=True, validator=age_validator))
    def api_test_age_validator(age):
        return age

    @app.route('/api/test_broken_route')
    @endpoint.api(parameter('age', type=int, required=False, default=28))
    def api_test_broken_route(age):
        raise Exception('whoops')

    @app.route('/api/test_status_code')
    @endpoint.api(parameter('age', type=int, required=False, default=28))
    def api_test_status_code(age):
        return "203 test", 203

    @app.route('/api/test_bad_status_code')
    @endpoint.api(parameter('age', type=int, required=False, default=28))
    def api_test_bad_status_code(age):
        return "203 test", 203, 1

    class UFO:
        def __init__(self):
            self.foo = 'bar'

    @app.route('/api/test_unknown_return')
    @endpoint.api(parameter('age', type=int, required=False, default=28))
    def api_test_unknown_return(age):
        return UFO()

    @app.route('/api/test_empty_return')
    @endpoint.api()
    def api_test_empty_return():
        return

    @app.route('/api/test_custom_return')
    @endpoint.api()
    def api_test_custom_return():
        return Response("foo", 203)

    @app.route('/api/test_docstring')
    @endpoint.api(parameter("foo", default="bar", type=str))
    def api_test_docstring(foo):
        """
        Just a test. With multiple
        lines.
        :param foo: bar!
        :param faulty line, should be ignored as a param.
        :return: Nothing, really.
        """
        raise Exception('whoops')

    @app.route('/api/test_types', methods=["GET", 'POST'])
    @endpoint.api(parameter('a', type=str, required=True),
                  parameter('b', type=int, required=True),
                  parameter('c', type=dict, required=False),
                  parameter('d', type=list, required=False),
                  parameter('e', type=datetime, required=True),
                  parameter('f', type=bool, required=False))
    def api_test_types(a, b, c, d, e, f):
        return [a, b, c, d, e, f]

    if sys.version_info >= (3, 5):

        @app.route('/api/test_type_annotations')
        @endpoint.api(parameter('name', required=True),
                      parameter('age', required=False))
        def api_test_type_annotations(name: str,
                                      age: int,
                                      location: str = "Amsterdam"):
            return {"name": name, "age": age, "location": location}

        @app.route('/api/test_type_annotations_fail')
        @endpoint.api(parameter('name', required=True),
                      parameter('age', required=False))
        def api_test_type_annotations_fail(name: str, age):
            return {"name": name, "age": age}

    return app
예제 #5
0
파일: api.py 프로젝트: xmranon/wownero-wfs
from datetime import datetime
from flask import request, redirect, Response, abort, render_template, url_for, flash, make_response, send_from_directory, jsonify
from flask.ext.login import login_user, logout_user, current_user, login_required, current_user
from flask_yoloapi import endpoint, parameter

import settings
from wowfunding.factory import app, db_session
from wowfunding.orm.orm import Proposal, User


@app.route('/api/1/proposals')
@endpoint.api(parameter('status', type=int, location='args', default=1),
              parameter('cat', type=str, location='args'),
              parameter('limit', type=int, location='args', default=20),
              parameter('offset', type=int, location='args', default=0))
def api_proposals_get(status, cat, limit, offset):
    try:
        proposals = Proposal.find_by_args(status=status,
                                          cat=cat,
                                          limit=limit,
                                          offset=offset)
    except Exception as ex:
        print(ex)
        return 'error', 500

    return [p.json for p in proposals]


@app.route('/api/1/convert/wow-usd')
@endpoint.api(parameter('wow', type=int, location='args', required=True))
def api_wow_usd(wow):
예제 #6
0
파일: api.py 프로젝트: tuxx/findex-gui
from flask_yoloapi import endpoint, parameter
from findex_common.utils_time import TimeMagic

from findex_gui.web import app
from findex_gui.controllers.user.decorators import admin_required
from findex_gui.controllers.admin.logs.logs import LogController


@app.route("/api/v2/admin/logs/get")
@admin_required
@endpoint.api(parameter("category", type=str),
              parameter("limit", type=int, default=10),
              parameter("offset", type=int, default=0))
def api_admin_scheduler_logs_get(category, limit, offset):
    entries = LogController.get(category=category, limit=limit, offset=offset)

    rtn = []
    for entry in entries:
        blob = entry.get_json()
        blob["date_added_ago"] = TimeMagic().ago_dt(blob["date_added"])
        rtn.append(blob)

    return {
        "records": rtn,
        "totalRecordCount": len(rtn),
        "queryRecordCount": -1
    }
예제 #7
0
@app.route('/proposal/add/disclaimer')
def proposal_add_disclaimer():
    return make_response(render_template(('proposal/disclaimer.html')))


@app.route('/proposal/add')
def proposal_add():
    if current_user.is_anonymous:
        return make_response(redirect(url_for('login')))
    default_content = settings.PROPOSAL_CONTENT_DEFAULT
    return make_response(render_template('proposal/edit.html', default_content=default_content))


@app.route('/proposal/comment', methods=['POST'])
@endpoint.api(
    parameter('pid', type=int, required=True),
    parameter('text', type=str, required=True),
    parameter('cid', type=int, required=False)
)
def proposal_comment(pid, text, cid):
    if current_user.is_anonymous:
        flash('not logged in', 'error')
        return redirect(url_for('proposal', pid=pid))
    if len(text) <= 3:
        flash('comment too short', 'error')
        return redirect(url_for('proposal', pid=pid))
    try:
        Comment.add_comment(user_id=current_user.id, message=text, pid=pid, cid=cid)
    except Exception as ex:
        flash('Could not add comment: %s' % str(ex), 'error')
        return redirect(url_for('proposal', pid=pid))
예제 #8
0
from flask import session
from flask_yoloapi import endpoint, parameter

from findex_gui.web import app

KEYS = ["search_display_view"]

VALUES = ["table", "fancy"]


@app.route("/api/v2/session/set", methods=["POST"])
@endpoint.api(parameter("key", type=str, required=True),
              parameter("val", type=str, required=False))
def api_session_set(key, val):
    if key not in KEYS:
        return Exception("key \"%s\" doesn't exist" % key)
    if val not in VALUES:
        return Exception("could not set val \"%s\" - doesn't exist" % val)
    session[key] = val
    return "session key set"


@app.route("/api/v2/session/get", methods=["POST"])
@endpoint.api(parameter("key", type=str, required=True),
              parameter("val", type=str, required=True))
def api_session_get(key, val):
    if key not in KEYS:
        return Exception("key \"%s\" doesn't exist" % key)
    if key not in session:
        session[key] = "fancy"
    return session[key]
예제 #9
0
import re

import requests
from flask import jsonify, send_from_directory, Response
from flask_yoloapi import endpoint, parameter

from funding.bin.utils import get_ip
from funding.bin.qr import QrCodeGenerator
from funding.factory import app, cache
from funding.orm import Proposal


@app.route('/api/1/proposals')
@endpoint.api(
    parameter('status', type=int, location='args', default=1),
    parameter('cat', type=str, location='args'),
    parameter('limit', type=int, location='args', default=20),
    parameter('offset', type=int, location='args', default=0)
)
def api_proposals_get(status, cat, limit, offset):
    try:
        proposals = Proposal.find_by_args(status=status, cat=cat, limit=limit, offset=offset)
    except Exception as ex:
        print(ex)
        return 'error', 500
    return [p.json for p in proposals]


@app.route('/api/1/convert/wow-usd')
@endpoint.api(
    parameter('amount', type=int, location='args', required=True)
예제 #10
0

@blueprint.route("/checklogin", methods=["GET"])
@cross_origin(supports_credentials=True)
@endpoint.api()
def loggedin():
    if 'username' in session:
        return {"isLoggedIn": True}
    if 'username' not in session:
        return {"isLoggedIn": False}


@blueprint.route("/login", methods=["POST"])
@cross_origin(supports_credentials=True)
@endpoint.api(
    parameter('username', type=str, required=False),
    parameter('password', type=str, required=False),
)
def login(username, password):
    pass_salt = ('%s%s' % (password, admin_auth['salt'])).encode('utf-8')
    pass_hash = sha256(pass_salt).hexdigest()
    if username == admin_auth['username'] and pass_hash == admin_auth[
            'password']:
        session['username'] = username
        return {"isLoggedIn": True}
    else:
        return {"message": "Username or password incorrect."}, 401


@blueprint.route("/logout", methods=["GET"])
@cross_origin(supports_credentials=True)
예제 #11
0
파일: api.py 프로젝트: tuxx/findex-gui
from flask import jsonify
from flask_yoloapi import endpoint, parameter
from sqlalchemy import func

from findex_gui.web import app, db
from findex_gui.orm.models import NmapRule
from findex_gui.controllers.user.decorators import admin_required
from findex_gui.controllers.nmap.nmap import NmapController


@app.route("/api/v2/admin/server/nmap/add", methods=["POST"])
@admin_required
@endpoint.api(parameter("rule", type=str, required=True),
              parameter("name", type=str, required=True),
              parameter("interval", type=str, required=False, default=None),
              parameter("group", type=str, required=False, default="Default"))
def api_admin_server_nmap_add(rule, name, interval, group):
    if isinstance(interval, str) and not interval.isdigit():
        interval = None
    else:
        interval = int(interval)

    return NmapController.add(cmd=rule,
                              name=name,
                              interval=interval,
                              group=group)


@app.route("/api/v2/admin/server/nmap/delete", methods=["POST"])
@admin_required
@endpoint.api(parameter("uid", type=int, required=True))
예제 #12
0
from flask_yoloapi import endpoint, parameter

from findex_gui.web import app
from findex_gui.bin import validators
from findex_gui.controllers.user.decorators import admin_required
from findex_gui.controllers.amqp.amqp import MqController
from findex_gui.controllers.amqp.amqp import AmqpConnectionController


@app.route("/api/v2/admin/mq/add", methods=["POST"])
@admin_required
@endpoint.api(
    parameter("name", type=str, required=True),
    parameter("broker",
              type=str,
              required=True,
              default="rabbitmq",
              validator=validators.amqp_broker),
    parameter("host", type=str, required=True),
    parameter("port", type=int, required=True),
    parameter("vhost", type=str, required=True),
    parameter("queue", type=str, required=True),
    parameter("ssl", type=bool, required=False, default=False),
    parameter("auth_user", type=str, required=True),
    parameter("auth_pass", type=str, required=True),
)
def api_admin_mq_add(name, broker, host, port, vhost, queue, ssl, auth_user,
                     auth_pass):
    """
    Adds a MQ server, for now, only rabbitmq is supported
    :param name: name of the 'mq' broker
예제 #13
0
from flask import Blueprint, g
from flask_yoloapi import endpoint, parameter

from grant.proposal.models import Proposal, proposal_team
from grant.utils.auth import requires_sm, requires_same_user_auth, verify_signed_auth, BadSignatureException
from .models import User, SocialMedia, Avatar, users_schema, user_schema, db

blueprint = Blueprint('user', __name__, url_prefix='/api/v1/users')


@blueprint.route("/", methods=["GET"])
@endpoint.api(parameter('proposalId', type=str, required=False))
def get_users(proposal_id):
    proposal = Proposal.query.filter_by(id=proposal_id).first()
    if not proposal:
        users = User.query.all()
    else:
        users = User.query.join(proposal_team).join(Proposal) \
            .filter(proposal_team.c.proposal_id == proposal.id).all()
    result = users_schema.dump(users)
    return result


@blueprint.route("/me", methods=["GET"])
@requires_sm
@endpoint.api()
def get_me():
    dumped_user = user_schema.dump(g.current_user)
    return dumped_user

예제 #14
0
    proposal = Proposal.query.filter_by(id=proposal_id).first()
    if proposal:
        dumped_proposal = proposal_schema.dump(proposal)
        return {
            "proposalId": proposal_id,
            "totalComments": len(dumped_proposal["comments"]),
            "comments": dumped_proposal["comments"]
        }
    else:
        return {"message": "No proposal matching id"}, 404


@blueprint.route("/<proposal_id>/comments", methods=["POST"])
@requires_sm
@endpoint.api(
    parameter('content', type=str, required=True)
)
def post_proposal_comments(proposal_id, user_id, content):
    proposal = Proposal.query.filter_by(id=proposal_id).first()
    if proposal:
        comment = Comment(
            proposal_id=proposal_id,
            user_id=g.current_user.id,
            content=content
        )
        db.session.add(comment)
        db.session.commit()
        dumped_comment = comment_schema.dump(comment)
        return dumped_comment, 201
    else:
        return {"message": "No proposal matching id"}, 404
예제 #15
0
from findex_gui.controllers.search.search import SearchController
from flask_yoloapi import endpoint, parameter

from findex_common.static_variables import FileCategories


@app.route("/api/v2/search/<string:key>", methods=["GET"])
def api_search_get(key):
    controller = SearchController()
    result = controller.search(key=key)
    return flask.jsonify(**result.get_json())


@app.route("/api/v2/search/<string:key>", methods=["POST"])
@endpoint.api(
    parameter("file_categories", type=list),
    parameter("file_extensions", type=list),
    parameter("file_type", type=list),
    parameter("file_size", type=str),
    parameter("page", type=int, default=0),
    parameter("per_page", type=int),
    parameter("lazy_search", type=bool),
    parameter("autocomplete", type=bool),
)
def api_search_post(key: str,
                    file_categories: list = None,
                    file_extensions: list = None,
                    file_size: list = None,
                    file_type: str = "both",
                    page: int = 0,
                    per_page: int = 30,
예제 #16
0
    file_content = ""
    with open(os.path.join(HERE_PATH, "../resources/" + ".".join((name, locale, extension))), "r", encoding="utf-8") as f:
        file_content = f.read()
    return file_content

@app.route("/resource/<name>/<locale>/<file_type>", methods=["GET"])
@endpoint.api()
def get_resource(name: str, locale: str, file_type: str = 'json'):
    content = get_file_content(name.lower(), locale.lower(), file_type)
    if (file_type == 'json'):
        return json.loads(content)
    return content

@app.route("/submitContactForm", methods=["POST"])
@endpoint.api(
    parameter("name", type=str, required=True),
    parameter("email", type=str, required=True),
    parameter("message", type=str, required=True)
)
def submit_contact_form(name, email, message):
    msg = EmailMessage()
    msg.set_content(message)
    msg["Subject"] = name + " - " + email
    msg["From"] = "*****@*****.**"
    msg["To"] = "*****@*****.**"
    if MAILJET_SECRET != "":
        with SMTP(MAILJET_URL, MAILJET_PORT) as smtp:
            smtp.starttls()
            smtp.login(MAILJET_USERNAME, MAILJET_SECRET)
            smtp.send_message(msg)
    else: