diff --git a/functional-test/src/main/java/org/zanata/page/BasePage.java b/functional-test/src/main/java/org/zanata/page/BasePage.java
index 4c621546c1..47f298b026 100644
--- a/functional-test/src/main/java/org/zanata/page/BasePage.java
+++ b/functional-test/src/main/java/org/zanata/page/BasePage.java
@@ -73,9 +73,9 @@ public class BasePage extends CorePage {
private By glossaryLink = By.id("glossary_link");
private By userAvatar = By.id("user--avatar");
private static final By BY_SIGN_IN = By.id("signin_link");
- private static final By BY_SIGN_OUT = By.id("right_menu_sign_out_link");
- private static final By BY_DASHBOARD_LINK = By.id("dashboard");
- private static final By BY_ADMINISTRATION_LINK = By.id("administration");
+ private static final By BY_SIGN_OUT = By.id("banner_form:right_menu_sign_out_link");
+ private static final By BY_DASHBOARD_LINK = By.id("banner_form:dashboard");
+ private static final By BY_ADMINISTRATION_LINK = By.id("banner_form:administration");
private By searchInput = By.id("projectAutocomplete-autocomplete__input");
private By registrationLink = By.id("register_link_internal_auth");
private static final By contactAdminLink = By.linkText("Contact admin");
diff --git a/functional-test/src/main/java/org/zanata/page/projectversion/versionsettings/VersionGeneralTab.java b/functional-test/src/main/java/org/zanata/page/projectversion/versionsettings/VersionGeneralTab.java
index abfbdca0bc..d3760d89cb 100644
--- a/functional-test/src/main/java/org/zanata/page/projectversion/versionsettings/VersionGeneralTab.java
+++ b/functional-test/src/main/java/org/zanata/page/projectversion/versionsettings/VersionGeneralTab.java
@@ -30,7 +30,7 @@
*/
@Slf4j
public class VersionGeneralTab extends VersionBasePage {
- private By versionIdField = By.id("settings-general_form:slugField:slug");
+ private By versionIdField = By.id("settings-general_form:slug:input:slug");
private By updateButton = By.id("settings-general_form:updateButton");
public VersionGeneralTab(WebDriver driver) {
diff --git a/functional-test/src/test/java/org/zanata/feature/administration/ServerSettingsTest.java b/functional-test/src/test/java/org/zanata/feature/administration/ServerSettingsTest.java
index ca8a4b3450..27d6382fc2 100644
--- a/functional-test/src/test/java/org/zanata/feature/administration/ServerSettingsTest.java
+++ b/functional-test/src/test/java/org/zanata/feature/administration/ServerSettingsTest.java
@@ -44,7 +44,7 @@
public class ServerSettingsTest extends ZanataTestCase {
@ClassRule
- public HasEmailRule hasEmailRule = new HasEmailRule();
+ public static HasEmailRule hasEmailRule = new HasEmailRule();
@Test
public void setServerURLTest() {
diff --git a/zanata-test-war/src/main/java/org/zanata/rest/SampleDataResource.java b/zanata-test-war/src/main/java/org/zanata/rest/SampleDataResource.java
index e8b337d2bb..b777b8c78a 100644
--- a/zanata-test-war/src/main/java/org/zanata/rest/SampleDataResource.java
+++ b/zanata-test-war/src/main/java/org/zanata/rest/SampleDataResource.java
@@ -9,7 +9,7 @@
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Response;
-@Path("/test/data/sample")
+@Path("/data/sample")
public interface SampleDataResource {
diff --git a/zanata-test-war/src/main/java/org/zanata/rest/SampleDataResourceImpl.java b/zanata-test-war/src/main/java/org/zanata/rest/SampleDataResourceImpl.java
index 75b5bb3ef2..d16107f165 100644
--- a/zanata-test-war/src/main/java/org/zanata/rest/SampleDataResourceImpl.java
+++ b/zanata-test-war/src/main/java/org/zanata/rest/SampleDataResourceImpl.java
@@ -31,7 +31,7 @@
* @author Patrick Huang pahuang@redhat.com
*/
-@Path("/test/data/sample")
+@Path("/data/sample")
@Slf4j
public class SampleDataResourceImpl implements SampleDataResource {
diff --git a/zanata-test-war/src/main/java/org/zanata/rest/TestApplication.java b/zanata-test-war/src/main/java/org/zanata/rest/TestApplication.java
new file mode 100644
index 0000000000..f2de9e5d93
--- /dev/null
+++ b/zanata-test-war/src/main/java/org/zanata/rest/TestApplication.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2015, Red Hat, Inc. and individual contributors as indicated by the
+ * @author tags. See the copyright.txt file in the distribution for a full
+ * listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free
+ * Software Foundation; either version 2.1 of the License, or (at your option)
+ * any later version.
+ *
+ * This software is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this software; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA, or see the FSF
+ * site: http://www.fsf.org.
+ */
+
+package org.zanata.rest;
+
+import java.util.Set;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.ws.rs.ApplicationPath;
+
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * @author Patrick Huang pahuang@redhat.com
+ */
+@ApplicationPath("/rest/test")
+@ApplicationScoped
+public class TestApplication extends javax.ws.rs.core.Application {
+
+ private static final ImmutableSet> CLASSES =
+ ImmutableSet.>builder()
+ .add(SampleDataResourceImpl.class).build();
+
+ @Override
+ public Set> getClasses() {
+ return CLASSES;
+ }
+}
diff --git a/zanata-war/pom.xml b/zanata-war/pom.xml
index 8fc6b970b6..9959fa64e4 100644
--- a/zanata-war/pom.xml
+++ b/zanata-war/pom.xml
@@ -2162,16 +2162,9 @@
- org.jboss.arquillian.extension
- arquillian-seam2
- 1.0.0.Beta1
-
-
-
- org.jboss.shrinkwrap.descriptors
- shrinkwrap-descriptors-api
-
-
+ org.jboss.shrinkwrap.resolver
+ shrinkwrap-resolver-impl-maven
+ 2.0.0
test
diff --git a/zanata-war/src/main/java/org/zanata/ApplicationConfiguration.java b/zanata-war/src/main/java/org/zanata/ApplicationConfiguration.java
index 3fabdc067c..1aa8421a8a 100644
--- a/zanata-war/src/main/java/org/zanata/ApplicationConfiguration.java
+++ b/zanata-war/src/main/java/org/zanata/ApplicationConfiguration.java
@@ -241,25 +241,8 @@ public String getServerPath() {
String configuredValue = databaseBackedConfig.getServerHost();
if (configuredValue != null) {
return configuredValue;
- } else if (defaultServerPath != null) {
- return defaultServerPath;
} else {
- createDefaultServerPath();
- return defaultServerPath;
- }
- }
-
-
- //@see comment at org.zanata.security.AuthenticationManager.onLoginCompleted()
- public void createDefaultServerPath() {
- java.util.Optional requestOpt =
- HttpRequestAndSessionHolder.getRequest();
- if (requestOpt.isPresent()) {
- HttpServletRequest request = requestOpt.get();
- defaultServerPath =
- request.getScheme() + "://" + request.getServerName()
- + ":" + request.getServerPort()
- + request.getContextPath();
+ return HttpRequestAndSessionHolder.getDefaultServerPath();
}
}
diff --git a/zanata-war/src/main/java/org/zanata/action/DashboardAction.java b/zanata-war/src/main/java/org/zanata/action/DashboardAction.java
index ce2f3a6808..8092223e96 100644
--- a/zanata-war/src/main/java/org/zanata/action/DashboardAction.java
+++ b/zanata-war/src/main/java/org/zanata/action/DashboardAction.java
@@ -119,15 +119,15 @@ public String getUserLanguageTeams() {
HAccount account = accountDAO.findById(authenticatedAccount.getId());
return StringUtils.join(
Collections2.transform(account.getPerson()
- .getLanguageMemberships(),
- new Function() {
- @Nullable
- @Override
- public Object apply(@NonNull HLocale locale) {
- return locale.retrieveDisplayName();
- }
- }),
- ", ");
+ .getLanguageMemberships(),
+ new Function() {
+ @Nullable
+ @Override
+ public Object apply(@NonNull HLocale locale) {
+ return locale.retrieveDisplayName();
+ }
+ }),
+ ", ");
}
private int countUserMaintainedProjects() {
@@ -215,6 +215,10 @@ public String getLastTranslatorMessage(HProject project) {
return "";
}
+ public boolean canCreateProject() {
+ return identity.hasPermission(new HProject(), "insert");
+ }
+
/**
* Project list filter. Pages its elements directly from the database.
*/
diff --git a/zanata-war/src/main/java/org/zanata/action/ProjectHome.java b/zanata-war/src/main/java/org/zanata/action/ProjectHome.java
index 6f01b3b195..34c9b48883 100644
--- a/zanata-war/src/main/java/org/zanata/action/ProjectHome.java
+++ b/zanata-war/src/main/java/org/zanata/action/ProjectHome.java
@@ -1139,7 +1139,7 @@ private boolean checkViewObsolete() {
&& identity.hasPermission("HProject", "view-obsolete");
}
- private class ProjectMaintainersAutocomplete extends MaintainerAutocomplete {
+ public class ProjectMaintainersAutocomplete extends MaintainerAutocomplete {
@Override
protected List getMaintainers() {
diff --git a/zanata-war/src/main/java/org/zanata/rest/ZanataRestSecurityInterceptor.java b/zanata-war/src/main/java/org/zanata/rest/ZanataRestSecurityInterceptor.java
index 16d79531dc..467dcddc34 100644
--- a/zanata-war/src/main/java/org/zanata/rest/ZanataRestSecurityInterceptor.java
+++ b/zanata-war/src/main/java/org/zanata/rest/ZanataRestSecurityInterceptor.java
@@ -2,6 +2,7 @@
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
+import javax.ws.rs.container.PreMatching;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.ext.Provider;
@@ -18,6 +19,7 @@
import java.io.IOException;
@Provider
+@PreMatching
@SecurityPrecedence
@Slf4j
public class ZanataRestSecurityInterceptor implements ContainerRequestFilter {
diff --git a/zanata-war/src/main/java/org/zanata/security/AuthenticationManager.java b/zanata-war/src/main/java/org/zanata/security/AuthenticationManager.java
index 5c6254ffad..69e15b3b8f 100644
--- a/zanata-war/src/main/java/org/zanata/security/AuthenticationManager.java
+++ b/zanata-war/src/main/java/org/zanata/security/AuthenticationManager.java
@@ -306,11 +306,6 @@ public void onLoginCompleted(@Observes LoginCompleted payload) {
userAccountServiceImpl.runRoleAssignmentRules(authenticatedAccount,
authenticatedCredentials, authType.name());
}
- // make sure server path is populated. Here we are sure servlet request
- // is available. In cases where it's not in database and
- // there is no servlet request, the value will not be null.
- // e.g. EmailBuilder triggered by JMS message
- applicationConfiguration.createDefaultServerPath();
}
public boolean isAccountWaitingForActivation(String username) {
diff --git a/zanata-war/src/main/java/org/zanata/security/SecurityFunctions.java b/zanata-war/src/main/java/org/zanata/security/SecurityFunctions.java
index 3cfda86c45..8c58d7a4a0 100644
--- a/zanata-war/src/main/java/org/zanata/security/SecurityFunctions.java
+++ b/zanata-war/src/main/java/org/zanata/security/SecurityFunctions.java
@@ -627,7 +627,13 @@ public static final boolean canAccessRestPath(
* See annotation @Path in REST service class.
*/
private static boolean isTestServicePath(String servicePath) {
- return servicePath != null && servicePath.startsWith("/test");
+ return servicePath != null
+ && (
+ // when being called in RestLimitingFilter
+ servicePath.startsWith("/zanata/rest/test") ||
+ // when being called in ZanataRestSecurityInterceptor
+ servicePath.startsWith("/test")
+ );
}
private static class AutoCloseSession implements AutoCloseable {
diff --git a/zanata-war/src/main/java/org/zanata/servlet/HttpRequestAndSessionHolder.java b/zanata-war/src/main/java/org/zanata/servlet/HttpRequestAndSessionHolder.java
index 5c475f7487..b6fb154f95 100644
--- a/zanata-war/src/main/java/org/zanata/servlet/HttpRequestAndSessionHolder.java
+++ b/zanata-war/src/main/java/org/zanata/servlet/HttpRequestAndSessionHolder.java
@@ -45,12 +45,19 @@ public class HttpRequestAndSessionHolder {
private static final ThreadLocal REQUEST =
new ThreadLocal<>();
+ private static String defaultServerPath;
+
void setRequest(@Observes @Initialized HttpServletRequest request) {
if (REQUEST.get() != null) {
throw new IllegalStateException(
"There is already a request for this thread");
}
REQUEST.set(request);
+ if (defaultServerPath == null) {
+ defaultServerPath = request.getScheme() + "://" + request.getServerName()
+ + ":" + request.getServerPort()
+ + request.getContextPath();
+ }
}
void removeRequest(@Observes @Destroyed HttpServletRequest request) {
@@ -76,4 +83,8 @@ public static Optional getHttpSession(boolean create) {
}
return Optional.empty();
}
+
+ public static String getDefaultServerPath() {
+ return defaultServerPath;
+ }
}
diff --git a/zanata-war/src/main/java/org/zanata/servlet/MultiFileUploadServlet.java b/zanata-war/src/main/java/org/zanata/servlet/MultiFileUploadServlet.java
index 39a287555f..71cb11c768 100644
--- a/zanata-war/src/main/java/org/zanata/servlet/MultiFileUploadServlet.java
+++ b/zanata-war/src/main/java/org/zanata/servlet/MultiFileUploadServlet.java
@@ -54,8 +54,10 @@
import org.zanata.file.GlobalDocumentId;
import org.zanata.file.SourceDocumentUpload;
import org.zanata.file.UserFileUploadTracker;
+import org.zanata.model.HAccount;
import org.zanata.rest.DocumentFileUploadForm;
import org.zanata.rest.dto.ChunkUploadResponse;
+import org.zanata.security.annotations.AuthenticatedLiteral;
import org.zanata.util.FileUtil;
import org.zanata.util.ServiceLocator;
@@ -123,10 +125,15 @@ private Optional getCannotUploadReason() {
return Optional.absent();
}
+ // FIXME consolidate to one Optional
private Optional getAccountId() {
- AuthenticatedAccountHome accountHome = ServiceLocator.instance().getInstance(
- AuthenticatedAccountHome.class);
- return Optional.fromNullable((Long) accountHome.getId());
+ java.util.Optional optionalAuthenticatedAccount =
+ ServiceLocator.instance().getOptionalInstance(
+ HAccount.class, new AuthenticatedLiteral());
+ if (optionalAuthenticatedAccount.isPresent()) {
+ return Optional.of(optionalAuthenticatedAccount.get().getId());
+ }
+ return Optional.absent();
}
@Override
diff --git a/zanata-war/src/main/webapp/WEB-INF/layout/dashboard/projects.xhtml b/zanata-war/src/main/webapp/WEB-INF/layout/dashboard/projects.xhtml
index c75260a141..8657168869 100644
--- a/zanata-war/src/main/webapp/WEB-INF/layout/dashboard/projects.xhtml
+++ b/zanata-war/src/main/webapp/WEB-INF/layout/dashboard/projects.xhtml
@@ -25,7 +25,7 @@
#{msgs['jsf.dashboard.projects.maintainedProjects.label']}
-
+
-
+