Index: topia/src/java/org/codelutin/topia/security/TopiaAccessController.java diff -u topia/src/java/org/codelutin/topia/security/TopiaAccessController.java:1.1 topia/src/java/org/codelutin/topia/security/TopiaAccessController.java:1.2 --- topia/src/java/org/codelutin/topia/security/TopiaAccessController.java:1.1 Wed May 4 16:09:41 2005 +++ topia/src/java/org/codelutin/topia/security/TopiaAccessController.java Fri May 20 17:51:10 2005 @@ -24,7 +24,7 @@ * Created: 4 mai 2005 * * @author Arnaud Thimel -* @version $Revision: 1.1 $ +* @version $Revision: 1.2 $ */ @@ -44,27 +44,46 @@ static private Logger log = Logger.getLogger("org.codelutin.topia.security.TopiaAccessController"); + + /** + * Vérifie si l'utilisateur actuellement loggué a le droit d'accéder à + * l'entité passée en paramètre pour les actions spécifiées. + * @param entity l'entité pour laquelle on vérifie les droits + * @param actions les actions [read, write, admin] + * @throws TopiaSecurityException + */ public static void checkPermission(TopiaEntity entity, String actions) throws TopiaSecurityException { - log.finest("Checking permissions for entity : " + entity); + log.finest("Checking permissions to entity : " + entity); if (entity == null) throw new TopiaSecurityException("TopiaEntity cannot be null"); - if (actions == null) - actions = "read"; //TODO Arno : DEFAULT_ACTIONS ??? - Subject subj =Subject.getSubject(AccessController.getContext()); - if (subj == null) - throw new TopiaSecurityException("Use doAs() and login first"); String topiaId; try { topiaId = entity.get_topiaId_(); } catch (TopiaException e) { - throw new TopiaSecurityException("Invalid TopiaEntity"); + throw new TopiaSecurityException("Invalid TopiaEntity", e); } + checkPermission(topiaId, actions); + } + + /** + * Vérifie si l'utilisateur actuellement loggué a le droit d'accéder à + * l'entité passée en paramètre pour les actions spécifiées. + * @param topiaId le topiaId de l'entité pour laquelle on vérifie les droits + * @param actions les actions [read, write, admin] + * @throws TopiaSecurityException + */ + public static void checkPermission(String topiaId, String actions) throws TopiaSecurityException { + if (actions == null) + actions = "read"; //TODO Arno : DEFAULT_ACTIONS ??? + Subject subj = Subject.getSubject(AccessController.getContext()); + if (subj == null) + throw new TopiaSecurityException("Use doAs() and login first"); try { AccessController.checkPermission(new TopiaPermission(topiaId, subj.getPrincipals(), actions)); } catch (AccessControlException e) { - throw new TopiaSecurityException("access denied to \"" + topiaId + "\""); + throw new TopiaSecurityException("access denied to object \"" + topiaId + "\" for \"" + subj + "\"", e); } - log.finest("Permission granted for entity : " + entity); + log.finest("Permission granted for entity : " + topiaId); } } Index: topia/src/java/org/codelutin/topia/security/TopiaGroupPrincipal.java diff -u topia/src/java/org/codelutin/topia/security/TopiaGroupPrincipal.java:1.2 topia/src/java/org/codelutin/topia/security/TopiaGroupPrincipal.java:1.3 --- topia/src/java/org/codelutin/topia/security/TopiaGroupPrincipal.java:1.2 Wed May 4 16:09:41 2005 +++ topia/src/java/org/codelutin/topia/security/TopiaGroupPrincipal.java Fri May 20 17:51:10 2005 @@ -24,16 +24,18 @@ * Created: 29 avr. 2005 * * @author Arnaud Thimel -* @version $Revision: 1.2 $ +* @version $Revision: 1.3 $ */ package org.codelutin.topia.security; - +/** + * Un TopiaPrincipal identifiant un groupe + */ public class TopiaGroupPrincipal extends TopiaPrincipal { public TopiaGroupPrincipal(String name) { - //super(name); this.name = "group." + name; } + } Index: topia/src/java/org/codelutin/topia/security/TopiaLoginModule.java diff -u topia/src/java/org/codelutin/topia/security/TopiaLoginModule.java:1.2 topia/src/java/org/codelutin/topia/security/TopiaLoginModule.java:1.3 --- topia/src/java/org/codelutin/topia/security/TopiaLoginModule.java:1.2 Wed May 4 16:09:41 2005 +++ topia/src/java/org/codelutin/topia/security/TopiaLoginModule.java Fri May 20 17:51:10 2005 @@ -24,7 +24,7 @@ * Created: 29 avr. 2005 * * @author Arnaud Thimel - * @version $Revision: 1.2 $ + * @version $Revision: 1.3 $ */ package org.codelutin.topia.security; @@ -45,7 +45,9 @@ import org.codelutin.topia.TopiaContext; import org.codelutin.topia.TopiaContextFactory; import org.codelutin.topia.TopiaException; - +/** + * LoginModule compatible avec Topia + */ public class TopiaLoginModule implements LoginModule { private Subject subject; @@ -59,7 +61,6 @@ */ public void initialize(Subject subject, CallbackHandler callbackHandler, Map sharedState, Map options) { -System.out.println("org.codelutin.topia.security.TopiaLoginModule.initialize"); this.subject = subject; this.callbackHandler = callbackHandler; this.principals = null; @@ -70,7 +71,6 @@ * @see javax.security.auth.spi.LoginModule#login() */ public boolean login() throws LoginException { -System.out.println("org.codelutin.topia.security.TopiaLoginModule.login"); if (callbackHandler == null) throw new LoginException("CallbackHandler cannot be null"); @@ -124,7 +124,6 @@ * @see javax.security.auth.spi.LoginModule#commit() */ public boolean commit() throws LoginException { -System.out.println("org.codelutin.topia.security.TopiaLoginModule.commit"); if (loginSuccess) { subject.getPrincipals().addAll(principals); return true; @@ -136,7 +135,6 @@ * @see javax.security.auth.spi.LoginModule#abort() */ public boolean abort() throws LoginException { -System.out.println("org.codelutin.topia.security.TopiaLoginModule.abort"); return false; } @@ -144,7 +142,6 @@ * @see javax.security.auth.spi.LoginModule#logout() */ public boolean logout() throws LoginException { -System.out.println("org.codelutin.topia.security.TopiaLoginModule.logout"); subject = null; principals = null; callbackHandler = null; Index: topia/src/java/org/codelutin/topia/security/TopiaPermission.java diff -u topia/src/java/org/codelutin/topia/security/TopiaPermission.java:1.1 topia/src/java/org/codelutin/topia/security/TopiaPermission.java:1.2 --- topia/src/java/org/codelutin/topia/security/TopiaPermission.java:1.1 Wed May 4 16:09:41 2005 +++ topia/src/java/org/codelutin/topia/security/TopiaPermission.java Fri May 20 17:51:10 2005 @@ -24,7 +24,7 @@ * Created: 2 mai 2005 * * @author Benjamin Poussin - * @version $Revision: 1.1 $ + * @version $Revision: 1.2 $ */ package org.codelutin.topia.security; @@ -182,7 +182,7 @@ // log.info(this.getClass().getName()+" name="+name+" actions="+actionsAsInt); actions = actionsAsInt; - + s = s.replaceAll(" +", " ");//Un seul espace quand il y en a plusieurs StringTokenizer tok = new StringTokenizer(s, " ", false); if (tok.hasMoreTokens()) { id = tok.nextToken(); @@ -190,17 +190,38 @@ } principals = new HashMap(); - + //Ajout de la possibilité d'écrire "Principal [abc,def, ghi]" faite !!! + boolean inBrackets = false; + String principalClass = null; while (tok.hasMoreTokens()) { - String principalClass = tok.nextToken(); + if (!inBrackets) + principalClass = tok.nextToken(); String principalName = null; if (tok.hasMoreTokens()) { principalName = tok.nextToken(); - } else { + } else {//TODO Arno !!! throw new IllegalArgumentException( "Principal must be followed by name"); } - addPrincipal(principalClass, principalName); + if (principalName.startsWith("[")) { + inBrackets = true; + principalName = principalName.substring(1); + } + if (!inBrackets) { + addPrincipal(principalClass, principalName); + } else { + if (principalName.endsWith("]")) { + inBrackets = false; + principalName = principalName.substring(0, principalName.length()-1); + } + if (principalName.trim().equals("")) + continue; + StringTokenizer sTK = new StringTokenizer(principalName, ","); + while (sTK.hasMoreTokens()) { + principalName = sTK.nextToken().trim(); + addPrincipal(principalClass, principalName); + } + } } } @@ -216,6 +237,8 @@ if (names == null) { principals.put(principalClass, names = new HashSet()); } + if (principalName.trim().startsWith("[") && principalName.endsWith("]")) + principalName = principalName.substring(1,principalName.lastIndexOf("]")); names.add(principalName); // log.info("principal added : "+principalClass+" "+principalName); } @@ -266,6 +289,7 @@ /** @param p une permission * @return Vrai si la permission p est incluse dans this */ public boolean implies(Permission p) { + //log.info(this + " >>> " + p); if (p == null) return false; if (!(p instanceof TopiaPermission)) @@ -278,6 +302,7 @@ if (!impliesActions(actions, that.actions)) return false; boolean result = impliesPrincipal(this.principals, that.principals); + //log.info(this.principals + " >>> " + that.principals + "\n\t" + result); return result; } @@ -287,7 +312,7 @@ * @return vrai si les ids sont egaux */ private boolean impliesId(String thisId, String thatId) { - return thisId.equals(thatId); + return thisId.equals(thatId) || "*".equals(thisId); } /** @@ -328,11 +353,12 @@ Set thisPrincipalNames = (Set) thisPrincipals.get(thisPrincipalClass); Set thatPrincipalNames = (Set) thatPrincipals.get(thisPrincipalClass); - if (thatPrincipalNames != null //that contient bien le principal nécessaire ! + if (thatPrincipalNames != null //that contient bien le principal nécessaire ! && (thisPrincipalNames.contains("*") || thatPrincipalNames.containsAll(thisPrincipalNames))) { //(this contient une étoile (accepte tous)) ou (that contient tout ce que contient this) continue; } + result = false; } return result; @@ -343,8 +369,17 @@ * @return a String representation of this object */ public String toString() { - return "(" + this.getClass().getName() + " id=\"" + id + "\" principals=" + return "(" + /*this.getClass().getName()*/"TopiaPermission" + " id=\"" + id + "\" principals=" + principals + " actions=\"" + getActions() + "\")"; + } + + public String principalsToString() { + String output = ""; + for (Iterator it = principals.keySet().iterator(); it.hasNext(); ) { + String className = (String)it.next(); + output += className + " " + principals.get(className) + " "; + } + return output; } } // TopiaPermission Index: topia/src/java/org/codelutin/topia/security/TopiaPolicy.java diff -u topia/src/java/org/codelutin/topia/security/TopiaPolicy.java:1.1 topia/src/java/org/codelutin/topia/security/TopiaPolicy.java:1.2 --- topia/src/java/org/codelutin/topia/security/TopiaPolicy.java:1.1 Wed May 4 16:09:41 2005 +++ topia/src/java/org/codelutin/topia/security/TopiaPolicy.java Fri May 20 17:51:10 2005 @@ -24,7 +24,7 @@ * Created: 2 mai 2005 * * @author Benjamin Poussin - * @version $Revision: 1.1 $ + * @version $Revision: 1.2 $ */ package org.codelutin.topia.security; @@ -39,11 +39,13 @@ import java.util.List; import java.util.logging.Logger; +import org.codelutin.util.HashMapMultiKey; + /** * Cette policy etend par delegation la policy qui etait deja  en place. * Cette classe permet d'ajouter des permissions a l'execution. */ -public class TopiaPolicy extends Policy { +public class TopiaPolicy extends Policy implements TopiaPermissionListener { /** to use log facility, just put in your code: log.info("..."); */ static private Logger log = Logger.getLogger("org.codelutin.topia.security.TopiaPolicy"); @@ -69,14 +71,14 @@ this.parentPolicy = parentPolicy; } - protected List permissions = new ArrayList(); + protected HashMapMultiKey permissions = new HashMapMultiKey(); /** * Renvoie toutes les permissions de la policy * @return liste des permissions */ public List getPermissions() { - return permissions; + return new ArrayList(permissions.values()); } /** @@ -87,14 +89,6 @@ super(); } - /** - * Permet d'ajouter la permission p durant l'execution du programme - * @param p permission a ajouter - */ - public void addPermission(Permission p) { - permissions.add(p); - } - /** * Methode qui permet de recuperer l'ensemble des permissions du CodeSource. * Appelle {@link java.security.Policy#getPermissions(java.security.CodeSource)} et ajoute toutes les permissions a la collection @@ -114,15 +108,35 @@ * @return une collection des permissions de parentPolicy */ public PermissionCollection getPermissions(ProtectionDomain domain) { - log.finest("getPermsDomain permissions: " +permissions); + log.finest("getPermsDomain permissions: " + permissions); PermissionCollection pc = parentPolicy.getPermissions(domain); - for (Iterator i = permissions.iterator(); i.hasNext();) { - pc.add((Permission) i.next()); + for (Iterator i = permissions.values().iterator(); i.hasNext();) { + Permission perm = (Permission) i.next(); + pc.add(perm); } return pc; } /** + * Méthode permettant de vérifier si la Permission donnée est valide sur le + * ProtectionDomain. Cette méthode n'appelle pas la méthode du parentPolicy + * car sinon la partie dynamique n'est plus prise en compte. Par contre, + * toutes les permissions (y compris celles des parentPolicy) sont prises + * en compte. + * @param domain le ProtectionDomain + * @param permission la Permission à vérifier + * @return true ssi la Permission est valide + */ + public boolean implies(ProtectionDomain domain, Permission permission) { + //parentPolicy.implies(domain, permission); //Surtout pas ! Sinon, les + // modifs sur les permissions ne sont pas pris en compte ! + PermissionCollection pc = getPermissions(domain); + if (pc == null) + return false; + return pc.implies(permission); + } + + /** * appel refresh() de l'attribut parentPolicy * * @see java.security.Policy#refresh() @@ -149,4 +163,78 @@ Policy.setPolicy(this); } } + + /* (non-Javadoc) + * @see org.codelutin.topia.security.TopiaPermissionListener#permissionAdded(org.codelutin.topia.security.TopiaPermissionEvent) + */ + public void permissionAdded(TopiaPermissionEvent event) { + for (Iterator it = event.getPermissions().iterator(); it.hasNext(); ) + addPermission((Permission)it.next()); + } + + /** + * Permet d'ajouter la permission p durant l'execution du programme + * @param p permission a ajouter + */ + private void addPermission(Permission p) { + HashMapMultiKey.Key key = new HashMapMultiKey.Key(); + if (p instanceof TopiaPermission) { + TopiaPermission perm = (TopiaPermission)p; + key = new HashMapMultiKey.Key().add(perm.getId()).add(perm.getPrincipals()); + } else { + key.add(p.getName());//TODO Arno : A vérif !!! + } + if (permissions.get(key) == null) + log.info("adding new Permission (" + key + "): " + p); + else + log.info("replacing Permission (" + key + "): " + p); + permissions.put(key, p); + //TODO Arno ??? Faut-il parcourir les principals pour les ajouter un à un + //Réponse : Non ! car si on fait ca, plus de diff entre "perm(princ1+princ2)" et "perm(princ1)+perm(princ2)" + } + + + /* (non-Javadoc) + * @see org.codelutin.topia.security.TopiaPermissionListener#permissionModified(org.codelutin.topia.security.TopiaPermissionEvent) + */ + public void permissionModified(TopiaPermissionEvent event) { + for (Iterator it = event.getPermissions().iterator(); it.hasNext(); ) + modifyPermission((Permission)it.next()); + } + + /** + * @param permission la permission à modifier + */ + private void modifyPermission(Permission permission) { + log.info("permissionModified : " + permission); + addPermission(permission); //TODO Arno : A priori idem à addPerm car on + //utilise une HashMap (donc écrase le précedent) - A vérif + } + + /* (non-Javadoc) + * @see org.codelutin.topia.security.TopiaPermissionListener#permissionRemoved(org.codelutin.topia.security.TopiaPermissionEvent) + */ + public void permissionRemoved(TopiaPermissionEvent event) { + for (Iterator it = event.getPermissions().iterator(); it.hasNext(); ) + removePermission((Permission)it.next()); + } + + /** + * @param permission La permission à supprimer + */ + private void removePermission(Permission permission) { + HashMapMultiKey.Key key = new HashMapMultiKey.Key(); + if (permission instanceof TopiaPermission) { + TopiaPermission perm = (TopiaPermission)permission; + key = new HashMapMultiKey.Key().add(perm.getId()).add(perm.getPrincipals()); + } else { + key.add(permission.getName()); //TODO Arno : A vérif !!! + } + if (permissions.get(key) == null) + log.info("Permission not found for delete: " + permission); + else + log.info("removing Permission: " + permission); + permissions.remove(key); + } + } Index: topia/src/java/org/codelutin/topia/security/TopiaPrincipal.java diff -u topia/src/java/org/codelutin/topia/security/TopiaPrincipal.java:1.2 topia/src/java/org/codelutin/topia/security/TopiaPrincipal.java:1.3 --- topia/src/java/org/codelutin/topia/security/TopiaPrincipal.java:1.2 Wed May 4 16:09:41 2005 +++ topia/src/java/org/codelutin/topia/security/TopiaPrincipal.java Fri May 20 17:51:10 2005 @@ -24,7 +24,7 @@ * Created: 29 avr. 2005 * * @author Arnaud Thimel -* @version $Revision: 1.2 $ +* @version $Revision: 1.3 $ */ @@ -37,17 +37,15 @@ protected String name; - /* - public TopiaPrincipal(String name) { - this.name = name; - } - */ - /* (non-Javadoc) * @see java.security.Principal#getName() */ public String getName() { return name; } - + + public String toString() { + return this.getClass().getName() + " : " + name; + } + } Index: topia/src/java/org/codelutin/topia/security/TopiaSimpleCallbackHandler.java diff -u topia/src/java/org/codelutin/topia/security/TopiaSimpleCallbackHandler.java:1.2 topia/src/java/org/codelutin/topia/security/TopiaSimpleCallbackHandler.java:1.3 --- topia/src/java/org/codelutin/topia/security/TopiaSimpleCallbackHandler.java:1.2 Wed May 4 16:09:41 2005 +++ topia/src/java/org/codelutin/topia/security/TopiaSimpleCallbackHandler.java Fri May 20 17:51:10 2005 @@ -24,7 +24,7 @@ * Created: 29 avr. 2005 * * @author Arnaud Thimel -* @version $Revision: 1.2 $ +* @version $Revision: 1.3 $ */ @@ -38,7 +38,10 @@ import javax.security.auth.callback.PasswordCallback; import javax.security.auth.callback.UnsupportedCallbackException; - +/** + * CallbackHandler basique compatible avec les applications Web (i.e. : on + * précise directement à l'application les login et mot de passe) + */ public class TopiaSimpleCallbackHandler implements CallbackHandler { private String username; Index: topia/src/java/org/codelutin/topia/security/TopiaUserPrincipal.java diff -u topia/src/java/org/codelutin/topia/security/TopiaUserPrincipal.java:1.2 topia/src/java/org/codelutin/topia/security/TopiaUserPrincipal.java:1.3 --- topia/src/java/org/codelutin/topia/security/TopiaUserPrincipal.java:1.2 Wed May 4 16:09:41 2005 +++ topia/src/java/org/codelutin/topia/security/TopiaUserPrincipal.java Fri May 20 17:51:10 2005 @@ -24,16 +24,19 @@ * Created: 29 avr. 2005 * * @author Arnaud Thimel -* @version $Revision: 1.2 $ +* @version $Revision: 1.3 $ */ package org.codelutin.topia.security; - +/** + * Un TopiaPrincipal identifiant un utilisateur + */ public class TopiaUserPrincipal extends TopiaPrincipal { public TopiaUserPrincipal(String name) { //super(name); this.name = "user." + name; } + } Index: topia/src/java/org/codelutin/topia/security/TopiaConfiguration.java diff -u /dev/null topia/src/java/org/codelutin/topia/security/TopiaConfiguration.java:1.1 --- /dev/null Fri May 20 17:51:15 2005 +++ topia/src/java/org/codelutin/topia/security/TopiaConfiguration.java Fri May 20 17:51:10 2005 @@ -0,0 +1,141 @@ +/* *##% + * Copyright (C) 2002, 2003, 2004, 2005 Code Lutin, + * Cédric Pineau, Benjamin Poussin, + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + *##%*/ + +/* * + * TopiaConfiguration.java + * + * Created: 10 mai 2005 + * + * @author Arnaud Thimel + * @version $Revision: 1.1 $ + */ + +package org.codelutin.topia.security; + +import java.util.HashMap; +import java.util.Map; + +import javax.security.auth.login.AppConfigurationEntry; +import javax.security.auth.login.Configuration; + +public class TopiaConfiguration extends Configuration { + + private HashMap appConfEntries; + + private static final String TOPIA_LOGIN_MODULE = "org.codelutin.topia.security.TopiaLoginModule"; + + public TopiaConfiguration() { + super(); + appConfEntries = new HashMap(); + } + + /** + * Créé une instance de TopiConfiguration avec un identifiant de + * configurationEntry et le nom du fichier de propriétés associé. + * @param name le nom de la configurationEntry + * @param contextPropertiesName le nom du fichier de propriétés + */ + public TopiaConfiguration(String name, String contextPropertiesName) { + super(); + appConfEntries = new HashMap(); + addEntry(name, contextPropertiesName); + } + + /** + * Ajoute une ConfigurationEntry avec le nom de fichier de propriétés + * associé + * @param name le nom de la configurationEntry + * @param contextPropertiesName le nom du fichier de propriétés + */ + private void addEntry(String name, String contextPropertiesName) { + AppConfigurationEntry[] confEntries = getAppConfigurationEntry(name); + if (confEntries != null) { + int i = 0; + for (; i < confEntries.length; i++) + if (TOPIA_LOGIN_MODULE.equals(confEntries[i].getLoginModuleName())) + break; + if (i == confEntries.length) { + AppConfigurationEntry[] tmpConfEntries = confEntries; + confEntries = new AppConfigurationEntry[confEntries.length + 1]; + for (int j = 0; j < confEntries.length; j++) + confEntries[j] = tmpConfEntries[j]; + confEntries[confEntries.length - 1] = createEntry(contextPropertiesName); + } else { + if ( /*Mauvais FLAG*/ + !AppConfigurationEntry.LoginModuleControlFlag.REQUIRED.equals(confEntries[i].getControlFlag()) + /*Ne contient pas la propriété*/ + || !confEntries[i].getOptions().containsKey( + "topia.app.context") + /*Propriété mal initialisée*/ + || !confEntries[i].getOptions().get("topia.app.context").equals( + contextPropertiesName)) + confEntries[i] = createEntry(contextPropertiesName, + confEntries[i].getOptions()); + } + } else { + confEntries = new AppConfigurationEntry[1]; + confEntries[0] = createEntry(contextPropertiesName); + } + appConfEntries.put(name, confEntries); + } + + /** + * Créé une entry avec des options vides + * @param contextPropertiesName le nom du fichier de propriétés + * @return l'entry créée + */ + private AppConfigurationEntry createEntry(String contextPropertiesName) { + return createEntry(contextPropertiesName, null); + } + + /** + * Créé une entry en rajoutant les options nécessaires à l'attribut options + * @param contextPropertiesName le nom du fichier de propriétés + * @param options l'objet contenant les options précédentes + * @return l'entry créée + */ + private AppConfigurationEntry createEntry(String contextPropertiesName, + Map options) { + if (options == null) + options = new HashMap(); + options.put("topia.app.context", contextPropertiesName); + return new AppConfigurationEntry(TOPIA_LOGIN_MODULE, + AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, options); + } + + /* (non-Javadoc) + * @see javax.security.auth.login.Configuration#getAppConfigurationEntry(java.lang.String) + */ + /** + * Renvoie les entries associéess à l'attribut name + * @param name l'identifiant des entries demandées + * @return un tableau cotenant les entries demandées + */ + public AppConfigurationEntry[] getAppConfigurationEntry(String name) { + return (AppConfigurationEntry[]) appConfEntries.get(name); + } + + /* (non-Javadoc) + * @see javax.security.auth.login.Configuration#refresh() + */ + public void refresh() { + } + +} Index: topia/src/java/org/codelutin/topia/security/TopiaPermissionEvent.java diff -u /dev/null topia/src/java/org/codelutin/topia/security/TopiaPermissionEvent.java:1.1 --- /dev/null Fri May 20 17:51:15 2005 +++ topia/src/java/org/codelutin/topia/security/TopiaPermissionEvent.java Fri May 20 17:51:10 2005 @@ -0,0 +1,70 @@ +/* *##% +* Copyright (C) 2002, 2003, 2004, 2005 Code Lutin, +* Cédric Pineau, Benjamin Poussin, +* +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program 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 General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*##%*/ + +/* * +* TopiaPermissionEvent.java +* +* Created: 13 mai 2005 +* +* @author Arnaud Thimel +* @version $Revision: 1.1 $ +*/ + + +package org.codelutin.topia.security; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.EventObject; +import java.util.List; + + +public class TopiaPermissionEvent extends EventObject { + + protected List permissions; + protected long date = 0; + + public TopiaPermissionEvent(Object source, TopiaPermission perm) { + super (source); + date = System.currentTimeMillis(); + List permissions = new ArrayList(); + permissions.add(perm); + this.permissions = Collections.unmodifiableList(permissions); + } + + public TopiaPermissionEvent(Object source, List permissions) { + super (source); + date = System.currentTimeMillis(); + this.permissions = Collections.unmodifiableList(permissions); + } + + public List getPermissions() { + return permissions; + } + + public Date getCreationDate() { + return new Date(date); + } + + public String toString() { + return "Event on " + permissions; + } +} Index: topia/src/java/org/codelutin/topia/security/TopiaPermissionListener.java diff -u /dev/null topia/src/java/org/codelutin/topia/security/TopiaPermissionListener.java:1.1 --- /dev/null Fri May 20 17:51:15 2005 +++ topia/src/java/org/codelutin/topia/security/TopiaPermissionListener.java Fri May 20 17:51:10 2005 @@ -0,0 +1,49 @@ +/* *##% +* Copyright (C) 2002, 2003, 2004, 2005 Code Lutin, +* Cédric Pineau, Benjamin Poussin, +* +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License +* as published by the Free Software Foundation; either version 2 +* of the License, or (at your option) any later version. +* +* This program 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 General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*##%*/ + +/* * +* TopiaPermissionListener.java +* +* Created: 13 mai 2005 +* +* @author Arnaud Thimel +* @version $Revision: 1.1 $ +*/ + + +package org.codelutin.topia.security; + +import java.util.EventListener; + +public interface TopiaPermissionListener extends EventListener { + /** + * Appelé lorsqu'une ou plusieurs permissions ont été créées + */ + public void permissionAdded(TopiaPermissionEvent event); + /** + * Appelé lorsqu'une ou plusieurs permissions ont été modifiées + */ + public void permissionModified(TopiaPermissionEvent event); + /** + * Appelé lorsqu'une ou plusieurs permissions ont été supprimées + */ + public void permissionRemoved(TopiaPermissionEvent event); + +}