diff --git a/scm-core/src/main/java/sonia/scm/util/ValidationUtil.java b/scm-core/src/main/java/sonia/scm/util/ValidationUtil.java index c9a042c79a..5e241b4b09 100644 --- a/scm-core/src/main/java/sonia/scm/util/ValidationUtil.java +++ b/scm-core/src/main/java/sonia/scm/util/ValidationUtil.java @@ -143,7 +143,7 @@ public class ValidationUtil { return Util.isNotEmpty(name) && name.matches(REGEX_REPOSITORYNAME) &&!name.contains("..") &&!name.endsWith("/.") &&!name.endsWith(".") - &&!name.endsWith("/"); + &&!name.endsWith("/") &&!name.contains("/./") &&!name.contains("//"); } /** diff --git a/scm-core/src/test/java/sonia/scm/util/ValidationUtilTest.java b/scm-core/src/test/java/sonia/scm/util/ValidationUtilTest.java index c95d0f88ce..388bb768bf 100644 --- a/scm-core/src/test/java/sonia/scm/util/ValidationUtilTest.java +++ b/scm-core/src/test/java/sonia/scm/util/ValidationUtilTest.java @@ -151,6 +151,10 @@ public class ValidationUtilTest assertFalse(ValidationUtil.isRepositoryNameValid("scm/../plugins")); assertFalse(ValidationUtil.isRepositoryNameValid("scm/main/")); assertFalse(ValidationUtil.isRepositoryNameValid("/scm/main/")); + + // issue 144 + assertFalse(ValidationUtil.isRepositoryNameValid("scm/./main")); + assertFalse(ValidationUtil.isRepositoryNameValid("scm//main")); } /** diff --git a/scm-webapp/src/main/webapp/resources/js/override/ext.form.vtypes.js b/scm-webapp/src/main/webapp/resources/js/override/ext.form.vtypes.js index cbbeb2a721..d3f4def73a 100644 --- a/scm-webapp/src/main/webapp/resources/js/override/ext.form.vtypes.js +++ b/scm-webapp/src/main/webapp/resources/js/override/ext.form.vtypes.js @@ -57,7 +57,9 @@ Ext.apply(Ext.form.VTypes, { && ! val.contains('..') && ! val.endsWith('/.') && ! val.endsWith('/') - && ! val.endsWith('.'); + && ! val.endsWith('.') + && ! val.contains('/./') + && ! val.contains('//'); }, repositoryNameText: 'The name of the repository is invalid.',