|
34 | 34 | import static no.digipost.sanitizing.internal.ValidatorPatterns.ALIGN; |
35 | 35 | import static no.digipost.sanitizing.internal.ValidatorPatterns.COLOR_NAME_OR_COLOR_CODE; |
36 | 36 | import static no.digipost.sanitizing.internal.ValidatorPatterns.CSS_TYPE; |
| 37 | +import static no.digipost.sanitizing.internal.ValidatorPatterns.DIMENSION; |
| 38 | +import static no.digipost.sanitizing.internal.ValidatorPatterns.FLEX_BASIS; |
37 | 39 | import static no.digipost.sanitizing.internal.ValidatorPatterns.HTML_CLASS; |
38 | 40 | import static no.digipost.sanitizing.internal.ValidatorPatterns.HTML_ID; |
39 | 41 | import static no.digipost.sanitizing.internal.ValidatorPatterns.HTML_TITLE; |
@@ -83,15 +85,33 @@ final class ApiHtmlValidatorPolicy { |
83 | 85 |
|
84 | 86 | final Predicate<String> allowAllValuesPredicate = (value) -> true; |
85 | 87 | final Map<String, Predicate<String>> propertyValueWhitelist = CSS_WHITELIST.stream().collect(Collectors.toMap(prop -> prop, prop -> allowAllValuesPredicate)); |
86 | | - //We need `clear`, `display` and `float` since diakonhjemme uses it (see skal_godta_diakonhjemmet_html()), |
87 | 88 | propertyValueWhitelist.put("clear", allowAllValuesPredicate); |
88 | 89 | propertyValueWhitelist.put("float", allowAllValuesPredicate); |
89 | | - propertyValueWhitelist.put("display", value -> value.equals("block") || value.equals("inline-block") || value.equals("inline")); |
| 90 | + propertyValueWhitelist.put("display", value -> value.equals("block") || value.equals("inline-block") || value.equals("inline") || value.equals("flex")); |
90 | 91 | propertyValueWhitelist.put("content", allowAllValuesPredicate); |
| 92 | + propertyValueWhitelist.put("flex-direction", value -> value.equals("row") || value.equals("column") || value.equals("row-reverse") || value.equals("column-reverse")); |
| 93 | + propertyValueWhitelist.put("flex-wrap", value -> value.equals("nowrap") || value.equals("wrap") || value.equals("wrap-reverse")); |
| 94 | + propertyValueWhitelist.put("justify-content", value -> value.equals("flex-start") || value.equals("flex-end") || value.equals("center") || value.equals("space-between") || value.equals("space-around") || value.equals("space-evenly")); |
| 95 | + propertyValueWhitelist.put("align-items", value -> value.equals("flex-start") || value.equals("flex-end") || value.equals("center") || value.equals("baseline") || value.equals("stretch")); |
| 96 | + propertyValueWhitelist.put("align-self", value -> value.equals("auto") || value.equals("flex-start") || value.equals("flex-end") || value.equals("center") || value.equals("baseline") || value.equals("stretch")); |
| 97 | + propertyValueWhitelist.put("gap", value -> DIMENSION.matcher(value).matches()); |
| 98 | + propertyValueWhitelist.put("flex", ApiHtmlValidatorPolicy::validateFlexProperty); |
91 | 99 |
|
92 | 100 | CSS_PROPERTY_WHITELIST = Collections.unmodifiableMap(propertyValueWhitelist); |
93 | 101 | } |
94 | 102 |
|
| 103 | + private static boolean validateFlexProperty(String value) { |
| 104 | + String[] values = value.split("\\s+"); |
| 105 | + if (values.length < 1 || values.length > 3) { |
| 106 | + return false; |
| 107 | + } |
| 108 | + boolean hasValidFlexGrowValue = NUMBER.matcher(values[0]).matches(); |
| 109 | + boolean hasValidFlexShrinkValue = values.length < 2 || NUMBER.matcher(values[1]).matches(); |
| 110 | + boolean hasValidFlexBasisValue = values.length < 3 || FLEX_BASIS.matcher(values[2]).matches(); |
| 111 | + |
| 112 | + return hasValidFlexGrowValue && hasValidFlexShrinkValue && hasValidFlexBasisValue; |
| 113 | + } |
| 114 | + |
95 | 115 | // Version 1 of policy. We used this policy before we introduced CSS-validation/-sanitation |
96 | 116 | static final PolicyFactory V1_VALIDATE_ONLY_HTML_POLICY = new HtmlPolicyBuilder() |
97 | 117 | .allowStyling(CssSchema.withProperties(CSS_WHITELIST)) |
|
0 commit comments