360 StoreFactory storeFactory = authorization.getStoreFactory();
361 Map<String, ResourcePermission> permissionsToEvaluate =
new LinkedHashMap<>();
362 ResourceStore resourceStore = storeFactory.getResourceStore();
363 ScopeStore scopeStore = storeFactory.getScopeStore();
364 Metadata metadata = request.getMetadata();
365 final AtomicInteger limit = metadata != null && metadata.getLimit() != null ?
new AtomicInteger(metadata.getLimit()) : null;
367 for (Permission permission : ticket.getPermissions()) {
368 if (limit != null && limit.get() <= 0) {
372 Set<String> requestedScopes = permission.getScopes();
374 if (permission.getScopes() == null) {
375 requestedScopes =
new HashSet<>();
378 List<Resource> requestedResources =
new ArrayList<>();
379 String resourceId = permission.getResourceId();
381 if (resourceId != null) {
382 Resource resource = null;
384 if (resourceId.indexOf(
'-') != -1) {
385 resource = resourceStore.findById(resourceId, resourceServer.getId());
388 if (resource != null) {
389 requestedResources.add(resource);
391 String resourceName = resourceId;
392 Resource ownerResource = resourceStore.findByName(resourceName, identity.getId(), resourceServer.getId());
394 if (ownerResource != null) {
395 permission.setResourceId(ownerResource.getId());
396 requestedResources.add(ownerResource);
399 if (!identity.isResourceServer()) {
400 Resource serverResource = resourceStore.findByName(resourceName, resourceServer.getId());
402 if (serverResource != null) {
403 permission.setResourceId(serverResource.getId());
404 requestedResources.add(serverResource);
410 String clientAdditionalScopes = request.getScope();
412 if (clientAdditionalScopes != null) {
413 requestedScopes.addAll(Arrays.asList(clientAdditionalScopes.split(
" ")));
416 Set<Scope> requestedScopesModel = requestedScopes.stream().map(s -> scopeStore.findByName(s, resourceServer.getId())).filter(Objects::nonNull).collect(Collectors.toSet());
418 if (resourceId != null && requestedResources.isEmpty()) {
419 throw new CorsErrorResponseException(request.getCors(),
"invalid_resource",
"Resource with id [" + resourceId +
"] does not exist.", Status.BAD_REQUEST);
422 if (!requestedScopes.isEmpty() && requestedScopesModel.isEmpty()) {
423 throw new CorsErrorResponseException(request.getCors(),
"invalid_scope",
"One of the given scopes " + permission.getScopes() +
" is invalid", Status.BAD_REQUEST);
426 if (!requestedResources.isEmpty()) {
427 for (Resource resource : requestedResources) {
428 if (limit != null && limit.get() <= 0) {
431 ResourcePermission perm = permissionsToEvaluate.get(resource.getId());
434 perm = Permissions.createResourcePermissions(resource, requestedScopesModel, authorization, request);
435 permissionsToEvaluate.put(resource.getId(), perm);
437 limit.decrementAndGet();
440 for (Scope scope : requestedScopesModel) {
441 perm.addScope(scope);
446 AtomicBoolean processed =
new AtomicBoolean();
448 resourceStore.findByScope(requestedScopesModel.stream().map(
Scope::getId).collect(Collectors.toList()), resourceServer.getId(), resource -> {
449 if (limit != null && limit.get() <= 0) {
453 ResourcePermission perm = permissionsToEvaluate.get(resource.getId());
456 perm = Permissions.createResourcePermissions(resource, requestedScopesModel, authorization, request);
457 permissionsToEvaluate.put(resource.getId(), perm);
459 limit.decrementAndGet();
462 for (Scope scope : requestedScopesModel) {
463 perm.addScope(scope);
467 processed.compareAndSet(
false,
true);
470 if (!processed.get()) {
471 for (Scope scope : requestedScopesModel) {
472 if (limit != null && limit.getAndDecrement() <= 0) {
475 permissionsToEvaluate.computeIfAbsent(scope.getId(), s ->
new ResourcePermission(null,
new ArrayList<>(Arrays.asList(scope)), resourceServer, request.getClaims()));
481 AccessToken rpt = request.getRpt();
483 if (rpt != null && rpt.isActive()) {
484 AccessToken.Authorization authorizationData = rpt.getAuthorization();
486 if (authorizationData != null) {
487 Collection<Permission> permissions = authorizationData.getPermissions();
489 if (permissions != null) {
490 for (Permission grantedPermission : permissions) {
491 if (limit != null && limit.get() <= 0) {
495 Resource resource = resourceStore.findById(grantedPermission.getResourceId(), ticket.getAudience()[0]);
497 if (resource != null) {
498 ResourcePermission permission = permissionsToEvaluate.get(resource.getId());
500 if (permission == null) {
501 permission =
new ResourcePermission(resource,
new ArrayList<>(), resourceServer, grantedPermission.getClaims());
502 permissionsToEvaluate.put(resource.getId(), permission);
504 limit.decrementAndGet();
507 if (grantedPermission.getClaims() != null) {
508 for (Entry<String, Set<String>> entry : grantedPermission.getClaims().entrySet()) {
509 Set<String> claims = permission.getClaims().get(entry.getKey());
511 if (claims != null) {
512 claims.addAll(entry.getValue());
518 for (String scopeName : grantedPermission.getScopes()) {
519 Scope scope = scopeStore.findByName(scopeName, resourceServer.getId());
522 if (!permission.getScopes().contains(scope)) {
523 permission.getScopes().add(scope);
533 return permissionsToEvaluate.values();