Skip to content

Commit c0c5943

Browse files
committed
Make the owner of the DFK configurable
1 parent 1212bd3 commit c0c5943

File tree

17 files changed

+277
-160
lines changed

17 files changed

+277
-160
lines changed

stroom-config/stroom-config-app/src/test/resources/stroom/config/app/expected.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -781,6 +781,7 @@ appConfig:
781781
refreshAfterWrite: null
782782
statisticsMode: "DROPWIZARD_METRICS"
783783
authenticationRequired: true
784+
dataFeedKeyOwnerMetaKey: "AccountId"
784785
dataFeedKeysDir: "data_feed_keys"
785786
enabledAuthenticationTypes:
786787
- "CERTIFICATE"

stroom-core/src/main/java/stroom/core/receive/AutoContentCreationConfig.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ public AutoContentCreationConfig() {
5858
additionalGroupTemplate = DEFAULT_ADDITIONAL_GROUP_TEMPLATE;
5959
createAsSubjectId = User.ADMINISTRATORS_GROUP_SUBJECT_ID;
6060
createAsType = UserType.GROUP;
61-
// TreeSet to ensure consistent order in the serialised json
62-
// Make all lower case as expression matching is case-sense on field name and we
61+
// Ensure consistent order in the serialised json
62+
// Make all lower case as expression matching is case-sense on field name, and we
6363
// can't be sure what case is used in the receipt headers.
6464
templateMatchFields = CollectionUtil.asUnmodifiabledConsistentOrderSet(normaliseFields(Set.of(
6565
StandardHeaderArguments.FEED,
@@ -136,7 +136,8 @@ public String getAdditionalGroupTemplate() {
136136

137137
@NotNull
138138
@JsonPropertyDescription(
139-
"The subjectId of the user/group who the auto-created content will be created by. " +
139+
"The subjectId of the user/group who the auto-created content will be created by, " +
140+
"typically a group with administrator privileges. " +
140141
"This user/group must have the permission to create all content required. It will also be the " +
141142
"'run as' user for created pipeline processor filters.")
142143
public String getCreateAsSubjectId() {

stroom-core/src/main/java/stroom/core/receive/ContentAutoCreationServiceImpl.java

+43-33
Original file line numberDiff line numberDiff line change
@@ -174,35 +174,29 @@ private static ExpressionMatcher createExpressionMatcher(final ExpressionMatcher
174174
public Optional<FeedDoc> tryCreateFeed(final String feedName,
175175
final UserDesc userDesc,
176176
final AttributeMap attributeMap) {
177-
Objects.requireNonNull(userDesc);
178177
LOGGER.debug("tryCreateFeed - feedName: {}, userRef: {}, attributeMap: {}",
179178
feedName, userDesc, attributeMap);
180179

181-
if (isEligibleForAutoCreation(userDesc, attributeMap)) {
182-
// Content gets created as the configured user
183-
final UserRef runAsUserRef = getRunAsUser();
180+
// Content gets created as the configured user
181+
final UserRef runAsUserRef = getRunAsUser();
184182

185-
final Optional<FeedDoc> optFeedDoc = securityContext.asUserResult(runAsUserRef, () ->
186-
ensureFeed(feedName, userDesc, attributeMap));
183+
final Optional<FeedDoc> optFeedDoc = securityContext.asUserResult(runAsUserRef, () ->
184+
ensureFeed(feedName, userDesc, attributeMap));
187185

188-
LOGGER.debug("feedName: '{}', userDesc: '{}', optFeedDoc: {}",
189-
feedName, userDesc, optFeedDoc);
186+
LOGGER.debug("feedName: '{}', userDesc: '{}', optFeedDoc: {}",
187+
feedName, userDesc, optFeedDoc);
190188

191-
return optFeedDoc;
192-
} else {
193-
LOGGER.debug("Not eligible for auto-creation");
194-
return Optional.empty();
195-
}
189+
return optFeedDoc;
196190
}
197191

198-
private boolean isEligibleForAutoCreation(final UserDesc userDesc,
199-
final AttributeMap attributeMap) {
200-
return NullSafe.allNonNull(userDesc, userDesc.getSubjectId(), attributeMap)
201-
&& attributeMap.containsKey(StandardHeaderArguments.ACCOUNT_ID)
202-
&& attributeMap.containsKey(StandardHeaderArguments.COMPONENT)
203-
&& attributeMap.containsKey(StandardHeaderArguments.SCHEMA)
204-
&& attributeMap.containsKey(StandardHeaderArguments.FORMAT);
205-
}
192+
// private boolean isEligibleForAutoCreation(final UserDesc userDesc,
193+
// final AttributeMap attributeMap) {
194+
// return NullSafe.allNonNull(userDesc, userDesc.getSubjectId(), attributeMap)
195+
// && attributeMap.containsKey(StandardHeaderArguments.ACCOUNT_ID)
196+
// && attributeMap.containsKey(StandardHeaderArguments.COMPONENT)
197+
// && attributeMap.containsKey(StandardHeaderArguments.SCHEMA)
198+
// && attributeMap.containsKey(StandardHeaderArguments.FORMAT);
199+
// }
206200

207201
private UserRef getRunAsUser() {
208202
final AutoContentCreationConfig autoContentCreationConfig = autoContentCreationConfigProvider.get();
@@ -265,32 +259,44 @@ private DocRef doCreateFeed(final String feedName,
265259
final UserDesc userDesc,
266260
final AttributeMap attributeMap) {
267261

268-
final String destinationPath = cachedDestinationPathTemplator.getValue().apply(attributeMap);
262+
final String destinationPath = cachedDestinationPathTemplator.getValue()
263+
.apply(attributeMap);
269264
final DocPath docPath = DocPath.fromPathString(destinationPath);
270265

271266
LOGGER.info("Ensuring path '{}' exists", docPath);
272267
final ExplorerNode destFolder = explorerService.ensureFolderPath(docPath, PermissionInheritance.DESTINATION);
273268
final DocRef destFolderRef = destFolder.getDocRef();
269+
final UserRef userRef;
274270

275-
LOGGER.info("Ensuing user with userRef: '{}' exists", userDesc);
276-
final User user = userService.getOrCreateUser(userDesc);
277-
final UserRef userRef = user.asRef();
271+
if (userDesc != null) {
272+
LOGGER.info("Ensuing user with userRef: '{}' exists", userDesc);
273+
final User user = userService.getOrCreateUser(userDesc);
274+
userRef = user.asRef();
275+
} else {
276+
LOGGER.info("No user details, won't ensure Stroom user or add any users to groups.");
277+
userRef = null;
278+
}
278279

279280
final String groupName = cachedGroupTemplator.getValue().apply(attributeMap);
280-
LOGGER.info("Auto-creating user group '{}', and adding userRef {} to it",
281-
groupName, userRef);
281+
LOGGER.info("Auto-creating user group '{}'", groupName);
282282
final User group = userService.getOrCreateUserGroup(groupName);
283283
addAppPerms(group);
284-
userService.addUserToGroup(userRef, group.asRef());
284+
if (userRef != null) {
285+
LOGGER.info("Adding userRef {} to group '{}", userRef, groupName);
286+
userService.addUserToGroup(userRef, group.asRef());
287+
}
285288

286289
Optional<User> optAdditionalGroup = Optional.empty();
287-
final String additionalGroupName = cachedAdditionalGroupTemplator.getValue().apply(attributeMap);
290+
final String additionalGroupName = cachedAdditionalGroupTemplator.getValue()
291+
.apply(attributeMap);
288292
if (NullSafe.isNonBlankString(additionalGroupName)) {
289-
LOGGER.info("Auto-creating additional user group '{}', and adding userRef {} to it",
290-
additionalGroupName, userRef);
293+
LOGGER.info("Auto-creating user group '{}'", additionalGroupName);
291294
final User additionalGroup = userService.getOrCreateUserGroup(additionalGroupName);
292295
addAppPerms(additionalGroup);
293-
userService.addUserToGroup(userRef, additionalGroup.asRef());
296+
if (userRef != null) {
297+
LOGGER.info("Adding userRef {} to additional group '{}", userRef, additionalGroupName);
298+
userService.addUserToGroup(userRef, additionalGroup.asRef());
299+
}
294300
optAdditionalGroup = Optional.of(additionalGroup);
295301
}
296302

@@ -338,7 +344,11 @@ private void configureFeed(final FeedDoc feedDoc,
338344
}
339345
});
340346

341-
feedDoc.setDescription("Auto-created for user '" + userRef.toDisplayString() + "'");
347+
if (userRef != null) {
348+
feedDoc.setDescription("Auto-created for user '" + userRef.toDisplayString() + "'");
349+
} else {
350+
feedDoc.setDescription("Auto-created");
351+
}
342352
feedDoc.setStatus(FeedStatus.RECEIVE);
343353

344354
consumeAttrVal(attributeMap, StandardHeaderArguments.ENCODING, val ->

stroom-core/src/main/java/stroom/core/receive/FeedStatusServiceImpl.java

+8-3
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import stroom.receive.common.FeedStatusService;
2929
import stroom.security.api.SecurityContext;
3030
import stroom.security.shared.AppPermission;
31+
import stroom.util.NullSafe;
3132
import stroom.util.logging.LambdaLogger;
3233
import stroom.util.logging.LambdaLoggerFactory;
3334
import stroom.util.logging.LogUtil;
@@ -91,16 +92,20 @@ public GetFeedStatusResponse getFeedStatus(final GetFeedStatusRequestV2 request)
9192

9293
FeedStatus feedStatus = feedProperties.getStatus(feedName);
9394
final UserDesc userDesc = request.getUserDesc();
94-
final AttributeMap attributeMap = new AttributeMap(request.getAttributeMap());
9595

9696
LOGGER.debug("feedName: {}, userDesc: {}, feedStatus: {}, ",
9797
feedName, userDesc, feedStatus);
9898

9999
// Feed does not exist so auto-create it if so configured
100-
if (feedStatus == null && userDesc != null) {
100+
if (feedStatus == null) {
101101
if (autoContentCreationConfigProvider.get().isEnabled()) {
102+
final AttributeMap attributeMap = NullSafe.getOrElseGet(
103+
request.getAttributeMap(),
104+
AttributeMap::new,
105+
AttributeMap::new);
102106
// Create the feed if it doesn't already exist
103-
feedStatus = contentAutoCreationService.tryCreateFeed(feedName, userDesc, attributeMap)
107+
feedStatus = contentAutoCreationService.tryCreateFeed(
108+
feedName, userDesc, attributeMap)
104109
.map(FeedDoc::getStatus)
105110
.orElse(null);
106111
} else {

stroom-feed/stroom-feed-api/src/main/java/stroom/feed/api/FeedProperties.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ String getEncoding(final String feedName,
2323

2424
boolean isReference(String feedName);
2525

26+
/**
27+
* DEPRECATED: To be replaced with policy based status decision, one day, maybe.
28+
*/
2629
@Deprecated
27-
// To be replaced with policy based status decision.
2830
FeedStatus getStatus(String feedName);
2931
}

stroom-proxy/stroom-proxy-app/src/test/resources/stroom/dist/proxy-expected.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ proxyConfig:
105105
refreshAfterWrite: null
106106
statisticsMode: "DROPWIZARD_METRICS"
107107
authenticationRequired: true
108+
dataFeedKeyOwnerMetaKey: "AccountId"
108109
dataFeedKeysDir: "data_feed_keys"
109110
enabledAuthenticationTypes:
110111
- "CERTIFICATE"

stroom-receive/stroom-receive-common/src/main/java/stroom/receive/common/CachedHashedDataFeedKey.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,11 @@ public String getHashAlgorithmId() {
5050
}
5151

5252
/**
53-
* @return The account ID associated with this data feed key
53+
* @return The value of a specified meta key.
5454
*/
5555
@NotBlank
56-
public String getAccountId() {
57-
return hashedDataFeedKey.getAccountId();
56+
public String getStreamMetaValue(final String metaKey) {
57+
return hashedDataFeedKey.getStreamMetaValue(metaKey);
5858
}
5959

6060
// @NotBlank

stroom-receive/stroom-receive-common/src/main/java/stroom/receive/common/DataFeedKeyService.java

+3-8
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,13 @@
11
package stroom.receive.common;
22

3-
import stroom.meta.api.AttributeMap;
4-
5-
import jakarta.servlet.http.HttpServletRequest;
6-
73
import java.nio.file.Path;
8-
import java.util.Optional;
94

105
public interface DataFeedKeyService extends AuthenticatorFilter {
116

12-
Optional<HashedDataFeedKey> getDataFeedKey(final HttpServletRequest request,
13-
final AttributeMap attributeMap);
7+
// Optional<HashedDataFeedKey> getDataFeedKey(final HttpServletRequest request,
8+
// final AttributeMap attributeMap);
149

15-
Optional<HashedDataFeedKey> getLatestDataFeedKey(final String accountId);
10+
// Optional<HashedDataFeedKey> getLatestDataFeedKey(final String accountId);
1611

1712
int addDataFeedKeys(HashedDataFeedKeys hashedDataFeedKeys,
1813
Path sourceFile);

0 commit comments

Comments
 (0)