2 * Copyright (C) 2001, 2002 The Mir-coders group
4 * This file is part of Mir.
6 * Mir is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * Mir is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with Mir; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 * In addition, as a special exception, The Mir-coders gives permission to link
21 * the code of this program with any library licensed under the Apache Software License,
22 * The Sun (tm) Java Advanced Imaging library (JAI), The Sun JIMI library
23 * (or with modified versions of the above that use the same license as the above),
24 * and distribute linked combinations including the two. You must obey the
25 * GNU General Public License in all respects for all of the code used other than
26 * the above mentioned libraries. If you modify this file, you may extend this
27 * exception to your version of the file, but you are not obligated to do so.
28 * If you do not wish to do so, delete this exception statement from your version.
31 package mircoders.accesscontrol;
33 import java.util.List;
34 import java.util.Vector;
36 import mir.config.MirPropertiesConfiguration;
37 import mir.log.LoggerWrapper;
38 import mircoders.entity.EntityUsers;
39 import mircoders.module.*;
40 import mircoders.storage.*;
42 public class AccessControl {
43 private UserAccessControl user;
44 private GeneralAccessControl general;
45 private ArticleAccessControl article;
46 protected LoggerWrapper logger = new LoggerWrapper("Global.AccessControl");
47 protected MirPropertiesConfiguration configuration;
49 public AccessControl() {
51 configuration = MirPropertiesConfiguration.instance();
53 user = new UserAccessControl(configuration.getVector("AccessControl.SuperUsers"));
54 general = new GeneralAccessControl();
55 article = new ArticleAccessControl(
56 configuration.getString("AccessControl.LockingEnabled", "0").equals("1"),
57 configuration.getString("AccessControl.LockingOptional", "0").equals("1"));
60 throw new RuntimeException(t.toString());
64 public UserAccessControl user() {
68 public GeneralAccessControl general() {
72 public ArticleAccessControl article() {
76 public class GeneralAccessControl {
77 public boolean mayDeleteArticles(EntityUsers aSubject) {
78 return configuration.getString("Mir.Localizer.Admin.AllowDeleteArticle", "0").equals("1");
81 public void assertMayDeleteArticles(EntityUsers aSubject) throws AuthorizationExc, AuthorizationFailure {
83 if (!mayDeleteArticles(aSubject))
84 throw new AuthorizationExc("not allowed to delete articles");
87 throw new AuthorizationFailure(t);
91 public boolean mayDeleteComments(EntityUsers aSubject) {
92 return configuration.getString("Mir.Localizer.Admin.AllowDeleteComment", "0").equals("1");
95 public void assertMayDeleteComments(EntityUsers aSubject) throws AuthorizationExc, AuthorizationFailure {
97 if (!mayDeleteArticles(aSubject))
98 throw new AuthorizationExc("not allowed to delete comments");
100 catch (Throwable t) {
101 throw new AuthorizationFailure(t);
106 public class UserAccessControl {
107 private List superusers;
109 public UserAccessControl(List aSuperUsers) {
110 superusers = new Vector(aSuperUsers);
113 public void assertMayAddUsers(EntityUsers aSubject) throws AuthorizationExc, AuthorizationFailure {
115 if (!mayAddUsers(aSubject))
116 throw new AuthorizationExc("not allowed to add users");
118 catch (Throwable t) {
119 throw new AuthorizationFailure(t);
124 public boolean mayAddUsers(EntityUsers aSubject) {
125 return superusers.contains(aSubject.getFieldValue("login"));
128 protected boolean isSuperUser(EntityUsers aUser) {
129 return superusers.contains(aUser.getFieldValue("login"));
132 public void assertMayEditUser(EntityUsers aSubject, EntityUsers anObject) throws AuthorizationExc, AuthorizationFailure {
134 if (!mayEditUser(aSubject, anObject))
135 throw new AuthorizationExc("not allowed to edit user " + anObject.getId());
137 catch (Throwable t) {
138 throw new AuthorizationFailure(t);
143 public boolean mayEditUser(EntityUsers aSubject, EntityUsers anObject) {
144 return superusers.contains(aSubject.getFieldValue("login"));
147 public boolean mayEditUsers(EntityUsers aSubject) {
148 return superusers.contains(aSubject.getFieldValue("login"));
151 public void assertMayDeleteUser(EntityUsers aSubject, EntityUsers anObject) throws AuthorizationExc, AuthorizationFailure {
153 if (!mayDeleteUser(aSubject, anObject))
154 throw new AuthorizationExc("not allowed to delete user " + anObject.getId());
156 catch (Throwable t) {
157 throw new AuthorizationFailure(t);
161 public boolean mayDeleteUser(EntityUsers aSubject, EntityUsers anObject) {
162 return superusers.contains(aSubject.getFieldValue("login"));
165 public boolean mayDeleteUsers(EntityUsers aSubject) {
166 return superusers.contains(aSubject.getFieldValue("login"));
169 public boolean mayChangeUserPassword(EntityUsers aSubject, EntityUsers anObject) {
170 return aSubject.getId().equals(anObject.getId()) || superusers.contains(aSubject.getFieldValue("login"));
173 public void assertMayChangeUserPassword(EntityUsers aSubject, EntityUsers anObject) throws AuthorizationExc, AuthorizationFailure {
175 if (!mayChangeUserPassword(aSubject, anObject))
176 throw new AuthorizationExc("not allowed to change user " + anObject.getId()+"'s password");
178 catch (Throwable t) {
179 throw new AuthorizationFailure(t);
184 public class ArticleAccessControl {
185 private ModuleContent contentModule;
186 private boolean lockingEnabled;
187 private boolean lockingOptional;
189 public ArticleAccessControl(boolean aLockingEnabled, boolean aLockingOptional) {
190 contentModule = new ModuleContent(DatabaseContent.getInstance());
191 lockingEnabled = aLockingEnabled;
192 lockingOptional = aLockingOptional;
195 public boolean mayEditArticle(EntityUsers aSubject, String anArticleId) {
196 String userId = aSubject.getId();
203 String lockingUser = contentModule.queryArticleLock(anArticleId);
205 return userId.equals(lockingUser) || ((lockingUser==null) && lockingOptional);
208 public boolean mayLockArticle(EntityUsers aSubject, String anArticleId) {
209 String userId = aSubject.getId();
216 String lockingUser = contentModule.queryArticleLock(anArticleId);
218 return (lockingUser==null);
221 public boolean mayForceLockArticle(EntityUsers aSubject, String anArticleId) {
222 String userId = aSubject.getId();
229 String lockingUser = contentModule.queryArticleLock(anArticleId);
231 return (lockingUser!=null) && !userId.equals(lockingUser) && user().isSuperUser(aSubject);
234 public boolean mayUnlockArticle(EntityUsers aSubject, String anArticleId) {
235 String userId = aSubject.getId();
242 String lockingUser = contentModule.queryArticleLock(anArticleId);
244 return userId.equals(lockingUser);