From f3e347c564d92fbfbe291ce6bbddc253774671e4 Mon Sep 17 00:00:00 2001 From: Carlos Munoz Date: Wed, 21 Mar 2012 15:43:58 +1000 Subject: [PATCH] rhbz727789 - Implement non-admin project creation in 1.5 branch This revision is a cherry-pick of the following commits: e8afa8a65f47aceac35ce2ebd8cc97517badadf0 ad01b3f915e4f776cd6604f20cce3a49bf3489ee b3fc29cbdd1d25f4a0cc717f131cf9d06635e7c9 a5153d9001e120d7d3fcd15bec4eca7499a7b06a --- .../src/main/java/org/zanata/model/HPerson.java | 14 +++++++++----- .../main/java/org/zanata/model/HProject.java | 12 ++++++++++++ .../java/org/zanata/action/ProjectHome.java | 13 +++++-------- .../zanata-war/src/main/resources/security.drl | 17 ++++++++++++++--- .../ResourceTranslationServiceSeamTest.java | 4 ++++ .../TranslationsResourceTestObjectFactory.java | 6 +++--- .../zanata/rest/service/VersionSeamTest.java | 5 +++++ 7 files changed, 52 insertions(+), 19 deletions(-) diff --git a/server/zanata-model/src/main/java/org/zanata/model/HPerson.java b/server/zanata-model/src/main/java/org/zanata/model/HPerson.java index c3dbd9d78f..9fd3691ba1 100644 --- a/server/zanata-model/src/main/java/org/zanata/model/HPerson.java +++ b/server/zanata-model/src/main/java/org/zanata/model/HPerson.java @@ -27,7 +27,6 @@ import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.JoinColumn; -import javax.persistence.JoinTable; import javax.persistence.ManyToMany; import javax.persistence.OneToMany; import javax.persistence.OneToOne; @@ -103,8 +102,11 @@ public String getEmail() return email; } - @ManyToMany(fetch = FetchType.EAGER) - @JoinTable(name = "HProject_Maintainer", joinColumns = @JoinColumn(name = "personId"), inverseJoinColumns = @JoinColumn(name = "projectId")) + /* + * This is a read-only side of the relationship. Changes to this collection are allowed but will not + * be persisted. + */ + @ManyToMany(fetch = FetchType.EAGER, mappedBy = "maintainers") public Set getMaintainerProjects() { if (maintainerProjects == null) @@ -213,10 +215,12 @@ public boolean isMaintainer(HProject proj) { // TODO consider implementing business key equality and using // getMaintainerProjects().contains(proj) - for (HProject maintProj : getMaintainerProjects()) + for (HPerson maintainer : proj.getMaintainers()) { - if (maintProj.getId().equals(proj.getId())) + if (maintainer.getId().equals( this.getId() )) + { return true; + } } return false; } diff --git a/server/zanata-model/src/main/java/org/zanata/model/HProject.java b/server/zanata-model/src/main/java/org/zanata/model/HProject.java index 3ec4e2ded0..7e56c4b352 100644 --- a/server/zanata-model/src/main/java/org/zanata/model/HProject.java +++ b/server/zanata-model/src/main/java/org/zanata/model/HProject.java @@ -112,6 +112,9 @@ public void setHomeContent(String homeContent) this.homeContent = homeContent; } + /** + * @see {@link #addMaintainer(HPerson)} + */ @ManyToMany @JoinTable(name = "HProject_Maintainer", joinColumns = @JoinColumn(name = "projectId"), inverseJoinColumns = @JoinColumn(name = "personId")) // @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) // caching affects permission checks in security.drl @@ -122,10 +125,19 @@ public Set getMaintainers() return maintainers; } + /** + * @see {@link #addMaintainer(HPerson)} + */ public void setMaintainers(Set maintainers) { this.maintainers = maintainers; } + + public void addMaintainer( HPerson maintainer ) + { + this.getMaintainers().add(maintainer); + maintainer.getMaintainerProjects().add(this); + } @ManyToMany @JoinTable(name = "HProject_Locale", joinColumns = @JoinColumn(name = "projectId"), inverseJoinColumns = @JoinColumn(name = "localeId")) diff --git a/server/zanata-war/src/main/java/org/zanata/action/ProjectHome.java b/server/zanata-war/src/main/java/org/zanata/action/ProjectHome.java index 312300a573..92bd6ed5e3 100644 --- a/server/zanata-war/src/main/java/org/zanata/action/ProjectHome.java +++ b/server/zanata-war/src/main/java/org/zanata/action/ProjectHome.java @@ -34,6 +34,7 @@ import org.jboss.seam.annotations.In; import org.jboss.seam.annotations.Logger; import org.jboss.seam.annotations.Name; +import org.jboss.seam.annotations.Transactional; import org.jboss.seam.core.Events; import org.jboss.seam.faces.FacesMessages; import org.jboss.seam.log.Log; @@ -44,7 +45,6 @@ import org.zanata.model.HAccount; import org.zanata.model.HIterationProject; import org.zanata.model.HLocale; -import org.zanata.model.HPerson; import org.zanata.model.HProjectIteration; import org.zanata.service.LocaleService; @@ -129,6 +129,7 @@ public boolean isSlugAvailable(String slug) } @Override + @Transactional public String persist() { String retValue = ""; @@ -138,13 +139,9 @@ public String persist() if (authenticatedAccount != null) { updateOverrideLocales(); - HPerson currentPerson = getEntityManager().find(HPerson.class, authenticatedAccount.getPerson().getId()); - if (currentPerson != null) - { - getInstance().getMaintainers().add(currentPerson); - retValue = super.persist(); - Events.instance().raiseEvent("projectAdded"); - } + getInstance().addMaintainer(authenticatedAccount.getPerson()); + retValue = super.persist(); + Events.instance().raiseEvent("projectAdded"); } return retValue; } diff --git a/server/zanata-war/src/main/resources/security.drl b/server/zanata-war/src/main/resources/security.drl index 9a799edcca..b3bd20c973 100644 --- a/server/zanata-war/src/main/resources/security.drl +++ b/server/zanata-war/src/main/resources/security.drl @@ -66,7 +66,19 @@ end ******************************************************************************************/ -/* admin can create/delete projects (see rule AdminAnything above) */ +/* admin can delete projects (see rule AdminAnything above) */ + +/* Any authenticated user can create a project */ +rule CreateProject + no-loop + activation-group "permissions" +when + $project: HProject() + $authenticatedPerson: HPerson() + check: PermissionCheck(target == $project, action == "insert", granted == false ) +then + check.grant(); +end /* anyone can read a project */ rule ReadProject @@ -104,13 +116,12 @@ rule UpdateProjectOrAddIteration no-loop activation-group "permissions" when + check: PermissionCheck(action == "update" || action == "add-iteration", granted == false) authenticatedPerson: HPerson() eval(authenticatedPerson != null) $project: HProject( eval(authenticatedPerson.isMaintainer($project)) ) - check: PermissionCheck( - target == $project, action == "update" || action == "add-iteration", granted == false) then check.grant(); end diff --git a/server/zanata-war/src/test/java/org/zanata/rest/service/ResourceTranslationServiceSeamTest.java b/server/zanata-war/src/test/java/org/zanata/rest/service/ResourceTranslationServiceSeamTest.java index fd8621a160..bfe2ace665 100644 --- a/server/zanata-war/src/test/java/org/zanata/rest/service/ResourceTranslationServiceSeamTest.java +++ b/server/zanata-war/src/test/java/org/zanata/rest/service/ResourceTranslationServiceSeamTest.java @@ -19,6 +19,7 @@ public abstract class ResourceTranslationServiceSeamTest extends ZanataDBUnitSea private static final String DOCUMENTS_DATA_DBUNIT_XML = "org/zanata/test/model/DocumentsData.dbunit.xml"; private static final String LOCALE_DATA_DBUNIT_XML = "org/zanata/test/model/LocalesData.dbunit.xml"; private static final String PROJECTS_DATA_DBUNIT_XML = "org/zanata/test/model/ProjectsData.dbunit.xml"; + private static final String ACCOUNT_DATA_DBUNIT_XML = "org/zanata/test/model/AccountData.dbunit.xml"; protected ITranslationResources translationResource; private String projectSlug = "sample-project"; @@ -51,11 +52,14 @@ public void setup() throws Exception @Override protected void prepareDBUnitOperations() { + beforeTestOperations.add(new DataSetOperation(ACCOUNT_DATA_DBUNIT_XML, DatabaseOperation.CLEAN_INSERT)); beforeTestOperations.add(new DataSetOperation(DOCUMENTS_DATA_DBUNIT_XML, DatabaseOperation.CLEAN_INSERT)); beforeTestOperations.add(new DataSetOperation(PROJECTS_DATA_DBUNIT_XML, DatabaseOperation.CLEAN_INSERT)); beforeTestOperations.add(new DataSetOperation(LOCALE_DATA_DBUNIT_XML, DatabaseOperation.CLEAN_INSERT)); + afterTestOperations.add(new DataSetOperation(PROJECTS_DATA_DBUNIT_XML, DatabaseOperation.DELETE_ALL)); afterTestOperations.add(new DataSetOperation(DOCUMENTS_DATA_DBUNIT_XML, DatabaseOperation.DELETE_ALL)); + afterTestOperations.add(new DataSetOperation(ACCOUNT_DATA_DBUNIT_XML, DatabaseOperation.DELETE_ALL)); afterTestOperations.add(new DataSetOperation(LOCALE_DATA_DBUNIT_XML, DatabaseOperation.DELETE_ALL)); } } diff --git a/server/zanata-war/src/test/java/org/zanata/rest/service/TranslationsResourceTestObjectFactory.java b/server/zanata-war/src/test/java/org/zanata/rest/service/TranslationsResourceTestObjectFactory.java index 374b2f3cea..596ea9c96e 100644 --- a/server/zanata-war/src/test/java/org/zanata/rest/service/TranslationsResourceTestObjectFactory.java +++ b/server/zanata-war/src/test/java/org/zanata/rest/service/TranslationsResourceTestObjectFactory.java @@ -22,7 +22,7 @@ public TranslationsResource getTestObject() TextFlowTarget target = new TextFlowTarget("rest1"); target.setContent("hello world"); target.setState(ContentState.Approved); - target.setTranslator(new Person("root@localhost", "Admin user")); + target.setTranslator(new Person("root@localhost", "Administrator")); // for the convenience of test target.getExtensions(true); entity.getTextFlowTargets().add(target); @@ -36,12 +36,12 @@ public TranslationsResource getTestObject2() TextFlowTarget target = new TextFlowTarget("rest1"); target.setContent("hello world"); target.setState(ContentState.Approved); - target.setTranslator(new Person("root@localhost", "Admin user")); + target.setTranslator(new Person("root@localhost", "Administrator")); target.getExtensions(true); TextFlowTarget target2 = new TextFlowTarget("rest2"); target2.setContent("greeting world"); target2.setState(ContentState.Approved); - target2.setTranslator(new Person("root@localhost", "Admin user")); + target2.setTranslator(new Person("root@localhost", "Administrator")); target2.getExtensions(true); entity.getTextFlowTargets().add(target2); entity.getExtensions(true); diff --git a/server/zanata-war/src/test/java/org/zanata/rest/service/VersionSeamTest.java b/server/zanata-war/src/test/java/org/zanata/rest/service/VersionSeamTest.java index 44a709bf6d..cba66ce26b 100644 --- a/server/zanata-war/src/test/java/org/zanata/rest/service/VersionSeamTest.java +++ b/server/zanata-war/src/test/java/org/zanata/rest/service/VersionSeamTest.java @@ -3,6 +3,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; +import org.dbunit.operation.DatabaseOperation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testng.annotations.BeforeMethod; @@ -18,9 +19,13 @@ public class VersionSeamTest extends ZanataDBUnitSeamTest private IVersionResource version; private final Logger log = LoggerFactory.getLogger(VersionSeamTest.class); + private static final String ACCOUNT_DATA_DBUNIT_XML = "org/zanata/test/model/AccountData.dbunit.xml"; + @Override protected void prepareDBUnitOperations() { + beforeTestOperations.add(new DataSetOperation(ACCOUNT_DATA_DBUNIT_XML, DatabaseOperation.CLEAN_INSERT)); + afterTestOperations.add(new DataSetOperation(ACCOUNT_DATA_DBUNIT_XML, DatabaseOperation.DELETE_ALL)); } @BeforeMethod