diff --git a/scm-core/src/main/java/sonia/scm/util/IOUtil.java b/scm-core/src/main/java/sonia/scm/util/IOUtil.java index 5745dfde8b..2e2b6b7fd6 100644 --- a/scm-core/src/main/java/sonia/scm/util/IOUtil.java +++ b/scm-core/src/main/java/sonia/scm/util/IOUtil.java @@ -370,13 +370,13 @@ public final class IOUtil } /** - * Method description + * Method description * * - * @param file + * @param file * @param silent * - * @throws IOException + * @throws IOException */ public static void delete(File file, boolean silent) throws IOException { @@ -388,22 +388,35 @@ public final class IOUtil { for (File child : children) { - delete(child); + delete(child, silent); } } } - if (!file.delete()) + for (int i = 20; !file.delete(); i--) { - String message = "could not delete file ".concat(file.getPath()); + if (i <= 20) + { + String message = "could not delete file ".concat(file.getPath()); - if (silent) - { - logger.error(message); + if (silent) + { + logger.error(message); + } + else + { + throw new IOException(message); + } } - else + + try { - throw new IOException(message); + logger.warn("sleep 250ms, because of delete for file {} failed", file); + Thread.sleep(250); + } + catch (InterruptedException ex) + { + logger.warn("sleep of delete method interrupted", ex); } } } 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 0b1a23f7bb..d0b67c5472 100644 --- a/scm-core/src/main/java/sonia/scm/util/ValidationUtil.java +++ b/scm-core/src/main/java/sonia/scm/util/ValidationUtil.java @@ -55,16 +55,13 @@ public final class ValidationUtil "^[A-z0-9][\\w.-]*@[A-z0-9][\\w\\-\\.]+\\.[A-z0-9]{2,6}$"; /** Field description */ - private static final String REGEX_NAME = "^[A-z0-9\\.\\-_]+$"; + private static final String REGEX_NAME = + "^[A-z0-9\\.\\-_@]|[^ ]([A-z0-9\\.\\-_@ ]*[A-z0-9\\.\\-_@]|[^ ])?$"; /** Field description */ private static final String REGEX_REPOSITORYNAME = "(?!^\\.\\.$)(?!^\\.$)(?!.*[\\\\\\[\\]])^[A-z0-9\\.][A-z0-9\\.\\-_/]*$"; - /** Field description */ - private static final String REGEX_USERNAME = - "^[A-z0-9\\.\\-_@]|[^ ]([A-z0-9\\.\\-_@ ]*[A-z0-9\\.\\-_@]|[^ ])?$"; - //~--- constructors --------------------------------------------------------- /** @@ -185,10 +182,12 @@ public final class ValidationUtil * @param username * * @return + * @deprecated use {@link #isNameValid(String)} */ + @Deprecated public static boolean isUsernameValid(String username) { - return Util.isNotEmpty(username) && username.matches(REGEX_USERNAME); + return isNameValid(username); } /** 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 a6ce29241c..620c2fae9d 100644 --- a/scm-core/src/test/java/sonia/scm/util/ValidationUtilTest.java +++ b/scm-core/src/test/java/sonia/scm/util/ValidationUtilTest.java @@ -102,14 +102,21 @@ public class ValidationUtilTest assertTrue(ValidationUtil.isNameValid("test.git")); assertTrue(ValidationUtil.isNameValid("Test123.git")); assertTrue(ValidationUtil.isNameValid("Test123-git")); - assertTrue(ValidationUtil.isNameValid("Test_repository-123.git")); + assertTrue(ValidationUtil.isNameValid("Test_user-123.git")); + assertTrue(ValidationUtil.isNameValid("test@scm-manager.de")); + assertTrue(ValidationUtil.isNameValid("test 123")); + assertTrue(ValidationUtil.isNameValid("t")); // false - assertFalse(ValidationUtil.isNameValid("test 123")); - assertFalse(ValidationUtil.isNameValid("test@123")); + assertFalse(ValidationUtil.isNameValid(" test 123")); + assertFalse(ValidationUtil.isNameValid(" test 123 ")); + assertFalse(ValidationUtil.isNameValid("test 123 ")); assertFalse(ValidationUtil.isNameValid("test/123")); assertFalse(ValidationUtil.isNameValid("test%123")); assertFalse(ValidationUtil.isNameValid("test:123")); + assertFalse(ValidationUtil.isNameValid("t ")); + assertFalse(ValidationUtil.isNameValid(" t")); + assertFalse(ValidationUtil.isNameValid(" t ")); } /** @@ -229,34 +236,4 @@ public class ValidationUtilTest assertFalse(ValidationUtil.isRepositoryNameValid(path)); } } - - /** - * Method description - * - */ - @Test - public void testIsUsernameValid() - { - - // true - assertTrue(ValidationUtil.isUsernameValid("test")); - assertTrue(ValidationUtil.isUsernameValid("test.git")); - assertTrue(ValidationUtil.isUsernameValid("Test123.git")); - assertTrue(ValidationUtil.isUsernameValid("Test123-git")); - assertTrue(ValidationUtil.isUsernameValid("Test_user-123.git")); - assertTrue(ValidationUtil.isUsernameValid("test@scm-manager.de")); - assertTrue(ValidationUtil.isUsernameValid("test 123")); - assertTrue(ValidationUtil.isUsernameValid("t")); - - // false - assertFalse(ValidationUtil.isUsernameValid(" test 123")); - assertFalse(ValidationUtil.isUsernameValid(" test 123 ")); - assertFalse(ValidationUtil.isUsernameValid("test 123 ")); - assertFalse(ValidationUtil.isUsernameValid("test/123")); - assertFalse(ValidationUtil.isUsernameValid("test%123")); - assertFalse(ValidationUtil.isUsernameValid("test:123")); - assertFalse(ValidationUtil.isUsernameValid("t ")); - assertFalse(ValidationUtil.isUsernameValid(" t")); - assertFalse(ValidationUtil.isUsernameValid(" t ")); - } } 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 80a5dec976..df17eeaee7 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 @@ -46,7 +46,7 @@ Ext.apply(Ext.form.VTypes, { // name validator name: function(val){ - return /^[A-z0-9\.\-_]+$/.test(val); + return val.match(/^[^ ][A-z0-9\.\-_@ ]*[^ ]$/); }, nameText: 'The name is invalid.', @@ -75,7 +75,7 @@ Ext.apply(Ext.form.VTypes, { // username validator username: function(val){ - return val.match(/^[^ ][A-z0-9\.\-_@ ]*[^ ]$/); + return name(val); }, usernameText: 'The username is invalid.'