8000 Dedicated service users by krystian-panek-vmltech · Pull Request #99 · wttech/acm · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Dedicated service users #99

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

Merged
merged 2 commits into from
May 16, 2025
Merged
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
1 change: 1 addition & 0 deletions Taskfile.yml
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,7 @@ tasks:
- src/**/*
- ../ui.apps/target/*.ui.apps-*.zip
- ../ui.content/target/*.ui.content-*.zip
- ../ui.config/target/*.ui.config-*.zip
- ../ui.content.migration/target/*.ui.content.migration-*.zip
- ../ui.content.permissions/target/*.ui.content.permissions-*.zip
generates: [ target/*.all-*.zip ]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,6 @@ public class AclContext {

private final PermissionsManager permissionsManager;

private final boolean compositeNodeStore;

public AclContext(ResourceResolver resourceResolver) {
try {
this.logger = LoggerFactory.getLogger(AclContext.class);
Expand All @@ -42,7 +40,6 @@ public AclContext(ResourceResolver resourceResolver) {
this.resourceResolver = resourceResolver;
this.authorizableManager = new AuthorizableManager(session, userManager, valueFactory);
this.permissionsManager = new PermissionsManager(session, accessControlManager, valueFactory);
this.compositeNodeStore = new Repo(resourceResolver).isCompositeNodeStore();
} catch (RepositoryException e) {
throw new AclException("Cannot access repository while obtaining ACL context!", e);
}
Expand All @@ -65,7 +62,7 @@ public PermissionsManager getPermissionsManager() {
}

public boolean isCompositeNodeStore() {
return compositeNodeStore;
return new Repo(resourceResolver).isCompositeNodeStore();
}

public AclUser determineUser(User user) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ public JobExecutionResult process(Job job, JobExecutionContext context) {
private Execution executeAsync(ExecutionContextOptions contextOptions, QueuedExecution execution)
throws AcmException {
try (ResourceResolver resolver =
ResourceUtils.serviceResolver(resourceResolverFactory, contextOptions.getUserId());
ResourceUtils.contentResolver(resourceResolverFactory, contextOptions.getUserId());
ExecutionContext context = executor.createContext(
execution.getJob().getId(),
contextOptions.getExecutionMode(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ public ExecutionContext createContext(

public Execution execute(Executable executable, ExecutionContextOptions contextOptions) throws AcmException {
try (ResourceResolver resourceResolver =
ResourceUtils.serviceResolver(resourceResolverFactory, contextOptions.getUserId()) 8000 ;
ResourceUtils.contentResolver(resourceResolverFactory, contextOptions.getUserId());
ExecutionContext executionContext = createContext(
ExecutionId.generate(), contextOptions.getExecutionMode(), executable, resourceResolver)) {
return execute(executionContext);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ protected void deactivate() {
}

public HealthStatus checkStatus() {
try (ResourceResolver resourceResolver = ResourceUtils.serviceResolver(resourceResolverFactory, null)) {
try (ResourceResolver resourceResolver = ResourceUtils.contentResolver(resourceResolverFactory, null)) {
return checkStatus(resourceResolver);
} catch (Exception e) {
LOG.error("Health checker failed", e);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;

try (ResourceResolver resolver = ResourceUtils.serviceResolver(resolverFactory, null)) {
try (ResourceResolver resolver = ResourceUtils.mockResolver(resolverFactory)) {
CodeContext codeContext = new CodeContext(osgiContext, resolver);
MockRepository repository = new MockRepository(resolver);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ public void run() {
ExecutionContextOptions contextOptions =
new ExecutionContextOptions(ExecutionMode.RUN, config.userImpersonationId());
try (ResourceResolver resourceResolver =
ResourceUtils.serviceResolver(resourceResolverFactory, contextOptions.getUserId())) {
ResourceUtils.contentResolver(resourceResolverFactory, contextOptions.getUserId())) {
ScriptRepository scriptRepository = new ScriptRepository(resourceResolver);

scriptRepository.clean();
Expand Down
54 changes: 40 additions & 14 deletions core/src/main/java/com/vml/es/aem/acm/core/util/ResourceUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,32 +13,58 @@

public final class ResourceUtils {

public enum Subservice {
CONTENT("acm-content-service"),
MOCK("acm-mock-service");

public final String userId;

Subservice(String userId) {
this.userId = userId;
}

public String id() {
return name().toLowerCase();
}
}

private ResourceUtils() {
// intentionally empty
}

public static ResourceResolver serviceResolver(
public static ResourceResolver contentResolver(
ResourceResolverFactory resourceResolverFactory, String userImpersonationId) throws LoginException {
boolean impersonation = StringUtils.isNotBlank(userImpersonationId);
return serviceResolver(resourceResolverFactory, Subservice.CONTENT, userImpersonationId);
}

public static ResourceResolver mockResolver(ResourceResolverFactory resourceResolverFactory) throws LoginException {
return serviceResolver(resourceResolverFactory, Subservice.MOCK, null);
}

private static ResourceResolver serviceResolver(
ResourceResolverFactory resourceResolverFactory, Subservice subservice, String userImpersonationId)
throws LoginException {
Map<String, Object> params = new HashMap<>();
params.put(ResourceResolverFactory.SUBSERVICE, "acm");
if (impersonation) {
params.put(ResourceResolverFactory.USER_IMPERSONATION, userImpersonationId);
params.put(ResourceResolverFactory.SUBSERVICE, subservice.id());

boolean impersonation = StringUtils.isNotBlank(userImpersonationId);
if (!impersonation) {
return resourceResolverFactory.getServiceResourceResolver(params);
}

try {
params.put(ResourceResolverFactory.USER_IMPERSONATION, userImpersonationId);
ResourceResolver resolver = resourceResolverFactory.getServiceResourceResolver(params);
if (impersonation) {
String userImpersonationIdEffective = serviceOrImpersonatedUserId(resolver);
if (!StringUtils.equals(userImpersonationId, userImpersonationIdEffective)) {
throw new AcmException(String.format(
"Cannot impersonate user '%s' as service user '%s' is used instead!",
serviceOrImpersonatedUserId(resolver), userImpersonationId));
}
String userImpersonationIdEffective = serviceOrImpersonatedUserId(resolver);
if (!StringUtils.equals(userImpersonationId, userImpersonationIdEffective)) {
throw new AcmException(String.format(
"Cannot impersonate user '%s' as service user '%s' is used instead!",
serviceOrImpersonatedUserId(resolver), userImpersonationId));
}
return resolver;
} catch (LoginException e) {
return resourceResolverFactory.getAdministrativeResourceResolver(
params); // fix for 'Impersonation not allowed' on 6.5.0 (supported by login admin whitelist)
// fix for 'Impersonation not allowed' on 6.5.0 (supported by login admin whitelist)
return resourceResolverFactory.getAdministrativeResourceResolver(params);
}
}

Expand Down
2 changes: 2 additions & 0 deletions ui.config/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@
<properties>
<cloudManagerTarget>none</cloudManagerTarget>
</properties>
<group>com.vml.es.aem.acm</group>
<name>acm.ui.config</name>
<packageType>container</packageType>
<showImportPackageReport>false</showImportPackageReport>
</configuration>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,14 @@ scripts=["
create path /conf/acm/settings/script/auto/enabled(sling:OrderedFolder)
create path /var/acm(sling:OrderedFolder)

create service user acm-service with path system/acm/acm-service

set ACL for acm-service
create service user acm-content-service with path system/acm/acm-content-service
set ACL for acm-content-service
allow jcr:all on /
end

create service user acm-mock-service with path system/acm/acm-mock-service
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hard to say if this is accurate ; it's fail-safe default but security concerns still need to be resolved case by case by projects using the ACM tool

set ACL for acm-mock-service
allow jcr:read on /content
allow jcr:read on /conf
end
"]
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
service.ranking=I"100"
user.mapping=["acm.core:acm\=acm-service"]
user.mapping=["acm.core:content\=acm-content-service", "acm.core:mock\=acm-mock-service"]

0