Fixes various issues. (#317)

This commit is contained in:
kevgliss 2016-05-16 09:23:48 -07:00
parent 58e8fe0bd0
commit c11034b9bc
13 changed files with 140 additions and 111 deletions

View File

@ -60,8 +60,15 @@ class AuthorityInputSchema(LemurInputSchema):
raise ValidationError("If generating a subca parent 'authority' must be specified.")
class AuthorityUpdateSchema(LemurInputSchema):
owner = fields.Email()
description = fields.String()
roles = fields.Nested(AssociatedRoleSchema(many=True))
class AuthorityOutputSchema(LemurOutputSchema):
id = fields.Integer()
description = fields.String()
name = fields.String()
owner = fields.Email()
not_before = fields.DateTime()
@ -73,7 +80,7 @@ class AuthorityOutputSchema(LemurOutputSchema):
options = fields.Dict()
roles = fields.List(fields.Nested(AssociatedRoleSchema))
authority_update_schema = AuthorityUpdateSchema()
authority_input_schema = AuthorityInputSchema()
authority_output_schema = AuthorityOutputSchema()
authorities_output_schema = AuthorityOutputSchema(many=True)

View File

@ -17,7 +17,7 @@ from lemur.roles import service as role_service
from lemur.certificates import service as certificate_service
from lemur.authorities import service
from lemur.authorities.schemas import authority_input_schema, authority_output_schema, authorities_output_schema
from lemur.authorities.schemas import authority_input_schema, authority_output_schema, authorities_output_schema, authority_update_schema
mod = Blueprint('authorities', __name__)
@ -218,7 +218,7 @@ class Authorities(AuthenticatedResource):
"""
return service.get(authority_id)
@validate_schema(authority_input_schema, authority_output_schema)
@validate_schema(authority_update_schema, authority_output_schema)
def put(self, authority_id, data=None):
"""
.. http:put:: /authorities/1
@ -266,6 +266,10 @@ class Authorities(AuthenticatedResource):
:statuscode 403: unauthenticated
"""
authority = service.get(authority_id)
if not authority:
return dict(message='Not Found'), 404
role = role_service.get_by_name(authority.owner)
# all the authority role members should be allowed
@ -277,7 +281,7 @@ class Authorities(AuthenticatedResource):
# we want to make sure that we cannot add roles that we are not members of
if not g.current_user.is_admin:
role_ids = set([r['id'] for r in data['roles']])
role_ids = set([r.id for r in data['roles']])
user_role_ids = set([r.id for r in g.current_user.roles])
if not role_ids.issubset(user_role_ids):

View File

@ -6,7 +6,7 @@
.. moduleauthor:: Kevin Glisson <kglisson@netflix.com>
"""
from marshmallow import fields
from lemur.users.schemas import UserOutputSchema
from lemur.users.schemas import UserNestedOutputSchema
from lemur.authorities.schemas import AuthorityOutputSchema
from lemur.common.schema import LemurInputSchema, LemurOutputSchema
from lemur.schemas import AssociatedUserSchema, AssociatedAuthoritySchema
@ -27,7 +27,7 @@ class RoleOutputSchema(LemurOutputSchema):
name = fields.String()
description = fields.String()
authorities = fields.Nested(AuthorityOutputSchema, many=True)
users = fields.Nested(UserOutputSchema, many=True)
users = fields.Nested(UserNestedOutputSchema, many=True)
role_input_schema = RoleInputSchema()

View File

@ -113,7 +113,7 @@ class PluginOutputSchema(LemurOutputSchema):
label = fields.String()
description = fields.String()
active = fields.Boolean()
plugin_options = fields.List(fields.Dict())
options = fields.List(fields.Dict(), dump_to='pluginOptions')
slug = fields.String()
title = fields.String()

View File

@ -1,8 +1,6 @@
<div class="modal-header">
<div class="modal-title">
<button type="button" class="close" ng-click="cancel()" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h3 class="modal-header">Edit <span class="text-muted"><small>{{ authority.name }}</small></span></h3>
</div>
<h3>Edit <span class="text-muted"><small>{{ authority.name }}</small></span></h3>
<div class="modal-body">
<form name="createForm" class="form-horizontal" role="form" novalidate>
<div class="form-group"
@ -62,4 +60,3 @@
<button ng-click="save(authority)" type="submit" ng-disabled="createForm.$invalid" class="btn btn-primary">Save</button>
<button ng-click="cancel()" class="btn btn-danger">Cancel</button>
</div>
</div>

View File

@ -1,7 +1,6 @@
<div class="modal-header">
<div class="modal-title">
<button type="button" class="close" ng-click="cancel()" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h3 class="modal-header">Edit <span class="text-muted"><small>{{ certificate.name }}</small></span></h3>
<h3>Edit <span class="text-muted"><small>{{ certificate.name }}</small></span></h3>
</div>
<div class="modal-body">
<form name="editForm" class="form-horizontal" role="form" novalidate>
@ -37,4 +36,3 @@
<button type="submit" ng-click="save(certificate)" ng-disabled="editForm.$invalid" class="btn btn-success">Save</button>
<button ng-click="cancel()" class="btn btn-danger">Cancel</button>
</div>
</div>

View File

@ -40,7 +40,7 @@ angular.module('lemur')
toaster.pop({
type: 'error',
title: 'Opps',
body: 'I see what you did there' + response.data.message
body: 'I see what you did there: ' + response.data.message
});
}
);

View File

@ -46,7 +46,7 @@ angular.module('lemur')
toaster.pop({
type: 'error',
title: 'Opps',
body: 'I see what you did there' + response.data.message
body: 'I see what you did there: ' + response.data.message
});
}
);

View File

@ -5,7 +5,6 @@ angular.module('lemur')
.controller('RolesEditController', function ($scope, $uibModalInstance, RoleApi, RoleService, UserService, toaster, editId) {
RoleApi.get(editId).then(function (role) {
$scope.role = role;
RoleService.getUsers(role);
});
$scope.save = function (role) {
@ -40,7 +39,23 @@ angular.module('lemur')
};
$scope.userService = UserService;
$scope.roleService = RoleService;
$scope.loadPassword = function (role) {
RoleService.loadPassword(role).then(
function (response) {
$scope.role.password = response.password;
$scope.role.username = response.username;
}, function (response) {
toaster.pop({
type: 'error',
title: role.name,
body: 'lemur-bad-request',
bodyOutputType: 'directive',
directiveData: response.data,
timeout: 100000
});
});
};
})
.controller('RolesCreateController', function ($scope,$uibModalInstance, RoleApi, RoleService, UserService, LemurRestangular, toaster) {

View File

@ -78,7 +78,7 @@
</div>
</form>
<div class="modal-footer">
<button ng-click="roleService.loadPassword(role)" class="btn btn-warning pull-left">Show Credentials</button>
<button ng-click="loadPassword(role)" class="btn btn-warning pull-left">Show Credentials</button>
<button ng-click="save(role)" type="submit" ng-disabled="createForm.$invalid" class="btn btn-primary">Save</button>
<button ng-click="cancel()" class="btn btn-danger">Cancel</button>
</div>

View File

@ -40,7 +40,7 @@ angular.module('lemur')
toaster.pop({
type: 'error',
title: 'Opps',
body: 'I see what you did there' + response.data.message
body: 'I see what you did there: ' + response.data.message
});
}
);

View File

@ -44,8 +44,8 @@ def test_authority_post(client, token, status):
@pytest.mark.parametrize("token,status", [
(VALID_USER_HEADER_TOKEN, 400),
(VALID_ADMIN_HEADER_TOKEN, 400),
(VALID_USER_HEADER_TOKEN, 200),
(VALID_ADMIN_HEADER_TOKEN, 200),
('', 401)
])
def test_authority_put(client, token, status):

View File

@ -30,6 +30,14 @@ class UserOutputSchema(LemurOutputSchema):
authorities = fields.Nested(AssociatedAuthoritySchema, many=True)
class UserNestedOutputSchema(LemurOutputSchema):
__envelope__ = False
id = fields.Integer()
username = fields.String()
email = fields.Email()
active = fields.Boolean()
user_input_schema = UserInputSchema()
user_output_schema = UserOutputSchema()
users_output_schema = UserOutputSchema(many=True)