ConnectionUtils.js 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921
  1. "use strict";
  2. /**
  3. * Licensed Materials - Property of IBM
  4. * IBM Cognos Products: admin
  5. * Copyright IBM Corp. 2017, 2018
  6. * US Government Users Restricted Rights - Use, duplication or disclosure
  7. * restricted by GSA ADP Schedule Contract with IBM Corp.
  8. */
  9. define(['underscore', 'bi/commons/ui/core/Class', 'bi/admin/common/utils/AJAXUtils', 'text!bi/admin/datasource/services/datasources.json', 'bi/admin/datasource/utils/StringUtil', 'ba-react-admin/ba-react-admin.min'], function (_, Class, AJAXUtils, datasources, StringUtil, AdminReact) {
  10. 'use strict'; //NOSONAR: meant to be strict
  11. var _singletonInstance = null;
  12. var ConnectionUtils = Class.extend({
  13. _DUAL_CNX_STR_SEPARATOR: 'IBM_JD_CNX_STR:',
  14. _connStringTemplateToken: '<caConnString>',
  15. _DEFAULTCONNECTIONSTRINGMODULE: 'bi/admin/datasource/slideout/JdbcConnectionStringPane',
  16. _getSignonsWithCredentials: function _getSignonsWithCredentials(ajaxService, dsId, dcId) {
  17. if (!dsId || !dcId) {
  18. return Promise.resolve([]);
  19. } else {
  20. var options = {
  21. method: 'GET',
  22. contentType: 'application/json; charset=utf-8',
  23. dataType: 'json'
  24. };
  25. options.url = AJAXUtils.getAJAXURL('datasources') + '/' + dsId + '/connections/' + dcId + '/signons';
  26. return new Promise(function (resolve, reject) {
  27. ajaxService.ajax(options).then(function (signons) {
  28. var retVal;
  29. if (signons.data) {
  30. retVal = signons;
  31. }
  32. resolve(retVal);
  33. }, reject);
  34. });
  35. }
  36. },
  37. getSignons: function getSignons(ajaxService, dsId, dcId) {
  38. return this._getSignonsWithCredentials(ajaxService, dsId, dcId).then(function (responseFromCreds) {
  39. var respCredentials = responseFromCreds && responseFromCreds.data && responseFromCreds.data.data ? responseFromCreds.data.data : [];
  40. return respCredentials;
  41. });
  42. },
  43. _connStringParseTMR: function _connStringParseTMR(paramsArray) {
  44. var parseResult = {
  45. tm1Params: {
  46. tm1AdminHost: '',
  47. tm1Port: '',
  48. tm1ServerName: '',
  49. tm1UseSSL: false,
  50. tm1Language: ''
  51. }
  52. };
  53. var items;
  54. _.each(paramsArray, function (entry) {
  55. if (entry.indexOf('TM1AdminHost') > -1) {
  56. items = entry.split('=');
  57. parseResult.tm1Params.tm1AdminHost = items[1];
  58. }
  59. if (entry.indexOf('TM1Protocol') > -1) {
  60. items = entry.split('=');
  61. parseResult.tm1Params.tm1UseSSL = items[1] === 'https';
  62. }
  63. if (entry.indexOf('TM1ServerPort') > -1) {
  64. items = entry.split('=');
  65. parseResult.tm1Params.tm1Port = items[1];
  66. }
  67. });
  68. return parseResult;
  69. },
  70. _connStringParseSAP: function _connStringParseSAP(paramsArray) {
  71. var parseResult = {
  72. sapbwParams: {
  73. logonType: '',
  74. server: '',
  75. sysNumber: '',
  76. clientNumber: '',
  77. logonGroup: '',
  78. codePage: '',
  79. routerString: ''
  80. }
  81. };
  82. var items;
  83. _.each(paramsArray, function (entry) {
  84. if (entry.indexOf('serverType') > -1) {
  85. items = entry.split('=');
  86. parseResult.sapbwParams.logonType = items[1];
  87. }
  88. if (entry.indexOf('server') > -1) {
  89. items = entry.split('=');
  90. parseResult.sapbwParams.server = items[1];
  91. }
  92. if (entry.indexOf('sysid') > -1) {
  93. items = entry.split('=');
  94. parseResult.sapbwParams.systemId = items[1];
  95. }
  96. if (entry.indexOf('sysnr') > -1) {
  97. items = entry.split('=');
  98. parseResult.sapbwParams.systemNumber = items[1];
  99. }
  100. if (entry.indexOf('client') > -1) {
  101. items = entry.split('=');
  102. parseResult.sapbwParams.clientNumber = items[1];
  103. }
  104. if (entry.indexOf('logonGroup') > -1) {
  105. items = entry.split('=');
  106. parseResult.sapbwParams.logonGroup = items[1];
  107. }
  108. if (entry.indexOf('codePage') > -1) {
  109. items = entry.split('=');
  110. parseResult.sapbwParams.codePage = parseInt(items[1]);
  111. }
  112. if (entry.indexOf('routerString') > -1) {
  113. items = entry.split('=');
  114. parseResult.sapbwParams.routerString = items[1];
  115. }
  116. });
  117. return parseResult;
  118. },
  119. _connStringParseOLAP: function _connStringParseOLAP(paramsArray) {
  120. var parseResult = {
  121. serverUrl: '',
  122. namedInstance: '',
  123. msasVersion: ''
  124. };
  125. var lang = false;
  126. var items;
  127. _.each(paramsArray, function (entry, i) {
  128. if (i === 2) {
  129. parseResult.msasVersion = entry;
  130. if (entry !== 'DO' || entry !== 'TMR') {
  131. lang = true;
  132. }
  133. }
  134. if (entry.indexOf('SERVER') > -1) {
  135. items = entry.split('=');
  136. var server = items[1].split('\\');
  137. parseResult.serverUrl = server[0];
  138. parseResult.namedInstance = server[1] || '';
  139. }
  140. if (lang && entry.indexOf('LCID') > -1) {
  141. items = entry.split('=');
  142. parseResult.languageVal = items[1];
  143. }
  144. });
  145. return parseResult;
  146. },
  147. parseConnectionString: function parseConnectionString(connection) {
  148. var conString = connection.connectionString;
  149. var connectionStringParseResult = {
  150. rawConnectionString: conString
  151. };
  152. this._resolveConnectionString(connectionStringParseResult);
  153. this._getMetaData(connectionStringParseResult);
  154. var parseResult;
  155. if (this.isTMRConnection(connection)) {
  156. parseResult = this._connStringParseTMR(conString.split(';'));
  157. } else if (conString.indexOf(ConnectionUtils.SAPBW) > -1) {
  158. parseResult = this._connStringParseSAP(conString.split(';'));
  159. } else if (this.isOLAPConnection(connection)) {
  160. parseResult = this._connStringParseOLAP(conString.split(';'));
  161. } else if (conString.indexOf(ConnectionUtils.EXTCAT) > -1) {
  162. parseResult = this._connStringParseExtCatalog(conString);
  163. } else {
  164. this._extractJDBCDriverInfo(connectionStringParseResult);
  165. if (connection.apiToken) {
  166. this._extractApiToken(connection.apiToken, connectionStringParseResult);
  167. }
  168. }
  169. _.extend(connectionStringParseResult, parseResult);
  170. return connectionStringParseResult;
  171. },
  172. _extractApiToken: function _extractApiToken(apiToken, parseResult) {
  173. parseResult.apiToken = {};
  174. if (apiToken.authKey) {
  175. parseResult.apiToken.authKey = apiToken.authKey;
  176. }
  177. if (apiToken.secretKey) {
  178. parseResult.apiToken.secretKey = apiToken.secretKey;
  179. }
  180. },
  181. _connStringParseExtCatalog: function _connStringParseExtCatalog(connectionStringParseResult) {
  182. var parseResult = {};
  183. if (connectionStringParseResult) {
  184. if (connectionStringParseResult.indexOf('URL=') > -1) {
  185. var conString = connectionStringParseResult.split('URL=');
  186. if (conString && conString.length > 0) {
  187. var urlString = conString[1].split(';');
  188. parseResult.serverUrl = urlString[0];
  189. parseResult.connectionProperties = '';
  190. for (var i = 1; i < urlString.length; i++) {
  191. if (!_.isEmpty(urlString[i])) {
  192. parseResult.connectionProperties += urlString[i] + ';';
  193. }
  194. }
  195. return parseResult;
  196. }
  197. }
  198. }
  199. },
  200. _extractJDBCDriverInfo: function _extractJDBCDriverInfo(connectionStringParseResult) {
  201. var items = connectionStringParseResult.connString.split(';DRIVER_NAME=');
  202. if (items && items.length > 1) {
  203. var stringVals = items[1].split(';');
  204. if (stringVals && stringVals.length > 0 && connectionStringParseResult.metadata.driverName !== stringVals[0]) {
  205. //driver has been updated with a different version
  206. connectionStringParseResult.metadata.driverName = stringVals[0];
  207. }
  208. }
  209. },
  210. resolveAuthMethod: function resolveAuthMethod(connectionStringParseResult, connection, signons) {
  211. var indexOfAuthSec = connection.connectionString.indexOf('^User ID:');
  212. if (connection.credentialNamespaces && connection.credentialNamespaces.length > 0) {
  213. connectionStringParseResult.authMethod = 'ucac';
  214. } else if (indexOfAuthSec !== -1 && signons.length > 0) {
  215. connectionStringParseResult.authMethod = 'usc';
  216. } else if (indexOfAuthSec !== -1) {
  217. connectionStringParseResult.authMethod = 'prompt';
  218. } else {
  219. connectionStringParseResult.authMethod = 'anon';
  220. }
  221. },
  222. _getConnectionCode: function _getConnectionCode(parseResult) {
  223. if (parseResult.msasVersion) {
  224. return parseResult.msasVersion;
  225. }
  226. return parseResult.metadata.code.split(':')[0];
  227. },
  228. _getAuthSection: function _getAuthSection(parseResult) {
  229. if (parseResult.authMethod === 'anon' || parseResult.authMethod === 'ucac') {
  230. return '';
  231. } else {
  232. return '^User ID:^?Password:';
  233. }
  234. },
  235. _buildConnectionTM1: function _buildConnectionTM1(connectionString, parseResult) {
  236. connectionString += ';LCID=' + 'en-us';
  237. connectionString += ';TM1AdminHost=' + parseResult.tm1Params.tm1AdminHost;
  238. connectionString += ';TM1Protocol=' + (parseResult.tm1Params.tm1UseSSL ? 'https' : 'http');
  239. connectionString += ';TM1ServerPort=' + parseResult.tm1Params.tm1Port;
  240. connectionString += ';TM1ServerName=TM1ServerName';
  241. connectionString += ';CATALOG=CATALOG;';
  242. connectionString += 'UID=%s;PWD=%s';
  243. return connectionString;
  244. },
  245. _buildConnectionJDBC: function _buildConnectionJDBC(connectionString, parseResult, objectInfo) {
  246. connectionString += ';URL=' + parseResult.jdbcURL;
  247. connectionString += ';DRIVER_NAME=' + parseResult.metadata.driverName + ';';
  248. if (parseResult.metadata.code.indexOf('JDBC:') === 0) {
  249. connectionString += 'ibmcognos.subcode=';
  250. connectionString += parseResult.metadata.code.substring(5) + ';';
  251. }
  252. if (parseResult.connectionProperties && parseResult.connectionProperties.length > 0) {
  253. connectionString += parseResult.connectionProperties + ';';
  254. }
  255. if (parseResult.gwConnStr != null && parseResult.gwConnStr.length <= 0 && parseResult.gwStringUpdated) {//do nothing - this prevents it from going in to the 2nd else if
  256. } else if (parseResult.gwConnStr && parseResult.gwStringUpdated && parseResult.gwConnStr.length > 0) {
  257. connectionString += parseResult.gwConnStr + ';';
  258. } else if (parseResult.connString && parseResult.connString.indexOf('IBMCOGNOS_SG_DEST') !== -1 && parseResult.connString.indexOf('IBMCOGNOS_SG_GWID') !== -1) {
  259. var tString = parseResult.connString.substring(parseResult.connString.indexOf('IBMCOGNOS_SG_GWID'));
  260. var indexOfSGWID = tString.indexOf(';', 1);
  261. if (indexOfSGWID >= 0) {
  262. connectionString += tString.substring(0, indexOfSGWID + 1);
  263. }
  264. tString = parseResult.connString.substring(parseResult.connString.indexOf('IBMCOGNOS_SG_DEST'));
  265. var indexOfSC = tString.indexOf(';', 1);
  266. if (indexOfSC >= 0) {
  267. connectionString += tString.substring(0, indexOfSC + 1);
  268. }
  269. if (tString.indexOf('IBMCOGNOS_SG_JDBC_DEST') !== -1) {
  270. indexOfSC = tString.indexOf(';', 1);
  271. if (indexOfSC >= 0) {
  272. connectionString += tString.substring(indexOfSC + 1);
  273. }
  274. }
  275. }
  276. if (parseResult.apiToken) {
  277. if (parseResult.apiToken.authKey || parseResult.apiToken.secretKey) {
  278. if (!objectInfo.apiToken) {
  279. objectInfo.apiToken = {};
  280. }
  281. objectInfo.apiToken.authKey = parseResult.apiToken.authKey;
  282. objectInfo.apiToken.secretKey = parseResult.apiToken.secretKey;
  283. } else {
  284. objectInfo.apiToken.authKey = '';
  285. objectInfo.apiToken.secretKey = '';
  286. }
  287. }
  288. return connectionString;
  289. },
  290. _buildConnectionSAP: function _buildConnectionSAP(connectionString, parseResult) {
  291. connectionString += ';serverType=' + parseResult.sapbwParams.logonType;
  292. connectionString += ';server=' + parseResult.sapbwParams.server;
  293. if (parseResult.sapbwParams && parseResult.sapbwParams.logonType === 'applicationServer') {
  294. connectionString += ';sysnr=' + parseResult.sapbwParams.systemNumber;
  295. }
  296. if (parseResult.sapbwParams && parseResult.sapbwParams.logonType === 'messageServer') {
  297. connectionString += ';sysid=' + parseResult.sapbwParams.systemId;
  298. }
  299. connectionString += ';client=' + parseResult.sapbwParams.clientNumber;
  300. if (parseResult.sapbwParams && parseResult.sapbwParams.logonType === 'messageServer') {
  301. connectionString += ';logonGroup=' + parseResult.sapbwParams.logonGroup;
  302. }
  303. connectionString += ';codePage=' + parseResult.sapbwParams.codePage;
  304. connectionString += ';routerString=' + parseResult.sapbwParams.routerString;
  305. connectionString += ';UID=%s;PWD=%s';
  306. return connectionString;
  307. },
  308. _buildConnectionOLAP: function _buildConnectionOLAP(connectionString, parseResult, connCode) {
  309. connectionString += ';SERVER=' + parseResult.serverUrl;
  310. if (parseResult.namedInstance) {
  311. connectionString += '\\' + parseResult.namedInstance;
  312. }
  313. if (connCode !== 'DO') {
  314. if (parseResult.languageVal) {
  315. connectionString += ';LCID=' + parseResult.languageVal;
  316. } else {
  317. connectionString += ';LCID=' + 'en-us';
  318. }
  319. }
  320. connectionString += ';UID=%s;PWD=%s';
  321. return connectionString;
  322. },
  323. _buildConnectionEXTCAT: function _buildConnectionEXTCAT(connectionString, parseResult) {
  324. connectionString += ';URL=' + parseResult.serverUrl + ';';
  325. if (parseResult.connectionProperties && parseResult.connectionProperties.length > 0) {
  326. connectionString += parseResult.connectionProperties + ';';
  327. }
  328. return connectionString;
  329. },
  330. buildConnection: function buildConnection(parseResult, objectInfo) {
  331. var connCode = this._getConnectionCode(parseResult);
  332. var connectionString = this._getAuthSection(parseResult) + ';LOCAL;' + connCode;
  333. if (connCode === ConnectionUtils.EXTCAT) {
  334. connectionString = this._buildConnectionEXTCAT(connectionString, parseResult);
  335. } else if (!_.isUndefined(parseResult.jdbcURL)) {
  336. connectionString = this._buildConnectionJDBC(connectionString, parseResult, objectInfo);
  337. } else if (parseResult.tm1Params) {
  338. connectionString = this._buildConnectionTM1(connectionString, parseResult);
  339. } else if (parseResult.sapbwParams) {
  340. connectionString = this._buildConnectionSAP(connectionString, parseResult);
  341. } else {
  342. connectionString = this._buildConnectionOLAP(connectionString, parseResult, connCode);
  343. }
  344. return connectionString;
  345. },
  346. getUpdatedConnectionString: function getUpdatedConnectionString(parseResult, newConnString) {
  347. return parseResult.connStringTemplate.replace(this._connStringTemplateToken, newConnString);
  348. },
  349. _getMetaData: function _getMetaData(connectionStringParseResult) {
  350. if (!this.isOLAPConnection(connectionStringParseResult)) {
  351. connectionStringParseResult.jdbcURL = this._getJdbcUrl(connectionStringParseResult.connString);
  352. }
  353. connectionStringParseResult.metadata = this.getDSMeta(connectionStringParseResult);
  354. if (connectionStringParseResult.metadata && !connectionStringParseResult.metadata.module) {
  355. connectionStringParseResult.metadata.module = this._DEFAULTCONNECTIONSTRINGMODULE;
  356. }
  357. },
  358. _getSubCode: function _getSubCode(objInfo) {
  359. var connString = objInfo.connectionString ? objInfo.connectionString : objInfo.connString;
  360. var subCode = StringUtil.getField(connString, ';ibmcognos.subcode=');
  361. if (!subCode) {
  362. var subProtocol = this._getJdbcSubprotocol(objInfo);
  363. subCode = 'JDBC:' + subProtocol;
  364. } else {
  365. if (subCode.toUpperCase() === 'HIVE') {
  366. subCode = 'HIVE2';
  367. }
  368. subCode = 'JDBC:' + subCode;
  369. }
  370. return subCode;
  371. },
  372. _getJdbcUrl: function _getJdbcUrl(cs) {
  373. var jdbcUrl = '';
  374. var urlConstant = 'URL=';
  375. var urlStart = cs.indexOf(urlConstant);
  376. if (urlStart !== -1) {
  377. var urlEnd;
  378. var driverConstant = ';DRIVER_NAME=';
  379. urlEnd = cs.indexOf(driverConstant, urlStart + urlConstant.length);
  380. if (urlEnd !== -1) {
  381. jdbcUrl = cs.substring(urlStart + urlConstant.length, urlEnd);
  382. }
  383. }
  384. return jdbcUrl;
  385. },
  386. _getJdbcSubprotocol: function _getJdbcSubprotocol(connectionStringParseResult) {
  387. var connString = connectionStringParseResult.connectionString || connectionStringParseResult.connString || '';
  388. var jdbcUrl = connectionStringParseResult.jdbcURL || this._getJdbcUrl(connString) || '';
  389. var subprotocol = '';
  390. var protocolStart = 'jdbc:'.length; // Sybase and Greenplum have ':' in the protocol
  391. // name so searching for the first index doesn't
  392. // work
  393. // Have to put in a static check for now. If we get
  394. // too many exceptions we should look at
  395. // reading the connections metadata file for a list
  396. // subprotocols.
  397. var protocolEnd = jdbcUrl.indexOf(':', protocolStart);
  398. if (protocolEnd !== -1) {
  399. subprotocol = jdbcUrl.substring(protocolStart, protocolEnd);
  400. if (subprotocol.toLowerCase() === 'sybase' || subprotocol.toLowerCase() === 'pivotal') {
  401. protocolEnd = jdbcUrl.indexOf(':', protocolEnd + 1);
  402. subprotocol = jdbcUrl.substring(protocolStart, protocolEnd);
  403. }
  404. }
  405. return subprotocol;
  406. },
  407. _getMainCode: function _getMainCode(cs) {
  408. var local = ';LOCAL;';
  409. var start = cs.indexOf(local) + local.length;
  410. var end = cs.indexOf(';', start);
  411. return cs.substring(start, end);
  412. },
  413. _parseBasicConnectionString: function _parseBasicConnectionString(connectionStringParseResult) {
  414. var dualStackIndex = connectionStringParseResult.rawConnectionString.indexOf(this._DUAL_CNX_STR_SEPARATOR);
  415. if (dualStackIndex !== -1) {
  416. connectionStringParseResult.connString = connectionStringParseResult.rawConnectionString.substr(dualStackIndex + this._DUAL_CNX_STR_SEPARATOR.length);
  417. connectionStringParseResult.connStringTemplate = connectionStringParseResult.rawConnectionString.replace(connectionStringParseResult.connString, this._connStringTemplateToken);
  418. } else {
  419. connectionStringParseResult.connString = connectionStringParseResult.rawConnectionString;
  420. connectionStringParseResult.connStringTemplate = this._connStringTemplateToken;
  421. }
  422. },
  423. _resolveConnectionString: function _resolveConnectionString(connectionStringParseResult) {
  424. this._parseBasicConnectionString(connectionStringParseResult);
  425. this._resolveConnectionProperties(connectionStringParseResult);
  426. },
  427. _resolveConnectionProperties: function _resolveConnectionProperties(connectionStringParseResult) {
  428. var indexOfDriver = connectionStringParseResult.connString.indexOf(';DRIVER_NAME=');
  429. var indexOfProperties = connectionStringParseResult.connString.indexOf(';', indexOfDriver + 1);
  430. var indexOfLastProperties = connectionStringParseResult.connString.indexOf(';', indexOfProperties + 1);
  431. if (indexOfLastProperties !== -1 && indexOfProperties !== -1) {
  432. connectionStringParseResult.connectionProperties = this._removeIBMSubCode(connectionStringParseResult.connString.substring(indexOfProperties + 1, connectionStringParseResult.connString.length - 1));
  433. connectionStringParseResult.connectionProperties = this._removeSecureGWInfo(connectionStringParseResult.connectionProperties);
  434. } else {
  435. connectionStringParseResult.connectionProperties = '';
  436. }
  437. },
  438. _removeIBMSubCode: function _removeIBMSubCode(propertiesString) {
  439. if (propertiesString.indexOf('ibmcognos.subcode') !== -1) {
  440. var indexOfSC = propertiesString.indexOf(';', 1);
  441. if (indexOfSC >= 0) {
  442. return propertiesString.substring(indexOfSC + 1);
  443. } else {
  444. return '';
  445. }
  446. } else {
  447. return propertiesString;
  448. }
  449. },
  450. _removeSecureGWInfo: function _removeSecureGWInfo(propertiesString) {
  451. if (propertiesString.indexOf('IBMCOGNOS_SG_GWID') !== -1) {
  452. var indexOfSC = propertiesString.indexOf(';', 1);
  453. if (indexOfSC >= 0) {
  454. propertiesString = propertiesString.substring(indexOfSC + 1);
  455. } else {
  456. propertiesString = '';
  457. }
  458. }
  459. if (propertiesString.indexOf('IBMCOGNOS_SG_DEST') !== -1) {
  460. indexOfSC = propertiesString.indexOf(';', 1);
  461. if (indexOfSC >= 0) {
  462. propertiesString = propertiesString.substring(indexOfSC + 1);
  463. } else {
  464. propertiesString = '';
  465. }
  466. }
  467. if (propertiesString.indexOf('IBMCOGNOS_SG_JDBC_DEST') !== -1) {
  468. indexOfSC = propertiesString.indexOf(';', 1);
  469. if (indexOfSC >= 0) {
  470. propertiesString = propertiesString.substring(indexOfSC + 1);
  471. } else {
  472. propertiesString = '';
  473. }
  474. }
  475. if (propertiesString.indexOf('IBMCOGNOS_SG_JDBC_OVERRIDE') !== -1) {
  476. indexOfSC = propertiesString.indexOf(';', 1);
  477. if (indexOfSC >= 0) {
  478. propertiesString = propertiesString.substring(indexOfSC + 1);
  479. } else {
  480. propertiesString = '';
  481. }
  482. }
  483. return propertiesString;
  484. },
  485. getAuthenticationFromString: function getAuthenticationFromString(connection, signons) {
  486. var retVal = 'anon';
  487. if (connection.isNew) {//do nothing
  488. } else if (signons.length > 0) {
  489. retVal = 'usc';
  490. } else if (connection.credentialNamespaces && connection.credentialNamespaces.length > 0) {
  491. retVal = 'ucac';
  492. } else if (connection.connectionString.indexOf('^User ID:') !== -1) {
  493. retVal = 'prompt';
  494. }
  495. return retVal;
  496. },
  497. saveConnection: function saveConnection(ajaxService, objectInfo, connectionSignons, removedSignons) {
  498. delete objectInfo.tenantID;
  499. delete objectInfo.owner;
  500. objectInfo.type = 'dataSourceConnection';
  501. return this._updateConnection(ajaxService, objectInfo).then(function () {
  502. return this._removedDeletedSignons(ajaxService, removedSignons);
  503. }.bind(this)).then(function () {
  504. return this._updateEditedSignons(ajaxService, objectInfo, connectionSignons);
  505. }.bind(this)).then(function () {
  506. return this._addCreatedSignons(ajaxService, objectInfo, connectionSignons);
  507. }.bind(this));
  508. },
  509. _updateSignonPolicies: function _updateSignonPolicies(ajaxService, objectInfo, location) {
  510. var options = {
  511. method: 'PUT',
  512. contentType: 'application/json; charset=utf-8',
  513. data: JSON.stringify(objectInfo),
  514. url: location
  515. };
  516. return ajaxService.ajax(options);
  517. },
  518. _updateEditedSignons: function _updateEditedSignons(ajaxService, objectInfo, connectionSignons) {
  519. var editedSignons = _.filter(connectionSignons, function (signon) {
  520. return signon.isEdited;
  521. });
  522. var deletePromises = [];
  523. editedSignons.forEach(function (signon) {
  524. var delPromise = this._deleteSignon(ajaxService, signon.id);
  525. deletePromises.push(delPromise);
  526. }.bind(this));
  527. var createPromises = [];
  528. return Promise.all(deletePromises).then(function () {
  529. editedSignons.forEach(function (signon) {
  530. createPromises.push(this._createSignon(ajaxService, objectInfo, signon));
  531. }.bind(this));
  532. return Promise.all(createPromises);
  533. }.bind(this));
  534. },
  535. _addCreatedSignons: function _addCreatedSignons(ajaxService, objectInfo, connectionSignons) {
  536. var promises = [];
  537. var newSignons = _.filter(connectionSignons, function (signon) {
  538. return signon.isNew;
  539. });
  540. newSignons.forEach(function (signon) {
  541. promises.push(this._createSignon(ajaxService, objectInfo, signon));
  542. }.bind(this));
  543. return Promise.all(promises);
  544. },
  545. _removedDeletedSignons: function _removedDeletedSignons(ajaxService, removedSignons) {
  546. var promises = [];
  547. if (_.isUndefined(removedSignons) || removedSignons === null) {
  548. return Promise.resolve();
  549. }
  550. removedSignons.forEach(function (signon) {
  551. var remPromise = this._deleteSignon(ajaxService, signon.id);
  552. promises.push(remPromise);
  553. }.bind(this));
  554. return Promise.all(promises);
  555. },
  556. _deleteSignon: function _deleteSignon(ajaxService, signonId) {
  557. var options = {
  558. method: 'DELETE',
  559. url: 'v1/objects/' + signonId + '?force=true'
  560. };
  561. return ajaxService.ajax(options);
  562. },
  563. createNewConnection: function createNewConnection(ajaxService, objectInfo, connectionSignons) {
  564. return new Promise(function (resolve, reject) {
  565. return this._createConnection(ajaxService, objectInfo).then(function (response) {
  566. var respLocation = this._getLocation(response);
  567. objectInfo.connId = respLocation.split('/').pop();
  568. return this._createSignons(ajaxService, objectInfo, connectionSignons);
  569. }.bind(this)).then(resolve, function (err) {
  570. reject(err);
  571. });
  572. }.bind(this));
  573. },
  574. _createDataServer: function _createDataServer(ajaxService, objectInfo) {
  575. var dataSource = {
  576. defaultName: objectInfo.defaultName,
  577. type: 'dataSource'
  578. };
  579. var options = {
  580. method: 'POST',
  581. contentType: 'application/json; charset=utf-8',
  582. data: JSON.stringify(dataSource)
  583. };
  584. options.url = AJAXUtils.getAJAXURL('datasources');
  585. return ajaxService.ajax(options);
  586. },
  587. createNewDataSource: function createNewDataSource(ajaxService, objectInfo, connectionSignons) {
  588. return new Promise(function (resolve, reject) {
  589. return this._createDataServer(ajaxService, objectInfo, connectionSignons).then(function (response) {
  590. var location = this._getLocation(response);
  591. objectInfo.dataSourceId = location.split('/').pop();
  592. return this.createNewConnection(ajaxService, objectInfo, connectionSignons);
  593. }.bind(this)).then(resolve, function (err) {
  594. reject(err);
  595. });
  596. }.bind(this));
  597. },
  598. _createSignons: function _createSignons(ajaxService, objectInfo, connectionSignons) {
  599. var promises = [];
  600. objectInfo.id = objectInfo.connId;
  601. if (!_.isUndefined(connectionSignons) && connectionSignons !== null) {
  602. connectionSignons.forEach(function (item) {
  603. promises.push(this._createSignon(ajaxService, objectInfo, item));
  604. }.bind(this));
  605. }
  606. return Promise.all(promises);
  607. },
  608. _createConnection: function _createConnection(ajaxService, objectInfo) {
  609. var connURL = AJAXUtils.getAJAXURL('datasources') + '/' + objectInfo.dataSourceId + '/connections';
  610. var options = {
  611. method: 'POST',
  612. contentType: 'application/json; charset=utf-8',
  613. data: JSON.stringify(objectInfo),
  614. url: connURL
  615. };
  616. return ajaxService.ajax(options);
  617. },
  618. _updateConnection: function _updateConnection(ajaxService, objectInfo) {
  619. var connURL = AJAXUtils.getAJAXURL('datasources') + '/' + objectInfo.dataSourceId + '/connections/' + objectInfo.connId;
  620. var options = {
  621. method: 'PUT',
  622. contentType: 'application/json; charset=utf-8',
  623. data: JSON.stringify(objectInfo),
  624. url: connURL
  625. };
  626. return ajaxService.ajax(options);
  627. },
  628. _createSignon: function _createSignon(ajaxService, objectInfo, signon) {
  629. delete signon.searchPath;
  630. delete signon.owner;
  631. delete signon._meta;
  632. delete signon.ancestors;
  633. delete signon.version;
  634. if (signon.credentialsEx && signon.credentialsEx.updatedSignon) {
  635. if (signon.credentials) {
  636. delete signon.credentials;
  637. }
  638. delete signon.credentialsEx.updatedSignon;
  639. } //we need to add consumers to the signon.
  640. if (signon.membersListObject && signon.membersListObject.length > 0) {
  641. var consumers = [];
  642. _.each(signon.membersListObject, function (item) {
  643. var memberObject = {
  644. 'id': item.id,
  645. 'defaultName': item.label,
  646. 'searchPath': item.searchPath,
  647. 'type': item.type
  648. };
  649. consumers.push(memberObject);
  650. }.bind(this));
  651. signon.consumers = consumers;
  652. delete signon.membersListObject;
  653. }
  654. var url = AJAXUtils.getAJAXURL('datasources') + '/' + objectInfo.dataSourceId + '/connections/' + objectInfo.connId + '/signons';
  655. var options = {
  656. method: 'POST',
  657. contentType: 'application/json; charset=utf-8',
  658. data: JSON.stringify(signon),
  659. url: url
  660. };
  661. return ajaxService.ajax(options).then(function (response) {
  662. var location = this._getLocation(response);
  663. delete signon.credentials;
  664. return this._updateSignonPolicies(ajaxService, signon, location);
  665. }.bind(this));
  666. },
  667. _sendTest: function _sendTest(ajaxService, objectInfo, testType) {
  668. var options = {
  669. method: 'POST',
  670. contentType: 'application/json; charset=utf-8',
  671. dataType: 'json',
  672. data: JSON.stringify(objectInfo)
  673. };
  674. if (objectInfo.connectionString.indexOf('EXTCATALOG') > -1) {
  675. options.url = 'v1/metadata/sources/test_with_credential';
  676. } else {
  677. options.url = AJAXUtils.getAJAXURL(testType);
  678. }
  679. return ajaxService.ajax(options);
  680. },
  681. test: function test(ajaxService, connectionString, selectedSignon, apiToken) {
  682. var testObj = {
  683. connectionString: connectionString
  684. };
  685. if (apiToken && apiToken.apiTokenEncoded) {
  686. testObj.apiToken = apiToken.apiTokenEncoded;
  687. } else if (apiToken) {
  688. testObj.apiToken = apiToken;
  689. }
  690. var testType = 'test'; //Order matters
  691. if (selectedSignon && selectedSignon.namespace) {
  692. testObj.namespace = selectedSignon.namespace;
  693. } else if (selectedSignon && selectedSignon.credentialsEx && selectedSignon.credentialsEx.updatedSignon) {
  694. if (selectedSignon.credentialsEx.updatedSignon) {
  695. testObj.userName = selectedSignon.credentialsEx.username;
  696. testObj.password = selectedSignon.credentialsEx.password;
  697. }
  698. if (selectedSignon.credentialsEx.updatedSignon === 'testDialog') {
  699. delete selectedSignon.credentialsEx.updatedSignon;
  700. }
  701. } else if (selectedSignon && selectedSignon.credentials) {
  702. testObj.credentialString = selectedSignon.credentials;
  703. testType = 'testWithConn';
  704. }
  705. return this._sendTest(ajaxService, testObj, testType);
  706. },
  707. _getLocation: function _getLocation(response) {
  708. return response.jqXHR.getResponseHeader('location');
  709. },
  710. isOLAPConnection: function isOLAPConnection(objInfo) {
  711. var dsMeta;
  712. if (objInfo.vendor) {
  713. dsMeta = objInfo.vendor;
  714. } else {
  715. dsMeta = this.getDSMeta(objInfo);
  716. }
  717. return dsMeta ? dsMeta.isOLAP : false;
  718. },
  719. getConnectionClass: function getConnectionClass(objInfo) {
  720. if (this.isOLAPConnection(objInfo)) {
  721. return ConnectionUtils.OLAP;
  722. }
  723. return ConnectionUtils.JDBC;
  724. },
  725. getDSMeta: function getDSMeta(objInfo) {
  726. var dsCode = this._getDSCode(objInfo);
  727. var dsMeta = _.find(this.datasourceList.data, function (item) {
  728. if (item.versions) {
  729. var flag = false;
  730. for (var i = 0; i < item.versions.length; i++) {
  731. if (item.versions[i].code.toLowerCase() === dsCode.toLowerCase()) {
  732. flag = true;
  733. }
  734. }
  735. return flag;
  736. } else if (item.code.toLowerCase() === dsCode.toLowerCase()) {
  737. return true;
  738. } else if (item.categoryId && item.categoryId.toLowerCase() === ConnectionUtils.JDBC.toLowerCase() && dsCode.indexOf(ConnectionUtils.JDBC) === 0) {
  739. var subCode = 'JDBC:' + item.subProtocol;
  740. return subCode.toLowerCase() === dsCode.toLowerCase();
  741. }
  742. return false;
  743. }.bind(this));
  744. if (dsMeta && dsMeta.versions) {
  745. dsMeta.code = dsCode;
  746. }
  747. return dsMeta;
  748. },
  749. _getDSCode: function _getDSCode(objInfo) {
  750. var connString = objInfo.connectionString ? objInfo.connectionString : objInfo.connString;
  751. var dsCode = this._getMainCode(connString);
  752. if (dsCode === ConnectionUtils.JDBC) {
  753. dsCode = this._getSubCode(objInfo);
  754. }
  755. return dsCode;
  756. },
  757. isTMRConnection: function isTMRConnection(objInfo) {
  758. var code;
  759. if (objInfo.vendor) {
  760. code = objInfo.vendor.code;
  761. } else {
  762. var connString = objInfo.connectionString ? objInfo.connectionString : objInfo.connString;
  763. code = this._getMainCode(connString);
  764. }
  765. return code === ConnectionUtils.TMR;
  766. },
  767. checkForSecuredGatewayExtension: function checkForSecuredGatewayExtension(glassContext) {
  768. return glassContext.appController.findCollection('ibm.com.admin.AdminPanel');
  769. }
  770. });
  771. ConnectionUtils.EXTCAT = 'EXTCATALOG';
  772. ConnectionUtils.JDBC = 'JDBC';
  773. ConnectionUtils.OLAP = 'OLAP';
  774. ConnectionUtils.TMR = 'TMR';
  775. ConnectionUtils.SAPBW = 'BW';
  776. var _static = {
  777. getInstance: function getInstance() {
  778. if (!_singletonInstance) {
  779. _singletonInstance = new ConnectionUtils();
  780. try {
  781. _singletonInstance.datasourceList = JSON.parse(datasources);
  782. } catch (err) {//do nothing
  783. }
  784. }
  785. return _singletonInstance;
  786. }
  787. };
  788. return _static.getInstance();
  789. });