42cece2f3659993319a4ce4d7cf0e06577bbc26e
[mir.git] / source / mircoders / accesscontrol / AccessControl.java
1 /*
2  * Copyright (C) 2001, 2002 The Mir-coders group
3  *
4  * This file is part of Mir.
5  *
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.
10  *
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.
15  *
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
19  *
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.
29  */
30
31 package mircoders.accesscontrol;
32
33 import java.util.List;
34 import java.util.Vector;
35
36 import mir.config.MirPropertiesConfiguration;
37 import mir.log.LoggerWrapper;
38 import mircoders.entity.EntityUsers;
39 import mircoders.module.*;
40 import mircoders.storage.*;
41
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;
48
49   public AccessControl() {
50     try {
51       configuration = MirPropertiesConfiguration.instance();
52
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"));
58     }
59     catch (Throwable t) {
60       throw new RuntimeException(t.toString());
61     }
62   }
63
64   public UserAccessControl user() {
65     return user;
66   }
67
68   public GeneralAccessControl general() {
69     return general;
70   }
71
72   public ArticleAccessControl article() {
73     return article;
74   }
75
76   public class GeneralAccessControl {
77     public boolean mayDeleteArticles(EntityUsers aSubject) {
78       return configuration.getString("Mir.Localizer.Admin.AllowDeleteArticle", "0").equals("1");
79     }
80
81     public void assertMayDeleteArticles(EntityUsers aSubject) throws AuthorizationExc, AuthorizationFailure {
82       try {
83         if (!mayDeleteArticles(aSubject))
84           throw new AuthorizationExc("not allowed to delete articles");
85       }
86       catch (Throwable t) {
87         throw new AuthorizationFailure(t);
88       }
89     }
90
91     public boolean mayDeleteComments(EntityUsers aSubject) {
92       return configuration.getString("Mir.Localizer.Admin.AllowDeleteComment", "0").equals("1");
93     }
94
95     public void assertMayDeleteComments(EntityUsers aSubject) throws AuthorizationExc, AuthorizationFailure {
96       try {
97         if (!mayDeleteArticles(aSubject))
98           throw new AuthorizationExc("not allowed to delete comments");
99       }
100       catch (Throwable t) {
101         throw new AuthorizationFailure(t);
102       }
103     }
104   }
105
106   public class UserAccessControl {
107     private List superusers;
108
109     public UserAccessControl(List aSuperUsers) {
110       superusers = new Vector(aSuperUsers);
111     }
112
113     public void assertMayAddUsers(EntityUsers aSubject) throws AuthorizationExc, AuthorizationFailure {
114       try {
115         if (!mayAddUsers(aSubject))
116           throw new AuthorizationExc("not allowed to add users");
117       }
118       catch (Throwable t) {
119         throw new AuthorizationFailure(t);
120       }
121
122     }
123
124     public boolean mayAddUsers(EntityUsers aSubject) {
125       return superusers.contains(aSubject.getFieldValue("login"));
126     }
127
128     protected boolean isSuperUser(EntityUsers aUser) {
129       return superusers.contains(aUser.getFieldValue("login"));
130     }
131
132     public void assertMayEditUser(EntityUsers aSubject, EntityUsers anObject) throws AuthorizationExc, AuthorizationFailure {
133       try {
134         if (!mayEditUser(aSubject, anObject))
135           throw new AuthorizationExc("not allowed to edit user " + anObject.getId());
136       }
137       catch (Throwable t) {
138         throw new AuthorizationFailure(t);
139       }
140
141     }
142
143     public boolean mayEditUser(EntityUsers aSubject, EntityUsers anObject) {
144       return superusers.contains(aSubject.getFieldValue("login"));
145     }
146
147     public boolean mayEditUsers(EntityUsers aSubject) {
148       return superusers.contains(aSubject.getFieldValue("login"));
149     }
150
151     public void assertMayDeleteUser(EntityUsers aSubject, EntityUsers anObject) throws AuthorizationExc, AuthorizationFailure {
152       try {
153         if (!mayDeleteUser(aSubject, anObject))
154           throw new AuthorizationExc("not allowed to delete user " + anObject.getId());
155       }
156       catch (Throwable t) {
157         throw new AuthorizationFailure(t);
158       }
159     }
160
161     public boolean mayDeleteUser(EntityUsers aSubject, EntityUsers anObject) {
162       return superusers.contains(aSubject.getFieldValue("login"));
163     }
164
165     public boolean mayDeleteUsers(EntityUsers aSubject) {
166       return superusers.contains(aSubject.getFieldValue("login"));
167     }
168
169     public boolean mayChangeUserPassword(EntityUsers aSubject, EntityUsers anObject) {
170       return aSubject.getId().equals(anObject.getId()) || superusers.contains(aSubject.getFieldValue("login"));
171     }
172
173     public void assertMayChangeUserPassword(EntityUsers aSubject, EntityUsers anObject) throws AuthorizationExc, AuthorizationFailure {
174       try {
175         if (!mayChangeUserPassword(aSubject, anObject))
176           throw new AuthorizationExc("not allowed to change user " + anObject.getId()+"'s password");
177       }
178       catch (Throwable t) {
179         throw new AuthorizationFailure(t);
180       }
181     }
182   }
183
184   public class ArticleAccessControl {
185     private ModuleContent contentModule;
186     private boolean lockingEnabled;
187     private boolean lockingOptional;
188
189     public ArticleAccessControl(boolean aLockingEnabled, boolean aLockingOptional) {
190       contentModule = new ModuleContent(DatabaseContent.getInstance());
191       lockingEnabled = aLockingEnabled;
192       lockingOptional = aLockingOptional;
193     }
194
195     public boolean mayEditArticle(EntityUsers aSubject, String anArticleId) {
196       String userId = aSubject.getId();
197
198       if (userId==null)
199         return false;
200       if (!lockingEnabled)
201         return true;
202
203       String lockingUser = contentModule.queryArticleLock(anArticleId);
204
205       return userId.equals(lockingUser) || ((lockingUser==null) && lockingOptional);
206     }
207
208     public boolean mayLockArticle(EntityUsers aSubject, String anArticleId) {
209       String userId = aSubject.getId();
210
211       if (userId==null)
212         return false;
213       if (!lockingEnabled)
214         return false;
215
216       String lockingUser = contentModule.queryArticleLock(anArticleId);
217
218       return (lockingUser==null);
219     }
220
221     public boolean mayForceLockArticle(EntityUsers aSubject, String anArticleId) {
222       String userId = aSubject.getId();
223
224       if (userId==null)
225         return false;
226       if (!lockingEnabled)
227         return false;
228
229       String lockingUser = contentModule.queryArticleLock(anArticleId);
230
231       return (lockingUser!=null) && !userId.equals(lockingUser) && user().isSuperUser(aSubject);
232     }
233
234     public boolean mayUnlockArticle(EntityUsers aSubject, String anArticleId) {
235       String userId = aSubject.getId();
236
237       if (userId==null)
238         return false;
239       if (!lockingEnabled)
240         return false;
241
242       String lockingUser = contentModule.queryArticleLock(anArticleId);
243
244       return userId.equals(lockingUser);
245     }
246   }
247 }