From 1d63d95e52a3586e179163de006e4431ba299f1d Mon Sep 17 00:00:00 2001 From: "Maria Odea B. Ching" Date: Tue, 3 May 2011 02:54:19 +0000 Subject: [PATCH] [MRM-1468] Fix XSS vulnerability in Archiva submitted by Marc Jansen Tan Chua o tightened up validation on input/edit forms + unit tests o added selenium tests for XSS vunerabilities o used c:out in some of the pages so output will be escaped if containing html characters git-svn-id: https://svn.apache.org/repos/asf/archiva/branches/archiva-1.3.x@1098897 13f79535-47bb-0310-9956-ffa450edef68 --- .../archiva/web/test/AppearanceTest.java | 42 +++- .../web/test/ArtifactManagementTest.java | 23 +- .../archiva/web/test/LegacySupportTest.java | 54 ++++ .../archiva/web/test/NetworkProxiesTest.java | 58 ++++- .../archiva/web/test/RepositoryTest.java | 131 +++++++++- .../archiva/web/test/XSSSecurityTest.java | 190 ++++++++++++++ .../web/test/parent/AbstractArchivaTest.java | 98 ++++++++ .../AbstractArtifactManagementTest.java | 54 ---- .../test/parent/AbstractRepositoryTest.java | 56 ++--- .../web/test/parent/AbstractSeleniumTest.java | 11 +- .../web/action/DeleteArtifactAction.java | 27 ++ .../EditOrganisationInfoAction.java | 28 ++- .../legacy/AddLegacyArtifactPathAction.java | 43 +++- .../ConfigureNetworkProxyAction.java | 37 ++- .../AddManagedRepositoryAction.java | 27 ++ .../EditManagedRepositoryAction.java | 27 +- .../DeleteArtifactAction-validation.xml | 22 +- .../EditOrganisationInfoAction-validation.xml | 5 + ...AddLegacyArtifactPathAction-validation.xml | 34 +++ ...roxyAction-saveNetworkProxy-validation.xml | 28 +++ .../AddManagedRepositoryAction-validation.xml | 23 ++ ...EditManagedRepositoryAction-validation.xml | 27 +- .../jsp/admin/addLegacyArtifactPath.jsp | 18 +- .../WEB-INF/jsp/admin/addRepository.jsp | 17 +- .../webapp/WEB-INF/jsp/admin/appearance.jsp | 13 +- .../jsp/admin/confirmAddRepository.jsp | 15 +- .../WEB-INF/jsp/admin/deleteNetworkProxy.jsp | 14 +- .../WEB-INF/jsp/admin/deleteRepository.jsp | 17 +- .../WEB-INF/jsp/admin/editAppearance.jsp | 9 +- .../WEB-INF/jsp/admin/editNetworkProxy.jsp | 21 +- .../WEB-INF/jsp/admin/editRepository.jsp | 17 +- .../WEB-INF/jsp/admin/legacyArtifactPath.jsp | 26 +- .../WEB-INF/jsp/admin/networkProxies.jsp | 31 ++- .../webapp/WEB-INF/jsp/admin/repositories.jsp | 67 +++-- .../WEB-INF/jsp/components/companyLogo.jsp | 6 +- .../webapp/WEB-INF/jsp/deleteArtifact.jsp | 17 +- .../web/action/DeleteArtifactActionTest.java | 188 ++++++++++++++ .../EditOrganizationInfoActionTest.java | 138 +++++++++++ .../AddLegacyArtifactPathActionTest.java | 232 ++++++++++++++++++ .../ConfigureNetworkProxyActionTest.java | 216 ++++++++++++++++ .../AbstractManagedRepositoryActionTest.java | 117 +++++++++ .../AddManagedRepositoryActionTest.java | 150 +++++++++-- .../EditManagedRepositoryActionTest.java | 157 ++++++++++-- .../web/validator/utils/ValidatorUtil.java | 62 +++++ 44 files changed, 2353 insertions(+), 240 deletions(-) create mode 100644 archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/XSSSecurityTest.java create mode 100644 archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/DeleteArtifactActionTest.java create mode 100644 archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/legacy/AddLegacyArtifactPathActionTest.java create mode 100644 archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/networkproxies/ConfigureNetworkProxyActionTest.java create mode 100644 archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/AbstractManagedRepositoryActionTest.java create mode 100644 archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/validator/utils/ValidatorUtil.java diff --git a/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/AppearanceTest.java b/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/AppearanceTest.java index 94f8b700d..dbd140ab2 100644 --- a/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/AppearanceTest.java +++ b/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/AppearanceTest.java @@ -25,15 +25,47 @@ import org.testng.annotations.Test; @Test( groups = { "appearance" }, dependsOnMethods = { "testWithCorrectUsernamePassword" }, sequential = true ) public class AppearanceTest extends AbstractArchivaTest { - public void testAddAppearanceNullValues() + public void testAddAppearanceEmptyValues() { goToAppearancePage(); clickLinkWithText( "Edit" ); addEditAppearance( "", "", "" ); assertTextPresent( "You must enter a name" ); } - - @Test( dependsOnMethods = { "testAddAppearanceNullValues" }) + + @Test( dependsOnMethods = { "testAddAppearanceEmptyValues" }) + public void testAddAppearanceInvalidValues() + { + addEditAppearance( "<>~+[ ]'\"" , "/home/user/abcXYZ0129._/\\~:?!&=-<> ~+[ ]'\"" , "/home/user/abcXYZ0129._/\\~:?!&=-<> ~+[ ]'\"" ); + assertTextPresent( "Organisation name must only contain alphanumeric characters, white-spaces(' '), equals(=), question-marks(?), exclamation-points(!), ampersands(&), forward-slashes(/), back-slashes(\\), underscores(_), dots(.), colons(:), tildes(~), and dashes(-)." ); + assertTextPresent( "You must enter a URL" ); + assertXpathCount("//span[@class='errorMessage' and text()='You must enter a URL']", 2); + } + + @Test( dependsOnMethods = { "testAddAppearanceInvalidValues" }) + public void testAddAppearanceInvalidOrganisationName() + { + addEditAppearance( "<>~+[ ]'\"" , "http://www.apache.org/" , "http://www.apache.org/images/asf_logo_wide.gifs" ); + assertTextPresent( "Organisation name must only contain alphanumeric characters, white-spaces(' '), equals(=), question-marks(?), exclamation-points(!), ampersands(&), forward-slashes(/), back-slashes(\\), underscores(_), dots(.), colons(:), tildes(~), and dashes(-)." ); + } + + @Test( dependsOnMethods = { "testAddAppearanceInvalidOrganisationName" }) + public void testAddAppearanceInvalidOrganisationUrl() + { + addEditAppearance( "The Apache Software Foundation" , "/home/user/abcXYZ0129._/\\~:?!&=-<> ~+[ ]'\"" , "http://www.apache.org/images/asf_logo_wide.gifs" ); + assertTextPresent( "You must enter a URL" ); + assertXpathCount("//span[@class='errorMessage' and text()='You must enter a URL']", 1); + } + + @Test( dependsOnMethods = { "testAddAppearanceInvalidOrganisationUrl" }) + public void testAddAppearanceInvalidOrganisationLogo() + { + addEditAppearance( "The Apache Software Foundation" , "http://www.apache.org/" , "/home/user/abcXYZ0129._/\\~:?!&=-<> ~+[ ]'\"" ); + assertTextPresent( "You must enter a URL" ); + assertXpathCount("//span[@class='errorMessage' and text()='You must enter a URL']", 1); + } + + @Test( dependsOnMethods = { "testAddAppearanceInvalidOrganisationLogo" }) public void testAddAppearanceValidValues() { addEditAppearance( "The Apache Software Foundation" , "http://www.apache.org/" , "http://www.apache.org/images/asf_logo_wide.gifs" ); @@ -46,6 +78,6 @@ public class AppearanceTest extends AbstractArchivaTest clickLinkWithText( "Edit" ); addEditAppearance( "Apache Software Foundation" , "http://www.apache.org/" , "http://www.apache.org/images/asf_logo_wide.gifs" ); assertTextPresent( "Apache Software Foundation" ); - } - + } + } \ No newline at end of file diff --git a/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/ArtifactManagementTest.java b/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/ArtifactManagementTest.java index 4eb22b172..d3f2836c3 100644 --- a/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/ArtifactManagementTest.java +++ b/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/ArtifactManagementTest.java @@ -82,7 +82,7 @@ public class ArtifactManagementTest addArtifact( getGroupId() , getArtifactId(), getVersion(), getPackaging() , " ", getRepositoryId() ); assertTextPresent( "Please add a file to upload." ); } - + @Test(groups = "requiresUpload") public void testAddArtifactValidValues() { @@ -139,4 +139,25 @@ public class ArtifactManagementTest deleteArtifact( "delete", "delete", "asdf", "internal"); assertTextPresent( "Invalid version." ); } + + // HTML select should have the proper value, else it will cause a selenium error: Option with label 'customValue' not found + public void testDeleteArtifactInvalidValues() + { + deleteArtifact( "<> \\/~+[ ]'\"", "<> \\/~+[ ]'\"", "<>", "internal"); + assertTextPresent( "Invalid version." ); + assertTextPresent( "Group id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + assertTextPresent( "Artifact id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + } + + public void testDeleteArtifactInvalidGroupId() + { + deleteArtifact( "<> \\/~+[ ]'\"", "delete", "1.0", "internal"); + assertTextPresent( "Group id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + } + + public void testDeleteArtifactInvalidArtifactId() + { + deleteArtifact( "delete", "<> \\/~+[ ]'\"", "1.0", "internal"); + assertTextPresent( "Artifact id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + } } diff --git a/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/LegacySupportTest.java b/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/LegacySupportTest.java index 26212a949..183c15f46 100644 --- a/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/LegacySupportTest.java +++ b/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/LegacySupportTest.java @@ -72,4 +72,58 @@ public class LegacySupportTest addLegacyArtifactPath( "test" , "test" , "test" , "1.0-SNAPSHOT" , "testing" , ""); assertTextPresent( "You must enter a type." ); } + + @Test( dependsOnMethods = { "testAddLegacyArtifact_NullType" }) + public void testAddLegacyArtifact_InvalidValues() + { + addLegacyArtifactPath( "<> ~+[ ]'\"" , "<> \\/~+[ ]'\"" , "<> \\/~+[ ]'\"" , "<> \\/~+[ ]'\"" , "<> \\/~+[ ]'\"" , "<> \\/~+[ ]'\""); + assertTextPresent( "Legacy path must only contain alphanumeric characters, forward-slashes(/), back-slashes(\\), underscores(_), dots(.), and dashes(-)." ); + assertTextPresent( "Group id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + assertTextPresent( "Artifact id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + assertTextPresent( "Version must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + assertTextPresent( "Classifier must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + assertTextPresent( "Type must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + } + + @Test( dependsOnMethods = { "testAddLegacyArtifact_InvalidValues" }) + public void testAddLegacyArtifact_InvalidLegacyPath() + { + addLegacyArtifactPath( "<> ~+[ ]'\"" , "test" , "test" , "1.0-SNAPSHOT" , "testing" , "jar"); + assertTextPresent( "Legacy path must only contain alphanumeric characters, forward-slashes(/), back-slashes(\\), underscores(_), dots(.), and dashes(-)." ); + } + + @Test( dependsOnMethods = { "testAddLegacyArtifact_InvalidLegacyPath" }) + public void testAddLegacyArtifact_InvalidGroupId() + { + addLegacyArtifactPath( "test" , "<> \\/~+[ ]'\"" , "test" , "1.0-SNAPSHOT" , "testing" , "jar"); + assertTextPresent( "Group id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + } + + @Test( dependsOnMethods = { "testAddLegacyArtifact_InvalidGroupId" }) + public void testAddLegacyArtifact_InvalidArtifactId() + { + addLegacyArtifactPath( "test" , "test" , "<> \\/~+[ ]'\"" , "1.0-SNAPSHOT" , "testing" , "jar"); + assertTextPresent( "Artifact id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + } + + @Test( dependsOnMethods = { "testAddLegacyArtifact_InvalidArtifactId" }) + public void testAddLegacyArtifact_InvalidVersion() + { + addLegacyArtifactPath( "test" , "test" , "test" , "<> \\/~+[ ]'\"" , "testing" , "jar"); + assertTextPresent( "Version must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + } + + @Test( dependsOnMethods = { "testAddLegacyArtifact_InvalidVersion" }) + public void testAddLegacyArtifact_InvalidType() + { + addLegacyArtifactPath( "test" , "test" , "test" , "1.0-SNAPSHOT" , "testing" , "<> \\/~+[ ]'\""); + assertTextPresent( "Type must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + } + + @Test( dependsOnMethods = { "testAddLegacyArtifact_InvalidType" }) + public void testAddLegacyArtifact_InvalidClassifier() + { + addLegacyArtifactPath( "test" , "test" , "test" , "1.0-SNAPSHOT" , "<> \\/~+[ ]'\"" , "jar"); + assertTextPresent( "Classifier must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + } } diff --git a/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/NetworkProxiesTest.java b/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/NetworkProxiesTest.java index b12a096b8..8224353d2 100644 --- a/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/NetworkProxiesTest.java +++ b/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/NetworkProxiesTest.java @@ -59,8 +59,60 @@ public class NetworkProxiesTest addNetworkProxy( "testing123", "http", "", "8080", "", ""); assertTextPresent( "You must enter a host." ); } - + @Test (dependsOnMethods = { "testAddNetworkProxiesNullHostname" } ) + public void testAddNetworkProxiesInvalidValues() + { + goToNetworkProxiesPage(); + addNetworkProxy( "<> \\/~+[ ]'\"", "<> ~+[ ]'\"", "<> ~+[ ]'\"", "0", "<> ~+[ ]'\"", ""); + assertTextPresent( "Proxy id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + assertTextPresent( "Protocol must only contain alphanumeric characters, forward-slashes(/), back-slashes(\\), dots(.), colons(:), and dashes(-)." ); + assertTextPresent( "Host must only contain alphanumeric characters, equals(=), question-marks(?), exclamation-points(!), ampersands(&), forward-slashes(/), back-slashes(\\), underscores(_), dots(.), colons(:), tildes(~), and dashes(-)." ); + assertTextPresent( "Port needs to be larger than 1" ); + assertTextPresent( "Username must only contain alphanumeric characters, at's(@), forward-slashes(/), back-slashes(\\), underscores(_), dots(.), and dashes(-)." ); + } + + @Test (dependsOnMethods = { "testAddNetworkProxiesInvalidValues" } ) + public void testAddNetworkProxiesInvalidIdentifier() + { + goToNetworkProxiesPage(); + addNetworkProxy( "<> \\/~+[ ]'\"", "http", "localhost", "8080", "", ""); + assertTextPresent( "Proxy id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + } + + @Test (dependsOnMethods = { "testAddNetworkProxiesInvalidIdentifier" } ) + public void testAddNetworkProxiesInvalidProtocol() + { + goToNetworkProxiesPage(); + addNetworkProxy( "testing123", "<> ~+[ ]'\"", "localhost", "8080", "", ""); + assertTextPresent( "Protocol must only contain alphanumeric characters, forward-slashes(/), back-slashes(\\), dots(.), colons(:), and dashes(-)." ); + } + + @Test (dependsOnMethods = { "testAddNetworkProxiesInvalidProtocol" } ) + public void testAddNetworkProxiesInvalidHostname() + { + goToNetworkProxiesPage(); + addNetworkProxy( "testing123", "http", "<> ~+[ ]'\"", "8080", "", ""); + assertTextPresent( "Host must only contain alphanumeric characters, equals(=), question-marks(?), exclamation-points(!), ampersands(&), forward-slashes(/), back-slashes(\\), underscores(_), dots(.), colons(:), tildes(~), and dashes(-)." ); + } + + @Test (dependsOnMethods = { "testAddNetworkProxiesInvalidHostname" } ) + public void testAddNetworkProxiesInvalidPort() + { + goToNetworkProxiesPage(); + addNetworkProxy( "testing123", "http", "localhost", "0", "", ""); + assertTextPresent( "Port needs to be larger than 1" ); + } + + @Test (dependsOnMethods = { "testAddNetworkProxiesInvalidPort" } ) + public void testAddNetworkProxiesInvalidUsername() + { + goToNetworkProxiesPage(); + addNetworkProxy( "testing123", "http", "localhost", "8080", "<> ~+[ ]'\"", ""); + assertTextPresent( "Username must only contain alphanumeric characters, at's(@), forward-slashes(/), back-slashes(\\), underscores(_), dots(.), and dashes(-)." ); + } + + @Test (dependsOnMethods = { "testAddNetworkProxiesInvalidUsername" } ) public void testAddNetworkProxiesValidValues() { goToNetworkProxiesPage(); @@ -68,7 +120,7 @@ public class NetworkProxiesTest assertPage( "Apache Archiva \\ Administration - Network Proxies" ); assertTextPresent( "testing123" ); } - + @Test (dependsOnMethods = { "testAddNetworkProxiesValidValues" } ) public void testEditNetworkProxy() { @@ -92,5 +144,5 @@ public class NetworkProxiesTest assertPage( "Apache Archiva \\ Administration - Network Proxies" ); assertTextPresent( "testing123" ); } - + } diff --git a/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/RepositoryTest.java b/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/RepositoryTest.java index 0c7df55d1..8b7743253 100644 --- a/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/RepositoryTest.java +++ b/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/RepositoryTest.java @@ -35,9 +35,66 @@ public class RepositoryTest assertTextPresent( "Managed Repository Sample 1" ); assertRepositoriesPage(); } - - @Test(dependsOnMethods = { "testAddManagedRepoValidValues" } ) - public void testAddManagedRepoInvalidValues() + + @Test(dependsOnMethods = { "testAddManagedRepoValidValues" } ) + public void testAddManagedRepoInvalidValues() + { + goToRepositoriesPage(); + getSelenium().open( "/archiva/admin/addRepository.action" ); ; + addManagedRepository( "<> \\/~+[ ]'\"", "<>\\~+[]'\"" , "<> ~+[ ]'\"" , "<> ~+[ ]'\"", "Maven 2.x Repository", "", "-1", "101" ); + assertTextPresent( "Identifier must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + assertTextPresent( "Directory must only contain alphanumeric characters, equals(=), question-marks(?), exclamation-points(!), ampersands(&), forward-slashes(/), back-slashes(\\), underscores(_), dots(.), colons(:), tildes(~), and dashes(-)." ); + assertTextPresent( "Repository Name must only contain alphanumeric characters, white-spaces(' '), forward-slashes(/), open-parenthesis('('), close-parenthesis(')'), underscores(_), dots(.), and dashes(-)." ); + assertTextPresent( "Index directory must only contain alphanumeric characters, equals(=), question-marks(?), exclamation-points(!), ampersands(&), forward-slashes(/), back-slashes(\\), underscores(_), dots(.), colons(:), tildes(~), and dashes(-)." ); + assertTextPresent( "Repository Purge By Retention Count needs to be between 1 and 100."); + assertTextPresent( "Repository Purge By Days Older Than needs to be larger than 0."); + assertTextPresent( "Invalid cron expression." ); + } + + @Test(dependsOnMethods = { "testAddManagedRepoInvalidValues" } ) + public void testAddManagedRepoInvalidIdentifier() + { + addManagedRepository( "<> \\/~+[ ]'\"", "name" , "/home" , "/.index", "Maven 2.x Repository", "0 0 * * * ?", "1", "1" ); + assertTextPresent( "Identifier must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + } + + @Test(dependsOnMethods = { "testAddManagedRepoInvalidIdentifier" } ) + public void testAddManagedRepoInvalidRepoName() + { + addManagedRepository( "identifier", "<>\\~+[]'\"" , "/home" , "/.index", "Maven 2.x Repository", "0 0 * * * ?", "1", "1" ); + assertTextPresent( "Repository Name must only contain alphanumeric characters, white-spaces(' '), forward-slashes(/), open-parenthesis('('), close-parenthesis(')'), underscores(_), dots(.), and dashes(-)." ); + } + + @Test(dependsOnMethods = { "testAddManagedRepoInvalidRepoName" } ) + public void testAddManagedRepoInvalidDirectory() + { + addManagedRepository( "identifier", "name" , "<> ~+[ ]'\"" , "/.index", "Maven 2.x Repository", "0 0 * * * ?", "1", "1" ); + assertTextPresent( "Directory must only contain alphanumeric characters, equals(=), question-marks(?), exclamation-points(!), ampersands(&), forward-slashes(/), back-slashes(\\), underscores(_), dots(.), colons(:), tildes(~), and dashes(-)." ); + } + + @Test(dependsOnMethods = { "testAddManagedRepoInvalidDirectory" } ) + public void testAddManagedRepoInvalidIndexDir() + { + addManagedRepository( "identifier", "name" , "/home" , "<> ~+[ ]'\"", "Maven 2.x Repository", "0 0 * * * ?", "1", "1" ); + assertTextPresent( "Index directory must only contain alphanumeric characters, equals(=), question-marks(?), exclamation-points(!), ampersands(&), forward-slashes(/), back-slashes(\\), underscores(_), dots(.), colons(:), tildes(~), and dashes(-)." ); + } + + @Test(dependsOnMethods = { "testAddManagedRepoInvalidIndexDir" } ) + public void testAddManagedRepoInvalidRetentionCount() + { + addManagedRepository( "identifier", "name" , "/home" , "/.index", "Maven 2.x Repository", "0 0 * * * ?", "1", "101" ); + assertTextPresent( "Repository Purge By Retention Count needs to be between 1 and 100." ); + } + + @Test(dependsOnMethods = { "testAddManagedRepoInvalidRetentionCount" } ) + public void testAddManagedRepoInvalidDaysOlder() + { + addManagedRepository( "identifier", "name" , "/home" , "/.index", "Maven 2.x Repository", "0 0 * * * ?", "-1", "1" ); + assertTextPresent( "Repository Purge By Days Older Than needs to be larger than 0." ); + } + + @Test(dependsOnMethods = { "testAddManagedRepoInvalidDaysOlder" } ) + public void testAddManagedRepoBlankValues() { goToRepositoriesPage(); getSelenium().open( "/archiva/admin/addRepository.action" ); ; @@ -48,7 +105,7 @@ public class RepositoryTest assertTextPresent( "Invalid cron expression." ); } - @Test(dependsOnMethods = { "testAddManagedRepoInvalidValues" } ) + @Test(dependsOnMethods = { "testAddManagedRepoBlankValues" } ) public void testAddManagedRepoNoIdentifier() { addManagedRepository( "", "name" , "/home" , "/.index", "Maven 2.x Repository", "0 0 * * * ?", "", "" ); @@ -86,8 +143,62 @@ public class RepositoryTest assertTextPresent( "Managed Repository Sample" ); } + @Test(dependsOnMethods = { "testAddManagedRepoForEdit" } ) + public void testEditManagedRepoInvalidValues() + { + editManagedRepository("<>\\~+[]'\"" , "<> ~+[ ]'\"" , "<> ~+[ ]'\"", "Maven 2.x Repository", "", "-1", "101"); + assertTextPresent( "Directory must only contain alphanumeric characters, equals(=), question-marks(?), exclamation-points(!), ampersands(&), forward-slashes(/), back-slashes(\\), underscores(_), dots(.), colons(:), tildes(~), and dashes(-)." ); + assertTextPresent( "Repository Name must only contain alphanumeric characters, white-spaces(' '), forward-slashes(/), open-parenthesis('('), close-parenthesis(')'), underscores(_), dots(.), and dashes(-)." ); + assertTextPresent( "Index directory must only contain alphanumeric characters, equals(=), question-marks(?), exclamation-points(!), ampersands(&), forward-slashes(/), back-slashes(\\), underscores(_), dots(.), colons(:), tildes(~), and dashes(-)." ); + assertTextPresent( "Repository Purge By Retention Count needs to be between 1 and 100."); + assertTextPresent( "Repository Purge By Days Older Than needs to be larger than 0."); + assertTextPresent( "Invalid cron expression." ); + } + + @Test(dependsOnMethods = { "testEditManagedRepoInvalidValues" } ) + public void testEditManagedRepoInvalidRepoName() + { + editManagedRepository("<>\\~+[]'\"" , "/home" , "/.index", "Maven 2.x Repository", "0 0 * * * ?", "1", "1"); + assertTextPresent( "Repository Name must only contain alphanumeric characters, white-spaces(' '), forward-slashes(/), open-parenthesis('('), close-parenthesis(')'), underscores(_), dots(.), and dashes(-)." ); + } + + @Test(dependsOnMethods = { "testEditManagedRepoInvalidRepoName" } ) + public void testEditManagedRepoInvalidDirectory() + { + editManagedRepository("name" , "<> ~+[ ]'\"" , "/.index", "Maven 2.x Repository", "0 0 * * * ?", "1", "1"); + assertTextPresent( "Directory must only contain alphanumeric characters, equals(=), question-marks(?), exclamation-points(!), ampersands(&), forward-slashes(/), back-slashes(\\), underscores(_), dots(.), colons(:), tildes(~), and dashes(-)." ); + } + + @Test(dependsOnMethods = { "testEditManagedRepoInvalidDirectory" } ) + public void testEditManagedRepoInvalidIndexDir() + { + editManagedRepository("name" , "/home" , "<> ~+[ ]'\"", "Maven 2.x Repository", "0 0 * * * ?", "1", "1"); + assertTextPresent( "Index directory must only contain alphanumeric characters, equals(=), question-marks(?), exclamation-points(!), ampersands(&), forward-slashes(/), back-slashes(\\), underscores(_), dots(.), colons(:), tildes(~), and dashes(-)." ); + } + + @Test(dependsOnMethods = { "testEditManagedRepoInvalidIndexDir" } ) + public void testEditManagedRepoInvalidCron() + { + editManagedRepository("name" , "/home" , "/.index", "Maven 2.x Repository", "", "1", "1"); + assertTextPresent( "Invalid cron expression." ); + } + + @Test(dependsOnMethods = { "testEditManagedRepoInvalidCron" } ) + public void testEditManagedRepoInvalidRetentionCount() + { + editManagedRepository("name" , "/home" , "/.index", "Maven 2.x Repository", "0 0 * * * ?", "1", "101"); + assertTextPresent( "Repository Purge By Retention Count needs to be between 1 and 100." ); + } + + @Test(dependsOnMethods = { "testEditManagedRepoInvalidRetentionCount" } ) + public void testEditManagedRepoInvalidDaysOlder() + { + editManagedRepository("name" , "/home" , "/.index", "Maven 2.x Repository", "0 0 * * * ?", "-1", "1"); + assertTextPresent( "Repository Purge By Days Older Than needs to be larger than 0." ); + } + //TODO - @Test(dependsOnMethods = { "testAddManagedRepoForEdit" } ) + @Test(dependsOnMethods = { "testEditManagedRepoInvalidDaysOlder" } ) public void testEditManagedRepo() { editManagedRepository( "repository.name" , "Managed Repo" ); @@ -140,11 +251,11 @@ public class RepositoryTest addRemoteRepository( "remoterepo" , "Remote Repository Sample" , "http://repository.codehaus.org/org/codehaus/mojo/" , "" , "" , "" , "Maven 2.x Repository" ); assertTextPresent( "Remote Repository Sample" ); } - + // *** BUNDLED REPOSITORY TEST *** - - @Test ( dependsOnMethods = { "testWithCorrectUsernamePassword" }, alwaysRun = true ) - public void testBundledRepository() + + @Test ( dependsOnMethods = { "testWithCorrectUsernamePassword" }, alwaysRun = true ) + public void testBundledRepository() { String repo1 = baseUrl + "repository/internal/"; String repo2 = baseUrl + "repository/snapshots/"; @@ -152,7 +263,7 @@ public class RepositoryTest assertRepositoryAccess( repo1 ); assertRepositoryAccess( repo2 ); - getSelenium().open( "/archiva" ); + getSelenium().open( "/archiva" ); } private void assertRepositoryAccess( String repo ) diff --git a/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/XSSSecurityTest.java b/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/XSSSecurityTest.java new file mode 100644 index 000000000..1b9cfa1d1 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/XSSSecurityTest.java @@ -0,0 +1,190 @@ +package org.apache.archiva.web.test; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import org.testng.annotations.Test; +import org.apache.archiva.web.test.parent.AbstractArchivaTest; + +/** + * Test all actions affected with XSS security issue. + */ +@Test( groups = { "xss" }, dependsOnMethods = { "testWithCorrectUsernamePassword" }, sequential = true ) +public class XSSSecurityTest + extends AbstractArchivaTest +{ + public void testDeleteArtifactImmunityToURLCrossSiteScripting() + { + getSelenium().open( "/archiva/deleteArtifact!doDelete.action?groupId=\"/>1&artifactId=\"/>1&version=\"/>1&repositoryId=\"/>1"); + assertDeleteArtifactPage(); + assertTextPresent( "Invalid version." ); + assertTextPresent( "User is not authorized to delete artifacts in repository '\"/>1'." ); + assertTextPresent( "Group id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + assertTextPresent( "Artifact id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + assertTextPresent( "Repository id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + assertElementValue("//input[@id='deleteArtifact_groupId']", "\"/>1"); + assertElementValue("//input[@id='deleteArtifact_artifactId']", "\"/>1"); + assertElementValue("//input[@id='deleteArtifact_version']", "\"/>1"); + assertElementValue("//select[@id='deleteArtifact_repositoryId']", "internal"); + } + + public void testDeleteArtifactImmunityToEncodedURLCrossSiteScripting() + { + getSelenium().open( "/archiva/deleteArtifact!doDelete.action?groupId=%22%2F%3E1%3Cscript%3Ealert('xss')%3C%2Fscript%3E&artifactId=%22%2F%3E1%3Cscript%3Ealert('xss')%3C%2Fscript%3E&version=%22%2F%3E1%3Cscript%3Ealert('xss')%3C%2Fscript%3E&repositoryId=%22%2F%3E1%3Cscript%3Ealert('xss')%3C%2Fscript%3E"); + assertDeleteArtifactPage(); + assertTextPresent( "Invalid version." ); + assertTextPresent( "User is not authorized to delete artifacts in repository '\"/>1'." ); + assertTextPresent( "Group id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + assertTextPresent( "Artifact id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + assertTextPresent( "Repository id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + assertElementValue("//input[@id='deleteArtifact_groupId']", "\"/>1"); + assertElementValue("//input[@id='deleteArtifact_artifactId']", "\"/>1"); + assertElementValue("//input[@id='deleteArtifact_version']", "\"/>1"); + assertElementValue("//select[@id='deleteArtifact_repositoryId']", "internal"); + } + + public void testEditAppearanceImmunityToURLCrossSiteScripting() + { + getSelenium().open( "/archiva/admin/configureAppearance.action?organisationName=&organisationUrl=&organisationLogo="); + assertAppearancePage(); + assertXpathCount("//td[text()=\"\"]", 1); + assertXpathCount("//code[text()=\"\"]", 2); + + } + + public void testEditAppearanceImmunityToEncodedURLCrossSiteScripting() + { + getSelenium().open( "/archiva/admin/configureAppearance.action?organisationName=%3Cscript%3Ealert('xss')%3C%2Fscript%3E&organisationUrl=%3Cscript%3Ealert('xss')%3C%2Fscript%3E&organisationLogo=%3Cscript%3Ealert('xss')%3C%2Fscript%3E"); + assertAppearancePage(); + assertXpathCount("//td[text()=\"\"]", 1); + assertXpathCount("//code[text()=\"\"]", 2); + } + + public void testAddLegacyArtifactImmunityToURLCrossSiteScripting() + { + getSelenium().open( "/archiva/admin/addLegacyArtifactPath!commit.action?legacyArtifactPath.path=\"/>1&groupId=\"/>1&artifactId=\"/>1&version=\"/>1&classifier=\"/>1&type=\"/>1"); + assertAddLegacyArtifactPathPage(); + assertTextPresent( "Legacy path must only contain alphanumeric characters, forward-slashes(/), back-slashes(\\), underscores(_), dots(.), and dashes(-)." ); + assertTextPresent( "Group id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + assertTextPresent( "Artifact id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + assertTextPresent( "Version must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + assertTextPresent( "Classifier must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + assertTextPresent( "Type must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + assertElementValue("//input[@id='addLegacyArtifactPath_legacyArtifactPath_path']", "\"/>1"); + assertElementValue("//input[@id='addLegacyArtifactPath_artifactId']", "\"/>1"); + assertElementValue("//input[@id='addLegacyArtifactPath_version']", "\"/>1"); + assertElementValue("//input[@id='addLegacyArtifactPath_groupId']", "\"/>1"); + assertElementValue("//input[@id='addLegacyArtifactPath_classifier']", "\"/>1"); + assertElementValue("//input[@id='addLegacyArtifactPath_type']", "\"/>1"); + } + + public void testAddLegacyArtifactImmunityToEncodedURLCrossSiteScripting() + { + getSelenium().open( "/archiva/admin/addLegacyArtifactPath!commit.action?legacyArtifactPath.path=%22%2F%3E1%3Cscript%3Ealert('xss')%3C%2Fscript%3E&groupId=%22%2F%3E1%3Cscript%3Ealert('xss')%3C%2Fscript%3E&artifactId=%22%2F%3E1%3Cscript%3Ealert('xss')%3C%2Fscript%3E&version=%22%2F%3E1%3Cscript%3Ealert('xss')%3C%2Fscript%3E&classifier=%22%2F%3E1%3Cscript%3Ealert('xss')%3C%2Fscript%3E&type=%22%2F%3E1%3Cscript%3Ealert('xss')%3C%2Fscript%3E"); + assertAddLegacyArtifactPathPage(); + assertTextPresent( "Legacy path must only contain alphanumeric characters, forward-slashes(/), back-slashes(\\), underscores(_), dots(.), and dashes(-)." ); + assertTextPresent( "Group id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + assertTextPresent( "Artifact id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + assertTextPresent( "Version must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + assertTextPresent( "Classifier must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + assertTextPresent( "Type must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + assertElementValue("//input[@id='addLegacyArtifactPath_legacyArtifactPath_path']", "\"/>1"); + assertElementValue("//input[@id='addLegacyArtifactPath_artifactId']", "\"/>1"); + assertElementValue("//input[@id='addLegacyArtifactPath_version']", "\"/>1"); + assertElementValue("//input[@id='addLegacyArtifactPath_groupId']", "\"/>1"); + assertElementValue("//input[@id='addLegacyArtifactPath_classifier']", "\"/>1"); + assertElementValue("//input[@id='addLegacyArtifactPath_type']", "\"/>1"); + } + + public void testDeleteNetworkProxyImmunityToURLCrossSiteScripting() + { + getSelenium().open( "/archiva/admin/deleteNetworkProxy!confirm.action?proxyid=\"/>1"); + assertTextPresent( "Security Alert - Invalid Token Found" ); + assertTextPresent( "Possible CSRF attack detected! Invalid token found in the request." ); + } + + public void testDeleteNetworkProxyImmunityToEncodedURLCrossSiteScripting() + { + getSelenium().open( "/archiva/admin/deleteNetworkProxy!confirm.action?proxyid=%22%2F%3E1%3Cscript%3Ealert('xss')%3C%2Fscript%3E"); + assertTextPresent( "Security Alert - Invalid Token Found" ); + assertTextPresent( "Possible CSRF attack detected! Invalid token found in the request." ); + } + + public void testAddManagedRepositoryImmunityToInputFieldCrossSiteScripting() + { + goToRepositoriesPage(); + getSelenium().open( "/archiva/admin/addRepository.action" ); + addManagedRepository( "test\">", "test\">" , "test\">" , "test\">", "Maven 2.x Repository", "", "-1", "101" ); + // xss inputs are blocked by validation. + assertTextPresent( "Identifier must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + assertTextPresent( "Directory must only contain alphanumeric characters, equals(=), question-marks(?), exclamation-points(!), ampersands(&), forward-slashes(/), back-slashes(\\), underscores(_), dots(.), colons(:), tildes(~), and dashes(-)." ); + assertTextPresent( "Repository Name must only contain alphanumeric characters, white-spaces(' '), forward-slashes(/), open-parenthesis('('), close-parenthesis(')'), underscores(_), dots(.), and dashes(-)." ); + assertTextPresent( "Index directory must only contain alphanumeric characters, equals(=), question-marks(?), exclamation-points(!), ampersands(&), forward-slashes(/), back-slashes(\\), underscores(_), dots(.), colons(:), tildes(~), and dashes(-)." ); + assertTextPresent( "Repository Purge By Retention Count needs to be between 1 and 100."); + assertTextPresent( "Repository Purge By Days Older Than needs to be larger than 0."); + assertTextPresent( "Invalid cron expression." ); + } + + public void testEditAppearanceImmunityToInputFieldCrossSiteScripting() + { + goToAppearancePage(); + clickLinkWithText( "Edit" ); + addEditAppearance( "test" , "test" , "test" ); + // xss inputs are blocked by validation. + assertTextPresent( "Organisation name must only contain alphanumeric characters, white-spaces(' '), equals(=), question-marks(?), exclamation-points(!), ampersands(&), forward-slashes(/), back-slashes(\\), underscores(_), dots(.), colons(:), tildes(~), and dashes(-)." ); + assertTextPresent( "You must enter a URL" ); + assertXpathCount("//span[@class='errorMessage' and text()='You must enter a URL']", 2); + } + + public void testEditAppearanceImmunityToCrossSiteScriptingRendering() + { + goToAppearancePage(); + clickLinkWithText( "Edit" ); + addEditAppearance( "xss" , "http://\">test" , "http://\">test" ); + // escaped html/url prevents cross-site scripting exploits + assertXpathCount("//td[text()=\"xss\"]", 1); + assertXpathCount("//code[text()='http://\">test']", 2); + } + + public void testAddLegacyArtifactPathImmunityToInputFieldCrossSiteScripting() + { + goToLegacySupportPage(); + clickLinkWithText( "Add" ); + addLegacyArtifactPath( "test" , "test" , "test" , "test" , "test" , "test"); + // xss inputs are blocked by validation. + assertTextPresent( "Legacy path must only contain alphanumeric characters, forward-slashes(/), back-slashes(\\), underscores(_), dots(.), and dashes(-)." ); + assertTextPresent( "Group id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + assertTextPresent( "Artifact id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + assertTextPresent( "Version must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + assertTextPresent( "Classifier must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + assertTextPresent( "Type must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + } + + public void testAddNetworkProxyImmunityToInputFieldCrossSiteScripting() + { + goToNetworkProxiesPage(); + addNetworkProxy( "test", "test", "test", "test", "test", ""); + // xss inputs are blocked by validation. + assertTextPresent( "Proxy id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)." ); + assertTextPresent( "Protocol must only contain alphanumeric characters, forward-slashes(/), back-slashes(\\), dots(.), colons(:), and dashes(-)." ); + assertTextPresent( "Host must only contain alphanumeric characters, equals(=), question-marks(?), exclamation-points(!), ampersands(&), forward-slashes(/), back-slashes(\\), underscores(_), dots(.), colons(:), tildes(~), and dashes(-)." ); + assertTextPresent( "Invalid field value for field \"proxy.port\"." ); + assertTextPresent( "Username must only contain alphanumeric characters, at's(@), forward-slashes(/), back-slashes(\\), underscores(_), dots(.), and dashes(-)." ); + } +} \ No newline at end of file diff --git a/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/parent/AbstractArchivaTest.java b/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/parent/AbstractArchivaTest.java index 3a2131dcb..f6b9fb373 100644 --- a/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/parent/AbstractArchivaTest.java +++ b/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/parent/AbstractArchivaTest.java @@ -552,6 +552,104 @@ public abstract class AbstractArchivaTest clickButtonWithValue( "Add Repository" ); } + // artifact management + public void assertDeleteArtifactPage() + { + assertPage( "Apache Archiva \\ Delete Artifact" ); + assertTextPresent( "Delete Artifact" ); + assertTextPresent( "Group Id*:" ); + assertTextPresent( "Artifact Id*:" ); + assertTextPresent( "Version*:" ); + assertTextPresent( "Repository Id:" ); + assertElementPresent( "groupId" ); + assertElementPresent( "artifactId" ); + assertElementPresent( "version" ); + assertElementPresent( "repositoryId" ); + assertButtonWithValuePresent( "Submit" ); + } + + // network proxies + public void goToNetworkProxiesPage() + { + clickLinkWithText( "Network Proxies" ); + assertNetworkProxiesPage(); + } + + public void assertNetworkProxiesPage() + { + assertPage( "Apache Archiva \\ Administration - Network Proxies" ); + assertTextPresent( "Administration - Network Proxies" ); + assertTextPresent( "Network Proxies" ); + assertLinkPresent( "Add Network Proxy" ); + } + + public void addNetworkProxy( String identifier, String protocol, String hostname, String port, String username, String password ) + { + //goToNetworkProxiesPage(); + clickLinkWithText( "Add Network Proxy" ); + assertAddNetworkProxy(); + setFieldValue( "proxy.id" , identifier ); + setFieldValue( "proxy.protocol" , protocol ); + setFieldValue( "proxy.host" , hostname ); + setFieldValue( "proxy.port" , port ); + setFieldValue( "proxy.username" , username ); + setFieldValue( "proxy.password" , password ); + clickButtonWithValue( "Save Network Proxy" ); + } + + public void assertAddNetworkProxy() + { + assertPage( "Apache Archiva \\ Admin: Add Network Proxy" ); + assertTextPresent( "Admin: Add Network Proxy" ); + assertTextPresent( "Add network proxy:" ); + assertTextPresent( "Identifier*:" ); + assertTextPresent( "Protocol*:" ); + assertTextPresent( "Hostname*:" ); + assertTextPresent( "Port*:" ); + assertTextPresent( "Username:" ); + assertTextPresent( "Password:" ); + assertButtonWithValuePresent( "Save Network Proxy" ); + } + + // Legacy Support + public void goToLegacySupportPage() + { + getSelenium().open( "/archiva/admin/legacyArtifactPath.action" ); + assertLegacySupportPage(); + } + + public void assertLegacySupportPage() + { + assertPage( "Apache Archiva \\ Administration - Legacy Support" ); + assertTextPresent( "Administration - Legacy Artifact Path Resolution" ); + assertTextPresent( "Path Mappings" ); + assertLinkPresent( "Add" ); + } + + public void addLegacyArtifactPath( String path, String groupId, String artifactId, String version, String classifier, String type) + { + assertAddLegacyArtifactPathPage(); + setFieldValue( "legacyArtifactPath.path" , path ); + setFieldValue( "groupId" , groupId ); + setFieldValue( "artifactId" , artifactId ); + setFieldValue( "version" , version ); + setFieldValue( "classifier" , classifier ); + setFieldValue( "type" , type ); + clickButtonWithValue( "Add Legacy Artifact Path" ); + } + + public void assertAddLegacyArtifactPathPage() + { + assertPage( "Apache Archiva \\ Admin: Add Legacy Artifact Path" ); + assertTextPresent( "Admin: Add Legacy Artifact Path" ); + assertTextPresent( "Enter the legacy path to map to a particular artifact reference, then adjust the fields as necessary." ); + String element = "addLegacyArtifactPath_legacyArtifactPath_path,addLegacyArtifactPath_groupId,addLegacyArtifactPath_artifactId,addLegacyArtifactPath_version,addLegacyArtifactPath_classifier,addLegacyArtifactPath_type"; + String[] arrayElement = element.split( "," ); + for ( String arrayelement : arrayElement ) + assertElementPresent( arrayelement ); + assertButtonWithValuePresent( "Add Legacy Artifact Path" ); + } + protected void logout() { clickLinkWithText("Logout"); diff --git a/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/parent/AbstractArtifactManagementTest.java b/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/parent/AbstractArtifactManagementTest.java index 433c04014..0847a6cc9 100644 --- a/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/parent/AbstractArtifactManagementTest.java +++ b/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/parent/AbstractArtifactManagementTest.java @@ -55,58 +55,4 @@ public abstract class AbstractArtifactManagementTest selectValue( "repositoryId" , repositoryId ); clickButtonWithValue( "Submit" ) ; } - - public void assertDeleteArtifactPage() - { - assertPage( "Apache Archiva \\ Delete Artifact" ); - assertTextPresent( "Delete Artifact" ); - assertTextPresent( "Group Id*:" ); - assertTextPresent( "Artifact Id*:" ); - assertTextPresent( "Version*:" ); - assertTextPresent( "Repository Id:" ); - assertElementPresent( "groupId" ); - assertElementPresent( "artifactId" ); - assertElementPresent( "version" ); - assertElementPresent( "repositoryId" ); - assertButtonWithValuePresent( "Submit" ); - } - - // Legacy Support - public void goToLegacySupportPage() - { - getSelenium().open( "/archiva/admin/legacyArtifactPath.action" ); - assertLegacySupportPage(); - } - - public void assertLegacySupportPage() - { - assertPage( "Apache Archiva \\ Administration - Legacy Support" ); - assertTextPresent( "Administration - Legacy Artifact Path Resolution" ); - assertTextPresent( "Path Mappings" ); - assertLinkPresent( "Add" ); - } - - public void addLegacyArtifactPath( String path, String groupId, String artifactId, String version, String classifier, String type) - { - assertAddLegacyArtifactPathPage(); - setFieldValue( "legacyArtifactPath.path" , path ); - setFieldValue( "groupId" , groupId ); - setFieldValue( "artifactId" , artifactId ); - setFieldValue( "version" , version ); - setFieldValue( "classifier" , classifier ); - setFieldValue( "type" , type ); - clickButtonWithValue( "Add Legacy Artifact Path" ); - } - - public void assertAddLegacyArtifactPathPage() - { - assertPage( "Apache Archiva \\ Admin: Add Legacy Artifact Path" ); - assertTextPresent( "Admin: Add Legacy Artifact Path" ); - assertTextPresent( "Enter the legacy path to map to a particular artifact reference, then adjust the fields as necessary." ); - String element = "addLegacyArtifactPath_legacyArtifactPath_path,addLegacyArtifactPath_groupId,addLegacyArtifactPath_artifactId,addLegacyArtifactPath_version,addLegacyArtifactPath_classifier,addLegacyArtifactPath_type"; - String[] arrayElement = element.split( "," ); - for ( String arrayelement : arrayElement ) - assertElementPresent( arrayelement ); - assertButtonWithValuePresent( "Add Legacy Artifact Path" ); - } } diff --git a/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/parent/AbstractRepositoryTest.java b/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/parent/AbstractRepositoryTest.java index 7595a335f..77dad4db3 100644 --- a/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/parent/AbstractRepositoryTest.java +++ b/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/parent/AbstractRepositoryTest.java @@ -177,47 +177,6 @@ public abstract class AbstractRepositoryTest /////////////////////////////// // network proxies /////////////////////////////// - public void goToNetworkProxiesPage() - { - clickLinkWithText( "Network Proxies" ); - assertNetworkProxiesPage(); - } - - public void assertNetworkProxiesPage() - { - assertPage( "Apache Archiva \\ Administration - Network Proxies" ); - assertTextPresent( "Administration - Network Proxies" ); - assertTextPresent( "Network Proxies" ); - assertLinkPresent( "Add Network Proxy" ); - } - - public void assertAddNetworkProxy() - { - assertPage( "Apache Archiva \\ Admin: Add Network Proxy" ); - assertTextPresent( "Admin: Add Network Proxy" ); - assertTextPresent( "Add network proxy:" ); - assertTextPresent( "Identifier*:" ); - assertTextPresent( "Protocol*:" ); - assertTextPresent( "Hostname*:" ); - assertTextPresent( "Port*:" ); - assertTextPresent( "Username:" ); - assertTextPresent( "Password:" ); - assertButtonWithValuePresent( "Save Network Proxy" ); - } - - public void addNetworkProxy( String identifier, String protocol, String hostname, String port, String username, String password ) - { - //goToNetworkProxiesPage(); - clickLinkWithText( "Add Network Proxy" ); - assertAddNetworkProxy(); - setFieldValue( "proxy.id" , identifier ); - setFieldValue( "proxy.protocol" , protocol ); - setFieldValue( "proxy.host" , hostname ); - setFieldValue( "proxy.port" , port ); - setFieldValue( "proxy.username" , username ); - setFieldValue( "proxy.password" , password ); - clickButtonWithValue( "Save Network Proxy" ); - } public void editNetworkProxies( String fieldName, String value) { @@ -299,6 +258,21 @@ public abstract class AbstractRepositoryTest //TODO clickButtonWithValue( "Update Repository" ); } + + public void editManagedRepository(String name, String directory, String indexDirectory, String type, String cron, String daysOlder, String retentionCount) + { + goToRepositoriesPage(); + clickLinkWithXPath( "//div[@id='contentArea']/div/div[5]/div[1]/a[1]/img" ); + assertPage( "Apache Archiva \\ Admin: Edit Managed Repository" ); + setFieldValue( "repository.name" , name ); + setFieldValue( "repository.location" , directory ); + setFieldValue( "repository.indexDir" , indexDirectory ); + selectValue( "repository.layout", type ); + setFieldValue( "repository.refreshCronExpression" , cron ); + setFieldValue( "repository.daysOlder" , daysOlder ); + setFieldValue( "repository.retentionCount" , retentionCount ); + clickButtonWithValue( "Update Repository" ); + } public void deleteManagedRepository() { diff --git a/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/parent/AbstractSeleniumTest.java b/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/parent/AbstractSeleniumTest.java index 888e89c41..98d4b6f8d 100644 --- a/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/parent/AbstractSeleniumTest.java +++ b/archiva-modules/archiva-web/archiva-webapp-test/src/test/testng/org/apache/archiva/web/test/parent/AbstractSeleniumTest.java @@ -399,5 +399,14 @@ public abstract class AbstractSeleniumTest { { Assert.assertFalse( getSelenium().isChecked( locator ) ); } - + + public void assertXpathCount(String locator, int expectedCount) + { + Assert.assertEquals( getSelenium().getXpathCount(locator).intValue(), expectedCount ); + } + + public void assertElementValue(String locator, String expectedValue) + { + Assert.assertEquals(getSelenium().getValue(locator), expectedValue); + } } diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/DeleteArtifactAction.java b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/DeleteArtifactAction.java index 7d2d62b25..ecb14aeb9 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/DeleteArtifactAction.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/DeleteArtifactAction.java @@ -60,6 +60,7 @@ import org.apache.maven.archiva.security.UserRepositories; import com.opensymphony.xwork2.Preparable; import com.opensymphony.xwork2.Validateable; +import org.apache.commons.lang.StringUtils; /** * Delete an artifact. Metadata will be updated if one exists, otherwise it would be created. @@ -381,6 +382,9 @@ public class DeleteArtifactAction { addActionError( e.getMessage() ); } + + // trims all request parameter values, since the trailing/leading white-spaces are ignored during validation. + trimAllRequestParameterValues(); } private List getManagableRepos() @@ -404,4 +408,27 @@ public class DeleteArtifactAction } return Collections.emptyList(); } + + private void trimAllRequestParameterValues() + { + if(StringUtils.isNotEmpty(groupId)) + { + groupId = groupId.trim(); + } + + if(StringUtils.isNotEmpty(artifactId)) + { + artifactId = artifactId.trim(); + } + + if(StringUtils.isNotEmpty(version)) + { + version = version.trim(); + } + + if(StringUtils.isNotEmpty(repositoryId)) + { + repositoryId = repositoryId.trim(); + } + } } diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/appearance/EditOrganisationInfoAction.java b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/appearance/EditOrganisationInfoAction.java index a6b65f8d3..c32b8233a 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/appearance/EditOrganisationInfoAction.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/appearance/EditOrganisationInfoAction.java @@ -19,6 +19,8 @@ package org.apache.maven.archiva.web.action.admin.appearance; * under the License. */ +import com.opensymphony.xwork2.Validateable; +import org.apache.commons.lang.StringUtils; import org.apache.maven.archiva.configuration.Configuration; import org.apache.maven.archiva.configuration.IndeterminateConfigurationException; import org.apache.maven.archiva.configuration.OrganisationInformation; @@ -38,7 +40,7 @@ import org.codehaus.redback.integration.interceptor.SecureActionException; */ public class EditOrganisationInfoAction extends AbstractAppearanceAction - implements SecureAction + implements SecureAction, Validateable { @Override public String execute() @@ -70,4 +72,28 @@ public class EditOrganisationInfoAction bundle.addRequiredAuthorization( ArchivaRoleConstants.OPERATION_MANAGE_CONFIGURATION, Resource.GLOBAL ); return bundle; } + + public void validate() + { + // trim all unecessary trailing/leading white-spaces; always put this statement before the closing braces(after all validation). + trimAllRequestParameterValues(); + } + + private void trimAllRequestParameterValues() + { + if(StringUtils.isNotEmpty(super.getOrganisationName())) + { + super.setOrganisationName(super.getOrganisationName().trim()); + } + + if(StringUtils.isNotEmpty(super.getOrganisationUrl())) + { + super.setOrganisationUrl(super.getOrganisationUrl().trim()); + } + + if(StringUtils.isNotEmpty(super.getOrganisationLogo())) + { + super.setOrganisationLogo(super.getOrganisationLogo().trim()); + } + } } diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/legacy/AddLegacyArtifactPathAction.java b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/legacy/AddLegacyArtifactPathAction.java index f3d4a36a2..18a266ccd 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/legacy/AddLegacyArtifactPathAction.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/legacy/AddLegacyArtifactPathAction.java @@ -28,6 +28,8 @@ import org.apache.maven.archiva.repository.ManagedRepositoryContent; import org.codehaus.plexus.registry.RegistryException; import com.opensymphony.xwork2.Preparable; +import com.opensymphony.xwork2.Validateable; +import org.apache.commons.lang.StringUtils; import org.apache.maven.archiva.web.action.PlexusActionSupport; /** @@ -38,7 +40,7 @@ import org.apache.maven.archiva.web.action.PlexusActionSupport; */ public class AddLegacyArtifactPathAction extends PlexusActionSupport - implements Preparable + implements Preparable, Validateable { /** * @plexus.requirement @@ -110,6 +112,12 @@ public class AddLegacyArtifactPathAction this.legacyArtifactPath = legacyArtifactPath; } + public void validate() + { + // trim all unecessary trailing/leading white-spaces; always put this statement before the closing braces(after all validation). + trimAllRequestParameterValues(); + } + protected String saveConfiguration( Configuration configuration ) { try @@ -131,6 +139,39 @@ public class AddLegacyArtifactPathAction return SUCCESS; } + private void trimAllRequestParameterValues() + { + if(StringUtils.isNotEmpty(legacyArtifactPath.getPath())) + { + legacyArtifactPath.setPath(legacyArtifactPath.getPath().trim()); + } + + if(StringUtils.isNotEmpty(groupId)) + { + groupId = groupId.trim(); + } + + if(StringUtils.isNotEmpty(artifactId)) + { + artifactId = artifactId.trim(); + } + + if(StringUtils.isNotEmpty(version)) + { + version = version.trim(); + } + + if(StringUtils.isNotEmpty(classifier)) + { + classifier = classifier.trim(); + } + + if(StringUtils.isNotEmpty(type)) + { + type = type.trim(); + } + } + public String getGroupId() { return groupId; diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/networkproxies/ConfigureNetworkProxyAction.java b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/networkproxies/ConfigureNetworkProxyAction.java index ec408deab..3299bc3b7 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/networkproxies/ConfigureNetworkProxyAction.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/networkproxies/ConfigureNetworkProxyAction.java @@ -20,6 +20,7 @@ package org.apache.maven.archiva.web.action.admin.networkproxies; */ import com.opensymphony.xwork2.Preparable; +import com.opensymphony.xwork2.Validateable; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.functors.NotPredicate; import org.apache.commons.lang.StringUtils; @@ -44,7 +45,7 @@ import org.codehaus.redback.integration.interceptor.SecureActionException; */ public class ConfigureNetworkProxyAction extends PlexusActionSupport - implements SecureAction, Preparable + implements SecureAction, Preparable, Validateable { /** * @plexus.requirement @@ -169,6 +170,12 @@ public class ConfigureNetworkProxyAction return saveConfiguration(); } + public void validate() + { + // trim all unecessary trailing/leading white-spaces; always put this statement before the closing braces(after all validation). + trimAllRequestParameterValues(); + } + public void setMode( String mode ) { this.mode = mode; @@ -225,4 +232,32 @@ public class ConfigureNetworkProxyAction return SUCCESS; } + + private void trimAllRequestParameterValues() + { + if(StringUtils.isNotEmpty(proxy.getId())) + { + proxy.setId(proxy.getId().trim()); + } + + if(StringUtils.isNotEmpty(proxy.getHost())) + { + proxy.setHost(proxy.getHost().trim()); + } + + if(StringUtils.isNotEmpty(proxy.getPassword())) + { + proxy.setPassword(proxy.getPassword().trim()); + } + + if(StringUtils.isNotEmpty(proxy.getProtocol())) + { + proxy.setProtocol(proxy.getProtocol().trim()); + } + + if(StringUtils.isNotEmpty(proxy.getUsername())) + { + proxy.setUsername(proxy.getUsername().trim()); + } + } } diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/AddManagedRepositoryAction.java b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/AddManagedRepositoryAction.java index 97151c816..e7f211ae1 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/AddManagedRepositoryAction.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/AddManagedRepositoryAction.java @@ -29,6 +29,7 @@ import org.codehaus.plexus.redback.role.RoleManagerException; import org.codehaus.plexus.scheduler.CronExpressionValidator; import java.io.File; import java.io.IOException; +import org.apache.commons.lang.StringUtils; /** * AddManagedRepositoryAction @@ -135,6 +136,32 @@ public class AddManagedRepositoryAction { addFieldError( "repository.refreshCronExpression", "Invalid cron expression." ); } + + // trim all unecessary trailing/leading white-spaces; always put this statement before the closing braces(after all validation). + trimAllRequestParameterValues(); + } + + private void trimAllRequestParameterValues() + { + if(StringUtils.isNotEmpty(repository.getId())) + { + repository.setId(repository.getId().trim()); + } + + if(StringUtils.isNotEmpty(repository.getName())) + { + repository.setName(repository.getName().trim()); + } + + if(StringUtils.isNotEmpty(repository.getLocation())) + { + repository.setLocation(repository.getLocation().trim()); + } + + if(StringUtils.isNotEmpty(repository.getIndexDir())) + { + repository.setIndexDir(repository.getIndexDir().trim()); + } } public ManagedRepositoryConfiguration getRepository() diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/EditManagedRepositoryAction.java b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/EditManagedRepositoryAction.java index f128ba152..9e78dbbea 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/EditManagedRepositoryAction.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/java/org/apache/maven/archiva/web/action/admin/repositories/EditManagedRepositoryAction.java @@ -167,6 +167,8 @@ public class EditManagedRepositoryAction { addFieldError( "repository.refreshCronExpression", "Invalid cron expression." ); } + + trimAllRequestParameterValues(); } private void resetStatistics( boolean reset ) @@ -189,7 +191,30 @@ public class EditManagedRepositoryAction repoContentStatsDao.deleteRepositoryContentStatistics( stats ); } } - } + } + + private void trimAllRequestParameterValues() + { + if(StringUtils.isNotEmpty(repository.getId())) + { + repository.setId(repository.getId().trim()); + } + + if(StringUtils.isNotEmpty(repository.getName())) + { + repository.setName(repository.getName().trim()); + } + + if(StringUtils.isNotEmpty(repository.getLocation())) + { + repository.setLocation(repository.getLocation().trim()); + } + + if(StringUtils.isNotEmpty(repository.getIndexDir())) + { + repository.setIndexDir(repository.getIndexDir().trim()); + } + } public String getRepoid() { diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/resources/org/apache/maven/archiva/web/action/DeleteArtifactAction-validation.xml b/archiva-modules/archiva-web/archiva-webapp/src/main/resources/org/apache/maven/archiva/web/action/DeleteArtifactAction-validation.xml index dcef342d0..bfe08fa1f 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/resources/org/apache/maven/archiva/web/action/DeleteArtifactAction-validation.xml +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/resources/org/apache/maven/archiva/web/action/DeleteArtifactAction-validation.xml @@ -21,20 +21,40 @@ + You must enter a groupId. + + true + ^[a-zA-Z0-9._-]+$ + Group id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-). + You must enter an artifactId. + + true + ^[a-zA-Z0-9._-]+$ + Artifact id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-). + + You must enter a version. - + + + + + true + ^[a-zA-Z0-9._-]*$ + Repository id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-). + + \ No newline at end of file diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/resources/org/apache/maven/archiva/web/action/admin/appearance/EditOrganisationInfoAction-validation.xml b/archiva-modules/archiva-web/archiva-webapp/src/main/resources/org/apache/maven/archiva/web/action/admin/appearance/EditOrganisationInfoAction-validation.xml index 38b3bcfa8..df93a3bbc 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/resources/org/apache/maven/archiva/web/action/admin/appearance/EditOrganisationInfoAction-validation.xml +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/resources/org/apache/maven/archiva/web/action/admin/appearance/EditOrganisationInfoAction-validation.xml @@ -26,6 +26,11 @@ You must enter a name + + true + ^([-a-zA-Z0-9._/~:?!&=\\]|\s)+$ + Organisation name must only contain alphanumeric characters, white-spaces(' '), equals(=), question-marks(?), exclamation-points(!), ampersands(&), forward-slashes(/), back-slashes(\), underscores(_), dots(.), colons(:), tildes(~), and dashes(-). + diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/resources/org/apache/maven/archiva/web/action/admin/legacy/AddLegacyArtifactPathAction-validation.xml b/archiva-modules/archiva-web/archiva-webapp/src/main/resources/org/apache/maven/archiva/web/action/admin/legacy/AddLegacyArtifactPathAction-validation.xml index 1725a33ec..bbf09dd9d 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/resources/org/apache/maven/archiva/web/action/admin/legacy/AddLegacyArtifactPathAction-validation.xml +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/resources/org/apache/maven/archiva/web/action/admin/legacy/AddLegacyArtifactPathAction-validation.xml @@ -21,30 +21,64 @@ + You must enter a legacy path. + + true + ^[-a-zA-Z0-9._/\\]+$ + Legacy path must only contain alphanumeric characters, forward-slashes(/), back-slashes(\), underscores(_), dots(.), and dashes(-). + You must enter a groupId. + + true + ^[a-zA-Z0-9._-]+$ + Group id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-). + You must enter an artifactId. + + true + ^[a-zA-Z0-9._-]+$ + Artifact id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-). + You must enter a version. + + true + ^[a-zA-Z0-9._-]+$ + Version must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-). + + + + + + true + ^[a-zA-Z0-9._-]*$ + Classifier must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-). + You must enter a type. + + true + ^[a-zA-Z0-9._-]+$ + Type must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-). + \ No newline at end of file diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/resources/org/apache/maven/archiva/web/action/admin/networkproxies/ConfigureNetworkProxyAction-saveNetworkProxy-validation.xml b/archiva-modules/archiva-web/archiva-webapp/src/main/resources/org/apache/maven/archiva/web/action/admin/networkproxies/ConfigureNetworkProxyAction-saveNetworkProxy-validation.xml index 5e39f8d7e..669b3b102 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/resources/org/apache/maven/archiva/web/action/admin/networkproxies/ConfigureNetworkProxyAction-saveNetworkProxy-validation.xml +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/resources/org/apache/maven/archiva/web/action/admin/networkproxies/ConfigureNetworkProxyAction-saveNetworkProxy-validation.xml @@ -35,18 +35,33 @@ true You must enter an identifier of 4 or more than 4 characters. + + true + ^[a-zA-Z0-9._-]+$ + Proxy id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-). + true You must enter a protocol. + + true + ^[-a-zA-Z0-9./:\\]+$ + Protocol must only contain alphanumeric characters, forward-slashes(/), back-slashes(\), dots(.), colons(:), and dashes(-). + true You must enter a host. + + true + ^[-a-zA-Z0-9._/~:?!&=\\]+$ + Host must only contain alphanumeric characters, equals(=), question-marks(?), exclamation-points(!), ampersands(&), forward-slashes(/), back-slashes(\), underscores(_), dots(.), colons(:), tildes(~), and dashes(-). + @@ -60,5 +75,18 @@ --> Port needs to be larger than ${min} + + true + ^[0-9]+$ + Port must only contain numeric characters. + + + + + + true + ^[-a-zA-Z0-9.@/_\\]*$ + Username must only contain alphanumeric characters, at's(@), forward-slashes(/), back-slashes(\), underscores(_), dots(.), and dashes(-). + diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/resources/org/apache/maven/archiva/web/action/admin/repositories/AddManagedRepositoryAction-validation.xml b/archiva-modules/archiva-web/archiva-webapp/src/main/resources/org/apache/maven/archiva/web/action/admin/repositories/AddManagedRepositoryAction-validation.xml index 23f4cb495..8e7790759 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/resources/org/apache/maven/archiva/web/action/admin/repositories/AddManagedRepositoryAction-validation.xml +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/resources/org/apache/maven/archiva/web/action/admin/repositories/AddManagedRepositoryAction-validation.xml @@ -26,16 +26,39 @@ You must enter a repository identifier. + + true + ^[a-zA-Z0-9._-]+$ + Identifier must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-). + You must enter a directory. + + true + ^[-a-zA-Z0-9._/~:?!&=\\]+$ + Directory must only contain alphanumeric characters, equals(=), question-marks(?), exclamation-points(!), ampersands(&), forward-slashes(/), back-slashes(\), underscores(_), dots(.), colons(:), tildes(~), and dashes(-). + + + + + + true + ^[-a-zA-Z0-9._/~:?!&=\\]*$ + Index directory must only contain alphanumeric characters, equals(=), question-marks(?), exclamation-points(!), ampersands(&), forward-slashes(/), back-slashes(\), underscores(_), dots(.), colons(:), tildes(~), and dashes(-). + You must enter a repository name. + + true + ^([a-zA-Z0-9.)/_(-]|\s)+$ + Repository Name must only contain alphanumeric characters, white-spaces(' '), forward-slashes(/), open-parenthesis('('), close-parenthesis(')'), underscores(_), dots(.), and dashes(-). + diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/resources/org/apache/maven/archiva/web/action/admin/repositories/EditManagedRepositoryAction-validation.xml b/archiva-modules/archiva-web/archiva-webapp/src/main/resources/org/apache/maven/archiva/web/action/admin/repositories/EditManagedRepositoryAction-validation.xml index 4ce434a43..b00981f06 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/resources/org/apache/maven/archiva/web/action/admin/repositories/EditManagedRepositoryAction-validation.xml +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/resources/org/apache/maven/archiva/web/action/admin/repositories/EditManagedRepositoryAction-validation.xml @@ -26,28 +26,51 @@ You must enter a repository identifier. + + true + ^[a-zA-Z0-9._-]+$ + Identifier must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-). + You must enter a directory. + + true + ^[-a-zA-Z0-9._/~:?!&=\\]+$ + Directory must only contain alphanumeric characters, equals(=), question-marks(?), exclamation-points(!), ampersands(&), forward-slashes(/), back-slashes(\), underscores(_), dots(.), colons(:), tildes(~), and dashes(-). + + + + + + true + ^[-a-zA-Z0-9._/~:?!&=\\]*$ + Index directory must only contain alphanumeric characters, equals(=), question-marks(?), exclamation-points(!), ampersands(&), forward-slashes(/), back-slashes(\), underscores(_), dots(.), colons(:), tildes(~), and dashes(-). + You must enter a repository name. + + true + ^([a-zA-Z0-9.)/_(-]|\s)+$ + Repository Name must only contain alphanumeric characters, white-spaces(' '), forward-slashes(/), open-parenthesis('('), close-parenthesis(')'), underscores(_), dots(.), and dashes(-). + 1 100 Repository Purge By Retention Count needs to be between ${min} and ${max}. - + 0 Repository Purge By Days Older Than needs to be larger than ${min}. - + diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/addLegacyArtifactPath.jsp b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/addLegacyArtifactPath.jsp index f10a3acfd..1e2f4e213 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/addLegacyArtifactPath.jsp +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/addLegacyArtifactPath.jsp @@ -66,8 +66,22 @@ } - - + <%-- changed the structure of displaying errorMessages & actionMessages in order for them to be escaped. --%> + +
    + +
  • +
    +
+
+ +
    + +
  • +
    +
+
+ diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/addRepository.jsp b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/addRepository.jsp index 158159490..d084f4dd2 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/addRepository.jsp +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/addRepository.jsp @@ -31,8 +31,21 @@

Admin: Add Managed Repository

- - + <%-- changed the structure of displaying errorMessages & actionMessages in order for them to be escaped. --%> + +
    + +
  • +
    +
+
+ +
    + +
  • +
    +
+
<%@ include file="/WEB-INF/jsp/admin/include/repositoryForm.jspf" %> diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/appearance.jsp b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/appearance.jsp index 55d360d88..cd5438c10 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/appearance.jsp +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/appearance.jsp @@ -40,29 +40,30 @@ Change your appearance

+<%-- used c:out in displaying EL's so that they are escaped --%>

Organization Information

- + - - +
Name${organisationName}
URL - ${organisationUrl} + +
Logo URL - ${organisationLogo} +
 
diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/confirmAddRepository.jsp b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/confirmAddRepository.jsp index e30b19f81..09ca17e0a 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/confirmAddRepository.jsp +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/confirmAddRepository.jsp @@ -46,23 +46,24 @@ the following managed repository?

+ <%-- used c:out in displaying EL's so that they are escaped --%>
- + - + - + - + @@ -80,15 +81,15 @@ - + - + - + diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/deleteNetworkProxy.jsp b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/deleteNetworkProxy.jsp index 19156a36e..49f1d8458 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/deleteNetworkProxy.jsp +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/deleteNetworkProxy.jsp @@ -19,6 +19,7 @@ <%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib prefix="s" uri="/struts-tags" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> @@ -30,7 +31,14 @@

Admin: Delete Network Proxy

- + <%-- changed the structure of displaying errorMessages in order for them to be escaped. --%> + +
    + +
  • +
    +
+
@@ -39,9 +47,9 @@
WARNING: This operation can not be undone.
- + <%-- used c:out in displaying EL's for them to be escaped. --%>

- Are you sure you want to delete network proxy ${proxyid} ? + Are you sure you want to delete network proxy ?

diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/deleteRepository.jsp b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/deleteRepository.jsp index 5f925e579..def8b68f6 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/deleteRepository.jsp +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/deleteRepository.jsp @@ -19,6 +19,7 @@ <%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib prefix="s" uri="/struts-tags" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> @@ -30,7 +31,14 @@

Admin: Delete Managed Repository

- +<%-- changed the structure of displaying errorMessages in order for them to be escaped. --%> + +
    + +
  • +
    +
+
@@ -44,19 +52,20 @@ Are you sure you want to delete the following managed repository?

+ <%-- used c:out in displaying EL's so that they are escaped --%>
ID:${repository.id}
Name:${repository.name}
Directory:${repository.location}
Index Directory:${repository.indexDir}
Type:
Cron:${repository.refreshCronExpression}
Repository Purge By Days Older Than:${repository.daysOlder}
Repository Purge By Retention Count:${repository.retentionCount}
Releases Included:
- + - + - +
ID:${repository.id}
Name:${repository.name}
Directory:${repository.location}
diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/editAppearance.jsp b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/editAppearance.jsp index 9ec3859fc..8df7a210d 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/editAppearance.jsp +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/editAppearance.jsp @@ -35,7 +35,14 @@

- +<%-- changed the structure of displaying actionMessages in order for them to be escaped. --%> + +
    + +
  • +
    +
+
diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/editNetworkProxy.jsp b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/editNetworkProxy.jsp index f7dd33ec0..56af90dad 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/editNetworkProxy.jsp +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/editNetworkProxy.jsp @@ -43,10 +43,23 @@
-

${addedit} network proxy: ${networkProxyName}

+

${addedit} network proxy:

- - + <%-- changed the structure of displaying errorMessages & actionMessages in order for them to be escaped. --%> + +
    + +
  • +
    +
+
+ +
    + +
  • +
    +
+
@@ -66,7 +79,7 @@
diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/editRepository.jsp b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/editRepository.jsp index 5a0b482a0..2d3e95646 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/editRepository.jsp +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/editRepository.jsp @@ -30,11 +30,24 @@

Admin: Edit Managed Repository

- +<%-- changed the structure of displaying errorMessages & actionMessages in order for them to be escaped. --%> + +
    + +
  • +
    +
+
- + +
    + +
  • +
    +
+
diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/legacyArtifactPath.jsp b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/legacyArtifactPath.jsp index 2cb6bdcae..8ad83c259 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/legacyArtifactPath.jsp +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/legacyArtifactPath.jsp @@ -35,8 +35,21 @@
- - +<%-- changed the structure of displaying errorMessages & actionMessages in order for them to be escaped. --%> + +
    + +
  • +
    +
+
+ +
    + +
  • +
    +
+
@@ -69,12 +82,12 @@
- +
<%-- TODO: make some icons --%> - + struts.token @@ -86,17 +99,18 @@
+<%-- used c:out in displaying EL's so that they would be escaped --%>
Path - ${legacyArtifactPath.path} +
Artifact - ${legacyArtifactPath.artifact} +
diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/networkProxies.jsp b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/networkProxies.jsp index 33aec91c5..1f0b9b658 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/networkProxies.jsp +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/networkProxies.jsp @@ -35,7 +35,21 @@
- + <%-- changed the structure of displaying errorMessages & actionMessages in order for them to be escaped. --%> + +
    + +
  • +
    +
+
+ +
    + +
  • +
    +
+
@@ -72,10 +86,10 @@ - + - + struts.token @@ -88,27 +102,28 @@ Delete Network Proxy
+ <%-- used c:out in displaying EL's for them to be escaped. --%> - + - + - + - + - + diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/repositories.jsp b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/repositories.jsp index 8050fc39f..dd34ffb80 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/repositories.jsp +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/admin/repositories.jsp @@ -47,8 +47,22 @@
- - + <%-- changed the structure of displaying errorMessages & actionMessages in order for them to be escaped. --%> + +
    + +
  • +
    +
+
+ + +
    + +
  • +
    +
+
@@ -85,11 +99,11 @@
<%-- TODO: make some icons --%> - + - + struts.token @@ -104,43 +118,44 @@ - +
+<%-- used c:out in displaying EL's for them to be escaped. --%>
" alt="" width="32" height="32"/>
-

${repository.name}

+

Identifier${proxy.id}
Protocol${proxy.protocol}
Host${proxy.host}
Port${proxy.port}
Username${proxy.username}
- + - + - + @@ -161,7 +176,7 @@ @@ -181,11 +196,11 @@ - + - + @@ -195,7 +210,7 @@ - +
Identifier - ${repository.id} +
Name - ${repository.name} +
Directory${repository.location}
Index Directory${repository.indexDir}
WebDAV URL${baseUrl}/${repository.id}///
TypeGroups - ${group}, + ,
Repository Purge By Days Older Than${repository.daysOlder}
Repository Purge By Retention Count${repository.retentionCount}
Scanning Cron${repository.refreshCronExpression}
@@ -229,19 +244,19 @@ - + - + - -
Last Scanned${stats.whenGathered}
Duration${stats.duration} ms ms
Total File Count${stats.totalFileCount} +
New Files Found${stats.newFileCount} +
@@ -295,15 +310,15 @@
- - + + " alt="" width="16" height="16"/> Edit - + struts.token @@ -319,24 +334,24 @@ " alt="" width="32" height="32"/>
-

${repository.name}

+

- + diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/components/companyLogo.jsp b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/components/companyLogo.jsp index 23fae758a..ec1b77e3c 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/components/companyLogo.jsp +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/components/companyLogo.jsp @@ -29,12 +29,12 @@ - - + + - + diff --git a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/deleteArtifact.jsp b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/deleteArtifact.jsp index d518a52d0..a742928f5 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/deleteArtifact.jsp +++ b/archiva-modules/archiva-web/archiva-webapp/src/main/webapp/WEB-INF/jsp/deleteArtifact.jsp @@ -30,8 +30,21 @@

Delete Artifact

- - + <%-- changed the structure of displaying errorMessages & actionMessages in order for them to be escaped. --%> + +
    + +
  • +
    +
+
+ +
    + +
  • +
    +
+
diff --git a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/DeleteArtifactActionTest.java b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/DeleteArtifactActionTest.java new file mode 100644 index 000000000..9e5a3ae0f --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/DeleteArtifactActionTest.java @@ -0,0 +1,188 @@ +package org.apache.maven.archiva.web.action; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import com.opensymphony.xwork2.ObjectFactory; +import com.opensymphony.xwork2.validator.ActionValidatorManager; +import com.opensymphony.xwork2.validator.ActionValidatorManagerFactory; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import junit.framework.TestCase; +import org.apache.maven.archiva.web.validator.utils.ValidatorUtil; + +public class DeleteArtifactActionTest extends TestCase +{ + private static final String EMPTY_STRING = ""; + + // valid inputs + private static final String GROUP_ID_VALID_INPUT = "abcXYZ0129._-"; + + private static final String ARTIFACT_ID_VALID_INPUT = "abcXYZ0129._-"; + + private static final String VERSION_VALID_INPUT = "1.2.3"; + + private static final String REPOSITORY_ID_VALID_INPUT = "abcXYZ0129._-"; + + // invalid inputs + private static final String GROUP_ID_INVALID_INPUT = "<> \\/~+[ ]'\""; + + private static final String ARTIFACT_ID_INVALID_INPUT = "<> \\/~+[ ]'\""; + + private static final String VERSION_INVALID_INPUT = "<>"; + + private static final String REPOSITORY_ID_INVALID_INPUT = "<> \\/~+[ ]'\""; + + // testing requisite + private DeleteArtifactAction deleteArtifactAction; + + private ActionValidatorManager actionValidatorManager; + + @Override + public void setUp() throws Exception + { + deleteArtifactAction = new DeleteArtifactAction(); + ObjectFactory.setObjectFactory(new ObjectFactory()); + actionValidatorManager = ActionValidatorManagerFactory.getInstance(); + } + + public void testStruts2ValidationFrameworkWithNullInputs() throws Exception + { + // prep + populateDeleteArtifactActionFields(deleteArtifactAction, null, null, null, null); + + // test + actionValidatorManager.validate(deleteArtifactAction, EMPTY_STRING); + + // verify + assertTrue(deleteArtifactAction.hasFieldErrors()); + + Map> fieldErrors = deleteArtifactAction.getFieldErrors(); + + // make an expected field error object + Map> expectedFieldErrors = new HashMap>(); + + // populate + List expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter a groupId."); + expectedFieldErrors.put("groupId", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter an artifactId."); + expectedFieldErrors.put("artifactId", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter a version."); + expectedFieldErrors.put("version", expectedErrorMessages); + + // repositoryId is not required. + + ValidatorUtil.assertFieldErrors(expectedFieldErrors, fieldErrors); + } + + public void testStruts2ValidationFrameworkWithBlankInputs() throws Exception + { + // prep + populateDeleteArtifactActionFields(deleteArtifactAction, EMPTY_STRING, EMPTY_STRING, EMPTY_STRING, EMPTY_STRING); + + // test + actionValidatorManager.validate(deleteArtifactAction, EMPTY_STRING); + + // verify + assertTrue(deleteArtifactAction.hasFieldErrors()); + + Map> fieldErrors = deleteArtifactAction.getFieldErrors(); + + // make an expected field error object + Map> expectedFieldErrors = new HashMap>(); + + // populate + List expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter a groupId."); + expectedFieldErrors.put("groupId", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter an artifactId."); + expectedFieldErrors.put("artifactId", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter a version."); + expectedFieldErrors.put("version", expectedErrorMessages); + + // repositoryId is not required. + + ValidatorUtil.assertFieldErrors(expectedFieldErrors, fieldErrors); + } + + public void testStruts2ValidationFrameworkWithInvalidInputs() throws Exception + { + // prep + populateDeleteArtifactActionFields(deleteArtifactAction, GROUP_ID_INVALID_INPUT, ARTIFACT_ID_INVALID_INPUT, VERSION_INVALID_INPUT, REPOSITORY_ID_INVALID_INPUT); + + // test + actionValidatorManager.validate(deleteArtifactAction, EMPTY_STRING); + + // verify + assertTrue(deleteArtifactAction.hasFieldErrors()); + + Map> fieldErrors = deleteArtifactAction.getFieldErrors(); + + // make an expected field error object + Map> expectedFieldErrors = new HashMap>(); + + // populate + List expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("Group id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)."); + expectedFieldErrors.put("groupId", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("Artifact id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)."); + expectedFieldErrors.put("artifactId", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("Repository id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)."); + expectedFieldErrors.put("repositoryId", expectedErrorMessages); + + // version has its validation in the validate() method of the action class. + + ValidatorUtil.assertFieldErrors(expectedFieldErrors, fieldErrors); + } + + public void testStruts2ValidationFrameworkWithValidInputs() throws Exception + { + // prep + populateDeleteArtifactActionFields(deleteArtifactAction, GROUP_ID_VALID_INPUT, ARTIFACT_ID_VALID_INPUT, VERSION_VALID_INPUT, REPOSITORY_ID_VALID_INPUT); + + // test + actionValidatorManager.validate(deleteArtifactAction, EMPTY_STRING); + + // verify + assertFalse(deleteArtifactAction.hasFieldErrors()); + } + + private void populateDeleteArtifactActionFields(DeleteArtifactAction deleteArtifactAction, String groupId, String artifactId, String version, String repositoryId) + { + deleteArtifactAction.setGroupId(groupId); + deleteArtifactAction.setArtifactId(artifactId); + deleteArtifactAction.setVersion(version); + deleteArtifactAction.setRepositoryId(repositoryId); + } +} diff --git a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/appearance/EditOrganizationInfoActionTest.java b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/appearance/EditOrganizationInfoActionTest.java index e076261a8..2b054a000 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/appearance/EditOrganizationInfoActionTest.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/appearance/EditOrganizationInfoActionTest.java @@ -20,12 +20,47 @@ package org.apache.maven.archiva.web.action.admin.appearance; */ import com.opensymphony.xwork2.Action; +import com.opensymphony.xwork2.ObjectFactory; +import com.opensymphony.xwork2.validator.ActionValidatorManager; +import com.opensymphony.xwork2.validator.ActionValidatorManagerFactory; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import org.apache.maven.archiva.configuration.OrganisationInformation; +import org.apache.maven.archiva.web.validator.utils.ValidatorUtil; /** */ public class EditOrganizationInfoActionTest extends AbstractOrganizationInfoActionTest { + private static final String EMPTY_STRING = ""; + + // valid inputs + private static final String ORGANISATION_NAME_VALID_INPUT = "abcXYZ0129. _/\\~ :?!&=-"; + + private static final String ORGANISATION_URL_VALID_INPUT = "file://home/user/abcXYZ0129._/\\~:?!&=-<> ~+[ ]'\""; + + private static final String ORGANISATION_LOGO_VALID_INPUT = "file://home/user/abcXYZ0129._/\\~:?!&=-<> ~+[ ]'\""; + + // invalid inputs + private static final String ORGANISATION_NAME_INVALID_INPUT = "<>~+[ ]'\""; + + private static final String ORGANISATION_URL_INVALID_INPUT = "/home/user/abcXYZ0129._/\\~:?!&=-<> ~+[ ]'\""; + + private static final String ORGANISATION_LOGO_INVALID_INPUT = "/home/user/abcXYZ0129._/\\~:?!&=-<> ~+[ ]'\""; + + // testing requisite + private ActionValidatorManager actionValidatorManager; + + @Override + public void setUp() throws Exception + { + super.setUp(); + ObjectFactory.setObjectFactory(new ObjectFactory()); + actionValidatorManager = ActionValidatorManagerFactory.getInstance(); + } + public void testOrganisationInfoSaves() throws Exception { @@ -56,6 +91,109 @@ public class EditOrganizationInfoActionTest extends AbstractOrganizationInfoActi assertEquals("URL1", orginfo.getUrl()); } + public void testStruts2ValidationFrameworkWithNullInputs() throws Exception + { + // prep + action = getAction(); + populateOrganisationValues(action, null, null, null); + + // test + actionValidatorManager.validate(action, EMPTY_STRING); + + // verify + assertTrue(action.hasFieldErrors()); + + Map> fieldErrors = action.getFieldErrors(); + + // make an expected field error object + Map> expectedFieldErrors = new HashMap>(); + + // populate + List expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter a name"); + expectedFieldErrors.put("organisationName", expectedErrorMessages); + + ValidatorUtil.assertFieldErrors(expectedFieldErrors, fieldErrors); + } + + public void testStruts2ValidationFrameworkWithBlankInputs() throws Exception + { + // prep + action = getAction(); + populateOrganisationValues(action, EMPTY_STRING, EMPTY_STRING, EMPTY_STRING); + + // test + actionValidatorManager.validate(action, EMPTY_STRING); + + // verify + assertTrue(action.hasFieldErrors()); + + Map> fieldErrors = action.getFieldErrors(); + + // make an expected field error object + Map> expectedFieldErrors = new HashMap>(); + + // populate + List expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter a name"); + expectedFieldErrors.put("organisationName", expectedErrorMessages); + + ValidatorUtil.assertFieldErrors(expectedFieldErrors, fieldErrors); + } + + public void testStruts2ValidationFrameworkWithInvalidInputs() throws Exception + { + // prep + action = getAction(); + populateOrganisationValues(action, ORGANISATION_NAME_INVALID_INPUT, ORGANISATION_URL_INVALID_INPUT, ORGANISATION_LOGO_INVALID_INPUT); + + // test + actionValidatorManager.validate(action, EMPTY_STRING); + + // verify + assertTrue(action.hasFieldErrors()); + + Map> fieldErrors = action.getFieldErrors(); + + // make an expected field error object + Map> expectedFieldErrors = new HashMap>(); + + // populate + List expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("Organisation name must only contain alphanumeric characters, white-spaces(' '), equals(=), question-marks(?), exclamation-points(!), ampersands(&), forward-slashes(/), back-slashes(\\), underscores(_), dots(.), colons(:), tildes(~), and dashes(-)."); + expectedFieldErrors.put("organisationName", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter a URL"); + expectedFieldErrors.put("organisationUrl", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter a URL"); + expectedFieldErrors.put("organisationLogo", expectedErrorMessages); + + ValidatorUtil.assertFieldErrors(expectedFieldErrors, fieldErrors); + } + + public void testStruts2ValidationFrameworkWithValidInputs() throws Exception + { + // prep + action = getAction(); + populateOrganisationValues(action, ORGANISATION_NAME_VALID_INPUT, ORGANISATION_URL_VALID_INPUT, ORGANISATION_LOGO_VALID_INPUT); + + // test + actionValidatorManager.validate(action, EMPTY_STRING); + + // verify + assertFalse(action.hasFieldErrors()); + } + + private void populateOrganisationValues(AbstractAppearanceAction abstractAppearanceAction , String name, String url, String logo) + { + abstractAppearanceAction.setOrganisationName(name); + abstractAppearanceAction.setOrganisationUrl(url); + abstractAppearanceAction.setOrganisationLogo(logo); + } + @Override protected AbstractAppearanceAction getAction() { diff --git a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/legacy/AddLegacyArtifactPathActionTest.java b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/legacy/AddLegacyArtifactPathActionTest.java new file mode 100644 index 000000000..0a10f1546 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/legacy/AddLegacyArtifactPathActionTest.java @@ -0,0 +1,232 @@ +package org.apache.maven.archiva.web.action.admin.legacy; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import com.opensymphony.xwork2.ObjectFactory; +import com.opensymphony.xwork2.validator.ActionValidatorManager; +import com.opensymphony.xwork2.validator.ActionValidatorManagerFactory; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import junit.framework.TestCase; +import org.apache.maven.archiva.configuration.LegacyArtifactPath; +import org.apache.maven.archiva.web.validator.utils.ValidatorUtil; + +public class AddLegacyArtifactPathActionTest extends TestCase +{ + private static final String EMPTY_STRING = ""; + + // valid inputs + private static final String LEGACY_ARTIFACT_PATH_PATH_VALID_INPUT = "-abcXYZ0129._/\\"; + + private static final String GROUP_ID_VALID_INPUT = "abcXYZ0129._-"; + + private static final String ARTIFACT_ID_VALID_INPUT = "abcXYZ0129._-"; + + private static final String VERSION_VALID_INPUT = "abcXYZ0129._-"; + + private static final String CLASSIFIER_VALID_INPUT = "abcXYZ0129._-"; + + private static final String TYPE_VALID_INPUT = "abcXYZ0129._-"; + + // invalid inputs + private static final String LEGACY_ARTIFACT_PATH_PATH_INVALID_INPUT = "<> ~+[ ]'\""; + + private static final String GROUP_ID_INVALID_INPUT = "<> \\/~+[ ]'\""; + + private static final String ARTIFACT_ID_INVALID_INPUT = "<> \\/~+[ ]'\""; + + private static final String VERSION_INVALID_INPUT = "<> \\/~+[ ]'\""; + + private static final String CLASSIFIER_INVALID_INPUT = "<> \\/~+[ ]'\""; + + private static final String TYPE_INVALID_INPUT = "<> \\/~+[ ]'\""; + + // testing requisite + private AddLegacyArtifactPathAction addLegacyArtifactPathAction; + + private ActionValidatorManager actionValidatorManager; + + @Override + public void setUp() throws Exception + { + addLegacyArtifactPathAction = new AddLegacyArtifactPathAction(); + ObjectFactory.setObjectFactory(new ObjectFactory()); + actionValidatorManager = ActionValidatorManagerFactory.getInstance(); + } + + public void testStruts2ValidationFrameworkWithNullInputs() throws Exception + { + // prep + LegacyArtifactPath legacyArtifactPath = createLegacyArtifactPath(null); + populateAddLegacyArtifactPathActionFields(addLegacyArtifactPathAction, legacyArtifactPath, null, null, null, null, null); + + // test + actionValidatorManager.validate(addLegacyArtifactPathAction, EMPTY_STRING); + + // verify + assertTrue(addLegacyArtifactPathAction.hasFieldErrors()); + + Map> fieldErrors = addLegacyArtifactPathAction.getFieldErrors(); + + // make an expected field error object + Map> expectedFieldErrors = new HashMap>(); + + // populate + List expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter a legacy path."); + expectedFieldErrors.put("legacyArtifactPath.path", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter a groupId."); + expectedFieldErrors.put("groupId", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter an artifactId."); + expectedFieldErrors.put("artifactId", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter a version."); + expectedFieldErrors.put("version", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter a type."); + expectedFieldErrors.put("type", expectedErrorMessages); + + ValidatorUtil.assertFieldErrors(expectedFieldErrors, fieldErrors); + } + + public void testStruts2ValidationFrameworkWithBlankInputs() throws Exception + { + // prep + LegacyArtifactPath legacyArtifactPath = createLegacyArtifactPath(EMPTY_STRING); + populateAddLegacyArtifactPathActionFields(addLegacyArtifactPathAction, legacyArtifactPath, EMPTY_STRING, EMPTY_STRING, EMPTY_STRING, EMPTY_STRING, EMPTY_STRING); + + // test + actionValidatorManager.validate(addLegacyArtifactPathAction, EMPTY_STRING); + + // verify + assertTrue(addLegacyArtifactPathAction.hasFieldErrors()); + + Map> fieldErrors = addLegacyArtifactPathAction.getFieldErrors(); + + // make an expected field error object + Map> expectedFieldErrors = new HashMap>(); + + // populate + List expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter a legacy path."); + expectedFieldErrors.put("legacyArtifactPath.path", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter a groupId."); + expectedFieldErrors.put("groupId", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter an artifactId."); + expectedFieldErrors.put("artifactId", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter a version."); + expectedFieldErrors.put("version", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter a type."); + expectedFieldErrors.put("type", expectedErrorMessages); + + ValidatorUtil.assertFieldErrors(expectedFieldErrors, fieldErrors); + } + + public void testStruts2ValidationFrameworkWithInvalidInputs() throws Exception + { + // prep + LegacyArtifactPath legacyArtifactPath = createLegacyArtifactPath(LEGACY_ARTIFACT_PATH_PATH_INVALID_INPUT); + populateAddLegacyArtifactPathActionFields(addLegacyArtifactPathAction, legacyArtifactPath, GROUP_ID_INVALID_INPUT, ARTIFACT_ID_INVALID_INPUT, VERSION_INVALID_INPUT, CLASSIFIER_INVALID_INPUT, TYPE_INVALID_INPUT); + + // test + actionValidatorManager.validate(addLegacyArtifactPathAction, EMPTY_STRING); + + // verify + assertTrue(addLegacyArtifactPathAction.hasFieldErrors()); + + Map> fieldErrors = addLegacyArtifactPathAction.getFieldErrors(); + + // make an expected field error object + Map> expectedFieldErrors = new HashMap>(); + + // populate + List expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("Legacy path must only contain alphanumeric characters, forward-slashes(/), back-slashes(\\), underscores(_), dots(.), and dashes(-)."); + expectedFieldErrors.put("legacyArtifactPath.path", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("Group id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)."); + expectedFieldErrors.put("groupId", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("Artifact id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)."); + expectedFieldErrors.put("artifactId", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("Version must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)."); + expectedFieldErrors.put("version", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("Classifier must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)."); + expectedFieldErrors.put("classifier", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("Type must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)."); + expectedFieldErrors.put("type", expectedErrorMessages); + + ValidatorUtil.assertFieldErrors(expectedFieldErrors, fieldErrors); + } + + public void testStruts2ValidationFrameworkWithValidInputs() throws Exception + { + // prep + LegacyArtifactPath legacyArtifactPath = createLegacyArtifactPath(LEGACY_ARTIFACT_PATH_PATH_VALID_INPUT); + populateAddLegacyArtifactPathActionFields(addLegacyArtifactPathAction, legacyArtifactPath, GROUP_ID_VALID_INPUT, ARTIFACT_ID_VALID_INPUT, VERSION_VALID_INPUT, CLASSIFIER_VALID_INPUT, TYPE_VALID_INPUT); + + // test + actionValidatorManager.validate(addLegacyArtifactPathAction, EMPTY_STRING); + + // verify + assertFalse(addLegacyArtifactPathAction.hasFieldErrors()); + } + + private LegacyArtifactPath createLegacyArtifactPath(String path) + { + LegacyArtifactPath legacyArtifactPath = new LegacyArtifactPath(); + legacyArtifactPath.setPath(path); + return legacyArtifactPath; + } + + private void populateAddLegacyArtifactPathActionFields(AddLegacyArtifactPathAction addLegacyArtifactPathAction, LegacyArtifactPath legacyArtifactPath, String groupId, String artifactId, String version, String classifier, String type) + { + addLegacyArtifactPathAction.setLegacyArtifactPath(legacyArtifactPath); + addLegacyArtifactPathAction.setGroupId(groupId); + addLegacyArtifactPathAction.setArtifactId(artifactId); + addLegacyArtifactPathAction.setVersion(version); + addLegacyArtifactPathAction.setClassifier(classifier); + addLegacyArtifactPathAction.setType(type); + } +} diff --git a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/networkproxies/ConfigureNetworkProxyActionTest.java b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/networkproxies/ConfigureNetworkProxyActionTest.java new file mode 100644 index 000000000..071373963 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/networkproxies/ConfigureNetworkProxyActionTest.java @@ -0,0 +1,216 @@ +package org.apache.maven.archiva.web.action.admin.networkproxies; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import com.opensymphony.xwork2.ObjectFactory; +import com.opensymphony.xwork2.validator.ActionValidatorManager; +import com.opensymphony.xwork2.validator.ActionValidatorManagerFactory; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import junit.framework.TestCase; +import org.apache.maven.archiva.configuration.NetworkProxyConfiguration; +import org.apache.maven.archiva.web.validator.utils.ValidatorUtil; + +public class ConfigureNetworkProxyActionTest extends TestCase +{ + private static final String EMPTY_STRING = ""; + + private static final String VALIDATION_CONTEXT = "saveNetworkProxy"; + + // valid inputs + private static final String PROXY_ID_VALID_INPUT = "abcXYZ0129._-"; + + private static final String PROXY_PROTOCOL_VALID_INPUT = "-abcXYZ0129./:\\"; + + private static final String PROXY_HOST_VALID_INPUT = "abcXYZ0129._/\\~:?!&=-"; + + private static final int PROXY_PORT_VALID_INPUT = 8080; + + private static final String PROXY_USERNAME_VALID_INPUT = "abcXYZ0129.@/_-\\"; + + // invalid inputs + private static final String PROXY_ID_INVALID_INPUT = "<> \\/~+[ ]'\""; + + private static final String PROXY_PROTOCOL_INVALID_INPUT = "<> ~+[ ]'\""; + + private static final String PROXY_HOST_INVALID_INPUT = "<> ~+[ ]'\""; + + private static final int PROXY_PORT_INVALID_INPUT = 0; + + private static final String PROXY_USERNAME_INVALID_INPUT = "<> ~+[ ]'\""; + + // testing requisite + private ConfigureNetworkProxyAction configureNetworkProxyAction; + + private ActionValidatorManager actionValidatorManager; + + @Override + public void setUp() + { + configureNetworkProxyAction = new ConfigureNetworkProxyAction(); + ObjectFactory.setObjectFactory(new ObjectFactory()); + actionValidatorManager = ActionValidatorManagerFactory.getInstance(); + } + + public void testStruts2ValidationFrameworkWithNullInputs() throws Exception + { + // prep + NetworkProxyConfiguration networkProxyConfiguration = createNetworkProxyConfiguration(null, null, null, null); + configureNetworkProxyAction.setProxy(networkProxyConfiguration); + + // test + actionValidatorManager.validate(configureNetworkProxyAction, VALIDATION_CONTEXT); + + // verify + assertTrue(configureNetworkProxyAction.hasFieldErrors()); + + Map> fieldErrors = configureNetworkProxyAction.getFieldErrors(); + + // make an expected field error object + Map> expectedFieldErrors = new HashMap>(); + + // populate + List expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter an identifier."); + expectedFieldErrors.put("proxy.id", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter a protocol."); + expectedFieldErrors.put("proxy.protocol", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter a host."); + expectedFieldErrors.put("proxy.host", expectedErrorMessages); + + ValidatorUtil.assertFieldErrors(expectedFieldErrors, fieldErrors); + } + + public void testStruts2ValidationFrameworkWithBlankInputs() throws Exception + { + // prep + NetworkProxyConfiguration networkProxyConfiguration = createNetworkProxyConfiguration(EMPTY_STRING, EMPTY_STRING, EMPTY_STRING, EMPTY_STRING); + configureNetworkProxyAction.setProxy(networkProxyConfiguration); + + // test + actionValidatorManager.validate(configureNetworkProxyAction, VALIDATION_CONTEXT); + + // verify + assertTrue(configureNetworkProxyAction.hasFieldErrors()); + + Map> fieldErrors = configureNetworkProxyAction.getFieldErrors(); + + // make an expected field error object + Map> expectedFieldErrors = new HashMap>(); + + // populate + List expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter an identifier."); + expectedFieldErrors.put("proxy.id", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter a protocol."); + expectedFieldErrors.put("proxy.protocol", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter a host."); + expectedFieldErrors.put("proxy.host", expectedErrorMessages); + + ValidatorUtil.assertFieldErrors(expectedFieldErrors, fieldErrors); + } + + public void testStruts2ValidationFrameworkWithInvalidInputs() throws Exception + { + // prep + NetworkProxyConfiguration networkProxyConfiguration = createNetworkProxyConfiguration(PROXY_ID_INVALID_INPUT, PROXY_HOST_INVALID_INPUT, PROXY_PORT_INVALID_INPUT, PROXY_PROTOCOL_INVALID_INPUT, PROXY_USERNAME_INVALID_INPUT); + configureNetworkProxyAction.setProxy(networkProxyConfiguration); + + // test + actionValidatorManager.validate(configureNetworkProxyAction, VALIDATION_CONTEXT); + + // verify + assertTrue(configureNetworkProxyAction.hasFieldErrors()); + + Map> fieldErrors = configureNetworkProxyAction.getFieldErrors(); + + // make an expected field error object + Map> expectedFieldErrors = new HashMap>(); + + // populate + List expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("Proxy id must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)."); + expectedFieldErrors.put("proxy.id", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("Protocol must only contain alphanumeric characters, forward-slashes(/), back-slashes(\\), dots(.), colons(:), and dashes(-)."); + expectedFieldErrors.put("proxy.protocol", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("Host must only contain alphanumeric characters, equals(=), question-marks(?), exclamation-points(!), ampersands(&), forward-slashes(/), back-slashes(\\), underscores(_), dots(.), colons(:), tildes(~), and dashes(-)."); + expectedFieldErrors.put("proxy.host", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("Port needs to be larger than 1"); + expectedFieldErrors.put("proxy.port", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("Username must only contain alphanumeric characters, at's(@), forward-slashes(/), back-slashes(\\), underscores(_), dots(.), and dashes(-)."); + expectedFieldErrors.put("proxy.username", expectedErrorMessages); + + ValidatorUtil.assertFieldErrors(expectedFieldErrors, fieldErrors); + } + + public void testStruts2ValidationFrameworkWithValidInputs() throws Exception + { + // prep + NetworkProxyConfiguration networkProxyConfiguration = createNetworkProxyConfiguration(PROXY_ID_VALID_INPUT, PROXY_HOST_VALID_INPUT, PROXY_PORT_VALID_INPUT, PROXY_PROTOCOL_VALID_INPUT, PROXY_USERNAME_VALID_INPUT); + configureNetworkProxyAction.setProxy(networkProxyConfiguration); + + // test + actionValidatorManager.validate(configureNetworkProxyAction, VALIDATION_CONTEXT); + + // verify + assertFalse(configureNetworkProxyAction.hasFieldErrors()); + } + + private NetworkProxyConfiguration createNetworkProxyConfiguration(String id, String host, int port, String protocol, String username) + { + NetworkProxyConfiguration networkProxyConfiguration = new NetworkProxyConfiguration(); + networkProxyConfiguration.setId(id); + networkProxyConfiguration.setHost(host); + networkProxyConfiguration.setPort(port); + networkProxyConfiguration.setProtocol(protocol); + networkProxyConfiguration.setUsername(username); + return networkProxyConfiguration; + } + + // over-loaded + // for simulating empty/null form purposes; excluding primitive data-typed values + private NetworkProxyConfiguration createNetworkProxyConfiguration(String id, String host, String protocol, String username) + { + NetworkProxyConfiguration networkProxyConfiguration = new NetworkProxyConfiguration(); + networkProxyConfiguration.setId(id); + networkProxyConfiguration.setHost(host); + networkProxyConfiguration.setProtocol(protocol); + networkProxyConfiguration.setUsername(username); + return networkProxyConfiguration; + } +} diff --git a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/AbstractManagedRepositoryActionTest.java b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/AbstractManagedRepositoryActionTest.java new file mode 100644 index 000000000..8e2085d22 --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/AbstractManagedRepositoryActionTest.java @@ -0,0 +1,117 @@ +package org.apache.maven.archiva.web.action.admin.repositories; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import com.opensymphony.xwork2.ObjectFactory; +import com.opensymphony.xwork2.validator.ActionValidatorManager; +import com.opensymphony.xwork2.validator.ActionValidatorManagerFactory; +import java.io.File; +import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration; +import org.codehaus.plexus.spring.PlexusInSpringTestCase; + +public abstract class AbstractManagedRepositoryActionTest extends PlexusInSpringTestCase +{ + protected static final String EMPTY_STRING = ""; + + // valid inputs; validation testing + protected static final String REPOSITORY_ID_VALID_INPUT = "abcXYZ0129._-"; + + protected static final String REPOSITORY_LOCATION_VALID_INPUT = "abcXYZ0129._/\\~:?!&=-"; + + protected static final String REPOSITORY_INDEX_DIR_VALID_INPUT = "abcXYZ0129._/\\~:?!&=-"; + + protected static final String REPOSITORY_NAME_VALID_INPUT = "abcXYZ 0129.)/ _(-"; + + protected static final int REPOSITORY_RETENTION_COUNT_VALID_INPUT = 1; + + protected static final int REPOSITORY_DAYS_OLDER_VALID_INPUT = 1; + + // invalid inputs; validation testing + protected static final String REPOSITORY_ID_INVALID_INPUT = "<> \\/~+[ ]'\""; + + protected static final String REPOSITORY_LOCATION_INVALID_INPUT = "<> ~+[ ]'\""; + + protected static final String REPOSITORY_INDEX_DIR_INVALID_INPUT = "<> ~+[ ]'\""; + + protected static final String REPOSITORY_NAME_INVALID_INPUT = "<>\\~+[]'\""; + + protected static final int REPOSITORY_RETENTION_COUNT_INVALID_INPUT = 101; + + protected static final int REPOSITORY_DAYS_OLDER_INVALID_INPUT = -1; + + // testing requisite; validation testing + protected ActionValidatorManager actionValidatorManager; + + protected static final String REPO_ID = "repo-ident"; + + protected File location; + + @Override + protected void setUp() throws Exception + { + super.setUp(); + + ObjectFactory.setObjectFactory(new ObjectFactory()); + actionValidatorManager = ActionValidatorManagerFactory.getInstance(); + } + + protected void populateRepository( ManagedRepositoryConfiguration repository ) + { + repository.setId( REPO_ID ); + repository.setName( "repo name" ); + repository.setLocation( location.getAbsolutePath() ); + repository.setLayout( "default" ); + repository.setRefreshCronExpression( "* 0/5 * * * ?" ); + repository.setDaysOlder( 31 ); + repository.setRetentionCount( 20 ); + repository.setReleases( true ); + repository.setSnapshots( true ); + repository.setScanned( false ); + repository.setDeleteReleasedSnapshots( true ); + } + + protected ManagedRepositoryConfiguration createManagedRepositoryConfiguration(String id, String name, String location, String indexDir, int daysOlder, int retentionCount) + { + ManagedRepositoryConfiguration managedRepositoryConfiguration = new ManagedRepositoryConfiguration(); + + managedRepositoryConfiguration.setId(id); + managedRepositoryConfiguration.setName(name); + managedRepositoryConfiguration.setLocation(location); + managedRepositoryConfiguration.setIndexDir(indexDir); + managedRepositoryConfiguration.setDaysOlder(daysOlder); + managedRepositoryConfiguration.setRetentionCount(retentionCount); + + return managedRepositoryConfiguration; + } + + // over-loaded + // for simulating empty/null form purposes; excluding primitive data-typed values + protected ManagedRepositoryConfiguration createManagedRepositoryConfiguration(String id, String name, String location, String indexDir) + { + ManagedRepositoryConfiguration managedRepositoryConfiguration = new ManagedRepositoryConfiguration(); + + managedRepositoryConfiguration.setId(id); + managedRepositoryConfiguration.setName(name); + managedRepositoryConfiguration.setLocation(location); + managedRepositoryConfiguration.setIndexDir(indexDir); + + return managedRepositoryConfiguration; + } +} diff --git a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/AddManagedRepositoryActionTest.java b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/AddManagedRepositoryActionTest.java index 7accb4b7c..e6b613a4a 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/AddManagedRepositoryActionTest.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/AddManagedRepositoryActionTest.java @@ -30,11 +30,14 @@ import org.apache.maven.archiva.security.ArchivaRoleConstants; import org.codehaus.plexus.redback.role.RoleManager; import org.codehaus.redback.integration.interceptor.SecureActionBundle; import org.codehaus.redback.integration.interceptor.SecureActionException; -import org.codehaus.plexus.spring.PlexusInSpringTestCase; import org.easymock.MockControl; -import java.io.File; +import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.apache.maven.archiva.web.validator.utils.ValidatorUtil; /** * AddManagedRepositoryActionTest @@ -42,7 +45,7 @@ import java.util.Collections; * @version $Id$ */ public class AddManagedRepositoryActionTest - extends PlexusInSpringTestCase + extends AbstractManagedRepositoryActionTest { private AddManagedRepositoryAction action; @@ -57,10 +60,6 @@ public class AddManagedRepositoryActionTest private ArchivaAuditLogsDao auditLogsDao; private MockControl auditLogsDaoControl; - - private static final String REPO_ID = "repo-ident"; - - private File location; @Override protected String getPlexusConfigLocation() @@ -190,20 +189,131 @@ public class AddManagedRepositoryActionTest String status = action.commit(); assertEquals( AddManagedRepositoryAction.CONFIRM, status ); } - - private void populateRepository( ManagedRepositoryConfiguration repository ) + + public void testStruts2ValidationFrameworkWithNullInputs() throws Exception + { + // prep + // 0 is the default value for primitive int; null for objects + ManagedRepositoryConfiguration managedRepositoryConfiguration = createManagedRepositoryConfiguration(null, null, null, null); + action.setRepository(managedRepositoryConfiguration); + + // test + actionValidatorManager.validate(action, EMPTY_STRING); + + // verify + assertTrue(action.hasFieldErrors()); + + Map> fieldErrors = action.getFieldErrors(); + + // make an expected field error object + Map> expectedFieldErrors = new HashMap>(); + + // populate + List expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter a repository identifier."); + expectedFieldErrors.put("repository.id", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter a directory."); + expectedFieldErrors.put("repository.location", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter a repository name."); + expectedFieldErrors.put("repository.name", expectedErrorMessages); + + ValidatorUtil.assertFieldErrors(expectedFieldErrors, fieldErrors); + } + + public void testStruts2ValidationFrameworkWithBlankInputs() throws Exception + { + // prep + // 0 is the default value for primitive int + ManagedRepositoryConfiguration managedRepositoryConfiguration = createManagedRepositoryConfiguration(EMPTY_STRING, EMPTY_STRING, EMPTY_STRING, EMPTY_STRING); + action.setRepository(managedRepositoryConfiguration); + + // test + actionValidatorManager.validate(action, EMPTY_STRING); + + // verify + assertTrue(action.hasFieldErrors()); + + Map> fieldErrors = action.getFieldErrors(); + + // make an expected field error object + Map> expectedFieldErrors = new HashMap>(); + + // populate + List expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter a repository identifier."); + expectedFieldErrors.put("repository.id", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter a directory."); + expectedFieldErrors.put("repository.location", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter a repository name."); + expectedFieldErrors.put("repository.name", expectedErrorMessages); + + ValidatorUtil.assertFieldErrors(expectedFieldErrors, fieldErrors); + } + + public void testStruts2ValidationFrameworkWithInvalidInputs() throws Exception { - repository.setId( REPO_ID ); - repository.setName( "repo name" ); - repository.setLocation( location.getAbsolutePath() ); - repository.setLayout( "default" ); - repository.setRefreshCronExpression( "* 0/5 * * * ?" ); - repository.setDaysOlder( 31 ); - repository.setRetentionCount( 20 ); - repository.setReleases( true ); - repository.setSnapshots( true ); - repository.setScanned( false ); - repository.setDeleteReleasedSnapshots( true ); + // prep + ManagedRepositoryConfiguration managedRepositoryConfiguration = createManagedRepositoryConfiguration(REPOSITORY_ID_INVALID_INPUT, REPOSITORY_NAME_INVALID_INPUT, REPOSITORY_LOCATION_INVALID_INPUT, REPOSITORY_INDEX_DIR_INVALID_INPUT, REPOSITORY_DAYS_OLDER_INVALID_INPUT, REPOSITORY_RETENTION_COUNT_INVALID_INPUT); + action.setRepository(managedRepositoryConfiguration); + + // test + actionValidatorManager.validate(action, EMPTY_STRING); + + // verify + assertTrue(action.hasFieldErrors()); + + Map> fieldErrors = action.getFieldErrors(); + + // make an expected field error object + Map> expectedFieldErrors = new HashMap>(); + + // populate + List expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("Identifier must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)."); + expectedFieldErrors.put("repository.id", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("Directory must only contain alphanumeric characters, equals(=), question-marks(?), exclamation-points(!), ampersands(&), forward-slashes(/), back-slashes(\\), underscores(_), dots(.), colons(:), tildes(~), and dashes(-)."); + expectedFieldErrors.put("repository.location", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("Repository Name must only contain alphanumeric characters, white-spaces(' '), forward-slashes(/), open-parenthesis('('), close-parenthesis(')'), underscores(_), dots(.), and dashes(-)."); + expectedFieldErrors.put("repository.name", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("Index directory must only contain alphanumeric characters, equals(=), question-marks(?), exclamation-points(!), ampersands(&), forward-slashes(/), back-slashes(\\), underscores(_), dots(.), colons(:), tildes(~), and dashes(-)."); + expectedFieldErrors.put("repository.indexDir", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("Repository Purge By Retention Count needs to be between 1 and 100."); + expectedFieldErrors.put("repository.retentionCount", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("Repository Purge By Days Older Than needs to be larger than 0."); + expectedFieldErrors.put("repository.daysOlder", expectedErrorMessages); + + ValidatorUtil.assertFieldErrors(expectedFieldErrors, fieldErrors); + } + + public void testStruts2ValidationFrameworkWithValidInputs() throws Exception + { + // prep + ManagedRepositoryConfiguration managedRepositoryConfiguration = createManagedRepositoryConfiguration(REPOSITORY_ID_VALID_INPUT, REPOSITORY_NAME_VALID_INPUT, REPOSITORY_LOCATION_VALID_INPUT, REPOSITORY_INDEX_DIR_VALID_INPUT, REPOSITORY_DAYS_OLDER_VALID_INPUT, REPOSITORY_RETENTION_COUNT_VALID_INPUT); + action.setRepository(managedRepositoryConfiguration); + + // test + actionValidatorManager.validate(action, EMPTY_STRING); + + // verify + assertFalse(action.hasFieldErrors()); } // TODO: test errors during add, other actions diff --git a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/EditManagedRepositoryActionTest.java b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/EditManagedRepositoryActionTest.java index 6f9bdf162..89b8ee57c 100644 --- a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/EditManagedRepositoryActionTest.java +++ b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/action/admin/repositories/EditManagedRepositoryActionTest.java @@ -20,6 +20,9 @@ package org.apache.maven.archiva.web.action.admin.repositories; */ import com.opensymphony.xwork2.Action; +import com.opensymphony.xwork2.ObjectFactory; +import com.opensymphony.xwork2.validator.ActionValidatorManager; +import com.opensymphony.xwork2.validator.ActionValidatorManagerFactory; import org.apache.maven.archiva.configuration.ArchivaConfiguration; import org.apache.maven.archiva.configuration.Configuration; import org.apache.maven.archiva.configuration.ManagedRepositoryConfiguration; @@ -41,7 +44,10 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import org.apache.maven.archiva.web.validator.utils.ValidatorUtil; /** * EditManagedRepositoryActionTest @@ -49,7 +55,7 @@ import java.util.List; * @version $Id$ */ public class EditManagedRepositoryActionTest - extends PlexusInSpringTestCase + extends AbstractManagedRepositoryActionTest { private EditManagedRepositoryAction action; @@ -73,16 +79,13 @@ public class EditManagedRepositoryActionTest private MockControl auditLogsDaoControl; - private static final String REPO_ID = "repo-ident"; - - private File location; - @Override protected String getPlexusConfigLocation() { return AbstractManagedRepositoriesAction.class.getName().replace( '.', '/' ) + "Test.xml"; } - + + @Override protected void setUp() throws Exception { @@ -258,6 +261,132 @@ public class EditManagedRepositoryActionTest repoContentStatsDaoControl.verify(); auditLogsDaoControl.verify(); } + + public void testStruts2ValidationFrameworkWithNullInputs() throws Exception + { + // prep + // 0 is the default value for primitive int; null for objects + ManagedRepositoryConfiguration managedRepositoryConfiguration = createManagedRepositoryConfiguration(null, null, null, null); + action.setRepository(managedRepositoryConfiguration); + + // test + actionValidatorManager.validate(action, EMPTY_STRING); + + // verify + assertTrue(action.hasFieldErrors()); + + Map> fieldErrors = action.getFieldErrors(); + + // make an expected field error object + Map> expectedFieldErrors = new HashMap>(); + + // populate + List expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter a repository identifier."); + expectedFieldErrors.put("repository.id", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter a directory."); + expectedFieldErrors.put("repository.location", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter a repository name."); + expectedFieldErrors.put("repository.name", expectedErrorMessages); + + ValidatorUtil.assertFieldErrors(expectedFieldErrors, fieldErrors); + } + + public void testStruts2ValidationFrameworkWithBlankInputs() throws Exception + { + // prep + // 0 is the default value for primitive int + ManagedRepositoryConfiguration managedRepositoryConfiguration = createManagedRepositoryConfiguration(EMPTY_STRING, EMPTY_STRING, EMPTY_STRING, EMPTY_STRING); + action.setRepository(managedRepositoryConfiguration); + + // test + actionValidatorManager.validate(action, EMPTY_STRING); + + // verify + assertTrue(action.hasFieldErrors()); + + Map> fieldErrors = action.getFieldErrors(); + + // make an expected field error object + Map> expectedFieldErrors = new HashMap>(); + + // populate + List expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter a repository identifier."); + expectedFieldErrors.put("repository.id", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter a directory."); + expectedFieldErrors.put("repository.location", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("You must enter a repository name."); + expectedFieldErrors.put("repository.name", expectedErrorMessages); + + ValidatorUtil.assertFieldErrors(expectedFieldErrors, fieldErrors); + } + + public void testStruts2ValidationFrameworkWithInvalidInputs() throws Exception + { + // prep + ManagedRepositoryConfiguration managedRepositoryConfiguration = createManagedRepositoryConfiguration(REPOSITORY_ID_INVALID_INPUT, REPOSITORY_NAME_INVALID_INPUT, REPOSITORY_LOCATION_INVALID_INPUT, REPOSITORY_INDEX_DIR_INVALID_INPUT, REPOSITORY_DAYS_OLDER_INVALID_INPUT, REPOSITORY_RETENTION_COUNT_INVALID_INPUT); + action.setRepository(managedRepositoryConfiguration); + + // test + actionValidatorManager.validate(action, EMPTY_STRING); + + // verify + assertTrue(action.hasFieldErrors()); + + Map> fieldErrors = action.getFieldErrors(); + + // make an expected field error object + Map> expectedFieldErrors = new HashMap>(); + + // populate + List expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("Identifier must only contain alphanumeric characters, underscores(_), dots(.), and dashes(-)."); + expectedFieldErrors.put("repository.id", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("Directory must only contain alphanumeric characters, equals(=), question-marks(?), exclamation-points(!), ampersands(&), forward-slashes(/), back-slashes(\\), underscores(_), dots(.), colons(:), tildes(~), and dashes(-)."); + expectedFieldErrors.put("repository.location", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("Repository Name must only contain alphanumeric characters, white-spaces(' '), forward-slashes(/), open-parenthesis('('), close-parenthesis(')'), underscores(_), dots(.), and dashes(-)."); + expectedFieldErrors.put("repository.name", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("Index directory must only contain alphanumeric characters, equals(=), question-marks(?), exclamation-points(!), ampersands(&), forward-slashes(/), back-slashes(\\), underscores(_), dots(.), colons(:), tildes(~), and dashes(-)."); + expectedFieldErrors.put("repository.indexDir", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("Repository Purge By Retention Count needs to be between 1 and 100."); + expectedFieldErrors.put("repository.retentionCount", expectedErrorMessages); + + expectedErrorMessages = new ArrayList(); + expectedErrorMessages.add("Repository Purge By Days Older Than needs to be larger than 0."); + expectedFieldErrors.put("repository.daysOlder", expectedErrorMessages); + + ValidatorUtil.assertFieldErrors(expectedFieldErrors, fieldErrors); + } + + public void testStruts2ValidationFrameworkWithValidInputs() throws Exception + { + // prep + ManagedRepositoryConfiguration managedRepositoryConfiguration = createManagedRepositoryConfiguration(REPOSITORY_ID_VALID_INPUT, REPOSITORY_NAME_VALID_INPUT, REPOSITORY_LOCATION_VALID_INPUT, REPOSITORY_INDEX_DIR_VALID_INPUT, REPOSITORY_DAYS_OLDER_VALID_INPUT, REPOSITORY_RETENTION_COUNT_VALID_INPUT); + action.setRepository(managedRepositoryConfiguration); + + // test + actionValidatorManager.validate(action, EMPTY_STRING); + + // verify + assertFalse(action.hasFieldErrors()); + } private void assertRepositoryEquals( ManagedRepositoryConfiguration expectedRepository, ManagedRepositoryConfiguration actualRepository ) @@ -292,22 +421,6 @@ public class EditManagedRepositoryActionTest return r; } - private void populateRepository( ManagedRepositoryConfiguration repository ) - throws IOException - { - repository.setId( REPO_ID ); - repository.setName( "repo name" ); - repository.setLocation( location.getCanonicalPath() ); - repository.setLayout( "default" ); - repository.setRefreshCronExpression( "* 0/5 * * * ?" ); - repository.setDaysOlder( 31 ); - repository.setRetentionCount( 20 ); - repository.setReleases( true ); - repository.setSnapshots( true ); - repository.setScanned( false ); - repository.setDeleteReleasedSnapshots( true ); - } - private List createRepositoryContentStatisticsList() { List repoStatsList = new ArrayList(); diff --git a/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/validator/utils/ValidatorUtil.java b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/validator/utils/ValidatorUtil.java new file mode 100644 index 000000000..a02301eeb --- /dev/null +++ b/archiva-modules/archiva-web/archiva-webapp/src/test/java/org/apache/maven/archiva/web/validator/utils/ValidatorUtil.java @@ -0,0 +1,62 @@ +package org.apache.maven.archiva.web.validator.utils; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import java.util.List; +import java.util.Map; +import junit.framework.Assert; + +public class ValidatorUtil +{ + public static void assertFieldErrors(Map> expectedFieldErrors, Map> actualFieldErrors) + { + if(expectedFieldErrors != null) + { + Assert.assertNotNull(actualFieldErrors); + // checks the number of field errors + Assert.assertEquals(expectedFieldErrors.size(), actualFieldErrors.size()); + + // check every content of the field error + for(Map.Entry> expectedEntry : expectedFieldErrors.entrySet()) + { + if(expectedEntry.getValue() != null) + { + Assert.assertNotNull(actualFieldErrors.get(expectedEntry.getKey())); + // checks the error message count per error field + Assert.assertEquals(expectedEntry.getValue().size(), actualFieldErrors.get(expectedEntry.getKey()).size()); + + // check the contents of error messages per field error + for(int i = 0; i < expectedEntry.getValue().size(); i++) + { + Assert.assertEquals(expectedEntry.getValue().get(i), actualFieldErrors.get(expectedEntry.getKey()).get(i)); + } + } + else + { + Assert.assertNull(actualFieldErrors.get(expectedEntry.getKey())); + } + } + } + else + { + Assert.assertNull(actualFieldErrors); + } + } +} -- 2.39.5
Identifier - ${repository.id} +
Name - ${repository.name} +
URL${repository.url}
Type