Move parse_repository_name into decorators

This commit is contained in:
Joseph Schorr 2017-07-20 11:31:22 -04:00
parent a64f268344
commit 98e2ccf74d
10 changed files with 40 additions and 49 deletions

View file

@ -1,14 +1,9 @@
import logging import logging
import json
import string
import datetime import datetime
import os import os
import re
from random import SystemRandom
from functools import wraps from functools import wraps
from cachetools import lru_cache
from flask import make_response, render_template, request, abort, session from flask import make_response, render_template, request, abort, session
from flask_login import login_user from flask_login import login_user
from flask_principal import identity_changed from flask_principal import identity_changed
@ -21,11 +16,10 @@ from auth import scopes
from auth.permissions import QuayDeferredPermissionUser from auth.permissions import QuayDeferredPermissionUser
from config import frontend_visible_config from config import frontend_visible_config
from external_libraries import get_external_javascript, get_external_css from external_libraries import get_external_javascript, get_external_css
from util.names import parse_namespace_repository
from util.secscan import PRIORITY_LEVELS from util.secscan import PRIORITY_LEVELS
from util.saas.useranalytics import build_error_callback from util.saas.useranalytics import build_error_callback
from util.timedeltastring import convert_to_timedelta from util.timedeltastring import convert_to_timedelta
from _init import STATIC_DIR, __version__ from _init import __version__
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -33,28 +27,6 @@ logger = logging.getLogger(__name__)
route_data = None route_data = None
def parse_repository_name(include_tag=False,
ns_kwarg_name='namespace_name',
repo_kwarg_name='repo_name',
tag_kwarg_name='tag_name',
incoming_repo_kwarg='repository'):
def inner(func):
@wraps(func)
def wrapper(*args, **kwargs):
repo_name_components = parse_namespace_repository(kwargs[incoming_repo_kwarg],
app.config['LIBRARY_NAMESPACE'],
include_tag=include_tag)
del kwargs[incoming_repo_kwarg]
kwargs[ns_kwarg_name] = repo_name_components[0]
kwargs[repo_kwarg_name] = repo_name_components[1]
if include_tag:
kwargs[tag_kwarg_name] = repo_name_components[2]
return func(*args, **kwargs)
return wrapper
return inner
def truthy_param(param): def truthy_param(param):
return param not in {False, 'false', 'False', '0', 'FALSE', '', 'null'} return param not in {False, 'false', 'False', '0', 'FALSE', '', 'null'}
@ -99,8 +71,8 @@ def common_login(db_user, permanent_session=True):
return False return False
def list_files(path, extension): def _list_files(path, extension):
import os """ Returns a list of all the files with the given extension found under the given path. """
def matches(f): def matches(f):
return os.path.splitext(f)[1] == '.' + extension and f.split(os.path.extsep)[1] != 'spec' return os.path.splitext(f)[1] == '.' + extension and f.split(os.path.extsep)[1] != 'spec'
@ -118,7 +90,7 @@ def render_page_template(name, route_data=None, **kwargs):
library_styles = [] library_styles = []
main_styles = [] main_styles = []
library_scripts = [] library_scripts = []
main_scripts = list_files('build', 'js') main_scripts = _list_files('build', 'js')
use_cdn = app.config.get('USE_CDN', True) use_cdn = app.config.get('USE_CDN', True)
if request.args.get('use_cdn') is not None: if request.args.get('use_cdn') is not None:

View file

@ -4,8 +4,35 @@ from functools import wraps
from flask import abort from flask import abort
import features import features
from app import app
from auth.auth_context import ( from auth.auth_context import (
get_validated_oauth_token, get_authenticated_user, get_validated_token, get_grant_context) get_validated_oauth_token, get_authenticated_user, get_validated_token, get_grant_context)
from util.names import parse_namespace_repository
def parse_repository_name(include_tag=False,
ns_kwarg_name='namespace_name',
repo_kwarg_name='repo_name',
tag_kwarg_name='tag_name',
incoming_repo_kwarg='repository'):
""" Decorator which parses the repository name found in the incoming_repo_kwarg argument,
and applies its pieces to the decorated function.
"""
def inner(func):
@wraps(func)
def wrapper(*args, **kwargs):
repo_name_components = parse_namespace_repository(kwargs[incoming_repo_kwarg],
app.config['LIBRARY_NAMESPACE'],
include_tag=include_tag)
del kwargs[incoming_repo_kwarg]
kwargs[ns_kwarg_name] = repo_name_components[0]
kwargs[repo_kwarg_name] = repo_name_components[1]
if include_tag:
kwargs[tag_kwarg_name] = repo_name_components[2]
return func(*args, **kwargs)
return wrapper
return inner
def anon_allowed(func): def anon_allowed(func):

View file

@ -9,8 +9,7 @@ from app import app, github_trigger
from auth.decorators import require_session_login from auth.decorators import require_session_login
from auth.permissions import AdministerRepositoryPermission from auth.permissions import AdministerRepositoryPermission
from data import model from data import model
from endpoints.common import parse_repository_name from endpoints.decorators import route_show_if, parse_repository_name
from endpoints.decorators import route_show_if
from util.http import abort from util.http import abort

View file

@ -13,8 +13,7 @@ from auth.permissions import (
ModifyRepositoryPermission, UserAdminPermission, ReadRepositoryPermission, ModifyRepositoryPermission, UserAdminPermission, ReadRepositoryPermission,
CreateRepositoryPermission, repository_read_grant, repository_write_grant) CreateRepositoryPermission, repository_read_grant, repository_write_grant)
from auth.signedgrant import generate_signed_token from auth.signedgrant import generate_signed_token
from endpoints.common import parse_repository_name from endpoints.decorators import anon_protect, anon_allowed, parse_repository_name
from endpoints.decorators import anon_protect, anon_allowed
from endpoints.notificationhelper import spawn_notification from endpoints.notificationhelper import spawn_notification
from endpoints.v1 import v1_bp from endpoints.v1 import v1_bp
from endpoints.v1.models_pre_oci import pre_oci_model as model from endpoints.v1.models_pre_oci import pre_oci_model as model

View file

@ -6,8 +6,7 @@ from flask import abort, request, jsonify, make_response, session
from auth.decorators import process_auth from auth.decorators import process_auth
from auth.permissions import (ReadRepositoryPermission, ModifyRepositoryPermission) from auth.permissions import (ReadRepositoryPermission, ModifyRepositoryPermission)
from data import model from data import model
from endpoints.common import parse_repository_name from endpoints.decorators import anon_protect, parse_repository_name
from endpoints.decorators import anon_protect
from endpoints.v1 import v1_bp from endpoints.v1 import v1_bp
from endpoints.v1.models_pre_oci import pre_oci_model as model from endpoints.v1.models_pre_oci import pre_oci_model as model
from util.audit import track_and_log from util.audit import track_and_log

View file

@ -11,8 +11,7 @@ from app import storage, app, get_app_url, metric_queue
from auth.registry_jwt_auth import process_registry_jwt_auth from auth.registry_jwt_auth import process_registry_jwt_auth
from data import database from data import database
from digest import digest_tools from digest import digest_tools
from endpoints.common import parse_repository_name from endpoints.decorators import anon_protect, parse_repository_name
from endpoints.decorators import anon_protect
from endpoints.v2 import v2_bp, require_repo_read, require_repo_write, get_input_stream from endpoints.v2 import v2_bp, require_repo_read, require_repo_write, get_input_stream
from endpoints.v2.errors import ( from endpoints.v2.errors import (
BlobUnknown, BlobUploadInvalid, BlobUploadUnknown, Unsupported, NameUnknown, LayerTooLarge) BlobUnknown, BlobUploadInvalid, BlobUploadUnknown, Unsupported, NameUnknown, LayerTooLarge)

View file

@ -9,8 +9,7 @@ import features
from app import docker_v2_signing_key, app, metric_queue from app import docker_v2_signing_key, app, metric_queue
from auth.registry_jwt_auth import process_registry_jwt_auth from auth.registry_jwt_auth import process_registry_jwt_auth
from digest import digest_tools from digest import digest_tools
from endpoints.common import parse_repository_name from endpoints.decorators import anon_protect, parse_repository_name
from endpoints.decorators import anon_protect
from endpoints.notificationhelper import spawn_notification from endpoints.notificationhelper import spawn_notification
from endpoints.v2 import v2_bp, require_repo_read, require_repo_write from endpoints.v2 import v2_bp, require_repo_read, require_repo_write
from endpoints.v2.models_interface import Label from endpoints.v2.models_interface import Label

View file

@ -1,8 +1,7 @@
from flask import jsonify from flask import jsonify
from auth.registry_jwt_auth import process_registry_jwt_auth from auth.registry_jwt_auth import process_registry_jwt_auth
from endpoints.common import parse_repository_name from endpoints.decorators import anon_protect, parse_repository_name
from endpoints.decorators import anon_protect
from endpoints.v2 import v2_bp, require_repo_read, paginate from endpoints.v2 import v2_bp, require_repo_read, paginate
from endpoints.v2.models_pre_oci import data_model as model from endpoints.v2.models_pre_oci import data_model as model

View file

@ -10,8 +10,7 @@ from auth.auth_context import get_authenticated_user
from auth.decorators import process_auth from auth.decorators import process_auth
from auth.permissions import ReadRepositoryPermission from auth.permissions import ReadRepositoryPermission
from data import database from data import database
from endpoints.common import parse_repository_name from endpoints.decorators import anon_protect, route_show_if, parse_repository_name
from endpoints.decorators import anon_protect, route_show_if
from endpoints.verbs.models_pre_oci import pre_oci_model as model from endpoints.verbs.models_pre_oci import pre_oci_model as model
from endpoints.v2.blob import BLOB_DIGEST_ROUTE from endpoints.v2.blob import BLOB_DIGEST_ROUTE
from image.appc import AppCImageFormatter from image.appc import AppCImageFormatter

View file

@ -27,10 +27,9 @@ from buildtrigger.triggerutil import TriggerProviderException
from data import model from data import model
from data.database import db from data.database import db
from endpoints.api.discovery import swagger_route_data from endpoints.api.discovery import swagger_route_data
from endpoints.common import (common_login, render_page_template, param_required, from endpoints.common import (common_login, render_page_template, param_required)
parse_repository_name)
from endpoints.csrf import csrf_protect, generate_csrf_token, verify_csrf from endpoints.csrf import csrf_protect, generate_csrf_token, verify_csrf
from endpoints.decorators import anon_protect, anon_allowed, route_show_if from endpoints.decorators import anon_protect, anon_allowed, route_show_if, parse_repository_name
from health.healthcheck import get_healthchecker from health.healthcheck import get_healthchecker
from util.cache import no_cache from util.cache import no_cache
from util.headers import parse_basic_auth from util.headers import parse_basic_auth