Browse Source

Permission fixes for contents or schemas.

pull/332/head
Sebastian Stehle 7 years ago
parent
commit
d7a34a95c4
  1. 1
      src/Squidex.Shared/Permissions.cs
  2. 2
      src/Squidex/Areas/Api/Controllers/Apps/AppLanguagesController.cs
  3. 17
      src/Squidex/Pipeline/AppResolver.cs
  4. 7
      src/Squidex/app-config/webpack.config.js
  5. 2
      src/Squidex/app-config/webpack.test.coverage.js
  6. 46
      src/Squidex/app/shared/components/schema-category.component.html
  7. 4
      src/Squidex/app/shared/components/schema-category.component.ts
  8. 4
      src/Squidex/app/shell/pages/app/left-menu.component.html
  9. 2
      src/Squidex/tslint.json

1
src/Squidex.Shared/Permissions.cs

@ -53,7 +53,6 @@ namespace Squidex.Shared
public const string AppContributorsRevoke = "squidex.apps.{app}.contributors.revoke"; public const string AppContributorsRevoke = "squidex.apps.{app}.contributors.revoke";
public const string AppLanguages = "squidex.apps.{app}.languages"; public const string AppLanguages = "squidex.apps.{app}.languages";
public const string AppLanguagesRead = "squidex.apps.{app}.languages.read";
public const string AppLanguagesCreate = "squidex.apps.{app}.languages.create"; public const string AppLanguagesCreate = "squidex.apps.{app}.languages.create";
public const string AppLanguagesUpdate = "squidex.apps.{app}.languages.update"; public const string AppLanguagesUpdate = "squidex.apps.{app}.languages.update";
public const string AppLanguagesDelete = "squidex.apps.{app}.languages.delete"; public const string AppLanguagesDelete = "squidex.apps.{app}.languages.delete";

2
src/Squidex/Areas/Api/Controllers/Apps/AppLanguagesController.cs

@ -39,7 +39,7 @@ namespace Squidex.Areas.Api.Controllers.Apps
[HttpGet] [HttpGet]
[Route("apps/{app}/languages/")] [Route("apps/{app}/languages/")]
[ProducesResponseType(typeof(AppLanguageDto[]), 200)] [ProducesResponseType(typeof(AppLanguageDto[]), 200)]
[ApiPermission(Permissions.AppLanguagesRead)] [ApiPermission(Permissions.AppCommon)]
[ApiCosts(0)] [ApiCosts(0)]
public IActionResult GetLanguages(string app) public IActionResult GetLanguages(string app)
{ {

17
src/Squidex/Pipeline/AppResolver.cs

@ -58,7 +58,7 @@ namespace Squidex.Pipeline
FindByOpenIdSubject(app, user) ?? FindByOpenIdSubject(app, user) ??
FindByOpenIdClient(app, user); FindByOpenIdClient(app, user);
if (permissions.Count == 0) if (permissions == null || permissions.Count == 0)
{ {
var set = user.Permissions(); var set = user.Permissions();
@ -69,11 +69,14 @@ namespace Squidex.Pipeline
} }
} }
var identity = user.Identities.First(); if (permissions != null)
foreach (var permission in permissions)
{ {
identity.AddClaim(new Claim(SquidexClaimTypes.Permissions, permission.Id)); var identity = user.Identities.First();
foreach (var permission in permissions)
{
identity.AddClaim(new Claim(SquidexClaimTypes.Permissions, permission.Id));
}
} }
context.HttpContext.Features.Set<IAppFeature>(new AppFeature(app)); context.HttpContext.Features.Set<IAppFeature>(new AppFeature(app));
@ -91,7 +94,7 @@ namespace Squidex.Pipeline
return role.Permissions; return role.Permissions;
} }
return PermissionSet.Empty; return null;
} }
private static PermissionSet FindByOpenIdSubject(IAppEntity app, ClaimsPrincipal user) private static PermissionSet FindByOpenIdSubject(IAppEntity app, ClaimsPrincipal user)
@ -103,7 +106,7 @@ namespace Squidex.Pipeline
return role.Permissions; return role.Permissions;
} }
return PermissionSet.Empty; return null;
} }
} }
} }

7
src/Squidex/app-config/webpack.config.js

@ -48,7 +48,11 @@ module.exports = {
test: /\.mjs$/, test: /\.mjs$/,
type: "javascript/auto", type: "javascript/auto",
include: [/node_modules/], include: [/node_modules/],
},{ }, {
test: /[\/\\]@angular[\/\\]core[\/\\].+\.js$/, // Remove warning from angular6
parser: { system: true },
include: [/node_modules/],
}, {
test: /\.ts$/, test: /\.ts$/,
use: [{ use: [{
loader: 'awesome-typescript-loader', options: { useCache: true, useBabel: true } loader: 'awesome-typescript-loader', options: { useCache: true, useBabel: true }
@ -140,6 +144,7 @@ module.exports = {
}), }),
new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /en/), new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /en/),
new webpack.ContextReplacementPlugin(/\@angular(\\|\/)core(\\|\/)fesm5/, helpers.root('app')), // Remove warning from angular6
/** /**
* Shim additional libraries * Shim additional libraries

2
src/Squidex/app-config/webpack.test.coverage.js

@ -24,7 +24,7 @@ module.exports = webpackMerge(testConfig, {
test: /\.ts$/, test: /\.ts$/,
use: [{ use: [{
loader: 'istanbul-instrumenter-loader' loader: 'istanbul-instrumenter-loader'
},{ }, {
loader: 'awesome-typescript-loader' loader: 'awesome-typescript-loader'
}, { }, {
loader: 'angular-router-loader' loader: 'angular-router-loader'

46
src/Squidex/app/shared/components/schema-category.component.html

@ -15,26 +15,30 @@
</div> </div>
<ul class="nav nav-panel nav-dark nav-dark-bordered flex-column" *ngIf="isOpen" @fade> <ul class="nav nav-panel nav-dark nav-dark-bordered flex-column" *ngIf="isOpen" @fade>
<li class="nav-item" *ngFor="let schema of schemasFiltered; trackBy: trackBySchema" dnd-draggable [dragEnabled]="!isReadonly" [dragData]="schema"> <ng-container *ngFor="let schema of schemasFiltered; trackBy: trackBySchema">
<a class="nav-link" [routerLink]="schemaRoute(schema)" routerLinkActive="active"> <ng-container *sqxPermission="schemaPermission(schema)">
<div class="row" *ngIf="!isReadonly"> <li class="nav-item" dnd-draggable [dragEnabled]="!isReadonly" [dragData]="schema">
<div class="col col-4"> <a class="nav-link" [routerLink]="schemaRoute(schema)" routerLinkActive="active">
<span class="schema-name schema-name-accent">{{schema.displayName}}</span> <div class="row" *ngIf="!isReadonly">
</div> <div class="col col-4">
<div class="col col-4"> <span class="schema-name schema-name-accent">{{schema.displayName}}</span>
<span class="schema-user"> </div>
<i class="icon-user"></i> {{schema.lastModifiedBy | sqxUserNameRef}} <div class="col col-4">
</span> <span class="schema-user">
</div> <i class="icon-user"></i> {{schema.lastModifiedBy | sqxUserNameRef}}
<div class="col col-4 schema-modified"> </span>
<small class="item-modified">{{schema.lastModified | sqxFromNow}}</small> </div>
<div class="col col-4 schema-modified">
<span class="item-published" [class.unpublished]="!schema.isPublished"></span> <small class="item-modified">{{schema.lastModified | sqxFromNow}}</small>
</div>
</div> <span class="item-published" [class.unpublished]="!schema.isPublished"></span>
</div>
<span class="schema-name" *ngIf="isReadonly">{{schema.displayName}}</span> </div>
</a>
</li> <span class="schema-name" *ngIf="isReadonly">{{schema.displayName}}</span>
</a>
</li>
</ng-container>
</ng-container>
</ul> </ul>
</div> </div>

4
src/Squidex/app/shared/components/schema-category.component.ts

@ -104,6 +104,10 @@ export class SchemaCategoryComponent implements OnInit, OnChanges {
this.schemasState.changeCategory(schema, this.name).pipe(onErrorResumeNext()).subscribe(); this.schemasState.changeCategory(schema, this.name).pipe(onErrorResumeNext()).subscribe();
} }
public schemaPermission(schema: SchemaDto) {
return `?squidex.apps.{app}.schemas.${schema.name}.*;squidex.apps.{app}.contents.${schema.name}.*`;
}
public schemaRoute(schema: SchemaDto) { public schemaRoute(schema: SchemaDto) {
return schema.isSingleton && this.routeSingletonToContent ? [schema.name, schema.id] : [schema.name]; return schema.isSingleton && this.routeSingletonToContent ? [schema.name, schema.id] : [schema.name];
} }

4
src/Squidex/app/shell/pages/app/left-menu.component.html

@ -1,10 +1,10 @@
<ul class="nav flex-column"> <ul class="nav flex-column">
<li class="nav-item" *sqxPermission="'squidex.apps.{app}.schemas.?.read'"> <li class="nav-item" *sqxPermission="'squidex.apps.{app}.schemas.*.read'">
<a class="nav-link" routerLink="schemas" routerLinkActive="active"> <a class="nav-link" routerLink="schemas" routerLinkActive="active">
<i class="nav-icon icon-schemas"></i> <div class="nav-text">Schemas</div> <i class="nav-icon icon-schemas"></i> <div class="nav-text">Schemas</div>
</a> </a>
</li> </li>
<li class="nav-item" *sqxPermission="'squidex.apps.{app}.contents.?.read'"> <li class="nav-item" *sqxPermission="'?squidex.apps.{app}.contents.*.read'">
<a class="nav-link" routerLink="content" routerLinkActive="active"> <a class="nav-link" routerLink="content" routerLinkActive="active">
<i class="nav-icon icon-contents"></i> <div class="nav-text">Content</div> <i class="nav-icon icon-contents"></i> <div class="nav-text">Content</div>
</a> </a>

2
src/Squidex/tslint.json

@ -98,8 +98,6 @@
], ],
"radix": true, "radix": true,
"rxjs-collapse-imports": true, "rxjs-collapse-imports": true,
"rxjs-pipeable-operators-only": true,
"rxjs-no-static-observable-methods": true,
"rxjs-proper-imports": true, "rxjs-proper-imports": true,
"semicolon": [ "semicolon": [
true, true,

Loading…
Cancel
Save