Added features:
[mir.git] / source / mircoders / accesscontrol / AccessControl.java
index 7e15db7..9f0dc3b 100755 (executable)
@@ -36,10 +36,13 @@ import java.util.Vector;
 import mir.config.MirPropertiesConfiguration;
 import mir.log.LoggerWrapper;
 import mircoders.entity.EntityUsers;
+import mircoders.module.*;
+import mircoders.storage.*;
 
 public class AccessControl {
   private UserAccessControl user;
   private GeneralAccessControl general;
+  private ArticleAccessControl article;
   protected LoggerWrapper logger = new LoggerWrapper("Global.AccessControl");
   protected MirPropertiesConfiguration configuration;
 
@@ -49,6 +52,9 @@ public class AccessControl {
 
       user = new UserAccessControl(configuration.getVector("AccessControl.SuperUsers"));
       general = new GeneralAccessControl();
+      article = new ArticleAccessControl(
+          configuration.getString("AccessControl.LockingEnabled", "0").equals("1"),
+          configuration.getString("AccessControl.LockingOptional", "0").equals("1"));
     }
     catch (Throwable t) {
       throw new RuntimeException(t.toString());
@@ -63,6 +69,10 @@ public class AccessControl {
     return general;
   }
 
+  public ArticleAccessControl article() {
+    return article;
+  }
+
   public class GeneralAccessControl {
     public boolean mayDeleteArticles(EntityUsers aSubject) {
       return configuration.getString("Mir.Localizer.Admin.AllowDeleteArticle", "0").equals("1");
@@ -115,6 +125,10 @@ public class AccessControl {
       return superusers.contains(aSubject.getValue("login"));
     }
 
+    protected boolean isSuperUser(EntityUsers aUser) {
+      return superusers.contains(aUser.getValue("login"));
+    }
+
     public void assertMayEditUser(EntityUsers aSubject, EntityUsers anObject) throws AuthorizationExc, AuthorizationFailure {
       try {
         if (!mayEditUser(aSubject, anObject))
@@ -166,4 +180,68 @@ public class AccessControl {
       }
     }
   }
+
+  public class ArticleAccessControl {
+    private ModuleContent contentModule;
+    private boolean lockingEnabled;
+    private boolean lockingOptional;
+
+    public ArticleAccessControl(boolean aLockingEnabled, boolean aLockingOptional) {
+      contentModule = new ModuleContent(DatabaseContent.getInstance());
+      lockingEnabled = aLockingEnabled;
+      lockingOptional = aLockingOptional;
+    }
+
+    public boolean mayEditArticle(EntityUsers aSubject, String anArticleId) {
+      String userId = aSubject.getId();
+
+      if (userId==null)
+        return false;
+      if (!lockingEnabled)
+        return true;
+
+      String lockingUser = contentModule.queryArticleLock(anArticleId);
+
+      return userId.equals(lockingUser) || ((lockingUser==null) && lockingOptional);
+    }
+
+    public boolean mayLockArticle(EntityUsers aSubject, String anArticleId) {
+      String userId = aSubject.getId();
+
+      if (userId==null)
+        return false;
+      if (!lockingEnabled)
+        return false;
+
+      String lockingUser = contentModule.queryArticleLock(anArticleId);
+
+      return (lockingUser==null);
+    }
+
+    public boolean mayForceLockArticle(EntityUsers aSubject, String anArticleId) {
+      String userId = aSubject.getId();
+
+      if (userId==null)
+        return false;
+      if (!lockingEnabled)
+        return false;
+
+      String lockingUser = contentModule.queryArticleLock(anArticleId);
+
+      return (lockingUser!=null) && !userId.equals(lockingUser) && user().isSuperUser(aSubject);
+    }
+
+    public boolean mayUnlockArticle(EntityUsers aSubject, String anArticleId) {
+      String userId = aSubject.getId();
+
+      if (userId==null)
+        return false;
+      if (!lockingEnabled)
+        return false;
+
+      String lockingUser = contentModule.queryArticleLock(anArticleId);
+
+      return userId.equals(lockingUser);
+    }
+  }
 }