Skip to content

Commit e1c0358

Browse files
committed
feat: add maskFromPaths
1 parent cd24d5e commit e1c0358

File tree

2 files changed

+58
-19
lines changed

2 files changed

+58
-19
lines changed

src/main/groovy/nextflow/validation/config/SummaryConfig.groovy

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ class SummaryConfig implements ConfigScope {
3939
@Description('Mask /s3/bucket/ and s3://bucket/ from path values.')
4040
final public boolean maskBucketNames
4141

42+
@ConfigOption
43+
@Description('A list of subpaths to mask from path values.')
44+
final public List<CharSequence> maskFromPaths
45+
4246
SummaryConfig(Map map, Boolean monochromeLogs) {
4347
Map config = map ?: Collections.emptyMap()
4448

@@ -84,15 +88,33 @@ class SummaryConfig implements ConfigScope {
8488
}
8589

8690
// maskFusionMount
87-
if(config.containsKey("maskFusionMount")) {
88-
maskFusionMount = config.maskFusionMount
89-
log.debug("Set `maskFusionMount` to ${maskFusionMount}")
91+
if(config.containsKey('maskFusionMount')) {
92+
if(config.maskFusionMount instanceof Boolean) {
93+
maskFusionMount = config.maskFusionMount
94+
log.debug("Set `maskFusionMount` to ${maskFusionMount}")
95+
} else {
96+
log.warn('Incorrect value detected for `validation.summary.maskFusionMount`, a boolean is expected. Defaulting to `false`')
97+
}
9098
}
9199

92100
// maskBucketNames
93-
if(config.containsKey("maskBucketNames")) {
94-
maskBucketNames = config.maskBucketNames
95-
log.debug("Set `maskBucketNames` to ${maskBucketNames}")
101+
if(config.containsKey('maskBucketNames')) {
102+
if(config.maskBucketNames instanceof Boolean) {
103+
maskBucketNames = config.maskBucketNames
104+
log.debug("Set `maskBucketNames` to ${maskBucketNames}")
105+
} else {
106+
log.warn('Incorrect value detected for `validation.summary.maskBucketNames`, a boolean is expected. Defaulting to `false`')
107+
}
108+
}
109+
110+
// maskFromPaths
111+
if(config.containsKey('maskFromPaths')) {
112+
if(config.maskFromPaths instanceof List<CharSequence>) {
113+
maskFromPaths = config.maskFromPaths
114+
log.debug("Set `maskFromPaths` to ${maskFromPaths}")
115+
} else {
116+
log.warn('Incorrect value detected for `validation.summary.maskFromPaths`, a list of strings is expected. Defaulting to ``')
117+
}
96118
}
97119
}
98120
}

src/main/groovy/nextflow/validation/summary/SummaryCreator.groovy

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,12 @@ class SummaryCreator {
5050
workflowSummary['container'] = workflow.container
5151
}
5252

53-
workflowSummary['launchDir'] = workflow.launchDir
54-
workflowSummary['workDir'] = workflow.workDir
55-
workflowSummary['projectDir'] = workflow.projectDir
53+
workflowSummary['launchDir'] = maybeMask(workflow.launchDir)
54+
workflowSummary['workDir'] = maybeMask(workflow.workDir)
55+
workflowSummary['projectDir'] = maybeMask(workflow.projectDir)
5656
workflowSummary['userName'] = workflow.userName
5757
workflowSummary['profile'] = workflow.profile
58-
workflowSummary['configFiles'] = workflow.configFiles ? workflow.configFiles.join(', ') : ''
58+
workflowSummary['configFiles'] = maybeMask(workflow.configFiles ? workflow.configFiles.join(', ') : '')
5959

6060
// Get pipeline parameters defined in JSON Schema
6161
Map paramsSummary = [:]
@@ -121,32 +121,49 @@ class SummaryCreator {
121121

122122
// We have a default in the schema, and this isn't it
123123
if (defaultValue != null && value != defaultValue) {
124-
summary.put(param, maybeMaskFusionMount(maybeMaskBucketNames((value))))
124+
summary.put(param, maybeMask(value))
125125
}
126126
// No default in the schema, and this isn't empty or false
127127
else if (defaultValue == null && value != '' && value != null && value != false && value != 'false') {
128-
summary.put(param, maybeMaskFusionMount(maybeMaskBucketNames((value))))
128+
summary.put(param, maybeMask(value))
129129
}
130130
}
131131
}
132132
return summary
133133
}
134134

135-
private String maybeMaskFusionMount(String value) {
135+
private CharSequence maybeMask(Path value) {
136+
return maybeMask(value.toString())
137+
}
138+
139+
private CharSequence maybeMask(CharSequence value) {
140+
return maybeMaskFusionMount(maybeMaskBucketNames(maybeMaskFromPaths(value)))
141+
}
142+
143+
private CharSequence maybeMaskFusionMount(CharSequence value) {
136144
if(config.summary.maskFusionMount) {
137145
return value.replace('/fusion', '')
138146
}
139147
return value
140148
}
141149

142150
// see https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html
143-
static final String S3_BUCKET_PATH_PREFIX = '\\/s3\\/[a-z0-9][a-z0-9-]{1,61}[a-z0-9]\\/'
144-
static final String S3_BUCKET_URI_PREFIX = 's3:\\/\\/[a-z0-9][a-z0-9-]{1,61}[a-z0-9]\\/'
151+
static final CharSequence S3_BUCKET_PATH_PREFIX = '\\/s3\\/[a-z0-9][a-z0-9-]{1,61}[a-z0-9]\\/'
152+
static final CharSequence S3_BUCKET_URI_PREFIX = 's3:\\/\\/[a-z0-9][a-z0-9-]{1,61}[a-z0-9]\\/'
145153

146-
private String maybeMaskBucketNames(String value) {
147-
if (config.summary.maskBucketNames) {
148-
value.replaceAll(S3_BUCKET_PATH_PREFIX, '')
149-
value.replaceAll(S3_BUCKET_URI_PREFIX, '')
154+
private CharSequence maybeMaskBucketNames(CharSequence value) {
155+
if(config.summary.maskBucketNames) {
156+
value = value.replaceAll(S3_BUCKET_PATH_PREFIX, '/[** masked **]/')
157+
value = value.replaceAll(S3_BUCKET_URI_PREFIX, '[** masked **]/')
158+
}
159+
return value
160+
}
161+
162+
private CharSequence maybeMaskFromPaths(CharSequence value) {
163+
if(config.summary.maskFromPaths != null && config.summary.maskFromPaths.size() > 0) {
164+
for (CharSequence toReplace : config.summary.maskFromPaths) {
165+
value = value.replace(toReplace, '[** masked **]')
166+
}
150167
}
151168
return value
152169
}

0 commit comments

Comments
 (0)