admin.js 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829
  1. /*
  2. * Password Management Servlets (PWM)
  3. * http://www.pwm-project.org
  4. *
  5. * Copyright (c) 2006-2009 Novell, Inc.
  6. * Copyright (c) 2009-2016 The PWM Project
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation; either version 2 of the License, or
  11. * (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program; if not, write to the Free Software
  20. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  21. */
  22. var PWM_ADMIN = PWM_ADMIN || {};
  23. var PWM_MAIN = PWM_MAIN || {};
  24. var PWM_GLOBAL = PWM_GLOBAL || {};
  25. PWM_ADMIN.initAdminNavMenu = function() {
  26. var makeMenu = function(){
  27. require(["dijit/form/DropDownButton", "dijit/DropDownMenu", "dijit/Menu","dijit/MenuItem", "dijit/PopupMenuItem", "dojo/dom", "dijit/MenuSeparator"],
  28. function(DropDownButton, DropDownMenu, Menu, MenuItem, PopupMenuItem, dom, MenuSeparator){
  29. var pMenu = new DropDownMenu({ style: "display: none;"});
  30. pMenu.addChild(new MenuItem({
  31. label: PWM_ADMIN.showString('Title_LogViewer'),
  32. id: 'eventLog_dropitem',
  33. onClick: function() {
  34. PWM_MAIN.goto(PWM_GLOBAL['url-context'] + '/private/admin/logs');
  35. }
  36. }));
  37. pMenu.addChild(new MenuItem({
  38. label: PWM_ADMIN.showString('Title_TokenLookup'),
  39. id: 'tokenLookup_dropitem',
  40. onClick: function() {
  41. PWM_MAIN.goto(PWM_GLOBAL['url-context'] + '/private/admin/tokens');
  42. }
  43. }));
  44. pMenu.addChild(new MenuItem({
  45. label: PWM_ADMIN.showString('Title_URLReference'),
  46. id: 'urlReference_dropitem',
  47. onClick: function() {
  48. PWM_MAIN.goto(PWM_GLOBAL['url-context'] + '/private/admin/urls');
  49. }
  50. }));
  51. pMenu.addChild(new MenuSeparator());
  52. pMenu.addChild(new MenuItem({
  53. label: 'Full Page Health Status',
  54. id: 'fullPageHealthStatus_dropitem',
  55. onClick: function() {
  56. PWM_MAIN.goto(PWM_GLOBAL['url-context'] + '/public/health.jsp');
  57. }
  58. }));
  59. pMenu.addChild(new MenuSeparator());
  60. pMenu.addChild(new MenuItem({
  61. label: '<span class="pwm-icon pwm-icon-external-link"></span> Application Reference',
  62. id: 'applictionReference_dropitem',
  63. onClick: function() {
  64. PWM_MAIN.newWindowOpen(PWM_GLOBAL['url-context'] + '/public/reference/','referencedoc');
  65. }
  66. }));
  67. if (PWM_GLOBAL['setting-displayEula'] == true) {
  68. pMenu.addChild(new MenuItem({
  69. label: 'View EULA',
  70. id: 'viewEULA_dropitem',
  71. onClick: function() {
  72. PWM_MAIN.showEula(false,null);
  73. }
  74. }));
  75. }
  76. pMenu.addChild(new MenuSeparator());
  77. pMenu.addChild(new MenuItem({
  78. label: 'Configuration Manager',
  79. id: 'configurationManager_dropitem',
  80. onClick: function() {
  81. PWM_MAIN.goto(PWM_GLOBAL['url-context'] + '/private/config/manager');
  82. }
  83. }));
  84. pMenu.addChild(new MenuItem({
  85. label: 'Configuration Editor',
  86. id: 'configurationEditor_dropitem',
  87. onClick: function() {
  88. PWM_MAIN.goto(PWM_GLOBAL['url-context'] + '/private/config/editor');
  89. }
  90. }));
  91. var dropDownButton = new DropDownButton({
  92. label: "More Options",
  93. name: "More Options",
  94. dropDown: pMenu,
  95. id: "progButton"
  96. });
  97. dom.byId("admin-nav-menu-container").appendChild(dropDownButton.domNode);
  98. });
  99. };
  100. PWM_MAIN.doIfQueryHasResults("#admin-nav-menu-container",makeMenu)
  101. };
  102. PWM_ADMIN.reportDataHeaders = function() {
  103. return {
  104. "username":PWM_ADMIN.showString("Field_Report_Username"),
  105. "userDN":PWM_ADMIN.showString("Field_Report_UserDN"),
  106. "ldapProfile":PWM_ADMIN.showString("Field_Report_LDAP_Profile"),
  107. "email":PWM_ADMIN.showString("Field_Report_Email"),
  108. "userGUID":PWM_ADMIN.showString("Field_Report_UserGuid"),
  109. "accountExpirationTime":PWM_ADMIN.showString("Field_Report_AccountExpireTime"),
  110. "passwordExpirationTime":PWM_ADMIN.showString("Field_Report_PwdExpireTime"),
  111. "passwordChangeTime":PWM_ADMIN.showString("Field_Report_PwdChangeTime"),
  112. "responseSetTime":PWM_ADMIN.showString("Field_Report_ResponseSaveTime"),
  113. "lastLoginTime":PWM_ADMIN.showString("Field_Report_LastLogin"),
  114. "hasResponses":PWM_ADMIN.showString("Field_Report_HasResponses"),
  115. "hasHelpdeskResponses":PWM_ADMIN.showString("Field_Report_HasHelpdeskResponses"),
  116. "responseStorageMethod":PWM_ADMIN.showString("Field_Report_ResponseStorageMethod"),
  117. "responseFormatType":PWM_ADMIN.showString("Field_Report_ResponseFormatType"),
  118. "passwordStatusExpired":PWM_ADMIN.showString("Field_Report_PwdExpired"),
  119. "passwordStatusPreExpired":PWM_ADMIN.showString("Field_Report_PwdPreExpired"),
  120. "passwordStatusViolatesPolicy":PWM_ADMIN.showString("Field_Report_PwdViolatesPolicy"),
  121. "passwordStatusWarnPeriod":PWM_ADMIN.showString("Field_Report_PwdWarnPeriod"),
  122. "requiresPasswordUpdate":PWM_ADMIN.showString("Field_Report_RequiresPasswordUpdate"),
  123. "requiresResponseUpdate":PWM_ADMIN.showString("Field_Report_RequiresResponseUpdate"),
  124. "requiresProfileUpdate":PWM_ADMIN.showString("Field_Report_RequiresProfileUpdate"),
  125. "cacheTimestamp":PWM_ADMIN.showString("Field_Report_RecordCacheTime")
  126. };
  127. };
  128. PWM_ADMIN.initReportDataGrid=function() {
  129. var headers = PWM_ADMIN.reportDataHeaders();
  130. require(["dojo","dojo/_base/declare", "dgrid/Grid", "dgrid/Keyboard", "dgrid/Selection", "dgrid/extensions/ColumnResizer", "dgrid/extensions/ColumnReorder", "dgrid/extensions/ColumnHider", "dgrid/extensions/DijitRegistry"],
  131. function(dojo, declare, Grid, Keyboard, Selection, ColumnResizer, ColumnReorder, ColumnHider, DijitRegistry){
  132. var columnHeaders = headers;
  133. // Create a new constructor by mixing in the components
  134. var CustomGrid = declare([ Grid, Keyboard, Selection, ColumnResizer, ColumnReorder, ColumnHider, DijitRegistry ]);
  135. // Now, create an instance of our custom grid
  136. PWM_VAR['reportGrid'] = new CustomGrid({columns: columnHeaders}, "grid");
  137. // unclick superfluous fields
  138. PWM_MAIN.getObject('grid-hider-menu-check-cacheTimestamp').click();
  139. PWM_MAIN.getObject('grid-hider-menu-check-ldapProfile').click();
  140. PWM_MAIN.getObject('grid-hider-menu-check-email').click();
  141. PWM_MAIN.getObject('grid-hider-menu-check-userGUID').click();
  142. PWM_MAIN.getObject('grid-hider-menu-check-responseStorageMethod').click();
  143. PWM_MAIN.getObject('grid-hider-menu-check-responseFormatType').click();
  144. PWM_MAIN.getObject('grid-hider-menu-check-userDN').click();
  145. PWM_MAIN.getObject('grid-hider-menu-check-hasHelpdeskResponses').click();
  146. PWM_MAIN.getObject('grid-hider-menu-check-passwordStatusExpired').click();
  147. PWM_MAIN.getObject('grid-hider-menu-check-passwordStatusPreExpired').click();
  148. PWM_MAIN.getObject('grid-hider-menu-check-passwordStatusViolatesPolicy').click();
  149. PWM_MAIN.getObject('grid-hider-menu-check-passwordStatusWarnPeriod').click();
  150. PWM_VAR['reportGrid'].on(".dgrid-row:click", function(evt){
  151. PWM_ADMIN.detailView(evt, PWM_ADMIN.reportDataHeaders(), PWM_VAR['reportGrid']);
  152. });
  153. });
  154. };
  155. PWM_ADMIN.initDownloadUserReportCsvForm = function() {
  156. require(["dojo/on", "dojo/query"], function(on, query) {
  157. query("#downloadUserReportCsvForm").on("click", function(e) {
  158. var selectedColumns = [];
  159. query("#grid-hider-menu input:checked").forEach(function(node, index, nodeList) {
  160. selectedColumns.push(node.id.replace('grid-hider-menu-check-', ''));
  161. });
  162. console.log("Selected columns: " + selectedColumns);
  163. downloadUserReportCsvForm.selectedColumns.value = selectedColumns;
  164. });
  165. });
  166. }
  167. PWM_ADMIN.refreshReportDataGrid=function() {
  168. if (PWM_MAIN.getObject('button-refreshReportDataGrid')) {
  169. PWM_MAIN.getObject('button-refreshReportDataGrid').disabled = true;
  170. }
  171. PWM_VAR['reportGrid'].refresh();
  172. var maximum = PWM_MAIN.getObject('maxReportDataResults').value;
  173. var url = PWM_GLOBAL['url-restservice'] + "/report?maximum=" + maximum;
  174. var loadFunction = function(data) {
  175. if (PWM_MAIN.getObject('button-refreshReportDataGrid')) {
  176. PWM_MAIN.getObject('button-refreshReportDataGrid').disabled = false;
  177. }
  178. if (data['error']) {
  179. PWM_MAIN.showErrorDialog(data);
  180. return;
  181. }
  182. var users = data['data']['users'];
  183. // "Flatten out" the nested properties, so they can be displayed in the grid
  184. for (var i = 0, len = users.length; i < len; i++) {
  185. var user = users[i];
  186. if (user.hasOwnProperty("passwordStatus")) {
  187. user["passwordStatusExpired"] = user["passwordStatus"]["expired"];
  188. user["passwordStatusPreExpired"] = user["passwordStatus"]["preExpired"];
  189. user["passwordStatusViolatesPolicy"] = user["passwordStatus"]["violatesPolicy"];
  190. user["passwordStatusWarnPeriod"] = user["passwordStatus"]["warnPeriod"];
  191. }
  192. }
  193. PWM_VAR['reportGrid'].renderArray(users);
  194. };
  195. PWM_MAIN.ajaxRequest(url,loadFunction,{method:'GET'});
  196. };
  197. PWM_ADMIN.refreshReportDataStatus=function(refreshTime) {
  198. var doRefresh = refreshTime
  199. ? function(){setTimeout(function(){PWM_ADMIN.refreshReportDataStatus(refreshTime);},refreshTime);}
  200. : function(){};
  201. var url = PWM_GLOBAL['url-restservice'] + "/report/status";
  202. var loadFunction = function(data) {
  203. if (data['data'] && data['data']['presentable']) {
  204. var fields = data['data']['presentable'];
  205. var htmlTable = '';
  206. for (var field in fields) {
  207. htmlTable += '<tr><td>' + field + '</td><td id="report_status_' + field + '">' + fields[field] + '</tr>';
  208. }
  209. PWM_MAIN.getObject('statusTable').innerHTML = htmlTable;
  210. for (var field in fields) {(function(field){
  211. PWM_MAIN.TimestampHandler.initElement(PWM_MAIN.getObject("report_status_" + field));
  212. console.log('called + ' + field);
  213. }(field)); }
  214. }
  215. if (data['data']['controllable']) {
  216. if (data['data']['raw']['inProgress']) {
  217. PWM_MAIN.getObject("reportStartButton").disabled = true;
  218. PWM_MAIN.getObject("reportStopButton").disabled = false;
  219. PWM_MAIN.getObject("reportClearButton").disabled = true;
  220. } else {
  221. PWM_MAIN.getObject("reportStartButton").disabled = false;
  222. PWM_MAIN.getObject("reportStopButton").disabled = true;
  223. PWM_MAIN.getObject("reportClearButton").disabled = false;
  224. }
  225. } else {
  226. PWM_MAIN.getObject("reportStartButton").disabled = true;
  227. PWM_MAIN.getObject("reportStopButton").disabled = true;
  228. PWM_MAIN.getObject("reportClearButton").disabled = true;
  229. }
  230. doRefresh();
  231. };
  232. PWM_MAIN.ajaxRequest(url,loadFunction,{method:'GET'});
  233. };
  234. PWM_ADMIN.refreshReportDataSummary=function(refreshTime) {
  235. var doRefresh = refreshTime
  236. ? function(){setTimeout(function(){PWM_ADMIN.refreshReportDataSummary(refreshTime);},refreshTime);}
  237. : function(){};
  238. require(["dojo","dojo/number"],function(dojo,number){
  239. var url = PWM_GLOBAL['url-restservice'] + "/report/summary";
  240. var loadFunction = function(data) {
  241. if (data['data'] && data['data']['presentable']) {
  242. var htmlTable = '';
  243. for (var item in data['data']['presentable']) {
  244. var rowData = data['data']['presentable'][item];
  245. htmlTable += '<tr><td>' + rowData['label'] + '</td><td>' + rowData['count'] + '</td><td>' + (rowData['pct'] ? rowData['pct'] : '') + '</td></tr>';
  246. }
  247. PWM_MAIN.getObject('summaryTable').innerHTML = htmlTable;
  248. }
  249. doRefresh();
  250. };
  251. PWM_MAIN.ajaxRequest(url,loadFunction,{method:'GET'});
  252. });
  253. };
  254. PWM_ADMIN.reportAction=function(action) {
  255. var confirmText, successText;
  256. if (!action) {
  257. return;
  258. }
  259. if (action=='start') {
  260. confirmText = PWM_ADMIN.showString('Confirm_Report_Start');
  261. successText = PWM_ADMIN.showString('Display_Start_Report_Success');
  262. } else if (action=='stop') {
  263. confirmText = PWM_ADMIN.showString('Confirm_Report_Stop');
  264. successText= PWM_ADMIN.showString('Display_Stop_Report_Success');
  265. } else if (action=='clear') {
  266. confirmText = PWM_ADMIN.showString('Confirm_Report_Clear');
  267. successText = PWM_ADMIN.showString('Display_Clear_Report_Success');
  268. }
  269. PWM_MAIN.showConfirmDialog({text:confirmText,okAction:function(){
  270. PWM_MAIN.showWaitDialog({loadFunction:function(){
  271. setTimeout(function(){
  272. var url = PWM_GLOBAL['url-restservice'] + "/command/report/" + action;
  273. var loadFunction = function(data) {
  274. PWM_MAIN.closeWaitDialog();
  275. PWM_MAIN.showDialog({title:PWM_MAIN.showString('Title_Success'),text:successText,nextAction:function(){
  276. PWM_ADMIN.refreshReportDataStatus();
  277. PWM_ADMIN.refreshReportDataSummary();
  278. }});
  279. };
  280. PWM_MAIN.ajaxRequest(url,loadFunction,{method:'GET'});
  281. },3000);
  282. }});
  283. }});
  284. };
  285. PWM_ADMIN.webSessionHeaders = function() {
  286. return {
  287. "userID":PWM_ADMIN.showString('Field_Session_UserID'),
  288. "ldapProfile":PWM_ADMIN.showString('Field_Session_LdapProfile'),
  289. "userDN":PWM_ADMIN.showString('Field_Session_UserDN'),
  290. "createTime":PWM_ADMIN.showString('Field_Session_CreateTime'),
  291. "lastTime":PWM_ADMIN.showString('Field_Session_LastTime'),
  292. "label":PWM_ADMIN.showString('Field_Session_Label'),
  293. "idle":PWM_ADMIN.showString('Field_Session_Idle'),
  294. "locale":PWM_ADMIN.showString('Field_Session_Locale'),
  295. "srcAddress":PWM_ADMIN.showString('Field_Session_SrcAddress'),
  296. "srcHost":PWM_ADMIN.showString('Field_Session_SrcHost'),
  297. "lastUrl":PWM_ADMIN.showString('Field_Session_LastURL'),
  298. "intruderAttempts":PWM_ADMIN.showString('Field_Session_IntruderAttempts')
  299. };
  300. };
  301. PWM_ADMIN.initActiveSessionGrid=function() {
  302. var headers = PWM_ADMIN.webSessionHeaders();
  303. require(["dojo","dojo/_base/declare", "dgrid/Grid", "dgrid/Keyboard", "dgrid/Selection", "dgrid/extensions/ColumnResizer", "dgrid/extensions/ColumnReorder", "dgrid/extensions/ColumnHider", "dgrid/extensions/DijitRegistry"],
  304. function(dojo, declare, Grid, Keyboard, Selection, ColumnResizer, ColumnReorder, ColumnHider, DijitRegistry){
  305. var columnHeaders = headers;
  306. // Create a new constructor by mixing in the components
  307. var CustomGrid = declare([ Grid, Keyboard, Selection, ColumnResizer, ColumnReorder, ColumnHider, DijitRegistry ]);
  308. // Now, create an instance of our custom grid
  309. PWM_VAR['activeSessionsGrid'] = new CustomGrid({
  310. columns: columnHeaders
  311. }, "activeSessionGrid");
  312. // unclick superfluous fields
  313. PWM_MAIN.getObject('activeSessionGrid-hider-menu-check-label').click();
  314. PWM_MAIN.getObject('activeSessionGrid-hider-menu-check-userDN').click();
  315. PWM_MAIN.getObject('activeSessionGrid-hider-menu-check-srcHost').click();
  316. PWM_MAIN.getObject('activeSessionGrid-hider-menu-check-locale').click();
  317. PWM_MAIN.getObject('activeSessionGrid-hider-menu-check-lastUrl').click();
  318. PWM_MAIN.getObject('activeSessionGrid-hider-menu-check-intruderAttempts').click();
  319. PWM_ADMIN.refreshActiveSessionGrid();
  320. PWM_VAR['activeSessionsGrid'].on(".dgrid-row:click", function(evt){
  321. PWM_ADMIN.detailView(evt, PWM_ADMIN.webSessionHeaders(), PWM_VAR['activeSessionsGrid']);
  322. });
  323. });
  324. };
  325. PWM_ADMIN.refreshActiveSessionGrid=function() {
  326. require(["dojo"],function(dojo){
  327. var grid = PWM_VAR['activeSessionsGrid'];
  328. grid.refresh();
  329. var maximum = PWM_MAIN.getObject('maxActiveSessionResults').value;
  330. var url = PWM_GLOBAL['url-restservice'] + "/app-data/session?maximum=" + maximum;
  331. var loadFunction = function(data) {
  332. grid.renderArray(data['data']);
  333. grid.set("sort", { attribute : 'createTime', ascending: false, descending: true });
  334. };
  335. PWM_MAIN.ajaxRequest(url,loadFunction,{method:'GET'});
  336. });
  337. };
  338. PWM_ADMIN.intruderHeaders = function(){
  339. return {
  340. "subject":PWM_ADMIN.showString('Field_Intruder_Subject'),
  341. "timestamp":PWM_ADMIN.showString('Field_Intruder_Timestamp'),
  342. "count":PWM_ADMIN.showString('Field_Intruder_Count'),
  343. "status":PWM_ADMIN.showString('Field_Intruder_Status')
  344. };
  345. };
  346. PWM_ADMIN.initIntrudersGrid=function() {
  347. PWM_VAR['intruderRecordTypes'] = ["ADDRESS","USERNAME","USER_ID","ATTRIBUTE","TOKEN_DEST"];
  348. var intruderGridHeaders = PWM_ADMIN.intruderHeaders();
  349. require(["dojo","dojo/_base/declare", "dgrid/Grid", "dgrid/Keyboard", "dgrid/Selection", "dgrid/extensions/ColumnResizer", "dgrid/extensions/ColumnReorder", "dgrid/extensions/ColumnHider", "dgrid/extensions/DijitRegistry"],
  350. function(dojo, declare, Grid, Keyboard, Selection, ColumnResizer, ColumnReorder, ColumnHider, DijitRegistry){
  351. // Create a new constructor by mixing in the components
  352. var CustomGrid = declare([ Grid, Keyboard, Selection, ColumnResizer, ColumnReorder, ColumnHider, DijitRegistry ]);
  353. // Now, create an instance of our custom grid
  354. PWM_VAR['intruderGrid'] = {};
  355. for (var i = 0; i < PWM_VAR['intruderRecordTypes'].length; i++) {
  356. (function(iter){
  357. var recordType = PWM_VAR['intruderRecordTypes'][iter];
  358. var grid = new CustomGrid({ columns: intruderGridHeaders}, recordType + "_Grid");
  359. PWM_VAR['intruderGrid'][recordType] = grid;
  360. grid.on(".dgrid-row:click", function(evt){
  361. PWM_ADMIN.detailView(evt, PWM_ADMIN.intruderHeaders(), grid);
  362. });
  363. })(i)
  364. }
  365. PWM_ADMIN.refreshIntruderGrid();
  366. });
  367. };
  368. PWM_ADMIN.refreshIntruderGrid=function() {
  369. for (var i = 0; i < PWM_VAR['intruderRecordTypes'].length; i++) {
  370. var recordType = PWM_VAR['intruderRecordTypes'][i];
  371. PWM_VAR['intruderGrid'][recordType].refresh();
  372. }
  373. try {
  374. var maximum = PWM_MAIN.getObject('maxIntruderGridResults').value;
  375. } catch (e) {
  376. maximum = 1000;
  377. }
  378. var url = PWM_GLOBAL['url-restservice'] + "/app-data/intruder?maximum=" + maximum;
  379. var loadFunction = function(data) {
  380. for (var i = 0; i < PWM_VAR['intruderRecordTypes'].length; i++) {
  381. var recordType = PWM_VAR['intruderRecordTypes'][i];
  382. PWM_VAR['intruderGrid'][recordType].renderArray(data['data'][recordType]);
  383. }
  384. };
  385. PWM_MAIN.ajaxRequest(url,loadFunction,{method:'GET'});
  386. };
  387. PWM_ADMIN.auditUserHeaders = function() {
  388. return {
  389. "timestamp": PWM_ADMIN.showString('Field_Audit_Timestamp'),
  390. "perpetratorID": PWM_ADMIN.showString('Field_Audit_PerpetratorID'),
  391. "perpetratorDN": PWM_ADMIN.showString('Field_Audit_PerpetratorDN'),
  392. "perpetratorLdapProfile": PWM_ADMIN.showString('Field_Audit_PerpetratorLdapProfile'),
  393. "eventCode": PWM_ADMIN.showString('Field_Audit_EventCode'),
  394. "message": PWM_ADMIN.showString('Field_Audit_Message'),
  395. "sourceAddress": PWM_ADMIN.showString('Field_Audit_SourceAddress'),
  396. "sourceHost": PWM_ADMIN.showString('Field_Audit_SourceHost'),
  397. "guid": PWM_ADMIN.showString('Field_Audit_GUID'),
  398. "narrative": PWM_ADMIN.showString('Field_Audit_Narrative')
  399. };
  400. };
  401. PWM_ADMIN.auditHelpdeskHeaders = function() {
  402. return {
  403. "timestamp": PWM_ADMIN.showString('Field_Audit_Timestamp'),
  404. "perpetratorID": PWM_ADMIN.showString('Field_Audit_PerpetratorID'),
  405. "perpetratorDN": PWM_ADMIN.showString('Field_Audit_PerpetratorDN'),
  406. "perpetratorLdapProfile": PWM_ADMIN.showString('Field_Audit_PerpetratorLdapProfile'),
  407. "eventCode": PWM_ADMIN.showString('Field_Audit_EventCode'),
  408. "message": PWM_ADMIN.showString('Field_Audit_Message'),
  409. "targetID": PWM_ADMIN.showString('Field_Audit_TargetID'),
  410. "targetDN": PWM_ADMIN.showString('Field_Audit_TargetDN'),
  411. "targetLdapProfile": PWM_ADMIN.showString('Field_Audit_TargetLdapProfile'),
  412. "sourceAddress": PWM_ADMIN.showString('Field_Audit_SourceAddress'),
  413. "sourceHost": PWM_ADMIN.showString('Field_Audit_SourceHost'),
  414. "guid": PWM_ADMIN.showString('Field_Audit_GUID'),
  415. "narrative": PWM_ADMIN.showString('Field_Audit_Narrative')
  416. };
  417. };
  418. PWM_ADMIN.auditSystemHeaders = function() {
  419. return {
  420. "timestamp":PWM_ADMIN.showString('Field_Audit_Timestamp'),
  421. "eventCode":PWM_ADMIN.showString('Field_Audit_EventCode'),
  422. "message":PWM_ADMIN.showString('Field_Audit_Message'),
  423. "instance":PWM_ADMIN.showString('Field_Audit_Instance'),
  424. "guid":PWM_ADMIN.showString('Field_Audit_GUID'),
  425. "narrative":PWM_ADMIN.showString('Field_Audit_Narrative')
  426. };
  427. };
  428. PWM_ADMIN.initAuditGrid=function() {
  429. require(["dojo","dojo/_base/declare", "dgrid/Grid", "dgrid/Keyboard", "dgrid/Selection", "dgrid/extensions/ColumnResizer", "dgrid/extensions/ColumnReorder", "dgrid/extensions/ColumnHider", "dgrid/extensions/DijitRegistry"],
  430. function(dojo, declare, Grid, Keyboard, Selection, ColumnResizer, ColumnReorder, ColumnHider, DijitRegistry){
  431. // Create a new constructor by mixing in the components
  432. var CustomGrid = declare([ Grid, Keyboard, Selection, ColumnResizer, ColumnReorder, ColumnHider, DijitRegistry ]);
  433. // Now, create an instance of our custom userGrid
  434. PWM_VAR['auditUserGrid'] = new CustomGrid({columns: PWM_ADMIN.auditUserHeaders()}, "auditUserGrid");
  435. PWM_VAR['auditSystemGrid'] = new CustomGrid({columns: PWM_ADMIN.auditSystemHeaders()}, "auditSystemGrid");
  436. PWM_VAR['auditHelpdeskGrid'] = new CustomGrid({columns: PWM_ADMIN.auditHelpdeskHeaders()}, "auditHelpdeskGrid");
  437. // unclick superfluous fields
  438. PWM_MAIN.getObject('auditUserGrid-hider-menu-check-perpetratorDN').click();
  439. PWM_MAIN.getObject('auditUserGrid-hider-menu-check-perpetratorLdapProfile').click();
  440. PWM_MAIN.getObject('auditUserGrid-hider-menu-check-message').click();
  441. PWM_MAIN.getObject('auditUserGrid-hider-menu-check-sourceHost').click();
  442. PWM_MAIN.getObject('auditUserGrid-hider-menu-check-guid').click();
  443. PWM_MAIN.getObject('auditUserGrid-hider-menu-check-narrative').click();
  444. PWM_MAIN.getObject('auditHelpdeskGrid-hider-menu-check-perpetratorDN').click();
  445. PWM_MAIN.getObject('auditHelpdeskGrid-hider-menu-check-perpetratorLdapProfile').click();
  446. PWM_MAIN.getObject('auditHelpdeskGrid-hider-menu-check-message').click();
  447. PWM_MAIN.getObject('auditHelpdeskGrid-hider-menu-check-targetDN').click();
  448. PWM_MAIN.getObject('auditHelpdeskGrid-hider-menu-check-targetLdapProfile').click();
  449. PWM_MAIN.getObject('auditHelpdeskGrid-hider-menu-check-sourceHost').click();
  450. PWM_MAIN.getObject('auditHelpdeskGrid-hider-menu-check-guid').click();
  451. PWM_MAIN.getObject('auditHelpdeskGrid-hider-menu-check-narrative').click();
  452. PWM_MAIN.getObject('auditSystemGrid-hider-menu-check-instance').click();
  453. PWM_MAIN.getObject('auditSystemGrid-hider-menu-check-guid').click();
  454. PWM_MAIN.getObject('auditSystemGrid-hider-menu-check-narrative').click();
  455. PWM_ADMIN.refreshAuditGridData();
  456. PWM_VAR['auditUserGrid'].on(".dgrid-row:click", function(evt){
  457. PWM_ADMIN.detailView(evt, PWM_ADMIN.auditUserHeaders(), PWM_VAR['auditUserGrid']);
  458. });
  459. PWM_VAR['auditSystemGrid'].on(".dgrid-row:click", function(evt){
  460. PWM_ADMIN.detailView(evt, PWM_ADMIN.auditSystemHeaders(), PWM_VAR['auditSystemGrid']);
  461. });
  462. PWM_VAR['auditHelpdeskGrid'].on(".dgrid-row:click", function(evt){
  463. PWM_ADMIN.detailView(evt, PWM_ADMIN.auditHelpdeskHeaders(), PWM_VAR['auditHelpdeskGrid']);
  464. });
  465. });
  466. };
  467. PWM_ADMIN.refreshAuditGridData=function(maximum) {
  468. PWM_VAR['auditUserGrid'].refresh();
  469. PWM_VAR['auditHelpdeskGrid'].refresh();
  470. PWM_VAR['auditSystemGrid'].refresh();
  471. if (!maximum) {
  472. maximum = 1000;
  473. }
  474. var url = PWM_GLOBAL['url-restservice'] + "/app-data/audit?maximum=" + maximum;
  475. var loadFunction = function(data) {
  476. PWM_VAR['auditUserGrid'].renderArray(data['data']['user']);
  477. PWM_VAR['auditUserGrid'].set("sort", { attribute : 'timestamp', ascending: false, descending: true });
  478. PWM_VAR['auditUserGrid'].resize();
  479. PWM_VAR['auditHelpdeskGrid'].renderArray(data['data']['helpdesk']);
  480. PWM_VAR['auditHelpdeskGrid'].set("sort", { attribute : 'timestamp', ascending: false, descending: true });
  481. PWM_VAR['auditHelpdeskGrid'].resize();
  482. PWM_VAR['auditSystemGrid'].renderArray(data['data']['system']);
  483. PWM_VAR['auditSystemGrid'].set("sort", { attribute : 'timestamp', ascending: false, descending: true });
  484. PWM_VAR['auditSystemGrid'].resize();
  485. };
  486. PWM_MAIN.ajaxRequest(url,loadFunction,{method:'GET'});
  487. };
  488. PWM_ADMIN.showStatChart = function(statName,days,divName,options) {
  489. options = options === undefined ? {} : options;
  490. var doRefresh = options['refreshTime']
  491. ? function(){setTimeout(function(){PWM_ADMIN.showStatChart(statName,days,divName,options);},options['refreshTime']);}
  492. : function(){};
  493. var epsTypes = PWM_GLOBAL['epsTypes'];
  494. var epsDurations = PWM_GLOBAL['epsDurations'];
  495. require(["dojo",
  496. "dijit",
  497. "dijit/registry",
  498. "dojox/charting/Chart2D",
  499. "dojox/charting/axis2d/Default",
  500. "dojox/charting/plot2d/Default",
  501. "dojox/charting/themes/Wetland",
  502. "dijit/form/Button",
  503. "dojox/gauges/GlossyCircularGauge",
  504. "dojo/domReady!"],
  505. function(dojo,dijit,registry){
  506. var statsGetUrl = PWM_GLOBAL['url-restservice'] + "/statistics";
  507. statsGetUrl += "?statName=" + statName;
  508. statsGetUrl += "&days=" + days;
  509. dojo.xhrGet({
  510. url: statsGetUrl,
  511. handleAs: "json",
  512. headers: {"Accept":"application/json","X-RestClientKey":PWM_GLOBAL['restClientKey']},
  513. timeout: 15 * 1000,
  514. preventCache: true,
  515. error: function(data) {
  516. for (var loopEpsTypeIndex = 0; loopEpsTypeIndex < epsTypes.length; loopEpsTypeIndex++) { // clear all the gauges
  517. var loopEpsName = epsTypes[loopEpsTypeIndex] + '';
  518. for (var loopEpsDurationsIndex = 0; loopEpsDurationsIndex < epsDurations.length; loopEpsDurationsIndex++) { // clear all the gauges
  519. var loopEpsDuration = epsDurations[loopEpsDurationsIndex] + '';
  520. var loopEpsID = "EPS-GAUGE-" + loopEpsName + "_" + loopEpsDuration;
  521. if (PWM_MAIN.getObject(loopEpsID) != null) {
  522. if (registry.byId(loopEpsID)) {
  523. registry.byId(loopEpsID).setAttribute('value','0');
  524. }
  525. }
  526. }
  527. }
  528. doRefresh();
  529. },
  530. load: function(data) {
  531. {// gauges
  532. console.log('Beginning stats update process...');
  533. data = data['data'];
  534. var activityCount = 0;
  535. for (var loopEpsIndex = 0; loopEpsIndex < epsTypes.length; loopEpsIndex++) {
  536. var loopEpsName = epsTypes[loopEpsIndex] + '';
  537. for (var loopEpsDurationsIndex = 0; loopEpsDurationsIndex < epsDurations.length; loopEpsDurationsIndex++) { // clear all the gauges
  538. var loopEpsDuration = epsDurations[loopEpsDurationsIndex] + '';
  539. var loopEpsID = "EPS-GAUGE-" + loopEpsName + "_" + loopEpsDuration;
  540. var loopFieldEpsID = "FIELD_" + loopEpsName + "_" + loopEpsDuration;
  541. var loopEpsValue = data['EPS'][loopEpsName + "_" + loopEpsDuration];
  542. var loopEpmValue = (loopEpsValue * 60).toFixed(3);
  543. var loopTop = PWM_GLOBAL['client.activityMaxEpsRate'];
  544. if (loopEpsDuration == "HOURLY") {
  545. activityCount += loopEpsValue;
  546. }
  547. if (PWM_MAIN.getObject(loopFieldEpsID) != null) {
  548. PWM_MAIN.getObject(loopFieldEpsID).innerHTML = loopEpmValue;
  549. }
  550. if (PWM_MAIN.getObject(loopEpsID) != null) {
  551. console.log('EpsID=' + loopEpsID + ', ' + 'Eps=' + loopEpsValue + ', ' + 'Epm=' + loopEpmValue);
  552. if (registry.byId(loopEpsID)) {
  553. registry.byId(loopEpsID).setAttribute('value',loopEpmValue);
  554. registry.byId(loopEpsID).setAttribute('max',loopTop);
  555. } else {
  556. var glossyCircular = new dojox.gauges.GlossyCircularGauge({
  557. background: [255, 255, 255, 0],
  558. noChange: true,
  559. value: loopEpmValue,
  560. max: loopTop,
  561. needleColor: '#FFDC8B',
  562. majorTicksInterval: Math.abs(loopTop / 10),
  563. minorTicksInterval: Math.abs(loopTop / 10),
  564. id: loopEpsID,
  565. width: 200,
  566. height: 150
  567. }, dojo.byId(loopEpsID));
  568. glossyCircular.startup();
  569. }
  570. }
  571. }
  572. }
  573. PWM_GLOBAL['epsActivityCount'] = activityCount;
  574. }
  575. if (divName != null && PWM_MAIN.getObject(divName)) { // stats chart
  576. var values = [];
  577. for(var key in data['nameData']) {
  578. var value = data['nameData'][key];
  579. values.push(parseInt(value));
  580. }
  581. if (PWM_GLOBAL[divName + '-stored-reference']) {
  582. var existingChart = PWM_GLOBAL[divName + '-stored-reference'];
  583. existingChart.destroy();
  584. }
  585. var c = new dojox.charting.Chart2D(divName);
  586. PWM_GLOBAL[divName + '-stored-reference'] = c;
  587. c.addPlot("default", {type: "Columns", gap:'2'});
  588. c.addAxis("x", {});
  589. c.addAxis("y", {vertical: true});
  590. c.setTheme(dojox.charting.themes.Wetland);
  591. c.addSeries("Series 1", values);
  592. c.render();
  593. }
  594. doRefresh();
  595. }
  596. });
  597. });
  598. };
  599. PWM_ADMIN.showAppHealth = function(parentDivID, options, refreshNow) {
  600. var inputOpts = options || PWM_GLOBAL['showPwmHealthOptions'] || {};
  601. PWM_GLOBAL['showPwmHealthOptions'] = options;
  602. var refreshUrl = inputOpts['sourceUrl'] || PWM_GLOBAL['url-restservice'] + "/health";
  603. var showRefresh = inputOpts['showRefresh'];
  604. var showTimestamp = inputOpts['showTimestamp'];
  605. var refreshTime = inputOpts['refreshTime'] || 60 * 1000;
  606. var finishFunction = inputOpts['finishFunction'];
  607. console.log('starting showPwmHealth: refreshTime=' + refreshTime);
  608. require(["dojo"],function(dojo){
  609. var parentDiv = dojo.byId(parentDivID);
  610. if (PWM_GLOBAL['inhibitHealthUpdate'] == true) {
  611. try { parentDiv.innerHTML = ''; } catch (e) { console.log('unable to update health div' + e) };
  612. return;
  613. }
  614. if (PWM_GLOBAL['healthCheckInProgress']) {
  615. return;
  616. }
  617. PWM_GLOBAL['healthCheckInProgress'] = "true";
  618. if (refreshNow) {
  619. parentDiv.innerHTML = '<div class="WaitDialogBlank" style="margin-top: 20px; margin-bottom: 20px"/>';
  620. refreshUrl = PWM_MAIN.addParamToUrl(refreshUrl, 'refreshImmediate', 'true');
  621. }
  622. var loadFunction = function(data) {
  623. if (data['error']) {
  624. PWM_MAIN.showErrorDialog(data);
  625. } else {
  626. PWM_GLOBAL['pwm-health'] = data['data']['overall'];
  627. var htmlBody = PWM_ADMIN.makeHealthHtml(data['data'], showTimestamp, showRefresh);
  628. parentDiv.innerHTML = htmlBody;
  629. PWM_MAIN.TimestampHandler.initElement(PWM_MAIN.getObject('healthCheckTimestamp'));
  630. PWM_MAIN.addEventHandler('button-refreshHealth','click',function(){
  631. PWM_ADMIN.showAppHealth(parentDivID, options, true);
  632. });
  633. PWM_GLOBAL['healthCheckInProgress'] = false;
  634. if (refreshTime > 0) {
  635. setTimeout(function() {
  636. PWM_ADMIN.showAppHealth(parentDivID, options);
  637. }, refreshTime);
  638. }
  639. if (showTimestamp) {
  640. PWM_MAIN.TimestampHandler.initElement(PWM_MAIN.getObject('healthCheckTimestamp'));
  641. }
  642. if (finishFunction) {
  643. finishFunction();
  644. }
  645. }
  646. };
  647. var errorFunction = function(error) {
  648. if (error != null) {
  649. console.log('error reaching server: ' + error);
  650. }
  651. var htmlBody = '<div style="text-align:center; background-color: #d20734">';
  652. htmlBody += '<br/><span style="font-weight: bold;">unable to load health data from server</span></br>';
  653. htmlBody += '<br/>' + new Date().toLocaleString() + '&nbsp;&nbsp;&nbsp;';
  654. if (showRefresh) {
  655. htmlBody += '<a href="#" onclick="PWM_ADMIN.showAppHealth(\'' + parentDivID + '\',null,true)">retry</a><br/><br/>';
  656. }
  657. htmlBody += '</div>';
  658. parentDiv.innerHTML = htmlBody;
  659. PWM_GLOBAL['healthCheckInProgress'] = false;
  660. PWM_GLOBAL['pwm-health'] = 'WARN';
  661. if (refreshTime > 0) {
  662. setTimeout(function() {
  663. PWM_ADMIN.showAppHealth(parentDivID, options);
  664. }, refreshTime);
  665. }
  666. if (finishFunction) {
  667. finishFunction();
  668. }
  669. };
  670. PWM_MAIN.ajaxRequest(refreshUrl,loadFunction,{errorFunction:errorFunction,method:'GET'});
  671. });
  672. };
  673. PWM_ADMIN.makeHealthHtml = function(healthData, showTimestamp, showRefresh) {
  674. var healthRecords = healthData['records'];
  675. var htmlBody = '<div>';
  676. htmlBody += '<div class="healthTable-wrapper"><table>';
  677. for (var i = 0; i < healthRecords.length; i++) {
  678. (function(iter){
  679. var loopRecord = healthRecords[iter];
  680. htmlBody += '<tr><td class="key" style="width:1px; white-space:nowrap;"">';
  681. htmlBody += loopRecord['topic'];
  682. htmlBody += '</td><td class="health-' + loopRecord['status'] + '">';
  683. htmlBody += loopRecord['status'];
  684. htmlBody += '</td><td><div style="max-height: 200px; overflow: auto">';
  685. htmlBody += loopRecord['detail'];
  686. htmlBody += '</div></td></tr>';
  687. })(i)
  688. }
  689. htmlBody += '</table></div>';
  690. if (showTimestamp || showRefresh) {
  691. htmlBody += '<div class="healthTable-footer">';
  692. if (showTimestamp) {
  693. htmlBody += 'Last Updated <span id="healthCheckTimestamp" class="timestamp">';
  694. htmlBody += (healthData['timestamp']);
  695. htmlBody += '</span>';
  696. }
  697. if (showRefresh) {
  698. // htmlBody += '&nbsp;&nbsp;&nbsp;&nbsp;<span id="button-refreshHealth" class="pwm-icon btn-icon pwm-icon-refresh" title="Refresh"></span>';
  699. }
  700. htmlBody += "</div>";
  701. }
  702. htmlBody += '</div>';
  703. return htmlBody;
  704. };
  705. PWM_ADMIN.detailView = function(evt, headers, grid){
  706. var row = grid.row(evt);
  707. var text = '<table>';
  708. var postExecuteFunctions = [];
  709. for (var item in headers) {
  710. (function(key){
  711. var value = key in row.data ? row.data[key] : '';
  712. var label = headers[key];
  713. text += '<tr><td class="key">' + label + '</td>';
  714. text += '<td>';
  715. if (key.toLowerCase().indexOf('time') >= 0) {
  716. text += '<span class="timestamp" id="field-detail-' + key + '">' + value + '</span>';
  717. PWM_MAIN.TimestampHandler.testIfStringIsTimestamp(value,function(){
  718. postExecuteFunctions.push(function() {
  719. PWM_MAIN.TimestampHandler.initElement(PWM_MAIN.getObject('field-detail-' + key));
  720. });
  721. });
  722. } else if (key == 'message') {
  723. var out = value.replace('\n', '<br/>');
  724. text += '<div style="max-height: 200px; overflow: auto; max-width: 400px">' + out + '</div>'
  725. } else {
  726. text += value;
  727. }
  728. text += '</td></tr>';
  729. })(item);
  730. }
  731. text += '</table>';
  732. PWM_MAIN.showDialog({title:"Record Detail",text:text,showClose:true,allowMove:true,loadFunction:function(){
  733. for (i = 0; i < postExecuteFunctions.length; i++) {
  734. postExecuteFunctions[i]();
  735. }
  736. }});
  737. };
  738. PWM_ADMIN.showString=function (key, options) {
  739. options = options || {};
  740. options['bundle'] = 'Admin';
  741. return PWM_MAIN.showString(key,options);
  742. };
  743. PWM_ADMIN.initAdminPage=function(nextFunction) {
  744. if (nextFunction) nextFunction();
  745. };