Skip to content

Commit b130008

Browse files
committed
feat: add maskFromPaths
1 parent cdf9fc7 commit b130008

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
def config = map ?: Collections.emptyMap()
4448

@@ -81,15 +85,33 @@ class SummaryConfig implements ConfigScope{
8185
}
8286

8387
// maskFusionMount
84-
if(config.containsKey("maskFusionMount")) {
85-
maskFusionMount = config.maskFusionMount
86-
log.debug("Set `maskFusionMount` to ${maskFusionMount}")
88+
if(config.containsKey('maskFusionMount')) {
89+
if(config.maskFusionMount instanceof Boolean) {
90+
maskFusionMount = config.maskFusionMount
91+
log.debug("Set `maskFusionMount` to ${maskFusionMount}")
92+
} else {
93+
log.warn('Incorrect value detected for `validation.summary.maskFusionMount`, a boolean is expected. Defaulting to `false`')
94+
}
8795
}
8896

8997
// maskBucketNames
90-
if(config.containsKey("maskBucketNames")) {
91-
maskBucketNames = config.maskBucketNames
92-
log.debug("Set `maskBucketNames` to ${maskBucketNames}")
98+
if(config.containsKey('maskBucketNames')) {
99+
if(config.maskBucketNames instanceof Boolean) {
100+
maskBucketNames = config.maskBucketNames
101+
log.debug("Set `maskBucketNames` to ${maskBucketNames}")
102+
} else {
103+
log.warn('Incorrect value detected for `validation.summary.maskBucketNames`, a boolean is expected. Defaulting to `false`')
104+
}
105+
}
106+
107+
// maskFromPaths
108+
if(config.containsKey('maskFromPaths')) {
109+
if(config.maskFromPaths instanceof List<CharSequence>) {
110+
maskFromPaths = config.maskFromPaths
111+
log.debug("Set `maskFromPaths` to ${maskFromPaths}")
112+
} else {
113+
log.warn('Incorrect value detected for `validation.summary.maskFromPaths`, a list of strings is expected. Defaulting to ``')
114+
}
93115
}
94116
}
95117
}

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

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,12 @@ class SummaryCreator {
4646
workflowSummary['container'] = workflow.container
4747
}
4848

49-
workflowSummary['launchDir'] = workflow.launchDir
50-
workflowSummary['workDir'] = workflow.workDir
51-
workflowSummary['projectDir'] = workflow.projectDir
49+
workflowSummary['launchDir'] = maybeMask(workflow.launchDir)
50+
workflowSummary['workDir'] = maybeMask(workflow.workDir)
51+
workflowSummary['projectDir'] = maybeMask(workflow.projectDir)
5252
workflowSummary['userName'] = workflow.userName
5353
workflowSummary['profile'] = workflow.profile
54-
workflowSummary['configFiles'] = workflow.configFiles ? workflow.configFiles.join(', ') : ''
54+
workflowSummary['configFiles'] = maybeMask(workflow.configFiles ? workflow.configFiles.join(', ') : '')
5555

5656
// Get pipeline parameters defined in JSON Schema
5757
def Map paramsSummary = [:]
@@ -114,32 +114,49 @@ class SummaryCreator {
114114

115115
// We have a default in the schema, and this isn't it
116116
if (defaultValue != null && value != defaultValue) {
117-
summary.put(param, maybeMaskFusionMount(maybeMaskBucketNames((value))))
117+
summary.put(param, maybeMask(value))
118118
}
119119
// No default in the schema, and this isn't empty or false
120120
else if (defaultValue == null && value != "" && value != null && value != false && value != 'false') {
121-
summary.put(param, maybeMaskFusionMount(maybeMaskBucketNames((value))))
121+
summary.put(param, maybeMask(value))
122122
}
123123
}
124124
}
125125
return summary
126126
}
127127

128-
private String maybeMaskFusionMount(String value) {
128+
private CharSequence maybeMask(Path value) {
129+
return maybeMask(value.toString())
130+
}
131+
132+
private CharSequence maybeMask(CharSequence value) {
133+
return maybeMaskFusionMount(maybeMaskBucketNames(maybeMaskFromPaths(value)))
134+
}
135+
136+
private CharSequence maybeMaskFusionMount(CharSequence value) {
129137
if(config.summary.maskFusionMount) {
130138
return value.replace('/fusion', '')
131139
}
132140
return value
133141
}
134142

135143
// see https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html
136-
static final String S3_BUCKET_PATH_PREFIX = '\\/s3\\/[a-z0-9][a-z0-9-]{1,61}[a-z0-9]\\/'
137-
static final String S3_BUCKET_URI_PREFIX = 's3:\\/\\/[a-z0-9][a-z0-9-]{1,61}[a-z0-9]\\/'
144+
static final CharSequence S3_BUCKET_PATH_PREFIX = '\\/s3\\/[a-z0-9][a-z0-9-]{1,61}[a-z0-9]\\/'
145+
static final CharSequence S3_BUCKET_URI_PREFIX = 's3:\\/\\/[a-z0-9][a-z0-9-]{1,61}[a-z0-9]\\/'
138146

139-
private String maybeMaskBucketNames(String value) {
140-
if (config.summary.maskBucketNames) {
141-
value.replaceAll(S3_BUCKET_PATH_PREFIX, '')
142-
value.replaceAll(S3_BUCKET_URI_PREFIX, '')
147+
private CharSequence maybeMaskBucketNames(CharSequence value) {
148+
if(config.summary.maskBucketNames) {
149+
value = value.replaceAll(S3_BUCKET_PATH_PREFIX, '/[** masked **]/')
150+
value = value.replaceAll(S3_BUCKET_URI_PREFIX, '[** masked **]/')
151+
}
152+
return value
153+
}
154+
155+
private CharSequence maybeMaskFromPaths(CharSequence value) {
156+
if(config.summary.maskFromPaths != null && config.summary.maskFromPaths.size() > 0) {
157+
for (CharSequence toReplace : config.summary.maskFromPaths) {
158+
value = value.replace(toReplace, '[** masked **]')
159+
}
143160
}
144161
return value
145162
}

0 commit comments

Comments
 (0)