admin-user-debug.jsp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501
  1. <%--
  2. ~ Password Management Servlets (PWM)
  3. ~ http://www.pwm-project.org
  4. ~
  5. ~ Copyright (c) 2006-2009 Novell, Inc.
  6. ~ Copyright (c) 2009-2018 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. <%@ page import="com.novell.ldapchai.cr.Challenge" %>
  23. <%@ page import="password.pwm.Permission" %>
  24. <%@ page import="password.pwm.bean.ResponseInfoBean" %>
  25. <%@ page import="password.pwm.bean.pub.PublicUserInfoBean" %>
  26. <%@ page import="password.pwm.config.profile.ChallengeProfile" %>
  27. <%@ page import="password.pwm.config.profile.ProfileType" %>
  28. <%@ page import="password.pwm.config.profile.PwmPasswordPolicy" %>
  29. <%@ page import="password.pwm.config.profile.PwmPasswordRule" %>
  30. <%@ page import="password.pwm.http.servlet.admin.UserDebugDataBean" %>
  31. <%@ page import="password.pwm.i18n.Display" %>
  32. <%@ page import="java.util.Map" %>
  33. <%@ page import="password.pwm.util.java.TimeDuration" %>
  34. <!DOCTYPE html>
  35. <%@ page language="java" session="true" isThreadSafe="true" contentType="text/html" %>
  36. <%@ taglib uri="pwm" prefix="pwm" %>
  37. <html lang="<pwm:value name="<%=PwmValue.localeCode%>"/>" dir="<pwm:value name="<%=PwmValue.localeDir%>"/>">
  38. <%@ include file="/WEB-INF/jsp/fragment/header.jsp" %>
  39. <body class="nihilo">
  40. <div id="wrapper">
  41. <jsp:include page="/WEB-INF/jsp/fragment/header-body.jsp">
  42. <jsp:param name="pwm.PageName" value="User Debug"/>
  43. </jsp:include>
  44. <div id="centerbody" class="wide">
  45. <h1 id="page-content-title">User Debug</h1>
  46. <%@ include file="fragment/admin-nav.jsp" %>
  47. <% final UserDebugDataBean userDebugDataBean = (UserDebugDataBean)JspUtility.getAttribute(pageContext, PwmRequestAttribute.UserDebugData); %>
  48. <% if (userDebugDataBean == null) { %>
  49. <%@ include file="/WEB-INF/jsp/fragment/message.jsp" %>
  50. <div id="panel-searchbar" class="searchbar">
  51. <form method="post" class="pwm-form">
  52. <input id="username" name="username" placeholder="<pwm:display key="Placeholder_Search"/>" title="<pwm:display key="Placeholder_Search"/>" class="helpdesk-input-username" <pwm:autofocus/> autocomplete="off"/>
  53. <input type="hidden" id="pwmFormID" name="pwmFormID" value="<pwm:FormID/>"/>
  54. <button type="submit" class="btn"><pwm:display key="Button_Search"/></button>
  55. </form>
  56. </div>
  57. <% } else { %>
  58. <div class="buttonbar">
  59. <form method="get" class="pwm-form">
  60. <button type="submit" class="btn"><pwm:display key="Button_Continue"/></button>
  61. </form>
  62. </div>
  63. <div class="buttonbar">
  64. <form method="get">
  65. <input type="hidden" name="processAction" value="<%=AdminServlet.AdminAction.downloadUserDebug.toString()%>"/>
  66. <button type="submit" class="btn">Download</button>
  67. </form>
  68. </div>
  69. <% final PublicUserInfoBean userInfo = userDebugDataBean.getPublicUserInfoBean(); %>
  70. <% if (userInfo != null) { %>
  71. <table>
  72. <tr>
  73. <td colspan="10" class="title">Identity</td>
  74. </tr>
  75. <tr>
  76. <td class="key">UserDN</td>
  77. <td><%=JspUtility.friendlyWrite(pageContext, userInfo.getUserDN())%></td>
  78. </tr>
  79. <tr>
  80. <td class="key">Ldap Profile</td>
  81. <td><%=JspUtility.friendlyWrite(pageContext, userInfo.getLdapProfile())%></td>
  82. </tr>
  83. <tr>
  84. <td class="key">Username</td>
  85. <td><%=JspUtility.friendlyWrite(pageContext, userInfo.getUserID())%></td>
  86. </tr>
  87. <tr>
  88. <td class="key"><%=PwmConstants.PWM_APP_NAME%> GUID</td>
  89. <td><%=JspUtility.friendlyWrite(pageContext, userInfo.getUserGUID())%></td>
  90. </tr>
  91. </table>
  92. <br/>
  93. <table>
  94. <tr>
  95. <td colspan="10" class="title">Status</td>
  96. </tr>
  97. <tr>
  98. <td class="key">Last Login Time</td>
  99. <td>
  100. <%=JspUtility.friendlyWrite(pageContext, userInfo.getLastLoginTime())%>
  101. <% if ( userInfo.getLastLoginTime() != null ) { %>
  102. ( <%=TimeDuration.fromCurrent(userInfo.getLastLoginTime()).asCompactString()%> )
  103. <% } %>
  104. </td>
  105. </tr>
  106. <tr>
  107. <td class="key">Account Expiration Time</td>
  108. <td>
  109. <%=JspUtility.friendlyWrite(pageContext, userInfo.getAccountExpirationTime())%>
  110. <% if ( userInfo.getAccountExpirationTime() != null ) { %>
  111. ( <%=TimeDuration.fromCurrent(userInfo.getAccountExpirationTime()).asCompactString()%> )
  112. <% } %>
  113. </td>
  114. </tr>
  115. <tr>
  116. <td class="key">Password Expiration</td>
  117. <td>
  118. <%=JspUtility.friendlyWrite(pageContext, userInfo.getPasswordExpirationTime())%>
  119. <% if ( userInfo.getPasswordExpirationTime() != null ) { %>
  120. ( <%=TimeDuration.fromCurrent(userInfo.getPasswordExpirationTime()).asCompactString()%> )
  121. <% } %>
  122. </td>
  123. </tr>
  124. <tr>
  125. <td class="key">Password Last Modified</td>
  126. <td>
  127. <%=JspUtility.friendlyWrite(pageContext, userInfo.getPasswordLastModifiedTime())%>
  128. <% if ( userInfo.getPasswordLastModifiedTime() != null ) { %>
  129. ( <%=TimeDuration.fromCurrent(userInfo.getPasswordLastModifiedTime()).asCompactString()%> )
  130. <% } %>
  131. </td>
  132. </tr>
  133. <tr>
  134. <td class="key">Email Address 1</td>
  135. <td><%=JspUtility.friendlyWrite(pageContext, userInfo.getUserEmailAddress())%></td>
  136. </tr>
  137. <tr>
  138. <td class="key">Email Address 2</td>
  139. <td><%=JspUtility.friendlyWrite(pageContext, userInfo.getUserEmailAddress2())%></td>
  140. </tr>
  141. <tr>
  142. <td class="key">Email Address 3</td>
  143. <td><%=JspUtility.friendlyWrite(pageContext, userInfo.getUserEmailAddress3())%></td>
  144. </tr>
  145. <tr>
  146. <td class="key">Phone Number 1</td>
  147. <td><%=JspUtility.friendlyWrite(pageContext, userDebugDataBean.getUserInfo().getUserSmsNumber())%></td>
  148. </tr>
  149. <tr>
  150. <td class="key">Phone Number 2</td>
  151. <td><%=JspUtility.friendlyWrite(pageContext, userDebugDataBean.getUserInfo().getUserSmsNumber2())%></td>
  152. </tr>
  153. <tr>
  154. <td class="key">Phone Number 3</td>
  155. <td><%=JspUtility.friendlyWrite(pageContext, userDebugDataBean.getUserInfo().getUserSmsNumber3())%></td>
  156. </tr>
  157. <tr>
  158. <td class="key">Username</td>
  159. <td><%=JspUtility.friendlyWrite(pageContext, userInfo.getUserID())%></td>
  160. </tr>
  161. <tr>
  162. <td class="key">
  163. <pwm:display key="Field_PasswordExpired"/>
  164. </td>
  165. <td id="PasswordExpired">
  166. <%= JspUtility.friendlyWrite(pageContext, userInfo.getPasswordStatus().isExpired()) %>
  167. </td>
  168. </tr>
  169. <tr>
  170. <td class="key">
  171. <pwm:display key="Field_PasswordPreExpired"/>
  172. </td>
  173. <td id="PasswordPreExpired">
  174. <%= JspUtility.friendlyWrite(pageContext, userInfo.getPasswordStatus().isPreExpired()) %>
  175. </td>
  176. </tr>
  177. <tr>
  178. <td class="key">
  179. <pwm:display key="Field_PasswordWithinWarningPeriod"/>
  180. </td>
  181. <td id="PasswordWithinWarningPeriod">
  182. <%= JspUtility.friendlyWrite(pageContext, userInfo.getPasswordStatus().isWarnPeriod()) %>
  183. </td>
  184. </tr>
  185. <tr>
  186. <td class="key">
  187. <pwm:display key="Field_PasswordViolatesPolicy"/>
  188. </td>
  189. <td id="PasswordViolatesPolicy">
  190. <%= JspUtility.friendlyWrite(pageContext, userInfo.getPasswordStatus().isViolatesPolicy()) %>
  191. </td>
  192. </tr>
  193. <tr>
  194. <td class="key">
  195. Password Readable From LDAP
  196. </td>
  197. <td>
  198. <%= JspUtility.friendlyWrite(pageContext, userDebugDataBean.isPasswordReadable()) %>
  199. </td>
  200. </tr>
  201. <tr>
  202. <td class="key">
  203. Requires New Password
  204. </td>
  205. <td>
  206. <%= JspUtility.friendlyWrite(pageContext, userInfo.isRequiresNewPassword()) %>
  207. </td>
  208. </tr>
  209. <tr>
  210. <td class="key">
  211. Requires Response Setup
  212. </td>
  213. <td>
  214. <%= JspUtility.friendlyWrite(pageContext, userInfo.isRequiresResponseConfig()) %>
  215. </td>
  216. </tr>
  217. <tr>
  218. <td class="key">
  219. Requires OTP Setup
  220. </td>
  221. <td>
  222. <%= JspUtility.friendlyWrite(pageContext, userInfo.isRequiresOtpConfig()) %>
  223. </td>
  224. </tr>
  225. <tr>
  226. <td class="key">
  227. Requires Profile Update
  228. </td>
  229. <td>
  230. <%= JspUtility.friendlyWrite(pageContext, userInfo.isRequiresUpdateProfile()) %>
  231. </td>
  232. </tr>
  233. <tr>
  234. <td class="key">
  235. Password is Within Minimum Lifetime
  236. </td>
  237. <td>
  238. <%= JspUtility.friendlyWrite(pageContext, userDebugDataBean.isPasswordWithinMinimumLifetime()) %>
  239. </td>
  240. </tr>
  241. </table>
  242. <br/>
  243. <table>
  244. <tr>
  245. <td colspan="10" class="title">Applied Configuration</td>
  246. </tr>
  247. <tr>
  248. <td class="key">Profiles</td>
  249. <td>
  250. <table>
  251. <tr>
  252. <td class="key">Service</td>
  253. <td class="key">ProfileID</td>
  254. </tr>
  255. <% for (final ProfileType profileType : userDebugDataBean.getProfiles().keySet()) { %>
  256. <tr>
  257. <td><%=profileType%></td>
  258. <td><%=JspUtility.friendlyWrite(pageContext, userDebugDataBean.getProfiles().get(profileType))%></td>
  259. </tr>
  260. <% } %>
  261. </table>
  262. </td>
  263. </tr>
  264. <tr>
  265. <td class="key">Permissions</td>
  266. <td>
  267. <table>
  268. <tr>
  269. <td class="key">Permission</td>
  270. <td class="key">Status</td>
  271. </tr>
  272. <% for (final Permission permission : userDebugDataBean.getPermissions().keySet()) { %>
  273. <tr>
  274. <td><%=permission%></td>
  275. <td><%=JspUtility.friendlyWrite(pageContext, userDebugDataBean.getPermissions().get(permission))%></td>
  276. </tr>
  277. <% } %>
  278. </table>
  279. </td>
  280. </tr>
  281. </table>
  282. <br/>
  283. <table>
  284. <tr>
  285. <td colspan="10" class="title">Password Policy</td>
  286. </tr>
  287. <% PwmPasswordPolicy userPolicy = userDebugDataBean.getUserInfo().getPasswordPolicy(); %>
  288. <% if (userPolicy != null) { %>
  289. <% PwmPasswordPolicy configPolicy = userDebugDataBean.getConfiguredPasswordPolicy(); %>
  290. <% PwmPasswordPolicy ldapPolicy = userDebugDataBean.getLdapPasswordPolicy(); %>
  291. <tr>
  292. <td colspan="10">
  293. <table>
  294. <tr class="title">
  295. <td class="key" style="width: 1px;">Rule</td>
  296. <td class="key" style="width: 1px;">Rule Type</td>
  297. <td class="key" style="width: 20%;">Configured <%=PwmConstants.PWM_APP_NAME%> Policy</td>
  298. <td class="key" style="width: 20%;">LDAP Policy</td>
  299. <td class="key" style="width: 20%;">Effective Policy</td>
  300. </tr>
  301. <tr>
  302. <td>ID</td>
  303. <td><pwm:display key="<%=Display.Value_NotApplicable.toString()%>"/></td>
  304. <td><%=JspUtility.friendlyWrite(pageContext, configPolicy.getIdentifier())%></td>
  305. <td><%=JspUtility.friendlyWrite(pageContext, ldapPolicy.getIdentifier())%></td>
  306. <td><%=JspUtility.friendlyWrite(pageContext, userPolicy.getIdentifier())%></td>
  307. </tr>
  308. <tr>
  309. <td>Display Name</td>
  310. <td><pwm:display key="<%=Display.Value_NotApplicable.toString()%>"/></td>
  311. <td><%=JspUtility.friendlyWrite(pageContext, configPolicy.getDisplayName(JspUtility.locale(request)))%></td>
  312. <td><%=JspUtility.friendlyWrite(pageContext, ldapPolicy.getDisplayName(JspUtility.locale(request)))%></td>
  313. <td><%=JspUtility.friendlyWrite(pageContext, userPolicy.getDisplayName(JspUtility.locale(request)))%></td>
  314. </tr>
  315. <% for (final PwmPasswordRule rule : PwmPasswordRule.values()) { %>
  316. <tr>
  317. <td><span title="<%=rule.getKey()%>"><%=rule.getLabel(JspUtility.locale(request), JspUtility.getPwmRequest(pageContext).getConfig())%></span></td>
  318. <td><%=rule.getRuleType()%></td>
  319. <td><%=JspUtility.friendlyWrite(pageContext, configPolicy.getValue(rule))%></td>
  320. <td><%=JspUtility.friendlyWrite(pageContext, ldapPolicy.getValue(rule))%></td>
  321. <td><%=JspUtility.friendlyWrite(pageContext, userPolicy.getValue(rule))%></td>
  322. </tr>
  323. <% } %>
  324. </table>
  325. </td>
  326. </tr>
  327. <% } %>
  328. </table>
  329. <br/>
  330. <table>
  331. <tr>
  332. <td colspan="10" class="title">Stored Responses</td>
  333. </tr>
  334. <% final ResponseInfoBean responseInfoBean = userDebugDataBean.getUserInfo().getResponseInfoBean(); %>
  335. <% if (responseInfoBean == null) { %>
  336. <tr>
  337. <td>Stored Responses</td>
  338. <td><pwm:display key="<%=Display.Value_NotApplicable.toString()%>"/></td>
  339. </tr>
  340. <% } else { %>
  341. <tr>
  342. <td>Identifier</td>
  343. <td><%=responseInfoBean.getCsIdentifier()%></td>
  344. </tr>
  345. <tr>
  346. <td>Storage Type</td>
  347. <td><%=responseInfoBean.getDataStorageMethod()%></td>
  348. </tr>
  349. <tr>
  350. <td>Format</td>
  351. <td><%=responseInfoBean.getFormatType()%></td>
  352. </tr>
  353. <tr>
  354. <td>Locale</td>
  355. <td><%=responseInfoBean.getLocale()%></td>
  356. </tr>
  357. <tr>
  358. <td>Storage Timestamp</td>
  359. <td><%=JspUtility.friendlyWrite(pageContext, responseInfoBean.getTimestamp())%></td>
  360. </tr>
  361. <tr>
  362. <td>Answered Challenges</td>
  363. <% final Map<Challenge,String> crMap = responseInfoBean.getCrMap(); %>
  364. <% if (crMap == null) { %>
  365. <td>
  366. n/a
  367. </td>
  368. <% } else { %>
  369. <td>
  370. <table>
  371. <tr>
  372. <td class="key">Type</td>
  373. <td class="key">Required</td>
  374. <td class="key">Text</td>
  375. </tr>
  376. <% for (final Challenge challenge : crMap.keySet()) { %>
  377. <tr>
  378. <td>
  379. <%= challenge.isAdminDefined() ? "Admin Defined" : "User Defined" %>
  380. </td>
  381. <td>
  382. <%= JspUtility.friendlyWrite(pageContext, challenge.isRequired())%>
  383. </td>
  384. <td>
  385. <%= JspUtility.friendlyWrite(pageContext, challenge.getChallengeText())%>
  386. </td>
  387. </tr>
  388. <% } %>
  389. </table>
  390. </td>
  391. <% } %>
  392. </tr>
  393. <tr>
  394. <td>
  395. Minimum Randoms Required
  396. </td>
  397. <td>
  398. <%=responseInfoBean.getMinRandoms()%>
  399. </td>
  400. </tr>
  401. <tr>
  402. <td>Helpdesk Answered Challenges</td>
  403. <% final Map<Challenge,String> helpdeskCrMap = responseInfoBean.getHelpdeskCrMap(); %>
  404. <% if (helpdeskCrMap == null) { %>
  405. <td>
  406. <pwm:display key="<%=Display.Value_NotApplicable.toString()%>"/>
  407. </td>
  408. <% } else { %>
  409. <td>
  410. <% for (final Challenge challenge : helpdeskCrMap.keySet()) { %>
  411. <%= JspUtility.friendlyWrite(pageContext, challenge.getChallengeText())%><br/>
  412. <% } %>
  413. </td>
  414. <% } %>
  415. </tr>
  416. <% } %>
  417. </table>
  418. <br/>
  419. <table>
  420. <tr>
  421. <td colspan="10" class="title">Challenge Profile</td>
  422. </tr>
  423. <% final ChallengeProfile challengeProfile = userDebugDataBean.getUserInfo().getChallengeProfile(); %>
  424. <% if (challengeProfile == null) { %>
  425. <tr>
  426. <td>Assigned Profile</td>
  427. <td><pwm:display key="<%=Display.Value_NotApplicable.toString()%>"/></td>
  428. </tr>
  429. <% } else { %>
  430. <tr>
  431. <td>Display Name</td>
  432. <td><%=challengeProfile.getDisplayName(JspUtility.locale(request))%></td>
  433. </tr>
  434. <tr>
  435. <td>Identifier</td>
  436. <td><%=challengeProfile.getIdentifier()%></td>
  437. </tr>
  438. <tr>
  439. <td>Locale</td>
  440. <td><%=challengeProfile.getLocale()%></td>
  441. </tr>
  442. <tr>
  443. <td>Challenges</td>
  444. <td>
  445. <table>
  446. <tr>
  447. <td class="key">Type</td>
  448. <td class="key">Text</td>
  449. <td class="key">Required</td>
  450. <td class="key">Min Length</td>
  451. <td class="key">Max Length</td>
  452. <td class="key">Enforce Wordlist</td>
  453. <td class="key">Max Question Characters</td>
  454. </tr>
  455. <% for (final Challenge challenge : challengeProfile.getChallengeSet().getChallenges()) { %>
  456. <tr>
  457. <td>
  458. <%= challenge.isAdminDefined() ? "Admin Defined" : "User Defined" %>
  459. </td>
  460. <td>
  461. <%= JspUtility.friendlyWrite(pageContext, challenge.getChallengeText())%>
  462. </td>
  463. <td>
  464. <%= JspUtility.friendlyWrite(pageContext, challenge.isRequired())%>
  465. </td>
  466. <td>
  467. <%= challenge.getMinLength() %>
  468. </td>
  469. <td>
  470. <%= challenge.getMaxLength() %>
  471. </td>
  472. <td>
  473. <%= JspUtility.friendlyWrite(pageContext, challenge.isEnforceWordlist())%>
  474. </td>
  475. <td>
  476. <%= challenge.getMaxQuestionCharsInAnswer() %>
  477. </td>
  478. </tr>
  479. <% } %>
  480. </table>
  481. </td>
  482. </tr>
  483. <% } %>
  484. </table>
  485. <% } %>
  486. <div class="buttonbar">
  487. <form method="get" class="pwm-form">
  488. <button type="submit" class="btn"><pwm:display key="Button_Continue"/></button>
  489. </form>
  490. </div>
  491. <% } %>
  492. </div>
  493. <div class="push"></div>
  494. </div>
  495. <jsp:include page="/WEB-INF/jsp/fragment/footer.jsp"/>
  496. </body>
  497. </html>