Skip to content

Commit 2d47354

Browse files
authored
fix: add hyphen to permission pattern (#3882)
2 parents 034ab18 + b434d36 commit 2d47354

3 files changed

Lines changed: 47 additions & 17 deletions

File tree

backend/src/main/java/com/bakdata/conquery/util/validation/ValidConqueryPermission.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,12 @@
1414
* Validate Shiro permissions
1515
*/
1616
@NotBlank
17-
@Pattern(regexp="^[\\w,*]+(?::[\\w,*@]+){0,2}$", message="Provide a valid shiro permission string with 3 parts at most.")
17+
@Pattern(regexp=ValidConqueryPermission.PERMISSION_PATTERN, message="Provide a valid shiro permission string with 3 parts at most, following this pattern: " + ValidConqueryPermission.PERMISSION_PATTERN)
1818
@Target({ElementType.FIELD, ElementType.PARAMETER})
1919
@Retention(RetentionPolicy.RUNTIME)
2020
@Constraint(validatedBy = {}) // No custom validator needed if only using built-ins
2121
public @interface ValidConqueryPermission {
22+
String PERMISSION_PATTERN = "^[\\w,*-]+(?::[\\w,*@-]+){0,2}$";
2223
String message() default "Invalid permission";
2324
Class<?>[] groups() default {};
2425
Class<? extends Payload>[] payload() default {};

backend/src/main/resources/com/bakdata/conquery/resources/admin/ui/templates/permissionCreator.html.ftl

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<#macro permissionCreator ownerId permissionTemplateMap>
22
<#local INSTANCES = "instances_">
33
<#local ABILITIES = "abilities_">
4-
<div class"table-responsive">
4+
<div>
55
<table class="table table-sm table-striped">
66
<thead>
77
<tr>
@@ -68,43 +68,64 @@
6868
6969
7070
let abilitySelector = document.getElementById("${ABILITIES}"+domain);
71-
abilityJoin = null;
71+
let abilityJoin = null;
72+
let abilities = [];
7273
if (abilitySelector != null) {
73-
let abilities = [];
7474
let abilityCheckboxes =abilitySelector.getElementsByTagName('input');
7575
for(let cb of abilityCheckboxes ) {
7676
if(cb.checked){
7777
abilities.push(cb.value.trim())
7878
}
7979
}
80-
if(abilityCheckboxes.length > 0 && abilities.length == 0 ) {
80+
if(abilityCheckboxes.length > 0 && abilities.length === 0 ) {
8181
alert("No abilities for permission specified");
8282
return;
8383
}
8484
abilityJoin = abilities.join(",");
8585
}
8686
87-
// Collection only only as a member if a permission supports abilities and thus targets
87+
// Collection only as a member if a permission supports abilities and thus targets
8888
let instanceInput = document.getElementById("${INSTANCES}"+domain).getElementsByTagName("ul");
8989
9090
91-
if(instanceInput.length != 0) {
91+
let instances = null;
92+
if(instanceInput.length !== 0) {
93+
if (abilities.length === 0) {
94+
alert("Abilities are required if instances are set");
95+
return;
96+
}
9297
// Permission can have targets
9398
instances = Array.from(instanceInput[0].children,c => c.innerHTML).join(",");
9499
}
95-
else {
96-
// Permission does not support abilities and targets (e.g. super permission)
97-
instances = null;
98-
}
99-
100-
permission = [domain, abilityJoin, instances].join(":")
100+
101+
102+
let permission = [domain, abilityJoin, instances].filter(x => !!x).join(":");
101103
console.log("Sending Permission: " + permission);
102-
await rest('/admin/permissions/${ownerId}',
104+
let response = await rest('/admin/permissions/${ownerId}',
103105
{
104106
method: 'post',
105107
body: permission
106-
});
107-
location.reload();
108+
}
109+
);
110+
if (!response.ok) {
111+
showToastMessage(
112+
ToastTypes.ERROR,
113+
"Error",
114+
"The send request came back with the following error: " + (await response.json()).message,
115+
"Status " + response.status,
116+
);
117+
} else {
118+
showToastMessage(
119+
ToastTypes.SUCCESS,
120+
"Permission Created",
121+
`Permission was created`,
122+
"Status " + response.status,
123+
);
124+
setTimeout(function(){
125+
location.reload();
126+
}, 500);
127+
128+
}
108129
}
109130
</script>
110131
</#macro>

backend/src/test/java/com/bakdata/conquery/integration/tests/PermissionResourceTest.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,20 @@ public class PermissionResourceTest {
3535
static Stream<Arguments> testParams() {
3636
return Stream.of(
3737
Arguments.of("domain", 204),
38+
Arguments.of("domain:", 422),
3839
Arguments.of("domain:operation", 204),
40+
Arguments.of("domain:operation:", 422),
3941
Arguments.of("domain:operation:instance", 204),
4042
Arguments.of("domain:operation1,:instance", 204),
43+
Arguments.of("domain-hyphen:operation,:instance@at", 204),
44+
Arguments.of("domain-hyphen:operation,:instance_underscore", 204),
4145
Arguments.of("domain:operation1,operation2:instance", 204),
46+
Arguments.of("*", 204),
47+
Arguments.of("*:", 422),
4248
Arguments.of("", 422),
43-
Arguments.of("domain:operation:instance:too_much", 422),
49+
Arguments.of(":", 422),
50+
Arguments.of("domain::instance", 422),
51+
Arguments.of("domain:operation:instance:too_many_parts", 422),
4452
Arguments.of("domain:,", 400)
4553

4654
);

0 commit comments

Comments
 (0)