Capabilities.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450
  1. /**
  2. Licensed Materials - Property of IBM
  3. IBM Cognos Products: DOCS
  4. (C) Copyright IBM Corp. 2005, 2008
  5. US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with
  6. IBM Corp.
  7. */
  8. /**
  9. * Capabilities.java
  10. *
  11. * Copyright (C) 2008 Cognos ULC, an IBM Company. All rights reserved.
  12. * Cognos (R) is a trademark of Cognos ULC, (formerly Cognos Incorporated).
  13. *
  14. */
  15. import java.rmi.RemoteException;
  16. import org.apache.axis.AxisFault;
  17. import org.apache.axis.client.Stub;
  18. import org.apache.axis.message.SOAPHeaderElement;
  19. import com.cognos.developer.schemas.bibus._3.AccessEnum;
  20. import com.cognos.developer.schemas.bibus._3.BaseClass;
  21. import com.cognos.developer.schemas.bibus._3.BiBusHeader;
  22. import com.cognos.developer.schemas.bibus._3.Permission;
  23. import com.cognos.developer.schemas.bibus._3.Policy;
  24. import com.cognos.developer.schemas.bibus._3.PolicyArrayProp;
  25. import com.cognos.developer.schemas.bibus._3.PropEnum;
  26. import com.cognos.developer.schemas.bibus._3.QueryOptions;
  27. import com.cognos.developer.schemas.bibus._3.SearchPathMultipleObject;
  28. import com.cognos.developer.schemas.bibus._3.SecuredFunction;
  29. import com.cognos.developer.schemas.bibus._3.Sort;
  30. import com.cognos.developer.schemas.bibus._3.UpdateOptions;
  31. import com.cognos.developer.schemas.bibus._3.UserCapabilityEnum;
  32. import com.cognos.developer.schemas.bibus._3.UserCapabilityEnumArrayProp;
  33. import com.cognos.developer.schemas.bibus._3.UserCapabilityPermission;
  34. import com.cognos.developer.schemas.bibus._3.UserCapabilityPolicy;
  35. import com.cognos.developer.schemas.bibus._3.UserCapabilityPolicyArrayProp;
  36. import com.cognos.developer.schemas.bibus._3._package;
  37. public class Capabilities
  38. {
  39. /**
  40. * Modifies capability privileges at both global and package level.
  41. *
  42. * @param connection Connection to Server.
  43. * @param securityObject Account, Group, or Role to be granted access
  44. * @param targetPackage package to be updated.
  45. * @param secFuncPath capability to grant access to, as search path.
  46. * @param capToUpdate capability to grant access to, as Enumeration set value.
  47. *
  48. */
  49. public String updateSecuredFunction(CRNConnect connection, BaseClassWrapper securityObject, BaseClassWrapper targetPackage, String secFuncPath, UserCapabilityEnum capToUpdate)
  50. {
  51. //add account, group, or role to capability at global level
  52. if (!(addPolicyToCapability(connection, securityObject, secFuncPath))){
  53. return "unable to grant selected account or role global " + capToUpdate + " capability";
  54. }
  55. //add a policy to package for the specified security object and capability,
  56. if (!(addPolicyToPackage(connection, securityObject, targetPackage, UserCapabilityEnum.canUseReportStudio))){
  57. return "unable to grant " + securityObject + " " + capToUpdate + " capability on package " + targetPackage + ".";
  58. }
  59. // Both succeeded
  60. return "Added " + capToUpdate + " to " + securityObject + " for package " + targetPackage + ".";
  61. }
  62. /**
  63. * Modifies capability privileges at both global and package level.
  64. *
  65. * @param connection Connection to Server.
  66. * @param securityObject Account, Group, or Role to be granted access
  67. * @param capability Capability to be updated (search path)
  68. *
  69. */
  70. public boolean addPolicyToCapability(CRNConnect connection, BaseClassWrapper securityObject, String capability){
  71. boolean result = false;
  72. BaseClass results[] = new BaseClass[] {};
  73. SecuredFunction securedFunction = null;
  74. Policy pol;
  75. //set up a policy with the required permissions and account
  76. Policy newPol = new Policy();
  77. Permission execPermission = new Permission();
  78. Permission travPermission = new Permission();
  79. execPermission.setName("execute");
  80. execPermission.setAccess(AccessEnum.grant);
  81. travPermission.setName("traverse");
  82. travPermission.setAccess(AccessEnum.grant);
  83. Permission[] polPermissions = {execPermission, travPermission};
  84. newPol.setPermissions(polPermissions);
  85. newPol.setSecurityObject(securityObject.getBaseClassObject());
  86. //Retrieve the capability, including policies
  87. try
  88. {
  89. results =
  90. connection.getCMService().query(
  91. new SearchPathMultipleObject(capability),
  92. new PropEnum[] {
  93. PropEnum.searchPath,
  94. PropEnum.policies,
  95. PropEnum.defaultName },
  96. new Sort[] {},
  97. new QueryOptions());
  98. securedFunction = (SecuredFunction)results[0];
  99. }
  100. catch (java.rmi.RemoteException remoteEx)
  101. {
  102. remoteEx.printStackTrace();
  103. return false;
  104. }
  105. //create two new sets of policies - one same size, one plus one
  106. //if user already in place, use the first, replacing that policy
  107. //with the new one. If user not already in place, add the new
  108. //one at the end.
  109. int numPolicies = securedFunction.getPolicies().getValue().length;
  110. Policy[] tmpPoliciesSame = new Policy[numPolicies];
  111. Policy[] tmpPoliciesPlus = new Policy[numPolicies + 1];
  112. boolean matchFound = false;
  113. for (int i = 0; i < numPolicies; i++)
  114. {
  115. pol = securedFunction.getPolicies().getValue()[i];
  116. String polSecPath =
  117. pol.getSecurityObject().getSearchPath().getValue();
  118. if (polSecPath.equals(securityObject.getBaseClassObject().getSearchPath().getValue()))
  119. {
  120. tmpPoliciesSame[i] = newPol;
  121. matchFound = true;
  122. }
  123. else{
  124. tmpPoliciesSame[i] = pol;
  125. tmpPoliciesPlus[i] = pol;
  126. }
  127. }
  128. // Update the policies property on the capability
  129. PolicyArrayProp policyPropForUpdate = new PolicyArrayProp();
  130. if (matchFound){
  131. //Update with tmpPoliciesSame
  132. policyPropForUpdate.setValue(tmpPoliciesSame);
  133. }
  134. else{
  135. //add new policy and update with tmpPoliciesPlus
  136. tmpPoliciesPlus[numPolicies]= newPol;
  137. policyPropForUpdate.setValue(tmpPoliciesPlus);
  138. }
  139. securedFunction.setPolicies(policyPropForUpdate);
  140. // Update the capability in the content store
  141. try
  142. {
  143. connection.getCMService().update(
  144. new BaseClass[] { securedFunction },
  145. new UpdateOptions());
  146. result = true;
  147. }
  148. catch (java.rmi.RemoteException remoteEx)
  149. {
  150. remoteEx.printStackTrace();
  151. result = false;
  152. }
  153. return result;
  154. }
  155. /**
  156. * Modifies a package to grant a capability for a user, group, or role.
  157. *
  158. * @param connection Connection to Server.
  159. * @param targetSecObject Account, Group, or Role to be granted access
  160. * @param targetPackage Package to be updated
  161. * @param capToAdd Capability to be updated (enumeration)
  162. *
  163. */
  164. public boolean addPolicyToPackage(CRNConnect connection, BaseClassWrapper targetSecObject, BaseClassWrapper targetPackage, UserCapabilityEnum capToAdd){
  165. boolean result = false;
  166. BaseClass results[] = new BaseClass[] {};
  167. _package myPackage = (_package)targetPackage.getBaseClassObject();
  168. UserCapabilityPolicy pol;
  169. // Set up a policy with the required permissions and security object
  170. UserCapabilityPolicy newUCPol = newUCPolicy(targetSecObject, capToAdd, AccessEnum.grant);
  171. // Create two new arrays of UserCapabilityPolicies - one same size, one plus one
  172. // If there is already a policy for the account, group, or role is already,
  173. // use the first, and include an updated policy for that security object.
  174. // If a policy does not already exist, add the new one at the end.
  175. int numPolicies = myPackage.getUserCapabilityPolicies().getValue().length;
  176. UserCapabilityPolicy[] tmpPoliciesSame = new UserCapabilityPolicy[numPolicies];
  177. UserCapabilityPolicy[] tmpPoliciesPlus = new UserCapabilityPolicy[numPolicies + 1];
  178. boolean matchFound = false;
  179. for (int i = 0; i < numPolicies; i++)
  180. {
  181. pol = myPackage.getUserCapabilityPolicies().getValue()[i];
  182. String polSecPath =
  183. pol.getSecurityObject().getSearchPath().getValue();
  184. // Check for match on account
  185. // If match on account, must edit permissions set for that account
  186. if (polSecPath.equals(targetSecObject.getBaseClassObject().getSearchPath().getValue()))
  187. {
  188. tmpPoliciesSame[i] = updateUCPermissions(pol, capToAdd, AccessEnum.grant);
  189. matchFound = true;
  190. }
  191. else{
  192. tmpPoliciesSame[i] = pol;
  193. tmpPoliciesPlus[i] = pol;
  194. }
  195. }
  196. // Update the userCapabilities property of the package
  197. UserCapabilityPolicyArrayProp policyPropForUpdate = new UserCapabilityPolicyArrayProp();
  198. if (matchFound){
  199. //Update with tmpPoliciesSame
  200. policyPropForUpdate.setValue(tmpPoliciesSame);
  201. }
  202. else{
  203. //add new policy and update with tmpPoliciesPlus
  204. tmpPoliciesPlus[numPolicies]= newUCPol;
  205. policyPropForUpdate.setValue(tmpPoliciesPlus);
  206. }
  207. myPackage.setUserCapabilityPolicies(policyPropForUpdate);
  208. // Update the package in the content store
  209. try
  210. {
  211. connection.getCMService().update(
  212. new BaseClass[] { myPackage },
  213. new UpdateOptions());
  214. result = true;
  215. }
  216. catch (java.rmi.RemoteException remoteEx)
  217. {
  218. remoteEx.printStackTrace();
  219. result = false;
  220. }
  221. return result;
  222. }
  223. /**
  224. * Construct a UserCapabilityPolicy object
  225. *
  226. * @param secObject Account, Group, or Role
  227. * @param capToSet Capability (as enumeration)
  228. * @param grantOrDeny Access setting to apply
  229. *
  230. */
  231. public UserCapabilityPolicy newUCPolicy(BaseClassWrapper secObject, UserCapabilityEnum capToSet, AccessEnum grantOrDeny){
  232. UserCapabilityPolicy UCPolicy = new UserCapabilityPolicy();
  233. UserCapabilityPermission ucPermission = new UserCapabilityPermission();
  234. ucPermission.setAccess(grantOrDeny);
  235. ucPermission.setUserCapability(capToSet);
  236. UserCapabilityPermission[] ucPermissions = {ucPermission};
  237. UCPolicy.setPermissions(ucPermissions);
  238. UCPolicy.setSecurityObject(secObject.getBaseClassObject());
  239. return UCPolicy;
  240. }
  241. /**
  242. * Update a UserCapabilityPolicy with permissions for specified capability
  243. *
  244. * @param UserCapabilityPolicy policy to update
  245. * @param capToSet Capability (as enumeration)
  246. * @param grantOrDeny Access setting to apply
  247. *
  248. */
  249. public UserCapabilityPolicy updateUCPermissions(UserCapabilityPolicy pol, UserCapabilityEnum capToSet, AccessEnum grantOrDeny){
  250. UserCapabilityPermission currentUCPermission;
  251. UserCapabilityPermission newUCPermission = new UserCapabilityPermission();
  252. newUCPermission.setAccess(grantOrDeny);
  253. newUCPermission.setUserCapability(capToSet);
  254. // Go through permissions array. If setting for capability exists, replace it.
  255. // Otherwise, add
  256. int numPermissions = pol.getPermissions().length;
  257. UserCapabilityPermission[] tmpPermissionsSame = new UserCapabilityPermission[numPermissions];
  258. UserCapabilityPermission[] tmpPermissionsPlus = new UserCapabilityPermission[numPermissions + 1];
  259. boolean matchFound = false;
  260. for (int i = 0; i < numPermissions; i++)
  261. {
  262. currentUCPermission = pol.getPermissions()[i];
  263. if (currentUCPermission.getUserCapability() == capToSet)
  264. {
  265. tmpPermissionsSame[i] = newUCPermission;
  266. matchFound = true;
  267. }
  268. else{
  269. tmpPermissionsSame[i] = currentUCPermission;
  270. tmpPermissionsPlus[i] = currentUCPermission;
  271. }
  272. }
  273. if (matchFound){
  274. //Update with tmpPermissionsSame
  275. pol.setPermissions(tmpPermissionsSame);
  276. }
  277. else{
  278. //add new permission and update with tmpPermissionsPlus
  279. tmpPermissionsPlus[numPermissions]= newUCPermission;
  280. pol.setPermissions(tmpPermissionsPlus);
  281. }
  282. return pol;
  283. }
  284. /**
  285. * Check the effective user capabilities on a package for the current user.
  286. * If a capability is present, the current user has this capability at both the
  287. * global and package levels.
  288. *
  289. * @param connection Connection to Server.
  290. * @param targetPackage package to check (search path)
  291. * @param capToCheck Capability (as enumeration)
  292. *
  293. */
  294. public boolean checkEffectiveCapability(CRNConnect connection, String targetPackage, UserCapabilityEnum capToCheck){
  295. boolean result = false;
  296. try
  297. {
  298. if ((targetPackage == null) || (targetPackage.length() == 0) || (targetPackage.compareTo("") == 0) )
  299. {
  300. return false;
  301. }
  302. // Query properties: we need effectiveUserCapabilities.
  303. PropEnum[] properties =
  304. { PropEnum.defaultName, PropEnum.searchPath, PropEnum.effectiveUserCapabilities};
  305. // Query options and sort; use the defaults.
  306. QueryOptions options = new QueryOptions();
  307. Sort[] sortBy = { new Sort()};
  308. try
  309. {
  310. BaseClass[] results =
  311. connection.getCMService().query(
  312. new SearchPathMultipleObject(targetPackage),
  313. properties,
  314. sortBy,
  315. options);
  316. _package mypackage = null;
  317. mypackage = (_package)results[0];
  318. //check for a specific capbility
  319. result = hasEffectiveCapability(mypackage.getEffectiveUserCapabilities(), capToCheck);
  320. }
  321. catch (AxisFault ex)
  322. {
  323. // Fault details can be found via ex.getFaultDetails(),
  324. // which returns an Element array.
  325. System.out.println("SOAP Fault:");
  326. System.out.println(ex.toString());
  327. }
  328. catch (RemoteException remoteEx)
  329. {
  330. SOAPHeaderElement theException =
  331. ((Stub)connection.getCMService()).getHeader(
  332. "",
  333. "biBusHeader");
  334. // You can now use theException to find out more information
  335. // about the problem.
  336. System.out.println("The request threw an RMI exception:");
  337. System.out.println(remoteEx.getMessage());
  338. System.out.println("Stack trace:");
  339. remoteEx.printStackTrace();
  340. }
  341. }
  342. catch (Exception ex)
  343. {}
  344. return result;
  345. }
  346. /**
  347. * Check a set of user capabilities for specified capability
  348. *
  349. * @param setCapabilities Array of user capabilities to check
  350. * @param capToSet Capability (as enumeration)
  351. *
  352. */
  353. public boolean hasEffectiveCapability(UserCapabilityEnumArrayProp setCapabilities, UserCapabilityEnum capToCheck){
  354. boolean result = false;
  355. UserCapabilityEnum[] capabilities = setCapabilities.getValue();
  356. //loop through capabilities, check for match
  357. for (int i = 0; i < capabilities.length; i++)
  358. {
  359. if (capabilities[i] == capToCheck)
  360. {
  361. return true;
  362. }
  363. }
  364. return false;
  365. }
  366. }