Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixes + DSM6 support #8

Closed
wants to merge 7 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions manage.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@
from unittest import TextTestRunner

from flask import current_app
from flask.ext.migrate import MigrateCommand
from flask.ext.script import Manager, Option
from flask.ext.security.script import (CreateUserCommand, DeactivateUserCommand, ActivateUserCommand, CreateRoleCommand,
from flask_migrate import MigrateCommand
from flask_script import Manager, Option
from flask_security.script import (CreateUserCommand, DeactivateUserCommand, ActivateUserCommand, CreateRoleCommand,
RemoveRoleCommand, AddRoleCommand, commit)
from flask.ext.security.utils import encrypt_password
from flask_security.utils import encrypt_password

from spkrepo import create_app
from spkrepo.ext import db
Expand Down
23 changes: 23 additions & 0 deletions migrations/versions/a41b2b645a3c_.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
"""Update for DSM6

Revision ID: a41b2b645a3c
Revises: 26b4c36c11e
Create Date: 2016-12-20 18:30:15.449680

"""
revision = 'a41b2b645a3c'
down_revision = '26b4c36c11e'

from alembic import op
import sqlalchemy as sa



def upgrade():
op.add_column('version', sa.Column('conf_privilege', sa.Unicode(length=255), nullable=True))
op.add_column('version', sa.Column('conf_resource', sa.Unicode(length=255), nullable=True))


def downgrade():
op.drop_column('version', 'conf_resource')
op.drop_column('version', 'conf_privilege')
1 change: 0 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
-e git+https://github.com/Diaoul/[email protected]#egg=Flask-Login
-e .
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@


tests_require = ['Flask-Testing',
'factory-boy', 'fake-factory',
'factory-boy', 'Faker',
'lxml', 'urltools',
'coveralls']

Expand Down
2 changes: 1 addition & 1 deletion spkrepo/app.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
import jinja2
from flask import Flask
from flask.ext.admin import Admin
from flask_admin import Admin
from wtforms import HiddenField

from . import config as default_config
Expand Down
2 changes: 2 additions & 0 deletions spkrepo/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -363,6 +363,8 @@ class Version(db.Model):
conf_dependencies = db.Column(db.Unicode(255))
conflicts = db.Column(db.Unicode(255))
conf_conflicts = db.Column(db.Unicode(255))
conf_privilege = db.Column(db.Unicode(255))
conf_resource = db.Column(db.Unicode(255))
install_wizard = db.Column(db.Boolean)
upgrade_wizard = db.Column(db.Boolean)
startable = db.Column(db.Boolean)
Expand Down
2 changes: 1 addition & 1 deletion spkrepo/templates/layout.html
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
{% endfor %}
</ul>
<ul class="nav navbar-nav navbar-right">
{% if current_user.is_authenticated() %}
{% if current_user.is_authenticated %}
{% if current_user.has_role('developer') or current_user.has_role('package_admin') or
current_user.has_role('admin') %}
{% set right_nav = [
Expand Down
28 changes: 26 additions & 2 deletions spkrepo/tests/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -457,7 +457,7 @@ def create_image(text, width=640, height=480):
def create_spk(build, info=None, signature=None, with_checksum=False, with_package_icons=True, with_info_icons=False,
with_info=True, with_package=True, with_scripts=True, with_conf=False, info_encoding='utf-8',
license_encoding='utf-8', signature_encoding='ascii', conf_dependencies_encoding='utf-8',
conf_conflicts_encoding='utf-8'):
conf_conflicts_encoding='utf-8', conf_privilege_encoding='utf-8', conf_resource_encoding='utf-8'):
"""
Create a valid SPK file

Expand All @@ -478,6 +478,8 @@ def create_spk(build, info=None, signature=None, with_checksum=False, with_packa
:param signature_encoding: encoding for the syno_signature.asc file
:param conf_dependencies_encoding: encoding for the conf/PKG_DEPS file
:param conf_conflicts_encoding: encoding for the conf/PKG_CONX file
:param conf_privilege_encoding: encoding for the conf/privilege file
:param conf_resource_encoding: encoding for the conf/resource file
:return: the created SPK stream
"""
# generate an info if none is given
Expand Down Expand Up @@ -506,7 +508,7 @@ def create_spk(build, info=None, signature=None, with_checksum=False, with_packa
spk.addfile(signature_tarinfo, fileobj=signature_stream)

# conf
if with_conf or build.version.conf_dependencies is not None or build.version.conf_conflicts is not None:
if with_conf or build.version.conf_dependencies is not None or build.version.conf_conflicts or build.version.conf_privilege is not None:
conf_folder_tarinfo = tarfile.TarInfo('conf')
conf_folder_tarinfo.type = tarfile.DIRTYPE
conf_folder_tarinfo.mode = 0o755
Expand All @@ -533,6 +535,28 @@ def create_spk(build, info=None, signature=None, with_checksum=False, with_packa
conf_tarinfo.size = conf_stream_bytes.tell()
conf_stream_bytes.seek(0)
spk.addfile(conf_tarinfo, fileobj=conf_stream_bytes)
if build.version.conf_privilege is not None:
conf_tarinfo = tarfile.TarInfo('conf/privilege')
config = ConfigParser()
config.read_dict(json.loads(build.version.conf_privilege))
conf_stream = io.StringIO()
config.write(conf_stream)
conf_stream_bytes = io.BytesIO(conf_stream.getvalue().encode(conf_privilege_encoding))
conf_stream_bytes.seek(0, io.SEEK_END)
conf_tarinfo.size = conf_stream_bytes.tell()
conf_stream_bytes.seek(0)
spk.addfile(conf_tarinfo, fileobj=conf_stream_bytes)
if build.version.conf_resource is not None:
conf_tarinfo = tarfile.TarInfo('conf/resource')
config = ConfigParser()
config.read_dict(json.loads(build.version.conf_resource))
conf_stream = io.StringIO()
config.write(conf_stream)
conf_stream_bytes = io.BytesIO(conf_stream.getvalue().encode(conf_resource_encoding))
conf_stream_bytes.seek(0, io.SEEK_END)
conf_tarinfo.size = conf_stream_bytes.tell()
conf_stream_bytes.seek(0)
spk.addfile(conf_tarinfo, fileobj=conf_stream_bytes)

# wizards
wizards = []
Expand Down
12 changes: 12 additions & 0 deletions spkrepo/tests/test_nas.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,18 @@ def assertCatalogEntry(self, entry, build, data=None, link_params=None):
else:
self.assertNotIn('conf_conxpkgs', entry)

# conf_privilege
if build.version.conf_privilege:
self.assertEqual(entry['conf_privilege'], build.version.conf_privilege)
else:
self.assertNotIn('conf_privilege', entry)

# conf_resource
if build.version.conf_resource:
self.assertEqual(entry['conf_resource'], build.version.conf_resource)
else:
self.assertNotIn('conf_resource', entry)

def test_missing_data_arch(self):
self.assert400(self.client.post(url_for('nas.catalog'), data=dict(build='1594', language='enu')))

Expand Down
21 changes: 18 additions & 3 deletions spkrepo/tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,9 @@ def test_generic(self):
self.assertEqual(build.version.maintainer_url, spk.info['maintainer_url'])
self.assertEqual(build.version.package.name, spk.info['package'])
self.assertEqual(build.version.report_url, spk.info['report_url'])
self.assertEqual(build.version.conf_dependencies is not None or build.version.conf_conflicts is not None,
spk.info['support_conf_folder'])
self.assertEqual(build.version.conf_dependencies is not None or build.version.conf_conflicts is not None or \
build.version.conf_privilege is not None or build.version.conf_resource is not None,
spk.info['support_conf_folder'])
self.assertEqual(build.version.version_string, spk.info['version'])

# icons
Expand Down Expand Up @@ -185,7 +186,7 @@ def test_invalid_spk(self):
self.assertEqual('Invalid SPK', str(cm.exception))

def test_missing_conf_folder(self):
build = BuildFactory.build(version__conf_dependencies=None, version__conf_conflicts=None)
build = BuildFactory.build(version__conf_dependencies=None, version__conf_conflicts=None, version__conf_privilege=None, version__conf_resource=None)
info = create_info(build)
info['support_conf_folder'] = 'yes'
with create_spk(build, info=info, with_conf=False) as f:
Expand All @@ -207,6 +208,20 @@ def test_wrong_conf_conflicts_encoding(self):
SPK(f)
self.assertEqual('Wrong conf/PKG_CONX encoding', str(cm.exception))

def test_wrong_conf_privilege_encoding(self):
build = BuildFactory.build(version__conf_privilege=json.dumps({'déçu': {'run-as': '<run-as>'}}))
with create_spk(build, conf_privilege_encoding='latin-1') as f:
with self.assertRaises(SPKParseError) as cm:
SPK(f)
self.assertEqual('Wrong conf/privilege encoding', str(cm.exception))

def test_wrong_conf_resource_encoding(self):
build = BuildFactory.build(version__conf_resource=json.dumps({'déçu': {'<resource-id>': '<specification>'}}))
with create_spk(build, conf_resource_encoding='latin-1') as f:
with self.assertRaises(SPKParseError) as cm:
SPK(f)
self.assertEqual('Wrong conf/resource encoding', str(cm.exception))

def test_empty_conf_folder(self):
build = BuildFactory.build(version__conf_dependencies=None, version__conf_conflicts=None)
info = create_info(build)
Expand Down
15 changes: 14 additions & 1 deletion spkrepo/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ def __init__(self, stream):
self.stream = stream
self.conf_dependencies = None
self.conf_conflicts = None
self.conf_privilege = None
self.conf_resource = None

self.stream.seek(0)
try:
Expand Down Expand Up @@ -151,7 +153,18 @@ def __init__(self, stream):
except UnicodeDecodeError:
raise SPKParseError('Wrong conf/PKG_CONX encoding')
self.conf_conflicts = json.dumps({s: {k: v for k, v in c.items(s)} for s in c.sections()})
if self.conf_dependencies is None and self.conf_conflicts is None:
if 'conf/privilege' in names:
try:
self.conf_privilege = spk.extractfile('conf/privilege').read().decode('utf-8').strip()
except UnicodeDecodeError:
raise SPKParseError('Wrong conf/privilege encoding')
if 'conf/resource' in names:
try:
self.conf_resource = spk.extractfile('conf/resource').read().decode('utf-8').strip()
except UnicodeDecodeError:
raise SPKParseError('Wrong conf/resource encoding')
if self.conf_dependencies is None and self.conf_conflicts is None and \
self.conf_privilege is None and self.conf_resource is None:
raise SPKParseError('Empty conf folder')

# verify checksum
Expand Down
28 changes: 14 additions & 14 deletions spkrepo/views/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@
import shutil

from flask import flash, url_for, redirect, abort, current_app
from flask.ext.admin import AdminIndexView, expose
from flask.ext.admin.actions import action
from flask.ext.admin.contrib.sqla import ModelView
from flask.ext.admin.contrib.sqla.form import get_form
from flask.ext.admin.contrib.sqla.tools import get_query_for_ids
from flask.ext.admin.form import ImageUploadField
from flask.ext.security import current_user
from flask_admin import AdminIndexView, expose
from flask_admin.actions import action
from flask_admin.contrib.sqla import ModelView
from flask_admin.contrib.sqla.form import get_form
from flask_admin.contrib.sqla.tools import get_query_for_ids
from flask_admin.form import ImageUploadField
from flask_security import current_user
from markupsafe import Markup
from wtforms import PasswordField
from wtforms.validators import Regexp
Expand All @@ -27,7 +27,7 @@ def __init__(self, **kwargs):

# Permissions
def is_accessible(self):
return current_user.is_authenticated() and current_user.has_role('admin')
return current_user.is_authenticated and current_user.has_role('admin')

can_create = False

Expand Down Expand Up @@ -73,7 +73,7 @@ def __init__(self, **kwargs):

# Permissions
def is_accessible(self):
return current_user.is_authenticated() and current_user.has_role('package_admin')
return current_user.is_authenticated and current_user.has_role('package_admin')

can_edit = False

Expand All @@ -87,7 +87,7 @@ def __init__(self, **kwargs):

# Permissions
def is_accessible(self):
return current_user.is_authenticated() and current_user.has_role('package_admin')
return current_user.is_authenticated and current_user.has_role('package_admin')

can_edit = False

Expand Down Expand Up @@ -121,7 +121,7 @@ def __init__(self, **kwargs):

# Permissions
def is_accessible(self):
return current_user.is_authenticated() and current_user.has_role('package_admin')
return current_user.is_authenticated and current_user.has_role('package_admin')

# View
def _display(view, context, model, name):
Expand All @@ -144,7 +144,7 @@ def __init__(self, **kwargs):

# Permissions
def is_accessible(self):
return current_user.is_authenticated() and current_user.has_role('package_admin')
return current_user.is_authenticated and current_user.has_role('package_admin')

@property
def can_create(self):
Expand Down Expand Up @@ -197,7 +197,7 @@ def __init__(self, **kwargs):

# Permissions
def is_accessible(self):
return current_user.is_authenticated() and any(map(current_user.has_role, ('developer', 'package_admin')))
return current_user.is_authenticated and any(map(current_user.has_role, ('developer', 'package_admin')))

can_create = False

Expand Down Expand Up @@ -372,7 +372,7 @@ def __init__(self, **kwargs):

# Permissions
def is_accessible(self):
return current_user.is_authenticated() and any(map(current_user.has_role, ('developer', 'package_admin')))
return current_user.is_authenticated and any(map(current_user.has_role, ('developer', 'package_admin')))

can_create = False

Expand Down
2 changes: 2 additions & 0 deletions spkrepo/views/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,8 @@ def post(self):
conf_dependencies=spk.conf_dependencies,
conflicts=spk.info.get('install_conflict_packages'),
conf_conflicts=spk.conf_conflicts,
conf_privilege=spk.conf_privilege,
conf_resource=spk.conf_resource,
install_wizard='install' in spk.wizards, upgrade_wizard='upgrade' in spk.wizards,
startable=spk.info.get('startable'), license=spk.license)

Expand Down
8 changes: 4 additions & 4 deletions spkrepo/views/frontend.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
import os

from flask import Blueprint, render_template, redirect, url_for, abort
from flask.ext.security import current_user, login_required, ConfirmRegisterForm
from flask.ext.security.forms import ChangePasswordForm
from flask.ext.wtf import Form
from flask_security import current_user, login_required, ConfirmRegisterForm
from flask_security.forms import ChangePasswordForm
from flask_wtf import FlaskForm
from wtforms import ValidationError, StringField, SubmitField
from wtforms.validators import InputRequired, Length

Expand All @@ -21,7 +21,7 @@ def index():
return render_template('frontend/index.html')


class GenerateApiKeyForm(Form):
class GenerateApiKeyForm(FlaskForm):
"""Form for generating an API key"""
api_key = StringField('API Key')
submit = SubmitField('Generate API Key')
Expand Down
4 changes: 4 additions & 0 deletions spkrepo/views/nas.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,10 @@ def get_catalog(arch, build, language, beta):
entry['conf_deppkgs'] = b.version.conf_dependencies
if b.version.conf_conflicts:
entry['conf_conxpkgs'] = b.version.conf_conflicts
if b.version.conf_privilege:
entry['conf_privilege'] = b.version.conf_privilege
if b.version.conf_resource:
entry['conf_resource'] = b.version.conf_resource
entries.append(entry)

# DSM 5.1
Expand Down