Customise Login

Overview

The standard FarCry login screen can be customised in a variety of ways.

  • Image, Application Name and Tagline can be modified
  • the login template can be replaced

Config Changes

Changing the properties on the standard FarCry login is easy. Just login into the webtop and go to ADMIN > Configuration > General. You can change the application name and tagline here. Also you can change the logo-image by adding an absolute URL or an address relative to the webroot of your application.

Substitute Login Template

You can completely replace the login template by adding a template of your own to ./yourproject/customadmin/login/login.cfm

./projects/myproject/customadmin/login/login.cfm
<cfsetting enablecfoutputonly="Yes">

<cfprocessingDirective pageencoding="utf-8">
<cfimport taglib="/farcry/fourq/tags" prefix="q4">

<cfoutput>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head> 
<title>#application.config.general.siteTitle# :: #application.applicationname#</title>

<!--- check for custom Admin CSS in project codebase --->
<cfif fileExists("#application.path.project#/www/css/customadmin/admin.css")>
    <cfoutput>
    <link href="#application.url.webroot#/css/customadmin/admin.css" rel="stylesheet" type="text/css" />
    </cfoutput>
<cfelse>
    <cfoutput>
    <link href="#application.url.farcry#/css/main.css" rel="stylesheet" type="text/css" />
    </cfoutput>
</cfif>
<script type="text/javascript" src="#application.url.farcry#/js/fade.js"></script>
</head>

<body id="sec-login" onload="ol()">

</cfoutput>

<cfset returnUrl = URLDecode(url.returnUrl)>
<cfset returnUrl = replace( returnUrl, "logout=1", "" )>
<cfset returnUrl = replace( returnUrl, "&&", "" )>

<cfparam name="error" default="">

<cfif isdefined("url.error") and url.error eq "draft">
<!--- TODO: i18n --->
    <cfset error = "This page is in draft. Please login with your details below">
</cfif>

<cfset currentNumberLoginAttempts = 0>
<cfif isDefined("form.Normal")>
    <cfset bHasLoggedIn = request.dmSec.oAuthentication.login(userlogin=form.userlogin,userpassword=form.password,baudit=1)>
    <cfif bHasLoggedIn>
        <cfset o_userProfile = createObject("component", application.types.dmProfile.typePath)>
        <cfset session.dmProfile = o_userProfile.getProfile(userName=form.userlogin)>
    <cfelse>
        <!--- check the audit log to see if they have try to login before and failed --->
        <cfset dateTolerance = DateAdd("n","-#application.config.general.loginAttemptsTimeOut#",Now())>
        <cfquery name="qLogAudit" datasource="#application.dsn#">
        SELECT  count(a.datetimeStamp) as numberOfLogin, max(a.datetimeStamp) as lastlogindate, a.username
        FROM    #application.dbowner#fqAudit a
        WHERE   a.auditType = 'dmSec.loginfailed'
            AND a.datetimeStamp >= <cfqueryparam value="#createODBCDateTime(dateTolerance)#" cfsqltype="cf_sql_timestamp">
        GROUP BY a.username
        </cfquery>

        <cfif qLogAudit.recordcount>
            <cfset currentNumberLoginAttempts = qLogAudit.numberOfLogin>
        </cfif>

        <cfset error = "<h5 class='fade-FFDADA' id='errortext'><span style='color:##c00'><b>Login failed:</b></span> Invalid User Login</h5>">
    </cfif>
</cfif>

<cfset oAuthentication = request.dmSec.oAuthentication>
<cfset stLoggedIn = oAuthentication.getUserAuthenticationData()>
<cfset bLoggedin = stLoggedIn.bloggedIn>

<cfif bLoggedIn>
    <!--- dmSecMX automatically sets up session.dmSec.authentication structure --->
    <!--- check for ADMIN permissions --->
    <cfset oAuthorisation = request.dmSec.oAuthorisation>
    <cfset iAdminState = oAuthorisation.checkPermission(permissionName="Admin",reference="PolicyGroup")>
        
    <cfif iAdminState eq 1>
        <!--- turn on admin permissions --->
        <cfset request.mode.bAdmin = 1>
        <cfset session.dmSec.authentication.bAdmin = 1>
        
        <!--- i18n: admin bits --->
        <cfif NOT structKeyExists(application.adminBundle, session.dmProfile.locale)>
            <!--- <cfset application.adminBundle[session.dmProfile.locale]=application.rB.getResourceBundle("farcry.admin",session.dmProfile.locale,true)> --->
            <!--- check if resource exist for this locale if not default to en_AU --->
            <cfif StructIsEmpty(application.rB.getResourceBundle("#application.path.core#/packages/resources/admin.properties",session.dmProfile.locale,false))>
                <cfset application.adminBundle[session.dmProfile.locale]=application.rB.getResourceBundle("#application.path.core#/packages/resources/admin.properties",session.dmProfile.locale,false)>
            <cfelse>
                <cfset application.adminBundle[session.dmProfile.locale]=application.rB.getResourceBundle("#application.path.core#/packages/resources/admin.properties","en_AU",false)>         
            </cfif>
        </cfif>
        <!--- i18n: find out this locale's writing system direction using our special psychic powers --->
        <cfif application.i18nUtils.isBIDI(session.dmProfile.locale)>
            <cfset session.writingDir="rtl">
        <cfelse>
            <cfset session.writingDir="ltr">
        </cfif> 
        <!--- i18n: final bit, grab user language from locale, tarts up html tag --->
        <cfset session.userLanguage=left(session.dmProfile.locale,2)>
    </cfif>

    <!--- relocate to original location --->
    <cflocation url="#returnUrl#" addtoken="No">
    <cfabort>
</cfif>

<!--- set message [error], if user has logged out --->
<cfif not len(error) AND returnUrl contains "logout=1">
    <cfset error="<span style='color:##008C0D'><b>OK:</b></span> You have successfully logged out.">
</cfif>

<cfset bShowLogin = "true">
<cfif currentNumberLoginAttempts GTE application.config.general.loginAttemptsAllowed>
    <cfset bShowLogin = "false">
    <cfset error = "<h5 class='fade-FFDADA' id='errortext'><span style='color:##c00'><b>Login failed:</b></span> Invalid User Login<br />You have exceeded the ammount of login attempts allowed #application.config.general.loginAttemptsAllowed#. Please retry later.</h5>">
</cfif>

<cfoutput>
<script type="text/javascript">
function ol()
{
    el=document.getElementById('userLogin');
    if ( el.value.length==0 ) el.focus();
}
</script>

<form action="#cgi.script_name#?#cgi.query_string#" method="post">
<div id="login">
    <!--- default logo gif --->
    <cfset siteLogo = "images/logo_placeholder.gif"> 
    <!--- if there is a site logo, use it instead of the default placeholder --->       
    <cfif structKeyExists(application.config.general,'siteLogoPath')>
        <cfif application.config.general.siteLogoPath NEQ "">
            <cfset siteLogo = application.config.general.siteLogoPath>
        </cfif>
    </cfif>
    <h1><a href="#application.url.webroot#/"><img src="#siteLogo#" alt="#application.config.general.siteTitle#" /></a>#application.config.general.siteTitle#<span>#application.config.general.siteTagLine#</span></h1>
        <fieldset><cfif bShowLogin EQ "true">
        <label for="userLogin">
        Username
        <input type="text" name="userLogin" id="userLogin" tabindex="1" />
        </label>
        <label for="password">
        Password
        <input type="password" name="password" id="password" tabindex="2" />
        </label>
        <input type="Submit" name="Normal" value="Log In" class="f-submit" tabindex="3" /></cfif>
        #error#
        </fieldset>
        
        <h3><img src="images/powered_by_farcry_watermark.gif" alt="Powered by FarCry" />Tell it to someone who cares</h3>
        
</div>
</form>

</body>
</html>
</cfoutput>

<cfsetting enablecfoutputonly="No">