Author: bpoussin Date: 2012-08-23 11:04:02 +0200 (Thu, 23 Aug 2012) New Revision: 1502 Url: http://nuiton.org/repositories/revision/wikitty/1502 Log: Evolution #1871: Change query in Security service to add condition on user logged for right management (debut d'implantation) Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceAuthorisation.java Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java 2012-08-23 08:23:10 UTC (rev 1501) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/query/WikittyQuery.java 2012-08-23 09:04:02 UTC (rev 1502) @@ -34,6 +34,7 @@ import org.nuiton.wikitty.query.conditions.Condition; import org.nuiton.wikitty.entities.Element; import org.nuiton.wikitty.entities.ElementField; +import org.nuiton.wikitty.query.conditions.Select; /** * Classe permettant de faire des recherches dans les données. @@ -107,6 +108,15 @@ dangereuse pour les performances. */ protected int wikittyFieldSearchDepth = 0; + /** + * indique si dans les resultats on doit ajouter les id des objets que + * l'utilisateur ne peut pas lire. + * par defaut on ne remonte pas les objets que l'utilisateur ne peut pas lire. + * Si vrai alors on ne remonte pas les objets, si faux et que la requete + * n'est pas un select on remonte les objets non lisible + */ + protected boolean checkAuthorisation = true; + /** create anonymous query */ public WikittyQuery() { } @@ -115,6 +125,27 @@ setCondition(condition); } + /** + * indique si dans les resultats on doit ajouter les id des objets que + * l'utilisateur ne peut pas lire. + * par defaut on ne remonte pas les objets que l'utilisateur ne peut pas lire. + * Si vrai alors on ne remonte pas les objets, si faux et que la requete + * n'est pas un select on remonte les objets non lisible + * + * si checkAuthorisation est: + * <li>true alors filtre actif + * <li>false et requete sans select alors filtre inactif + * <li>false et requete select alors filtre <strong>actif</strong> + */ + public boolean isCheckAuthorisation() { + boolean result = checkAuthorisation || condition instanceof Select; + return result; + } + + public void setCheckAuthorisation(boolean checkAuthorisation) { + this.checkAuthorisation = checkAuthorisation; + } + public WikittyQuery copy() { WikittyQueryVisitorCopy v = new WikittyQueryVisitorCopy(); accept(v); Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceAuthorisation.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceAuthorisation.java 2012-08-23 08:23:10 UTC (rev 1501) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/services/WikittyServiceAuthorisation.java 2012-08-23 09:04:02 UTC (rev 1502) @@ -24,6 +24,11 @@ */ package org.nuiton.wikitty.services; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Set; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -43,15 +48,9 @@ import org.nuiton.wikitty.entities.WikittyTreeNode; import org.nuiton.wikitty.query.WikittyQuery; import org.nuiton.wikitty.query.WikittyQueryMaker; +import org.nuiton.wikitty.query.WikittyQueryResult; +import org.nuiton.wikitty.query.WikittyQueryResultTreeNode; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Set; - -import static org.nuiton.i18n.I18n._; - /** * Cette classe gere les autorisations d'acces en utilisant les * WikittyAuthorization, il faut donc que la personne soit loggue et donc @@ -97,16 +96,6 @@ } @Override - public void addWikittyServiceListener(WikittyListener listener, ServiceListenerType type) { - getDelegate().addWikittyServiceListener(listener, type); - } - - @Override - public void removeWikittyServiceListener(WikittyListener listener, ServiceListenerType type) { - getDelegate().addWikittyServiceListener(listener, type); - } - - @Override public WikittyEvent clear(String securityToken) { String userId = getUserId(securityToken); if (isAppAdmin(securityToken, userId)) { @@ -114,7 +103,9 @@ WikittyEvent result = getDelegate().clear(securityToken); return result; } else { - throw new SecurityException(_("user %s can't clear data", userId)); + throw new SecurityException(String.format( + "user %s can't clear data", + userId)); } } @@ -135,7 +126,9 @@ // peut sortir de la boucle break; } else { - throw new SecurityException(_("user %s can't clear data", userId)); + throw new SecurityException(String.format( + "user %s can't replay data", + userId)); } } if (e.getType().contains(WikittyEvent.WikittyEventType.PUT_WIKITTY)) { @@ -190,7 +183,96 @@ return result; } + @Override + public List<Wikitty> restore(String securityToken, List<String> ids) { + String userId = getUserId(securityToken); + List<Wikitty> wikitties = getDelegate().restore(securityToken, ids); + + long start = TimeLog.getTime(); + for (Wikitty wikitty : wikitties) { + if (wikitty != null) { + refuseUnauthorizedRead(securityToken, userId, wikitty); + } + } + timeLog.log(start, "restore"); + return wikitties; + } + /** + * Ajoute dans les queries si demande (WikittyQuery#checkAuthorisation) ou si + * necessaire (WikittyQuery commence par un Select) une condition supplementaire + * qui filtre les objets remontes en fonction de ce qu'a le droit l'utilisateur + * courant. + * @param securityToken + * @param queries + * @return + */ + @Override + public List<WikittyQueryResult<String>> findAllByQuery( + String securityToken, List<WikittyQuery> queries) { + List<WikittyQuery> qs = new ArrayList<WikittyQuery>(queries.size()); + for (WikittyQuery q : queries) { + if (q != null && q.isCheckAuthorisation()) { + q = addAuthorisationCondition(q); + } + qs.add(q); + } + return super.findAllByQuery(securityToken, qs); + } + + /** + * Ajoute dans les queries si demande (WikittyQuery#checkAuthorisation) ou si + * necessaire (WikittyQuery commence par un Select) une condition supplementaire + * qui filtre les objets remontes en fonction de ce qu'a le droit l'utilisateur + * courant. + * @param securityToken + * @param queries + * @return + */ + @Override + public List<String> findByQuery(String securityToken, List<WikittyQuery> queries) { + List<WikittyQuery> qs = new ArrayList<WikittyQuery>(queries.size()); + for (WikittyQuery q : queries) { + if (q != null && q.isCheckAuthorisation()) { + q = addAuthorisationCondition(q); + } + qs.add(q); + } + return super.findByQuery(securityToken, qs); + } + + /** + * Ajoute dans filter (si non null) et si demande (WikittyQuery#checkAuthorisation) + * une condition supplementaire qui filtre les objets remontes en fonction + * de ce qu'a le droit l'utilisateur courant. + * + * @param securityToken + * @param queries + * @return + */ + @Override + public WikittyQueryResultTreeNode<String> findTreeNode( + String securityToken, String wikittyId, int depth, boolean count, WikittyQuery filter) { + if (filter != null && filter.isCheckAuthorisation()) { + filter = addAuthorisationCondition(filter); + } + return super.findTreeNode(securityToken, wikittyId, depth, count, filter); + } + + /** + * Ajoute une condition pour filtre en plus les objets seulement lisible + * par l'utilisateur loggue. + * @param q La requete a modifier + * @return une nouvelle requete avec la clause en plus + */ + protected WikittyQuery addAuthorisationCondition(WikittyQuery q) { + // FIXME poussin 20120823 a implanter, il faut trouver la bonne + // requete en fonction du stockage des droits dans solr. + // il faut donc faire un point sur le stockage des droits + return q; + } + + /** * Indique si on a bien le droit d'enregistrer tout les wikitties de la * collection. Des que pour un wikitty on a pas les droits, une exception * est levee. @@ -225,7 +307,7 @@ boolean canCreate = extensionRights == null || canRead(securityToken, userId, null, extensionRights); if ( ! canCreate ) { - throw new SecurityException(_( + throw new SecurityException(String.format( "user %s can't create instance of extension %s", userId, extensionRights)); } @@ -271,11 +353,12 @@ // Object newValue = wikitty.getFqField(fqFieldDirtyName); // oldVersion.setFqField(fqFieldDirtyName, newValue); // } else { -// throw new SecurityException(_("user %s can't write field %s on wikitty %s", +// throw new SecurityException(String.format("user %s can't write field %s on wikitty %s", // userId, fqFieldDirtyName, wikitty)); // } if (!canChange) { - throw new SecurityException(_("user %s can't write field %s on wikitty %s", + throw new SecurityException(String.format( + "user %s can't write field %s on wikitty %s", userId, fqFieldDirtyName, wikitty)); } } @@ -283,21 +366,6 @@ } } - @Override - public List<Wikitty> restore(String securityToken, List<String> ids) { - String userId = getUserId(securityToken); - List<Wikitty> wikitties = getDelegate().restore(securityToken, ids); - - long start = TimeLog.getTime(); - for (Wikitty wikitty : wikitties) { - if (wikitty != null) { - refuseUnauthorizedRead(securityToken, userId, wikitty); - } - } - timeLog.log(start, "restore"); - return wikitties; - } - /** throw an exception if read is not allowed */ protected void refuseUnauthorizedRead( String securityToken, String userId, @@ -305,7 +373,7 @@ if (wikitty != null) { for (String extensionName : wikitty.getExtensionNames()) { if ( ! canRead(securityToken, userId, extensionName, wikitty)) { - throw new SecurityException(_( + throw new SecurityException(String.format( "user %s can't read extension %s on wikitty %s," + " it may be due to a global policy on the wikitty", userId, extensionName, wikitty)); @@ -416,7 +484,7 @@ if (wikitty != null) { for (String extensionName : wikitty.getExtensionNames()) { if ( ! canWrite(securityToken, userId, extensionName, wikitty)) { - throw new SecurityException(_( + throw new SecurityException(String.format( "user %s doesn't have rights on extension %s on wikitty %s", userId, extensionName, wikitty)); } @@ -485,7 +553,9 @@ // canWrite is true if this user can modify the field for this extension boolean canWrite = canWrite(securityToken, userId, null, extensionAuthorisation); if ( ! canWrite) { - throw new SecurityException(_("user %s don't have write right for extension %s", userId, extension)); + throw new SecurityException(String.format( + "user %s don't have write right for extension %s", + userId, extension)); } } } @@ -552,7 +622,8 @@ // seul les AppAdmin on le droit a cette method getDelegate().syncSearchEngine(securityToken); } else { - throw new SecurityException(_("user %s can't sync search engine", + throw new SecurityException(String.format( + "user %s can't sync search engine", getUserId(securityToken))); } }