Quellcode durchsuchen

Spelling fixes and environent reference doc updates

Jason Rivard vor 9 Jahren
Ursprung
Commit
e1090fd0e1

+ 55 - 66
src/main/java/password/pwm/http/ContextManager.java

@@ -61,11 +61,6 @@ public class ContextManager implements Serializable {
 
     private String contextPath;
 
-    private enum ContextParameter {
-        applicationPath,
-        configurationFile,
-    }
-
     private final static String UNSPECIFIED_VALUE = "unspecified";
 
     public ContextManager(ServletContext servletContext) {
@@ -146,9 +141,10 @@ public class ContextManager implements Serializable {
         PwmApplicationMode mode = PwmApplicationMode.ERROR;
 
 
+        final ParameterReader parameterReader = new ParameterReader(servletContext);
         final File applicationPath;
         {
-            final String applicationPathStr = readApplicationPath();
+            final String applicationPathStr = parameterReader.readApplicationPath();
             if (applicationPathStr == null || applicationPathStr.isEmpty()) {
                 startupErrorInformation = new ErrorInformation(PwmError.ERROR_ENVIRONMENT_ERROR,"application path is not specified");
                 return;
@@ -183,8 +179,8 @@ public class ContextManager implements Serializable {
         }
         LOGGER.debug("configuration file was loaded from " + (configurationFile == null ? "null" : configurationFile.getAbsoluteFile()));
 
-        final Collection<PwmEnvironment.ApplicationFlag> applicationFlags = readApplicationFlags();
-        final Map<PwmEnvironment.ApplicationParameter,String> applicationParams = readApplicationParams();
+        final Collection<PwmEnvironment.ApplicationFlag> applicationFlags = parameterReader.readApplicationFlags();
+        final Map<PwmEnvironment.ApplicationParameter,String> applicationParams = parameterReader.readApplicationParams();
 
         try {
             final PwmEnvironment pwmEnvironment= new PwmEnvironment.Builder(configuration, applicationPath)
@@ -371,26 +367,7 @@ public class ContextManager implements Serializable {
     public File locateConfigurationFile(final File applicationPath)
             throws Exception
     {
-        String configurationFileSetting = servletContext.getInitParameter(
-                ContextParameter.configurationFile.toString());
-
-        if (configurationFileSetting == null
-                || configurationFileSetting.trim().isEmpty()
-                || UNSPECIFIED_VALUE.equalsIgnoreCase(configurationFileSetting.trim())
-                ) {
-            configurationFileSetting = PwmConstants.DEFAULT_CONFIG_FILE_FILENAME;
-        }
-
-        try {
-            File file = new File(configurationFileSetting);
-            if (file.isAbsolute()) {
-                return file;
-            }
-        } catch (Exception e) {
-            outputError("error testing context " + ContextParameter.configurationFile.toString() + " parameter to verify if it is a valid file path: " + e.getMessage());
-        }
-
-        return new File(applicationPath.getAbsolutePath() + File.separator + configurationFileSetting);
+        return new File(applicationPath.getAbsolutePath() + File.separator + PwmConstants.DEFAULT_CONFIG_FILE_FILENAME);
     }
 
     public File locateWebInfFilePath() {
@@ -406,16 +383,33 @@ public class ContextManager implements Serializable {
         return null;
     }
 
-    public String readApplicationPath() {
+    static void outputError(String outputText) {
+        final String msg = PwmConstants.PWM_APP_NAME + " " + PwmConstants.DEFAULT_DATETIME_FORMAT.format(new Date()) + " " + outputText;
+        System.out.println(msg);
+        System.out.println(msg);
+    }
+
+    public String getInstanceGuid() {
+        return instanceGuid;
+    }
 
-        {
-            final String contextAppPathSetting = servletContext.getInitParameter(
-                    ContextParameter.applicationPath.toString());
+    public InputStream getResourceAsStream(String path)
+    {
+        return servletContext.getResourceAsStream(path);
+    }
 
-            if (contextAppPathSetting != null && !contextAppPathSetting.isEmpty()) {
-                if (!UNSPECIFIED_VALUE.equalsIgnoreCase(contextAppPathSetting)) {
-                    return contextAppPathSetting;
-                }
+    private static class ParameterReader {
+        private final ServletContext servletContext;
+
+
+        ParameterReader(ServletContext servletContext) {
+            this.servletContext = servletContext;
+        }
+
+        String readApplicationPath() {
+            final String contextAppPathSetting = readEnvironmentParameter(PwmEnvironment.EnvironmentParameter.applicationPath);
+            if (contextAppPathSetting != null) {
+                return contextAppPathSetting;
             }
 
             final String contextPath = servletContext.getContextPath().replace("/","");
@@ -424,50 +418,45 @@ public class ContextManager implements Serializable {
                     contextPath
             );
         }
-    }
 
-    public Collection<PwmEnvironment.ApplicationFlag> readApplicationFlags() {
-        final String contextAppFlagsValue = servletContext.getInitParameter(
-                PwmEnvironment.EnvironmentParameter.applicationFlags.toString()
-        );
+        Collection<PwmEnvironment.ApplicationFlag> readApplicationFlags() {
+            final String contextAppFlagsValue = readEnvironmentParameter(PwmEnvironment.EnvironmentParameter.applicationFlags);
 
-        if (contextAppFlagsValue != null && !contextAppFlagsValue.isEmpty()) {
-            return PwmEnvironment.ParseHelper.parseApplicationFlagValueParameter(contextAppFlagsValue);
+            if (contextAppFlagsValue != null && !contextAppFlagsValue.isEmpty()) {
+                return PwmEnvironment.ParseHelper.parseApplicationFlagValueParameter(contextAppFlagsValue);
+            }
+
+            final String contextPath = servletContext.getContextPath().replace("/","");
+            return PwmEnvironment.ParseHelper.readApplicationFlagsFromSystem(contextPath);
         }
 
-        final String contextPath = servletContext.getContextPath().replace("/","");
-        return PwmEnvironment.ParseHelper.readApplicationFlagsFromSystem(contextPath);
-    }
+        Map<PwmEnvironment.ApplicationParameter,String> readApplicationParams() {
+            final String contextAppParamsValue = readEnvironmentParameter(PwmEnvironment.EnvironmentParameter.applicationParamFile);
 
-    public Map<PwmEnvironment.ApplicationParameter,String> readApplicationParams() {
-        final String contextAppParamsValue = servletContext.getInitParameter(
-                PwmEnvironment.EnvironmentParameter.applicationParamFile.toString()
-        );
+            if (contextAppParamsValue != null && !contextAppParamsValue.isEmpty()) {
+                return PwmEnvironment.ParseHelper.parseApplicationParamValueParameter(contextAppParamsValue);
+            }
 
-        if (contextAppParamsValue != null && !contextAppParamsValue.isEmpty()) {
-            return PwmEnvironment.ParseHelper.parseApplicationParamValueParameter(contextAppParamsValue);
+            final String contextPath = servletContext.getContextPath().replace("/","");
+            return PwmEnvironment.ParseHelper.readApplicationParmsFromSystem(contextPath);
         }
 
-        final String contextPath = servletContext.getContextPath().replace("/","");
-        return PwmEnvironment.ParseHelper.readApplicationParmsFromSystem(contextPath);
-    }
 
-    static void outputError(String outputText) {
-        final String msg = PwmConstants.PWM_APP_NAME + " " + PwmConstants.DEFAULT_DATETIME_FORMAT.format(new Date()) + " " + outputText;
-        System.out.println(msg);
-        System.out.println(msg);
-    }
+        private String readEnvironmentParameter(final PwmEnvironment.EnvironmentParameter environmentParameter) {
+            final String value = servletContext.getInitParameter(
+                    environmentParameter.toString());
 
-    public String getInstanceGuid() {
-        return instanceGuid;
-    }
+            if (value != null && !value.isEmpty()) {
+                if (!UNSPECIFIED_VALUE.equalsIgnoreCase(value)) {
+                    return value;
+                }
+            }
 
     public String getContextPath() {
         return contextPath;
     }
 
-    public InputStream getResourceAsStream(String path)
-    {
-        return servletContext.getResourceAsStream(path);
+            return null;
+        }
     }
 }

+ 1 - 1
src/main/resources/password/pwm/i18n/Admin.properties

@@ -298,7 +298,7 @@ Title_UserActivity=User Activity
 Title_DataAnalysis=Data Analysis
 Title_Dashboard=Dashboard
 Title_LogViewer=Log Viewer
-Title_TokenLookup=Token Lookup
+Title_TokenLookup=Token Search
 Title_URLReference=URL Reference
 MenuItem_ConfigEditor=Configuration Editor
 MenuItem_ConfigManager=Configuration Manager

+ 3 - 3
src/main/resources/password/pwm/i18n/PwmSetting.properties

@@ -346,7 +346,7 @@ Setting_Description_helpdesk.setPassword.mode=Mode to allow Help Desk administra
 Setting_Description_helpdesk.setPassword.writeAttributes=Actions to execute after a Help Desk actor modifies the user's password.  Macros may be used.
 Setting_Description_helpdesk.token.sendMethod=Set the method(s) used for sending the token code to the user.
 Setting_Description_helpdesk.useProxy=Use the application proxy connection for all actions initiated in the Help Desk module.  When disabled, actions are initiated using the logged in user's ldap connection, requiring that the user have appropriate privileges in the ldap directory.
-Setting_Description_helpdesk.verificationMethods=Verification methods that can be used by helpdesk operators to confirm the identity of a user.  Any method that is set to required or optional will be available to the helpdesk operator.  If one or more methods are set to required, at least one of the required methods will need to be successfully completed before the user detail can be viewed by the helpdesk operator.
+Setting_Description_helpdesk.verificationMethods=Verification methods that can be used by Help Desk operators to confirm the identity of a user.  Any method that is set to required or optional will be available to the Help Desk operator.  If one or more methods are set to required, at least one of the required methods will need to be successfully completed before the user detail can be viewed by the Help Desk operator.
 Setting_Description_helpdesk.viewStatusValues=Select the fields that are available to help desk administrators to view the status of the users.
 Setting_Description_http.proxy.url=The url of the HTTP proxy server.  If blank, no proxy server will be used.<ul><li>For http proxy server, use "<i>http\://serverame\:3128</i>" format</li><li>For authenticated proxy server, use the "<i>http\://username\:password@servername\:3128</i>" format</ul></li><br/>
 Setting_Description_idleTimeoutSeconds=Number of seconds after which an authenticated session becomes unauthenticated.  Minimum value is 60 seconds.
@@ -463,7 +463,7 @@ Setting_Description_password.policy.allowNumeric=Allow numeric characters in pas
 Setting_Description_password.policy.allowSpecial=Allow special (non alpha-numeric) characters in password.
 Setting_Description_password.policy.caseSensitivity=Controls if the password is case sensitive.  In most cases, this can be read from the directory, but in some cases this value is not able to correctly read, so you may override it here.
 Setting_Description_password.policy.changeMessage=Message to be displayed to user during password changes.  May include HTML markup.  This setting may be overwritten by a change password message read as part of an ldap password policy.
-Setting_Description_password.policy.charGroup.minimumMatch=The number of regular expiression matches defined in the setting <code>@PwmSettingReference\:password.policy.charGroup.regExValues@</code>.
+Setting_Description_password.policy.charGroup.minimumMatch=The number of regular expression matches defined in the setting <code>@PwmSettingReference\:password.policy.charGroup.regExValues@</code>.
 Setting_Description_password.policy.charGroup.regExValues=A list of regular expression character matches.  Along with the setting <code>@PwmSettingReference\:password.policy.charGroup.minimumMatch@</code>, this setting allows creating a complex list of requirements that the user will only need to partially match.  For example, this type of policy could be used to replicate Active Directory's "3 out of 5" rules, but with more flexibility and customization.
 Setting_Description_password.policy.checkWordlist=Check the password against the configured Word List.
 Setting_Description_password.policy.disallowCurrent=Prohibit current password from being used as new password.  Note that this can only be enforced if the login method permits the user's password to be known.
@@ -827,7 +827,7 @@ Setting_Label_ldap.ad.proxyForgotten=Use Proxy When Password Forgotten
 Setting_Label_ldap.defaultObjectClasses=User Object Class
 Setting_Label_ldap.duplicateMode=LDAP Duplicate Mode
 Setting_Label_ldap.edirectory.cr.applyWordlist=eDirectory Challenge Set Apply Word List
-Setting_Label_ldap.edirectory.cr.maxQuestionCharsInAnswer=eDirectory Challenge Set Maximum Question Chars In Answer
+Setting_Label_ldap.edirectory.cr.maxQuestionCharsInAnswer=eDirectory Challenge Set Maximum Question Characters In Answer
 Setting_Label_ldap.edirectory.cr.minRandomDuringSetup=eDirectory Challenge Set Minimum Randoms During Setup
 Setting_Label_ldap.edirectory.enableNmas=Enable NMAS Extensions
 Setting_Label_ldap.edirectory.readChallengeSets=Read eDirectory Challenge Sets

+ 1 - 10
src/main/webapp/WEB-INF/web.xml

@@ -30,20 +30,11 @@
     <description>Password Management Servlet</description>
     <context-param>
         <description>
-            Explicit location of application working directory. If a relative path is specified, it is relative to the
-            deployed applications base directory.
+            Explicit location of application path working directory or the literal value "unspecified".  See the environment documentation at /public/reference/environment.jsp for more information.
         </description>
         <param-name>applicationPath</param-name>
         <param-value>unspecified</param-value>
     </context-param>
-    <context-param>
-        <description>
-            Name of configuration XML file file. If a relative path is specified, it is relative to the applicationPath
-            param.  If blank, the default config file name will be used relative to the application path.
-        </description>
-        <param-name>configurationFile</param-name>
-        <param-value>unspecified</param-value>
-    </context-param>
     <welcome-file-list>
         <welcome-file>index.jsp</welcome-file>
     </welcome-file-list>

+ 69 - 31
src/main/webapp/public/reference/environment.jsp

@@ -1,5 +1,6 @@
 <%@ page import="password.pwm.http.JspUtility" %>
 <%@ page import="password.pwm.http.tag.value.PwmValue" %>
+<%@ page import="password.pwm.config.PwmSettingCategory" %>
 <%--
   ~ Password Management Servlets (PWM)
   ~ http://www.pwm-project.org
@@ -51,27 +52,36 @@
     </jsp:include>
     <div id="centerbody">
         <%@ include file="reference-nav.jsp"%>
-        <h1>About the <%=PwmConstants.PWM_APP_NAME%> Environment</h1>
+        <h1><%=PwmConstants.PWM_APP_NAME%> Environment</h1>
+        <h2><code>ApplicationPath</code></h2>
+        <p>The application path setting is required.  Configure the application path to use a directory on the local filesystem.  <%=PwmConstants.PWM_APP_NAME%> will store it's
+            operating files in this directory.  Specifically, the following contents will be stored in the application path:</p>
+        <ul>
+            <li>Configuration</li>
+            <li>LocalDB database</li>
+            <li>Log files</li>
+            <li>Backup data</li>
+        </ul>
         <p>
-            The <%=PwmConstants.PWM_APP_NAME%> application requires environment settings to load and run successfully.  Specifically, an <b>application path</b> setting
-            is required.  The path value is given as a directory on the local file system.  The pwm application must have full permissions to create, modify
-            and delete folders in this directory.
+            The path value is given as an absolute directory path on the local file system.  The <%=PwmConstants.PWM_APP_NAME%> application must have full permissions to create, modify and delete folders in this directory.  The directory must already be exist when <%=PwmConstants.PWM_APP_NAME%> is started, it will not be
+            automatically created.
         </p>
         <p>
-            Previous versions of <%=PwmConstants.PWM_APP_NAME%> did not require the application path to be set and would automatically use the exploded war directory's
-            <code>WEB-INF</code> directory as the application path.  This is no longer done automatically.
+            Older versions of <%=PwmConstants.PWM_APP_NAME%> did not require the application path to be set and would automatically use the exploded war directory's
+            <code>WEB-INF</code> directory as the application path.  This is no longer done automatically, and having the application path be within the exploded war or anywhere in the application server's directory structure is
+            not recommended.
         </p>
-        <h1>Setting the Application Path</h1>
-        These methods are used in this order until a value is found.  The directory must already exist, and the application must have read and write privileges to that directory.
+        <h3>Setting the Application Path</h3>
+        The following configuration methods are evaluated by the application in this order until a value is found:
         <ol>
             <li><a href="#webxml">Servlet <code>web.xml</code></a></li>
             <li><a href="#property">Java System Property</a></li>
             <li><a href="#envvar">Environment Variable</a></li>
         </ol>
-        <h2><a id="webxml">Servlet web.xml</a></h2>
-        Modify the servlet <code>WEB-INF/web.xml</code> file.  You will need to modify the application war file to accomplish this method.  This method also accommodates multiple
-        applications on a single application server.  File paths may be absolute or relative to the base of the exploded application directory.
-        <h3>Linux</h3>
+        <h3><a id="webxml">Servlet web.xml</a></h3>
+        Modify the servlet <code>WEB-INF/web.xml</code> file.  You must modify the application war file to accomplish this method.  This method accommodates multiple
+        applications on a single application server.  File paths must be absolute.
+        <h4>Linux Example</h4>
         <div class="codeExample">
             <code>
                 &lt;context-param&gt;<br/>
@@ -81,7 +91,7 @@
                 &lt;/context-param&gt;<br/>
             </code>
         </div>
-        <h3>Windows</h3>
+        <h4>Windows Example</h4>
         <div class="codeExample">
             <code>
                 &lt;context-param&gt;<br/>
@@ -91,42 +101,70 @@
                 &lt;/context-param&gt;<br/>
             </code>
         </div>
-        <h3>Relative Location</h3>
-        In this example a relative path is specified.  Setting the value to <code>WEB-INF</code> mimics the behavior of older versions of the application.
-        <div class="codeExample">
-            <code>
-                &lt;context-param&gt;<br/>
-                &nbsp;&nbsp;&nbsp;&lt;description&gt;...&lt;/description&gt;<br/>
-                &nbsp;&nbsp;&nbsp;&lt;param-name&gt;applicationPath&lt;/param-name&gt;<br/>
-                &nbsp;&nbsp;&nbsp;&lt;param-value&gt;WEB-INF&lt;/param-value&gt;<br/>
-                &lt;/context-param&gt;<br/>
-            </code>
-        </div>
-        <h2><a id="property">Java System Property</a></h2>
+        <h3><a id="property">Java System Property</a></h3>
         <p>The application will read the java system property <b><%=PwmConstants.PWM_APP_NAME.toLowerCase()%>.applicationPath</b> variable to determine the location of
             the application path.  Relative paths are not permitted.  These example parameters would be added to the java command
             line that starts the application server (tomcat) and java process.</p>
-        <h3>Linux</h3>
+        <h4>Linux Example</h4>
         <div class="codeExample">
             <code>-D<%=PwmConstants.PWM_APP_NAME.toLowerCase()%>.applicationPath='/home/user/<%=PwmConstants.PWM_APP_NAME.toLowerCase()%>-data'</code>
         </div>
-        <h3>Windows</h3>
+        <h4>Windows Example</h4>
         <div class="codeExample">
             <code>-D<%=PwmConstants.PWM_APP_NAME.toLowerCase()%>.applicationPath="c:\<%=PwmConstants.PWM_APP_NAME.toLowerCase()%>-data"</code>
         </div>
-        <h2><a id="envvar">Environment Variable</a></h2>
+        <h3><a id="envvar">Environment Variable</a></h3>
         <p>The application will read the <b><%=PwmConstants.PWM_APP_NAME%>_APPLICATIONPATH</b> variable to determine the location of the application path.  Relative paths are not permitted.</p>
-        <h3>Linux</h3>
+        <h3>Linux Example</h3>
         <div class="codeExample">
             <code>export <%=PwmConstants.PWM_APP_NAME%>_APPLICATIONPATH='/home/user/<%=PwmConstants.PWM_APP_NAME.toLowerCase()%>-data'</code>
         </div>
-        <h3>Windows</h3>
+        <p>This environment variable would typically be set as part of an init or other script file that starts your application server.</p>
+        <h4>Windows Example</h4>
         <div class="codeExample">
             <code>set "<%=PwmConstants.PWM_APP_NAME%>_APPLICATIONPATH=c:\<%=PwmConstants.PWM_APP_NAME.toLowerCase()%>-data"</code>
         </div>
-        <br/><br/><br/><br/>
+        <p>This environment variable is typically set as part of a <code>.bat</code> file that starts your application server, or possibly as a system-wide environment variable via the windows control panel.</p>
+        <br/><br/>
+        <h2><code>ApplicationFlags</code></h2>
+        <p>Application flags can be set to enable or disable behaviors in <%=PwmConstants.PWM_APP_NAME%>.   By default, no flags are set.  Setting flags is optional.  Flags are specified as a comma seperated
+            list of values.  Values are case sensitive.  In most cases, you will not need to set an application flag.
+            <table>
+        <tr><td><h3>Flag</h3></td><td><h3>Behavior</h3></td></tr>
+        <tr><td>ManageHttps</td><td>Enable the setting category <code><%=PwmSettingCategory.HTTPS_SERVER.getLabel(PwmConstants.DEFAULT_LOCALE)%></code></td></tr>
+        <tr><td>NoFileLock</td><td>Disable the file lock in the application path directory.</td></tr>
+    </table>
+        <h3>Linux Example</h3>
+        <div class="codeExample">
+            <code>export <%=PwmConstants.PWM_APP_NAME%>_APPLICATIONFLAGS='ManageHttps,NoFileLock'</code>
+        </div>
+        <br/><br/>
+        <h1>Environment Variable Names and Servlet Context</h1>
+        <p>
+            The environment variables listed above, such as <code><%=PwmConstants.PWM_APP_NAME%>_APPLICATIONPATH</code> and <code><%=PwmConstants.PWM_APP_NAME.toLowerCase()%>.applicationPath</code> assume the default context name of
+            <code>/<%=PwmConstants.PWM_APP_NAME.toLowerCase()%>/</code> is used.  The context path will default to the war file name on most systems.
+        </p>
+        <p>
+            For non-default context names, or when there are multiple <%=PwmConstants.PWM_APP_NAME%> applications deployed on the same server, the environment variable must include the context.  For example:
+        </p>
+        <table>
+            <tr>
+                <td><h3>Context</h3></td><td><h3>Environment Property Name</h3></td><td><h3>Environment Variable Name</h3></td>
+            </tr>
+            <tr>
+                <td><code>/<%=PwmConstants.PWM_APP_NAME.toLowerCase()%>/</code></td><td><code><%=PwmConstants.PWM_APP_NAME.toLowerCase()%>.applicationPath</code><br/>or<br/><code><%=PwmConstants.PWM_APP_NAME.toLowerCase()%>.<%=PwmConstants.PWM_APP_NAME.toLowerCase()%>.applicationPath</code></td><td><code><%=PwmConstants.PWM_APP_NAME%>_APPLICATIONPATH</code><br/>or<br/><code><%=PwmConstants.PWM_APP_NAME%>_<%=PwmConstants.PWM_APP_NAME%>_APPLICATIONPATH</code></td>
+            </tr>
+            <tr>
+                <td><code>/acme/</code></td><td><code><%=PwmConstants.PWM_APP_NAME.toLowerCase()%>.acme.applicationPath</code></td><td><code><%=PwmConstants.PWM_APP_NAME%>_ACME_APPLICATIONPATH</code></td>
+            </tr>
+            <tr>
+                <td><code>/acme2/</code></td><td><code><%=PwmConstants.PWM_APP_NAME.toLowerCase()%>.acme2.applicationPath</code></td><td><code><%=PwmConstants.PWM_APP_NAME%>_ACME2_APPLICATIONPATH</code></td>
+            </tr>
+        </table>
     </div>
 </div>
 <%@ include file="/WEB-INF/jsp/fragment/footer.jsp" %>
+<br/>
+<br/>
 </body>
 </html>

+ 4 - 4
src/main/webapp/public/resources/js/admin.js

@@ -31,14 +31,14 @@ PWM_ADMIN.initAdminNavMenu = function() {
             function(DropDownButton, DropDownMenu, Menu, MenuItem, PopupMenuItem, dom, MenuSeparator){
                 var pMenu = new DropDownMenu({ style: "display: none;"});
                 pMenu.addChild(new MenuItem({
-                    label: 'Event Log',
+                    label: PWM_ADMIN.showString('Title_LogViewer'),
                     id: 'eventLog_dropitem',
                     onClick: function() {
                         PWM_MAIN.goto(PWM_GLOBAL['url-context'] + '/private/admin/logs');
                     }
                 }));
                 pMenu.addChild(new MenuItem({
-                    label: 'Token Lookup',
+                    label: PWM_ADMIN.showString('Title_TokenLookup'),
                     id: 'tokenLookup_dropitem',
                     onClick: function() {
                         PWM_MAIN.goto(PWM_GLOBAL['url-context'] + '/private/admin/tokens');
@@ -46,7 +46,7 @@ PWM_ADMIN.initAdminNavMenu = function() {
                 }));
 
                 pMenu.addChild(new MenuItem({
-                    label: 'URL Reference',
+                    label: PWM_ADMIN.showString('Title_URLReference'),
                     id: 'urlReference_dropitem',
                     onClick: function() {
                         PWM_MAIN.goto(PWM_GLOBAL['url-context'] + '/private/admin/urls');
@@ -405,7 +405,7 @@ PWM_ADMIN.auditUserHeaders = function() {
         "sourceAddress": PWM_ADMIN.showString('Field_Audit_SourceAddress'),
         "sourceHost": PWM_ADMIN.showString('Field_Audit_SourceHost'),
         "guid": PWM_ADMIN.showString('Field_Audit_GUID'),
-        "narrative": PWM_ADMIN.showString('Field_Audit_Narrative')   
+        "narrative": PWM_ADMIN.showString('Field_Audit_Narrative')
     };
 };