1
2 import base64
3 import datetime
4 import functools
5 from logging import getLogger
6
7 from flask import url_for
8 import flask
9
10 from ..models import User, Copr, BuildChroot, Build
11 from ..logic.users_logic import UsersLogic
12 from ..logic.builds_logic import BuildsLogic
13 from ..logic.coprs_logic import CoprsLogic
14 from ..rest_api.schemas import BuildTaskSchema
15 from ..rest_api.util import mm_serialize_one, get_one_safe
16
17 from .exceptions import AuthFailed, ObjectNotFoundError
18 from .schemas import CoprChrootSchema, BuildSchema, ProjectSchema
19 from .util import mm_serialize_one
20 from coprs import app
21
22 log = getLogger(__name__)
35
38 if self_params is None:
39 self_params = {}
40 return {
41 "build": BuildSchema().dump(build)[0],
42 "_links": {
43 "self": {"href": url_for(".buildr", build_id=build.id, **self_params)},
44 "project": {"href": url_for(".projectr", project_id=build.copr_id)},
45 "build_tasks": {"href": url_for(".buildtasklistr", build_id=build.id)}
46 }
47 }
48
51 """
52 :param Copr project:
53 """
54 if self_params is None:
55 self_params = {}
56
57 return {
58 "project": mm_serialize_one(ProjectSchema, project),
59 "_links": {
60 "self": {"href": url_for(".projectr", project_id=project.id, **self_params)},
61 "builds": {"href": url_for(".buildlistr", project_id=project.id)},
62 "chroots": {"href": url_for(".projectchrootlistr", project_id=project.id)},
63 "build_tasks": {"href":url_for(".buildtasklistr", project_id=project.id) }
64 },
65 }
66
82
85
86 @functools.wraps(f)
87 def decorated_function(*args, **kwargs):
88 token = None
89 api_login = None
90 try:
91 if "Authorization" in flask.request.headers:
92 base64string = flask.request.headers["Authorization"]
93 base64string = base64string.split()[1].strip()
94 userstring = base64.b64decode(base64string)
95 (api_login, token) = userstring.decode("utf-8").split(":")
96 except Exception:
97 log.exception("Failed to get auth token from headers")
98 api_login = token = None
99
100 token_auth = False
101 if token and api_login:
102 user = UsersLogic.get_by_api_login(api_login).first()
103 if (user and user.api_token == token and
104 user.api_token_expiration >= datetime.date.today()):
105
106 token_auth = True
107 flask.g.user = user
108 if not token_auth:
109 message = (
110 "Login invalid/expired. "
111 "Please visit {0}/api "
112 "get or renew your API token.")
113
114 raise AuthFailed(message.format(app.config["PUBLIC_COPR_HOSTNAME"]))
115 return f(*args, **kwargs)
116 return decorated_function
117
129
141
153