Author: bpoussin Date: 2010-06-08 15:16:36 +0200 (Tue, 08 Jun 2010) New Revision: 109 Url: http://nuiton.org/repositories/revision/wikitty/109 Log: avancement de l'implantation de la securite - (re)modif de PagedResult tout compile et les tests passent donc tout doit fonctionner comme avant Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/PagedResult.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyProxy.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyService.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceCached.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceImpl.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceNotifier.java trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceSecurity.java trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/WikittySearchEnginSolr.java trunk/wikitty-solr-impl/src/test/java/org/nuiton/wikitty/solr/test/SolrServerTest.java Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/PagedResult.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/PagedResult.java 2010-06-08 12:59:39 UTC (rev 108) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/PagedResult.java 2010-06-08 13:16:36 UTC (rev 109) @@ -50,8 +50,6 @@ protected List<T> results; /** facet asked or null if no facet */ protected Map<String, List<FacetTopic>> facets; - /** securityToken of user that generate this PagedResult */ - protected String securityToken; /** * we don't initialize securityToken @@ -72,35 +70,6 @@ } /** - * Create PagedResult and initialize securityToken - * - * @param secuirtyToken - * @param firstIndice - * @param numFound - * @param queryString - * @param facets - * @param results - */ - public PagedResult(String securityToken, int firstIndice, int numFound, String queryString, - Map<String, List<FacetTopic>> facets, List<T> results) { - this.securityToken = securityToken; - this.firstIndice = firstIndice; - this.numFound = numFound; - this.queryString = queryString; - this.facets = facets; - this.results = Collections.unmodifiableList(results); - } - - /** - * initialize/set securityToken - * - * @param securityToken - */ - public void setSecurityToken(String securityToken) { - this.securityToken = securityToken; - } - - /** * Convert all result to the wanted type and return new PagedResult with * this new result list. If some result don't have the right extension (clazz) * this extension is automatically added if autoconvert is true. Else @@ -117,7 +86,8 @@ * @return new PagedResult */ public <E extends BusinessEntityWikitty> PagedResult<E> cast( - WikittyService wikittyService, Class<E> clazz, boolean autoconvert) { + String securityToken, WikittyService wikittyService, + Class<E> clazz, boolean autoconvert) { List<E> castedResult = new ArrayList<E>(results.size()); E sample = WikittyUtil.newInstance(clazz); Collection<WikittyExtension> wantedExtension = sample.getStaticExtensions(); @@ -150,7 +120,7 @@ } } } - PagedResult<E> result = new PagedResult<E>(securityToken, + PagedResult<E> result = new PagedResult<E>( firstIndice, numFound, queryString, facets, castedResult); return result; } Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyProxy.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyProxy.java 2010-06-08 12:59:39 UTC (rev 108) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyProxy.java 2010-06-08 13:16:36 UTC (rev 109) @@ -224,7 +224,7 @@ securityToken, criteria); // we can use autoconvert = true because search by example add automaticaly // restriction on extension - PagedResult<E> result = (PagedResult<E>)pagedResult.cast( + PagedResult<E> result = (PagedResult<E>)pagedResult.cast(securityToken, wikittyService, e.getClass(), true); return result; } @@ -302,7 +302,8 @@ // we can cast with autoconvert true because we have add restriction // on extension - PagedResult<E> result = (PagedResult<E>)pagedResult.cast(wikittyService, sample.getClass(), true); + PagedResult<E> result = (PagedResult<E>)pagedResult.cast(securityToken, + wikittyService, sample.getClass(), true); return result; } Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyService.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyService.java 2010-06-08 12:59:39 UTC (rev 108) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyService.java 2010-06-08 13:16:36 UTC (rev 109) @@ -102,6 +102,44 @@ public void clear(String securityToken); /** + * Verifie si l'utilisateur lie au securityToken a le droit d'ecrire + * le Wikitty passe en argument + * + * @param securityToken le token de securite qui permet de retrouver + * l'utilisateur et ainsi verifier les droits + * @param wikitty le wikitty a sauver + * @return vrai si l'utilisateur peut sauver l'objet + */ + public boolean canWrite(String securityToken, Wikitty wikitty); + + /** + * Verifie que l'utilisateur associe au securityToken peut supprimer le + * wikitty dont on passe l'identifiant. Seul le propriétaire de l'objet + * ou un admin peut supprimer un objet. + * + * Si l'id de l'objet est invalide, la methode retourne true, car la + * suppression d'un id invalide ne fait rien + * + * @param securityToken + * @param wikittyId + * @return vrai le la suppression ne posera pas de probleme. + */ + public boolean canDelete(String securityToken, String wikittyId); + + /** + * Un utilisateur peu lire un objet, s'il est Reader ou a defaut: + * - owner + * - AppAdmin + * - Admin + * - Writer + * + * @param securityToken + * @param id + * @return vrai si l'utilisateur peut lire l'obbjet + */ + public boolean canRead(String securityToken, String wikittyId); + + /** * Manage Update and creation. * * @param wikitty contains an id all the time. Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceCached.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceCached.java 2010-06-08 12:59:39 UTC (rev 108) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceCached.java 2010-06-08 13:16:36 UTC (rev 109) @@ -99,12 +99,36 @@ } @Override + public String login(String login, String password) { + return ws.login(login, password); + } + + @Override + public void logout(String securityToken) { + ws.logout(securityToken); + } + + @Override + public boolean canWrite(String securityToken, Wikitty wikitty) { + return ws.canWrite(securityToken, wikitty); + } + + @Override + public boolean canDelete(String securityToken, String wikittyId) { + return ws.canDelete(securityToken, wikittyId); + } + + @Override + public boolean canRead(String securityToken, String wikittyId) { + return ws.canRead(securityToken, wikittyId); + } + + @Override public void clear(String securityToken) { ws.clear(securityToken); cache.clearWikitty(); } - /** * Override to refresh wikitty after put label * @param wikittyId @@ -513,16 +537,6 @@ } @Override - public String login(String login, String password) { - return ws.login(login, password); - } - - @Override - public void logout(String securityToken) { - ws.logout(securityToken); - } - - @Override public UpdateResponse syncEngin(String securityToken) { return ws.syncEngin(securityToken); } Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceImpl.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceImpl.java 2010-06-08 12:59:39 UTC (rev 108) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceImpl.java 2010-06-08 13:16:36 UTC (rev 109) @@ -116,6 +116,21 @@ } @Override + public boolean canWrite(String securityToken, Wikitty wikitty) { + return true; + } + + @Override + public boolean canDelete(String securityToken, String wikittyId) { + return true; + } + + @Override + public boolean canRead(String securityToken, String wikittyId) { + return true; + } + + @Override public UpdateResponse store(String securityToken, WikittyTransaction transaction, Collection<Wikitty> wikitties, boolean disableAutoVersionIncrement) { // update/store extension if necessary @@ -579,7 +594,6 @@ List<String> ids = resultIds.getAll(); List<Wikitty> wikitties = restore(securityToken, transaction, ids); PagedResult<Wikitty> result = new PagedResult<Wikitty>( - securityToken, resultIds.getFirstIndice(), resultIds.getNumFound(), resultIds.getQueryString(), Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceNotifier.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceNotifier.java 2010-06-08 12:59:39 UTC (rev 108) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceNotifier.java 2010-06-08 13:16:36 UTC (rev 109) @@ -172,6 +172,21 @@ ws.logout(securityToken); } + @Override + public boolean canWrite(String securityToken, Wikitty wikitty) { + return ws.canWrite(securityToken, wikitty); + } + + @Override + public boolean canDelete(String securityToken, String wikittyId) { + return ws.canDelete(securityToken, wikittyId); + } + + @Override + public boolean canRead(String securityToken, String wikittyId) { + return ws.canRead(securityToken, wikittyId); + } + public void clear(String securityToken) { ws.clear(securityToken); } Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceSecurity.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceSecurity.java 2010-06-08 12:59:39 UTC (rev 108) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyServiceSecurity.java 2010-06-08 13:16:36 UTC (rev 109) @@ -17,6 +17,7 @@ package org.nuiton.wikitty; +import static org.nuiton.i18n.I18n._; import java.util.Collection; import java.util.List; @@ -61,17 +62,17 @@ Wikitty wToken = new Wikitty(token); // force add extension to wikitty SecurityToken securityToken = new SecurityTokenImpl(wToken); - // on passe null comme toke, car on est dans le service de secu - // normalement il ne devrait pas y en avoir d'autre - ws.store(null, wToken); + // on passe token comme securityToken, mais il ne me semble pas + // que ce soit tres utile, mais comme ca c'est uniform + ws.store(token, wToken); return token; } @Override public void logout(String securityToken) { - // on passe null comme toke, car on est dans le service de secu - // normalement il ne devrait pas y en avoir d'autre - ws.delete(null, securityToken); + // on passe securityToken comme token, mais il ne me semble pas + // que ce soit tres utile, mais comme ca c'est uniform + ws.delete(securityToken, securityToken); } @Override @@ -80,64 +81,219 @@ // seul les AppAdmin on le droit a cette method } + /** + * Prepare l'ecriture en ajoutant s'il le faut l'extension + * WikittyAuthorisation et en fixant l'owner a l'utilisateur courant + * + * @param securityToken le token de securite qui permet de retrouver + * l'utilisateur + * @param wikitty le wikitty a sauver + */ + protected void prepareWrite(String securityToken, Wikitty wikitty) { + Wikitty oldVersion = ws.restore(securityToken, wikitty.getId()); + if (oldVersion == null) { + // creation d'une nouvelle entity, on a des choses a faire + + // recuperation de l'utilisateur associe au securityToken + Wikitty securityTokenWikitty = ws.restore(securityToken, securityToken); + String userId = securityTokenWikitty.getFieldAsWikitty( + SecurityToken.EXT_SECURITYTOKEN, SecurityToken.FIELD_USER); + + // on ajoute et on fixe les droits par defaut + WikittyAuthorisation auth = new WikittyAuthorisationImpl(wikitty); + auth.setOwner(userId); + } + } + @Override + public boolean canWrite(String securityToken, Wikitty wikitty) { + boolean result = false; + + String userId = getUserId(securityToken); + // + // check security + // + + // recuperation de l'ancienne version de l'objet pour verifier les droits + Wikitty oldVersion = ws.restore(securityToken, wikitty.getId()); + if (oldVersion == null) { + // creation d'une nouvelle entity + + // on verifie que l'on a le droit de creer une entity avec cette extension + // TODO poussin 20100607 trouver ou mettre l'autorisation qui retient l'information de qui a le droit de cree une extension + result = true; + } else { + // modification d'une entity existante + + // si c'est le owner il a tous les droits, a defaut les admins + // peuvent aussi le modifier + result = + // owner et admin peuvent tout modifier + isOwner(userId, oldVersion) || isAppAdmin(userId) + || isAdmin(userId, oldVersion) + // un writer ne peut pas modifier l'extension d'autorisation + || (WikittyAuthorisationAbstract.equals(oldVersion, wikitty) + && isWriter(userId, oldVersion)); + } + return result; + } + + @Override + public boolean canDelete(String securityToken, String wikittyId) { + boolean result = false; + + // + // check security + // + + // recuperation de l'ancienne version de l'objet pour verifier les droits + Wikitty oldVersion = ws.restore(securityToken, wikittyId); + if (oldVersion == null) { + // l'objet n'existe pas donc la suppression retourne true + result = true; + } else { + // suppresion d'une entity existante + String userId = getUserId(securityToken); + + // si c'est le owner il a tous les droits, a defaut les admins + // peuvent aussi le supprimer + result = + // owner et admin peuvent tout modifier + isOwner(userId, oldVersion) || isAppAdmin(userId) + || isAdmin(userId, oldVersion); + } + return result; + } + + @Override + public boolean canRead(String securityToken, String wikittyId) { + // recuperation de l'utilisateur associe au securityToken + Wikitty securityTokenWikitty = ws.restore(securityToken, securityToken); + String userId = securityTokenWikitty.getFieldAsWikitty( + SecurityToken.EXT_SECURITYTOKEN, SecurityToken.FIELD_USER); + + // + // check security + // + + // recuperation de l'objet pour verifier les droits + Wikitty w = ws.restore(securityToken, wikittyId); + boolean result = isReader(userId, w) || isOwner(userId, w) + || isAppAdmin(userId) || isAdmin(userId, w) + || isWriter(userId, w); + return result; + } + + @Override public UpdateResponse store(String securityToken, Wikitty wikitty) { - throw new UnsupportedOperationException("Not supported yet."); + if (canWrite(securityToken, wikitty)) { + prepareWrite(securityToken, wikitty); + UpdateResponse result = ws.store(securityToken, wikitty); + return result; + } else { + throw new SecurityException(_("user %s can't modify object %s", + getUserId(securityToken), wikitty.getId())); + } } @Override public UpdateResponse store(String securityToken, Collection<Wikitty> wikitties) { - throw new UnsupportedOperationException("Not supported yet."); + for (Wikitty w : wikitties) { + if (!canWrite(securityToken, w)) { + throw new SecurityException(_("user %s can't modify object %s", + getUserId(securityToken), w.getId())); + } + } + for (Wikitty w : wikitties) { + prepareWrite(securityToken, w); + } + UpdateResponse result = ws.store(securityToken, wikitties); + return result; } @Override public UpdateResponse store(String securityToken, Collection<Wikitty> wikitties, boolean disableAutoVersionIncrement) { - throw new UnsupportedOperationException("Not supported yet."); + for (Wikitty w : wikitties) { + if (!canWrite(securityToken, w)) { + throw new SecurityException(_("user %s can't modify object %s", + getUserId(securityToken), w.getId())); + } + } + for (Wikitty w : wikitties) { + prepareWrite(securityToken, w); + } + UpdateResponse result = ws.store(securityToken, wikitties, disableAutoVersionIncrement); + return result; } @Override - public UpdateResponse store(String securityToken, WikittyTransaction transaction, Collection<Wikitty> wikitties, boolean disableAutoVersionIncrement) { - throw new UnsupportedOperationException("Not supported yet."); - } + public UpdateResponse store(String securityToken, WikittyTransaction transaction, + Collection<Wikitty> wikitties, boolean disableAutoVersionIncrement) { + for (Wikitty w : wikitties) { + if (!canWrite(securityToken, w)) { + throw new SecurityException(_("user %s can't modify object %s", + getUserId(securityToken), w.getId())); + } + } + for (Wikitty w : wikitties) { + prepareWrite(securityToken, w); + } + UpdateResponse result = ws.store(securityToken, transaction, wikitties, + disableAutoVersionIncrement); + return result; + } @Override public List<String> getAllExtensionIds(String securityToken) { - throw new UnsupportedOperationException("Not supported yet."); + // All people can read extension + return ws.getAllExtensionIds(securityToken); } @Override - public List<String> getAllExtensionsRequires(String securityToken, String extensionName) { - throw new UnsupportedOperationException("Not supported yet."); + public List<String> getAllExtensionsRequires( + String securityToken, String extensionName) { + // All people can read extension + return ws.getAllExtensionsRequires(securityToken, extensionName); } @Override - public UpdateResponse storeExtension(String securityToken, WikittyExtension ext) { - throw new UnsupportedOperationException("Not supported yet."); + public UpdateResponse storeExtension( + String securityToken, WikittyExtension ext) { + // TODO poussin 20100607 check security + return ws.storeExtension(securityToken, ext); } @Override - public UpdateResponse storeExtension(String securityToken, Collection<WikittyExtension> exts) { - throw new UnsupportedOperationException("Not supported yet."); + public UpdateResponse storeExtension(String securityToken, + Collection<WikittyExtension> exts) { + // TODO poussin 20100607 check security + return ws.storeExtension(securityToken, exts); } @Override - public UpdateResponse storeExtension(String securityToken, WikittyTransaction transaction, Collection<WikittyExtension> exts) { - throw new UnsupportedOperationException("Not supported yet."); + public UpdateResponse storeExtension(String securityToken, + WikittyTransaction transaction, Collection<WikittyExtension> exts) { + // TODO poussin 20100607 check security + return ws.storeExtension(securityToken, transaction, exts); } @Override public WikittyExtension restoreExtension(String securityToken, String id) { - throw new UnsupportedOperationException("Not supported yet."); + // All people can read extension + return ws.restoreExtension(securityToken, id); } @Override - public WikittyExtension restoreExtension(String securityToken, WikittyTransaction transaction, String id) { - throw new UnsupportedOperationException("Not supported yet."); + public WikittyExtension restoreExtension(String securityToken, + WikittyTransaction transaction, String id) { + // All people can read extension + return ws.restoreExtension(securityToken, transaction, id); } @Override public WikittyExtension restoreExtensionLastVersion(String securityToken, String name) { - throw new UnsupportedOperationException("Not supported yet."); + // All people can read extension + return ws.restoreExtensionLastVersion(securityToken, name); } @Override @@ -147,82 +303,269 @@ @Override public Wikitty restore(String securityToken, String id) { - throw new UnsupportedOperationException("Not supported yet."); + Wikitty result = null; + if (canRead(securityToken, id)) { + result = ws.restore(securityToken, id); + } else { + throw new SecurityException(_("user %s can't read object %s", + getUserId(securityToken), id)); + } + return result; } @Override - public List<Wikitty> restore(String securityToken, List<String> id) { - throw new UnsupportedOperationException("Not supported yet."); + public List<Wikitty> restore(String securityToken, List<String> ids) { + for (String id : ids) { + if (!canRead(securityToken, id)) { + throw new SecurityException(_("user %s can't read object %s", + getUserId(securityToken), id)); + } + } + + return ws.restore(securityToken, ids); } @Override public void delete(String securityToken, String id) { - throw new UnsupportedOperationException("Not supported yet."); + if (canDelete(securityToken, id)) { + ws.delete(securityToken, id); + } } @Override public void delete(String securityToken, Collection<String> ids) { - throw new UnsupportedOperationException("Not supported yet."); + for (String id : ids) { + if (!canDelete(securityToken, id)) { + throw new SecurityException(_("user %s can't delete object %s", + getUserId(securityToken), id)); + } + } + + ws.delete(securityToken, ids); } @Override public PagedResult<Wikitty> findAllByCriteria(String securityToken, Criteria criteria) { - throw new UnsupportedOperationException("Not supported yet."); + // TODO poussin 20100607 check security + return ws.findAllByCriteria(securityToken, criteria); } @Override - public PagedResult<Wikitty> findAllByCriteria(String securityToken, WikittyTransaction transaction, Criteria criteria) { - throw new UnsupportedOperationException("Not supported yet."); + public PagedResult<Wikitty> findAllByCriteria(String securityToken, + WikittyTransaction transaction, Criteria criteria) { + // TODO poussin 20100607 check security + return ws.findAllByCriteria(securityToken, transaction, criteria); } @Override public Wikitty findByCriteria(String securityToken, Criteria criteria) { - throw new UnsupportedOperationException("Not supported yet."); + // TODO poussin 20100607 check security + return ws.findByCriteria(securityToken, criteria); } @Override public void addLabel(String securityToken, String wikittyId, String label) { - throw new UnsupportedOperationException("Not supported yet."); + // TODO poussin 20100607 check security + ws.addLabel(securityToken, wikittyId, label); } @Override - public PagedResult<Wikitty> findAllByLabel(String securityToken, String label, int firstIndex, int endIndex) { - throw new UnsupportedOperationException("Not supported yet."); + public PagedResult<Wikitty> findAllByLabel(String securityToken, + String label, int firstIndex, int endIndex) { + // TODO poussin 20100607 check security + return ws.findAllByLabel(securityToken, label, firstIndex, endIndex); } @Override public Wikitty findByLabel(String securityToken, String label) { - throw new UnsupportedOperationException("Not supported yet."); + // TODO poussin 20100607 check security + return ws.findByLabel(securityToken, label); } @Override public Set<String> findAllAppliedLabels(String securityToken, String wikittyId) { - throw new UnsupportedOperationException("Not supported yet."); + // TODO poussin 20100607 check security + return ws.findAllAppliedLabels(securityToken, wikittyId); } @Override public Tree restoreTree(String securityToken, String wikittyId) { - throw new UnsupportedOperationException("Not supported yet."); + // TODO poussin 20100607 check security + return ws.restoreTree(securityToken, wikittyId); } @Override public Entry<TreeNode, Integer> restoreNode(String securityToken, String wikittyId, Criteria filter) { - throw new UnsupportedOperationException("Not supported yet."); + // TODO poussin 20100607 check security + return ws.restoreNode(securityToken, wikittyId, filter); } @Override public Map<TreeNode, Integer> restoreChildren(String securityToken, String wikittyId, Criteria filter) { - throw new UnsupportedOperationException("Not supported yet."); + // TODO poussin 20100607 check security + return ws.restoreChildren(securityToken, wikittyId, filter); } @Override public Wikitty restoreVersion(String securityToken, String wikittyId, String version) { - throw new UnsupportedOperationException("Not supported yet."); + // TODO poussin 20100607 check security + return ws.restoreVersion(securityToken, wikittyId, version); } @Override public UpdateResponse syncEngin(String securityToken) { - throw new UnsupportedOperationException("Not supported yet."); + // TODO poussin 20100607 check security + return ws.syncEngin(securityToken); } + + // + // Method helper to check right + // + + /** + * Recupere l'identifiant de l'utilisateur associe au securityToken + * + * @param securityToken + * @return l'identifiant de l'utilisateur, ou null si le token est invalide + */ + protected String getUserId(String securityToken) { + String result = null; + // recuperation de l'utilisateur associe au securityToken + Wikitty securityTokenWikitty = ws.restore(securityToken, securityToken); + if (securityTokenWikitty != null) { + result = securityTokenWikitty.getFieldAsWikitty( + SecurityToken.EXT_SECURITYTOKEN, SecurityToken.FIELD_USER); + } + return result; + } + + + /** + * Verifie que l'utilisateur est bien le proprietaire de l'objet + * + * @param userId + * @param w + * @return + */ + protected boolean isOwner(String userId, Wikitty w) { + boolean result = false; + if (w.hasExtension(WikittyAuthorisation.EXT_WIKITTYAUTHORISATION)) { + String owner = w.getFieldAsWikitty( + WikittyAuthorisation.EXT_WIKITTYAUTHORISATION, + WikittyAuthorisation.FIELD_OWNER); + result = userId.equals(owner); + } + return result; + } + + /** + * verifie que l'utilisateur est dans la liste des admin + * + * @param userId + * @param w + * @return vrai si et seulement si l'utilisateur est dans la liste des + * admin + */ + protected boolean isAdmin(String userId, Wikitty w) { + boolean result = isMember(userId, w, WikittyAuthorisation.FIELD_ADMIN); + return result; + } + + /** + * verifie que l'utilisateur est dans la liste des writer + * + * @param userId + * @param w + * @return vrai si et seulement si l'utilisateur est dans la liste des + * writers + */ + protected boolean isWriter(String userId, Wikitty w) { + boolean result = isMember(userId, w, WikittyAuthorisation.FIELD_WRITER); + return result; + } + + /** + * Par defaut un objet est lisible par tous, sauf s'il a l'extension + * d'autorisation et que la liste des readers existe et n'est pas vide + * + * @param userId + * @param w + * @return true si l'utilisateur est dans la liste des reader (ou que cette + * liste n'existe pas ce qui indique que tout le monde est reader) + */ + protected boolean isReader(String userId, Wikitty w) { + boolean result = true; + if (w.hasExtension(WikittyAuthorisation.EXT_WIKITTYAUTHORISATION)) { + Set<String> groupOrUser = w.getFieldAsSet( + WikittyAuthorisation.EXT_WIKITTYAUTHORISATION, + WikittyAuthorisation.FIELD_READER, + String.class); + if (!(groupOrUser == null || groupOrUser.size() == 0)) { + result = isMember(userId, w, WikittyAuthorisation.FIELD_READER); + } + } + return result; + } + + /** + * Verifie si l'utilisateur est considere comme un AppAdmin + * + * @param userId + * @return + */ + protected boolean isAppAdmin(String userId) { + // TODO poussin 20100607 verifier que l'utilisateur est un AppAdmin ou non + return false; + } + + /** + * verifie qu'un utilisateur est membre d'un groupe passe en parametre via + * l'arguement field + * + * @param userId + * @param w + * @param field must be WikittyAuthorisation field name: admin, writer, reader + * @return + */ + protected boolean isMember(String userId, Wikitty w, String field) { + boolean result = false; + if (w.hasExtension(WikittyAuthorisation.EXT_WIKITTYAUTHORISATION)) { + Set<String> groupOrUser = w.getFieldAsSet( + WikittyAuthorisation.EXT_WIKITTYAUTHORISATION, + field, + String.class); + result = isMember(userId, groupOrUser); + } + return result; + } + + /** + * Verifie recursivement si un utilisateur est dans un groupe qui peut etre + * constitue d'autre groupe ou d'utilisateur + * + * @param userId l'utilisateur recherche + * @param groupOrUser la liste des id d'utilisateurs ou d'autres groupes + * @return vrai si userId est retrouve, false sinon + */ + protected boolean isMember(String userId, Set<String> groupOrUser) { + for (String id : groupOrUser) { + if (userId.equals(id)) { + return true; + } else { + Wikitty w = ws.restore(null, id); + if (w.hasExtension(WikittyGroup.EXT_WIKITTYGROUP)) { + Set<String> members = w.getFieldAsSet( + WikittyGroup.EXT_WIKITTYGROUP, + WikittyGroup.FIELD_MEMBERS, String.class); + if (isMember(userId, members)) { + return true; + } + } + } + } + // not found in groupOrUser + return false; + } + } Modified: trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/WikittySearchEnginSolr.java =================================================================== --- trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/WikittySearchEnginSolr.java 2010-06-08 12:59:39 UTC (rev 108) +++ trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/solr/WikittySearchEnginSolr.java 2010-06-08 13:16:36 UTC (rev 109) @@ -686,7 +686,7 @@ int numFound = (int)resp.getResults().getNumFound(); // FIXME null security token PagedResult<String> result = new PagedResult<String>( - null, firstIndex, numFound, queryString, facets, ids); + firstIndex, numFound, queryString, facets, ids); return result; } catch (SolrServerException e) { Modified: trunk/wikitty-solr-impl/src/test/java/org/nuiton/wikitty/solr/test/SolrServerTest.java =================================================================== --- trunk/wikitty-solr-impl/src/test/java/org/nuiton/wikitty/solr/test/SolrServerTest.java 2010-06-08 12:59:39 UTC (rev 108) +++ trunk/wikitty-solr-impl/src/test/java/org/nuiton/wikitty/solr/test/SolrServerTest.java 2010-06-08 13:16:36 UTC (rev 109) @@ -192,7 +192,9 @@ thread1.start(); thread2.start(); - Thread.sleep(3000); +// Thread.sleep(3000); + thread1.join(); + thread2.join(); SolrDocument result = findById(solrServer1, "1"); assertNotNull(result);