PageRenderTime 28ms CodeModel.GetById 13ms RepoModel.GetById 1ms app.codeStats 0ms

/jira-project/jira-components/jira-core/src/main/java/com/atlassian/jira/issue/search/parameters/lucene/DefaultPermissionQueryFactory.java

https://bitbucket.org/ahmed_bilal_360factors/jira7-core
Java | 200 lines | 142 code | 23 blank | 35 comment | 25 complexity | 28c21eb350b171248e79b5e2f7b72b07 MD5 | raw file
Possible License(s): Apache-2.0
  1. package com.atlassian.jira.issue.search.parameters.lucene;
  2. import com.atlassian.jira.issue.search.constants.SystemSearchConstants;
  3. import com.atlassian.jira.issue.security.IssueSecurityLevel;
  4. import com.atlassian.jira.issue.security.IssueSecurityLevelManager;
  5. import com.atlassian.jira.issue.security.IssueSecurityLevelPermission;
  6. import com.atlassian.jira.issue.security.IssueSecuritySchemeManager;
  7. import com.atlassian.jira.permission.PermissionSchemeEntry;
  8. import com.atlassian.jira.permission.PermissionSchemeManager;
  9. import com.atlassian.jira.permission.PermissionTypeManager;
  10. import com.atlassian.jira.project.Project;
  11. import com.atlassian.jira.security.JiraAuthenticationContextImpl;
  12. import com.atlassian.jira.security.PermissionManager;
  13. import com.atlassian.jira.security.RequestCacheKeys;
  14. import com.atlassian.jira.security.SecurityTypeManager;
  15. import com.atlassian.jira.security.plugin.ProjectPermissionKey;
  16. import com.atlassian.jira.security.type.SecurityType;
  17. import com.atlassian.jira.user.ApplicationUser;
  18. import org.apache.lucene.index.Term;
  19. import org.apache.lucene.search.BooleanClause;
  20. import org.apache.lucene.search.BooleanQuery;
  21. import org.apache.lucene.search.Query;
  22. import org.apache.lucene.search.TermQuery;
  23. import org.ofbiz.core.entity.GenericEntityException;
  24. import org.slf4j.Logger;
  25. import org.slf4j.LoggerFactory;
  26. import java.util.Collection;
  27. import java.util.LinkedHashSet;
  28. import java.util.List;
  29. import java.util.Set;
  30. public class DefaultPermissionQueryFactory implements PermissionQueryFactory {
  31. private static final Logger log = LoggerFactory.getLogger(DefaultPermissionQueryFactory.class);
  32. private final IssueSecurityLevelManager issueSecurityLevelManager;
  33. private final PermissionManager permissionManager;
  34. private final PermissionSchemeManager permissionSchemeManager;
  35. private final PermissionTypeManager permissionTypeManager;
  36. private final IssueSecuritySchemeManager issueSecuritySchemeManager;
  37. private final SecurityTypeManager issueSecurityTypeManager;
  38. public DefaultPermissionQueryFactory(final IssueSecurityLevelManager issueSecurityLevelManager, final PermissionManager permissionManager, final PermissionSchemeManager permissionSchemeManager, final PermissionTypeManager permissionTypeManager, final IssueSecuritySchemeManager issueSecuritySchemeManager, final SecurityTypeManager issueSecurityTypeManager) {
  39. this.issueSecurityLevelManager = issueSecurityLevelManager;
  40. this.permissionManager = permissionManager;
  41. this.permissionSchemeManager = permissionSchemeManager;
  42. this.permissionTypeManager = permissionTypeManager;
  43. this.issueSecuritySchemeManager = issueSecuritySchemeManager;
  44. this.issueSecurityTypeManager = issueSecurityTypeManager;
  45. }
  46. @Override
  47. public Query getQuery(final ApplicationUser searcher, final ProjectPermissionKey permissionKey) {
  48. try {
  49. final BooleanQuery query = new BooleanQuery();
  50. // This function loop around all the security types in the current scheme or schemes
  51. final Collection<Project> projects = permissionManager.getProjects(permissionKey, searcher);
  52. // collect unique project queries
  53. final Set<Query> projectQueries = new LinkedHashSet<Query>();
  54. for (final Project project : projects) {
  55. collectProjectTerms(project, searcher, projectQueries, permissionKey);
  56. }
  57. // add them to the permission query
  58. final BooleanQuery permissionQuery = new BooleanQuery();
  59. for (final Query projectQuery : projectQueries) {
  60. permissionQuery.add(projectQuery, BooleanClause.Occur.SHOULD);
  61. }
  62. // If you have a project query then add it and look for issue level queries
  63. if (!permissionQuery.clauses().isEmpty()) {
  64. query.add(permissionQuery, BooleanClause.Occur.MUST);
  65. // collect unique issue level security queries
  66. final Set<Query> issueLevelSecurityQueries = new LinkedHashSet<Query>();
  67. issueLevelSecurityQueries.add(new TermQuery(new Term(SystemSearchConstants.forSecurityLevel().getIndexField(), "-1")));
  68. try {
  69. //Also loop through the project and return the security levels this user has access
  70. for (final Project project : projects) {
  71. collectSecurityLevelTerms(project, searcher, issueLevelSecurityQueries);
  72. }
  73. } catch (final GenericEntityException e) {
  74. log.error("Error occurred retrieving security levels for this user");
  75. }
  76. final BooleanQuery issueLevelQuery = new BooleanQuery();
  77. for (final Query issueLevelSecurityQuery : issueLevelSecurityQueries) {
  78. issueLevelQuery.add(issueLevelSecurityQuery, BooleanClause.Occur.SHOULD);
  79. }
  80. query.add(issueLevelQuery, BooleanClause.Occur.MUST);
  81. }
  82. return query;
  83. } catch (final GenericEntityException e) {
  84. log.error("Error constructing query: " + e, e);
  85. return null;
  86. }
  87. }
  88. ///CLOVER:OFF
  89. PermissionsFilterCache getCache() {
  90. PermissionsFilterCache cache = (PermissionsFilterCache) JiraAuthenticationContextImpl.getRequestCache().get(
  91. RequestCacheKeys.PERMISSIONS_FILTER_CACHE);
  92. if (cache == null) {
  93. if (log.isDebugEnabled()) {
  94. log.debug("Creating new PermissionsFilterCache");
  95. }
  96. cache = new PermissionsFilterCache();
  97. JiraAuthenticationContextImpl.getRequestCache().put(RequestCacheKeys.PERMISSIONS_FILTER_CACHE, cache);
  98. }
  99. return cache;
  100. }
  101. ///CLOVER:ON
  102. /**
  103. * Loops around the permission schemes for the current project and adds a query for the SecurityType if there is one
  104. * in scheme.
  105. *
  106. * @param project The project for which we need to construct the query
  107. * @param searcher The user conducting the search
  108. * @param queries The collection of queries already generated for projects
  109. * @throws org.ofbiz.core.entity.GenericEntityException If there's a problem retrieving permissions.
  110. */
  111. void collectProjectTerms(final Project project, final ApplicationUser searcherUser, final Set<Query> queries, final ProjectPermissionKey permissionId) throws GenericEntityException {
  112. final Long schemeId = permissionSchemeManager.getSchemeIdFor(project);
  113. final Collection<PermissionSchemeEntry> entities = permissionSchemeManager.getPermissionSchemeEntries(schemeId, permissionId);
  114. for (final PermissionSchemeEntry schemeEntry : entities) {
  115. final SecurityType securityType = permissionTypeManager.getSecurityType(schemeEntry.getType());
  116. if (securityType != null) {
  117. try {
  118. if (userHasPermissionForProjectAndSecurityType(searcherUser, project, schemeEntry.getParameter(), securityType)) {
  119. final Query tempQuery = securityType.getQuery(searcherUser, project, schemeEntry.getParameter());
  120. if (tempQuery != null) {
  121. queries.add(tempQuery);
  122. }
  123. }
  124. } catch (final Exception e) {
  125. log.debug("Could not add query for security type:" + securityType.getDisplayName(), e);
  126. }
  127. } else {
  128. log.debug("Could not find security type:" + schemeEntry.getType());
  129. }
  130. }
  131. }
  132. /**
  133. * Loop through the user security levels for project adding them to the query if they exists
  134. *
  135. * @param project The project for which we are constructing a query for the security levels
  136. * @param queries The collection of queries already generated for security levels
  137. * @param searcher The user conducting the search
  138. * @throws org.ofbiz.core.entity.GenericEntityException If there's a problem retrieving security levels.
  139. */
  140. void collectSecurityLevelTerms(final Project project, final ApplicationUser searcherUser, final Set<Query> queries) throws GenericEntityException {
  141. final List<IssueSecurityLevel> usersSecurityLevels = issueSecurityLevelManager.getUsersSecurityLevels(project, searcherUser);
  142. for (final IssueSecurityLevel securityLevel : usersSecurityLevels) {
  143. @SuppressWarnings("unchecked")
  144. final List<IssueSecurityLevelPermission> securities = issueSecuritySchemeManager.getPermissionsBySecurityLevel(securityLevel.getId());
  145. for (final IssueSecurityLevelPermission securityLevelPermission : securities) {
  146. final SecurityType securityType = issueSecurityTypeManager.getSecurityType(securityLevelPermission.getType());
  147. if (securityType != null) {
  148. if (userHasPermissionForProjectAndSecurityType(searcherUser, project, securityLevelPermission.getParameter(), securityType)) {
  149. final Query tempQuery = securityType.getQuery(searcherUser, project, securityLevel, securityLevelPermission.getParameter());
  150. if (tempQuery != null) {
  151. queries.add(tempQuery);
  152. }
  153. }
  154. }
  155. }
  156. }
  157. }
  158. /**
  159. * Tests if the specified user has permission for the specified security type in the specified project given the
  160. * context of the permission scheme entity.
  161. *
  162. * @param searcher the user; may be null if user is anonymous
  163. * @param project the project
  164. * @param parameter the permission parameter (group name etc)
  165. * @param securityType the security type
  166. * @return true if the user has permission; false otherwise
  167. */
  168. boolean userHasPermissionForProjectAndSecurityType(final ApplicationUser searcher, final Project project, final String parameter, final SecurityType securityType) {
  169. boolean hasPermission;
  170. if (searcher == null) {
  171. hasPermission = securityType.hasPermission(project, parameter);
  172. } else {
  173. hasPermission = securityType.hasPermission(project, parameter, searcher, false);
  174. }
  175. return hasPermission;
  176. }
  177. }