<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://rt-wiki.bestpractical.com/index.php?action=history&amp;feed=atom&amp;title=AutoCreateAndCanonicalizeUserInfo</id>
	<title>AutoCreateAndCanonicalizeUserInfo - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://rt-wiki.bestpractical.com/index.php?action=history&amp;feed=atom&amp;title=AutoCreateAndCanonicalizeUserInfo"/>
	<link rel="alternate" type="text/html" href="https://rt-wiki.bestpractical.com/index.php?title=AutoCreateAndCanonicalizeUserInfo&amp;action=history"/>
	<updated>2026-08-23T04:41:52Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://rt-wiki.bestpractical.com/index.php?title=AutoCreateAndCanonicalizeUserInfo&amp;diff=244&amp;oldid=prev</id>
		<title>Admin: 4 revisions imported</title>
		<link rel="alternate" type="text/html" href="https://rt-wiki.bestpractical.com/index.php?title=AutoCreateAndCanonicalizeUserInfo&amp;diff=244&amp;oldid=prev"/>
		<updated>2016-04-06T20:03:17Z</updated>

		<summary type="html">&lt;p&gt;4 revisions imported&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Outdated}}&lt;br /&gt;
&lt;br /&gt;
== Auto Create User and Lookup Alternate Addresses via LDAP ==&lt;br /&gt;
&lt;br /&gt;
To make the [[AutoCreateFromExternalUserInfo]] overlay recognise that a person may have multiple users I added amended scripts. This allows RT to work the LDAP directory in MS Exchange 5.5 (I don&amp;#039;t know about later versions). e.g.&lt;br /&gt;
&lt;br /&gt;
 cn = joeb&lt;br /&gt;
 email = joe.bloggs@company.com&lt;br /&gt;
 otherMailbox = smtp$joeb@company.com&lt;br /&gt;
 otherMailbox = smtp$joebloggs@company.com&lt;br /&gt;
&lt;br /&gt;
Will all refer back to RT user joeb with RT email = [mailto:joe.bloggs@company.com joe.bloggs@company.com]&lt;br /&gt;
&lt;br /&gt;
It also allows the helpdesk staff to enter requestors as joeb, [mailto:joeb@company.com joeb@company.com], [mailto:joe.bloggs@company.com joe.bloggs@company.com] or [mailto:joebloggs@company.com joebloggs@company.com] and still refer to user joeb.&lt;br /&gt;
&lt;br /&gt;
Place [[CurrentUser Local|CurrentUser_Local]].pm and [[User Local|User_Local]].pm in $RT_HOME/lib/RT folders&lt;br /&gt;
&lt;br /&gt;
=== User_Local.pm ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&lt;br /&gt;
  # User_Local.pm overlay&lt;br /&gt;
  #&lt;br /&gt;
  # author: Phillip Cole (phillip d cole @ uk d coltgroup d com)&lt;br /&gt;
  # based on CurrentUser_Local.pm and much help from the mailing lists&lt;br /&gt;
  #&lt;br /&gt;
  no warnings qw(redefine);&lt;br /&gt;
  &lt;br /&gt;
  # {{{ sub CanonicalizeEmailAddress&lt;br /&gt;
  &lt;br /&gt;
  =head2 CanonicalizeEmailAddress ADDRESS&lt;br /&gt;
  &lt;br /&gt;
  # Lookup this email address in Exchange LDAP to make sure it is the&lt;br /&gt;
  # users primary email address&lt;br /&gt;
  # i.e. replace philcole@company.com with phillip.cole@company.com&lt;br /&gt;
  &lt;br /&gt;
  =cut&lt;br /&gt;
  &lt;br /&gt;
  sub CanonicalizeEmailAddress {&lt;br /&gt;
      my $self = shift;&lt;br /&gt;
      my $email = shift;&lt;br /&gt;
  &lt;br /&gt;
      $RT::Logger-&amp;amp;gt;debug(&amp;quot;CanonicalizeEmailAddress: Inside User_Local.pm version email=$email\n&amp;quot;);&lt;br /&gt;
      if ($email) {&lt;br /&gt;
  &lt;br /&gt;
          my ($found, %params) = RT::User::LookupExternalUserInfo(&amp;quot;otherMailbox&amp;quot;, &amp;quot;smtp\$$email&amp;quot;);&lt;br /&gt;
          if ($found) {&lt;br /&gt;
              if ($params{&amp;#039;EmailAddress&amp;#039;} and ($email ne $params{&amp;#039;EmailAddress&amp;#039;})) {&lt;br /&gt;
                  $RT::Logger-&amp;amp;gt;info(&amp;quot;CanonicalizeEmailAddress: Changing email to &amp;quot; . $params{&amp;#039;EmailAddress&amp;#039;} . &amp;quot;\n&amp;quot;);&lt;br /&gt;
                  return($params{&amp;#039;EmailAddress&amp;#039;});&lt;br /&gt;
              }&lt;br /&gt;
          }&lt;br /&gt;
      }&lt;br /&gt;
      return($email);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  # {{{ sub CanonicalizeUserInfo&lt;br /&gt;
  &lt;br /&gt;
  =head2 CanonicalizeUserInfo&lt;br /&gt;
  &lt;br /&gt;
  Colt Custom function to lookup a new users details from within an LDAP directory&lt;br /&gt;
  &lt;br /&gt;
  =cut&lt;br /&gt;
  &lt;br /&gt;
  sub CanonicalizeUserInfo {&lt;br /&gt;
      my $self = shift;&lt;br /&gt;
      my $args = shift;&lt;br /&gt;
      my $success = 1;&lt;br /&gt;
      $success = 0;&lt;br /&gt;
  &lt;br /&gt;
      $RT::Logger-&amp;amp;gt;debug(&amp;quot;CanonicalizeUserInfo: Inside User_Local.pm version\n&amp;quot; .&lt;br /&gt;
                         &amp;#039;   $args-&amp;amp;gt;{\&amp;#039;RealName\&amp;#039;}    =&amp;#039; . $args-&amp;amp;gt;{&amp;#039;RealName&amp;#039;} . &amp;quot;\n&amp;quot; .&lt;br /&gt;
                         &amp;#039;   $args-&amp;amp;gt;{\&amp;#039;Name\&amp;#039;}        =&amp;#039; . $args-&amp;amp;gt;{&amp;#039;Name&amp;#039;} . &amp;quot;\n&amp;quot; .&lt;br /&gt;
                         &amp;#039;   $args-&amp;amp;gt;{\&amp;#039;EmailAddress\&amp;#039;}=&amp;#039; . $args-&amp;amp;gt;{&amp;#039;EmailAddress&amp;#039;} . &amp;quot;\n&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
      # $args is a hash reference.  To get at it&amp;#039;s values need to call $args-&amp;amp;gt;{&amp;#039;key&amp;#039;}&lt;br /&gt;
      # $args has keys:&lt;br /&gt;
      #    RealName     - User human name (e.g. Cole, Phillip)&lt;br /&gt;
      #    Name         - Username (e.g. ukpgc)&lt;br /&gt;
      #    EmailAddress - Email address (e.g. phillip.cole@company.com)&lt;br /&gt;
      #    Comments     - Comments created during creation&lt;br /&gt;
  &lt;br /&gt;
      # Try to match by User ID first&lt;br /&gt;
      my ($found, %params) = RT::User::LookupExternalUserInfo(&amp;quot;uid&amp;quot;, $args-&amp;amp;gt;{&amp;#039;Name&amp;#039;});&lt;br /&gt;
      if (!$found) {&lt;br /&gt;
          # If not found try to match email address&lt;br /&gt;
          my $email = $self-&amp;amp;gt;CanonicalizeEmailAddress($args-&amp;amp;gt;{&amp;#039;EmailAddress&amp;#039;});&lt;br /&gt;
          ($found, %params) = RT::User::LookupExternalUserInfo(&amp;quot;mail&amp;quot;, $email);&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
      if ($found) {&lt;br /&gt;
          $RT::Logger-&amp;amp;gt;info(&amp;quot;CanonicalizeUserInfo: Setting args as returned via LDAP,\n&amp;quot;);&lt;br /&gt;
          $args-&amp;amp;gt;{&amp;#039;Name&amp;#039;} = $params{&amp;#039;Name&amp;#039;};&lt;br /&gt;
          $args-&amp;amp;gt;{&amp;#039;RealName&amp;#039;} = $params{&amp;#039;RealName&amp;#039;};&lt;br /&gt;
          $args-&amp;amp;gt;{&amp;#039;EmailAddress&amp;#039;} = $params{&amp;#039;EmailAddress&amp;#039;};&lt;br /&gt;
          $args-&amp;amp;gt;{&amp;#039;Comments&amp;#039;} = &amp;#039;Autocreated via LDAP when added as a watcher&amp;#039;;&lt;br /&gt;
          $success = 1;&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
      return($success);&lt;br /&gt;
  }&lt;br /&gt;
  # }}}&lt;br /&gt;
  &lt;br /&gt;
  # {{{ sub LookupExternalUserInfo&lt;br /&gt;
  &lt;br /&gt;
  =head2 LookupExternalUserInfo&lt;br /&gt;
  &lt;br /&gt;
  LookupExternalUserInfo takes a key/value pair, looks it up in LDAP,&lt;br /&gt;
  and returns a (sparse) params hash suitable for creating a User object&lt;br /&gt;
  &lt;br /&gt;
  =cut&lt;br /&gt;
  &lt;br /&gt;
  sub LookupExternalUserInfo {&lt;br /&gt;
     my $key = shift;&lt;br /&gt;
     my $value = shift;&lt;br /&gt;
  &lt;br /&gt;
     # I have dreams of this function using an $LdapAttrMap hash fpr&lt;br /&gt;
     # Ldap -&amp;amp;gt; RT account creation, in the form of:&lt;br /&gt;
     #&lt;br /&gt;
     #   %RT::LdapAttrMap = ( Name=&amp;amp;gt; &amp;#039;uid&amp;#039;,&lt;br /&gt;
     #                        RealName=&amp;amp;gt; &amp;#039;cn&amp;#039;,&lt;br /&gt;
     #                        EmailAdress=&amp;amp;gt; &amp;#039;mail&amp;#039;,&lt;br /&gt;
     #                        [anyUserAttr]=&amp;amp;gt; [anyLdapAttr]);&lt;br /&gt;
     #&lt;br /&gt;
     # But until then, you better have the following variables defined&lt;br /&gt;
     # in your RT_SiteConfig.pm:&lt;br /&gt;
     #&lt;br /&gt;
     #   Set($LdapServer, &amp;quot;ldap.domain.tld&amp;quot;);&lt;br /&gt;
     #   Set($LdapBase, &amp;quot;cn=Users,dc=domain,dc=tld&amp;quot;);&lt;br /&gt;
     #   Set($LdapUidAttr, &amp;quot;uid&amp;quot;);&lt;br /&gt;
     #   Set($LdapNameAttr, &amp;quot;cn&amp;quot;);&lt;br /&gt;
     #   Set($LdapMailAttr, &amp;quot;mail&amp;quot;);&lt;br /&gt;
     #   Set($LdapFilter, &amp;quot;(objectclass=person)&amp;quot;);&lt;br /&gt;
     #   Set($AutoCreateFromExternalUserInfo, 1);&lt;br /&gt;
     #&lt;br /&gt;
     # enjoy!&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
     my $FoundInExternalDatabase = 0;&lt;br /&gt;
     my %params = ( Name=&amp;amp;gt; undef,&lt;br /&gt;
                    EmailAddress=&amp;amp;gt; undef,&lt;br /&gt;
                    RealName=&amp;amp;gt; undef);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
     $RT::Logger-&amp;amp;gt;debug(&amp;quot;LookupExternalUserInfo: Entered with:\n&amp;quot;,&lt;br /&gt;
                        &amp;quot;\tkey   = $key\n&amp;quot;,&lt;br /&gt;
                        &amp;quot;\tvalue = $value\n&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
     use Net::LDAP;&lt;br /&gt;
     use Net::LDAP::Constant qw(LDAP_SUCCESS LDAP_PARTIAL_RESULTS);&lt;br /&gt;
  &lt;br /&gt;
     my $ldap = new Net::LDAP($RT::LdapServer)&lt;br /&gt;
       or $RT::Logger-&amp;amp;gt;critical(&amp;quot;LookupExternalUserInfo: Cannot connect to &amp;quot;,&lt;br /&gt;
                                &amp;quot;LDAP&amp;#039;\n&amp;quot;),&lt;br /&gt;
         return ($FoundInExternalDatabase, %params);&lt;br /&gt;
  &lt;br /&gt;
     my $mesg = $ldap-&amp;amp;gt;bind();&lt;br /&gt;
     if ($mesg-&amp;amp;gt;code != LDAP_SUCCESS) {&lt;br /&gt;
       $RT::Logger-&amp;amp;gt;critical(&amp;quot;LookupExternalUserInfo: Cannot bind anonymously &amp;quot;,&lt;br /&gt;
                             &amp;quot;to LDAP:&amp;quot;, $mesg-&amp;amp;gt;code, &amp;quot;\n&amp;quot;);&lt;br /&gt;
       #$params{&amp;#039;RealName&amp;#039;} = &amp;quot;\&amp;quot;$params{&amp;#039;RealName&amp;#039;}\&amp;quot;&amp;quot;;&lt;br /&gt;
       return ($FoundInExternalDatabase, %params);&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
     my $filter = &amp;quot;@{[ $key ]}=$value&amp;quot;;&lt;br /&gt;
     $RT::Logger-&amp;amp;gt;debug(&amp;quot;LookupExternalUserInfo: First search filter &amp;quot;,&lt;br /&gt;
                        &amp;quot;&amp;#039;$filter&amp;#039;\n&amp;quot;);&lt;br /&gt;
     $mesg = $ldap-&amp;amp;gt;search(base   =&amp;amp;gt; $RT::LdapBase,&lt;br /&gt;
                           filter =&amp;amp;gt; $filter,&lt;br /&gt;
                           attrs  =&amp;amp;gt; [ $RT::LdapUidAttr, $RT::LdapMailAttr, $RT::LdapNameAttr ]);&lt;br /&gt;
     if ($mesg-&amp;amp;gt;code != LDAP_SUCCESS and $mesg-&amp;amp;gt;code != LDAP_PARTIAL_RESULTS)  {&lt;br /&gt;
       $RT::Logger-&amp;amp;gt;critical(&amp;quot;LookupExternalUserInfo: Could not search for &amp;quot;,&lt;br /&gt;
                             &amp;quot;$filter: &amp;quot;, $mesg-&amp;amp;gt;code, &amp;quot;\n&amp;quot;);&lt;br /&gt;
       $params{&amp;#039;RealName&amp;#039;} = &amp;quot;\&amp;quot;$params{&amp;#039;RealName&amp;#039;}\&amp;quot;&amp;quot;;&lt;br /&gt;
       return ($FoundInExternalDatabase, %params);&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     $RT::Logger-&amp;amp;gt;debug(&amp;quot;LookupExternalUserInfo:  Search produced &amp;quot;,&lt;br /&gt;
                        $mesg-&amp;amp;gt;count, &amp;quot; results\n&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
     # The search succeeded with just one match&lt;br /&gt;
     if ($mesg-&amp;amp;gt;count == 1) {&lt;br /&gt;
       $params{&amp;#039;Name&amp;#039;} = ($mesg-&amp;amp;gt;first_entry-&amp;amp;gt;get_value($RT::LdapUidAttr))[0];&lt;br /&gt;
       $params{&amp;#039;EmailAddress&amp;#039;} = ($mesg-&amp;amp;gt;first_entry-&amp;amp;gt;get_value($RT::LdapMailAttr))[0];&lt;br /&gt;
       $params{&amp;#039;RealName&amp;#039;} = ($mesg-&amp;amp;gt;first_entry-&amp;amp;gt;get_value($RT::LdapNameAttr))[0];&lt;br /&gt;
       #$params{&amp;#039;RealName&amp;#039;} = &amp;quot;\&amp;quot;$params{&amp;#039;RealName&amp;#039;}\&amp;quot;&amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
       $FoundInExternalDatabase = 1;&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     $mesg = $ldap-&amp;amp;gt;unbind();&lt;br /&gt;
     if ($mesg-&amp;amp;gt;code != LDAP_SUCCESS) {&lt;br /&gt;
       $RT::Logger-&amp;amp;gt;critical(&amp;quot;LookupExternalUserInfo: Could not unbind from &amp;quot;,&lt;br /&gt;
                             &amp;quot;LDAP: &amp;quot;, $mesg-&amp;amp;gt;code, &amp;quot;\n&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
     undef $ldap;&lt;br /&gt;
     undef $mesg;&lt;br /&gt;
  &lt;br /&gt;
     $RT::Logger-&amp;amp;gt;debug(&amp;quot;LookupExternalUserInfo: Leaving LDAP examination &amp;quot;,&lt;br /&gt;
                        &amp;quot;with:\n&amp;quot;,&lt;br /&gt;
                        &amp;quot;\tName         = $params{&amp;#039;Name&amp;#039;}\n&amp;quot;,&lt;br /&gt;
                        &amp;quot;\tEmailAddress = $params{&amp;#039;EmailAddress&amp;#039;}\n&amp;quot;,&lt;br /&gt;
                        &amp;quot;\tRealName     = $params{&amp;#039;RealName&amp;#039;}\n&amp;quot;,&lt;br /&gt;
                        &amp;quot;\tFound        = $FoundInExternalDatabase\n&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
     return ($FoundInExternalDatabase, %params);&lt;br /&gt;
  }&lt;br /&gt;
  # }}}&lt;br /&gt;
  &lt;br /&gt;
  1;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CurrentUser_Local.pm ===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#&lt;br /&gt;
  # AutoCreateFromExternalUserInfo overlay&lt;br /&gt;
  #&lt;br /&gt;
  # author: Robin Battey &amp;amp;lt;zanfur at zanfur dot com&amp;amp;gt;&lt;br /&gt;
  # modified by Phillip Cole to remove $self-&amp;amp;gt; from LookupExternalUserInfo&lt;br /&gt;
  # and move LookupExternalUserInfo into User_Local.pm&lt;br /&gt;
  #&lt;br /&gt;
  # based in part by the LookupExternalUserInfo function&lt;br /&gt;
  # written by Jeff Hoover &amp;amp;lt;jeff.hoover at infotechfl dot com&amp;amp;gt;&lt;br /&gt;
  #&lt;br /&gt;
  # This Overlay is useful if you want the following behavior:&lt;br /&gt;
  #  * Whenever RT tries -- and fails -- to load a user from the&lt;br /&gt;
  #    RT user database, it queries an Ldap server for the account&lt;br /&gt;
  #    information and creates it on the fly (for both email lookups&lt;br /&gt;
  #    and web logins)&lt;br /&gt;
  #  * RT behaves as though the account has always been there -- i.e.&lt;br /&gt;
  #    there is no reason to give &amp;quot;Everyone&amp;quot; the &amp;quot;Create Ticket&amp;quot; right,&lt;br /&gt;
  #    because the account has been there all along ...&lt;br /&gt;
  #  * NO synchronization with the Ldap server once the account has&lt;br /&gt;
  #    been created, so any changes in RT stay in RT and any changes&lt;br /&gt;
  #    in Ldap stay in Ldap (unless you run some other script, of course)&lt;br /&gt;
  #&lt;br /&gt;
  # The situation I had at my place of employment, which caused me&lt;br /&gt;
  # to write this, is we have an Active Directory server with a fairly&lt;br /&gt;
  # large number of users on it, with a fair bit of adding/deleting of&lt;br /&gt;
  # users going on.  I wanted a way for users to send a request to the&lt;br /&gt;
  # help queue, and then immediately be able to see the ticket, the&lt;br /&gt;
  # ticket&amp;#039;s status, etc using their Active Directory (i.e. windows&lt;br /&gt;
  # domain) username and password.  I wrote this overlay for the account&lt;br /&gt;
  # generation, and used the LdapOverlay available in the &amp;quot;Contributions&amp;quot;&lt;br /&gt;
  # section of the RT3 Wiki (http://wiki.bestpractical.com) for the&lt;br /&gt;
  # authentication.  This overlay was therefore designed to work well&lt;br /&gt;
  # with the LdapOverlay, and actually uses (some of) the same Ldap&lt;br /&gt;
  # variables.&lt;br /&gt;
  #&lt;br /&gt;
  # I spent a bit of effort making sure this was modular, particularly&lt;br /&gt;
  # in the case of a different external user info source.  It currently&lt;br /&gt;
  # works with LDAP (and, of course, Active Directory), but there&amp;#039;s no&lt;br /&gt;
  # good reason why you can&amp;#039;t just replace the LookupExternalUserInfo&lt;br /&gt;
  # function to get your data from somewhere else.&lt;br /&gt;
  &lt;br /&gt;
  no warnings qw(redefine);&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  # {{{ sub CreateFromExternalUserInfo&lt;br /&gt;
  &lt;br /&gt;
  =head2 CreateFromExternalUserInfo&lt;br /&gt;
  &lt;br /&gt;
  Calls LookupExternalUserInfo and creates a user from the results&lt;br /&gt;
  &lt;br /&gt;
  =cut&lt;br /&gt;
  &lt;br /&gt;
  sub CreateFromExternalUserInfo {&lt;br /&gt;
      my $self = shift;&lt;br /&gt;
      my @lookupargs = @_;&lt;br /&gt;
  &lt;br /&gt;
      $RT::Logger-&amp;amp;gt;debug( &amp;quot;CreateFromExternalUserInfo: entered with args: &amp;quot;, @lookupargs, &amp;quot;\n&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
      my ($found, %params) = RT::User::LookupExternalUserInfo (@lookupargs);&lt;br /&gt;
      $RT::Logger-&amp;amp;gt;debug( &amp;quot;CreateFromExternalUserInfo: params hash: &amp;quot;, %params, &amp;quot;\n&amp;quot;);&lt;br /&gt;
      unless ($found) {&lt;br /&gt;
          $RT::Logger-&amp;amp;gt;info (&amp;quot;CreateFromExternalUserInfo: failed to find user with args: &amp;quot;, @lookupargs, &amp;quot;\n&amp;quot;);&lt;br /&gt;
          return undef;&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
      my $UserObj = RT::User-&amp;amp;gt;new($RT::SystemUser);&lt;br /&gt;
      my ($val, $msg) = $UserObj-&amp;amp;gt;Create(&lt;br /&gt;
          %{ref($RT::AutoCreate) ? $RT::AutoCreate : {}},&lt;br /&gt;
          %params&lt;br /&gt;
      );&lt;br /&gt;
  &lt;br /&gt;
      unless ($val) {&lt;br /&gt;
          $RT::Logger-&amp;amp;gt;info (&amp;quot;CreateFromExternalUserInfo: failed to create user with args: &amp;quot;, @lookupargs, &amp;quot;\n&amp;quot;);&lt;br /&gt;
          return undef;&lt;br /&gt;
      }&lt;br /&gt;
  &lt;br /&gt;
      $RT::Logger-&amp;amp;gt;info (&amp;quot;CreateFromExternalUserInfo: created user $val (\&amp;quot;$msg\&amp;quot;)\n&amp;quot;);&lt;br /&gt;
      $self-&amp;amp;gt;Load($val);&lt;br /&gt;
  }&lt;br /&gt;
  # }}}&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  # {{{ sub LoadByEmail&lt;br /&gt;
  &lt;br /&gt;
  =head2 LoadByEmail&lt;br /&gt;
  &lt;br /&gt;
  Loads a User into this CurrentUser object.&lt;br /&gt;
  Takes the email address of the user to load.&lt;br /&gt;
  &lt;br /&gt;
  =cut&lt;br /&gt;
  &lt;br /&gt;
  sub LoadByEmail  {&lt;br /&gt;
      my $self = shift;&lt;br /&gt;
      my $identifier = shift;&lt;br /&gt;
      $identifier = RT::User::CanonicalizeEmailAddress(undef, $identifier);&lt;br /&gt;
  &lt;br /&gt;
      $self-&amp;amp;gt;LoadByCol(&amp;quot;EmailAddress&amp;quot;,$identifier);&lt;br /&gt;
  &lt;br /&gt;
      if (!$self-&amp;amp;gt;Id and $RT::AutoCreateFromExternalUserInfo) {&lt;br /&gt;
          $self-&amp;amp;gt;CreateFromExternalUserInfo (&amp;quot;mail&amp;quot;, $identifier);&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  # }}}&lt;br /&gt;
  &lt;br /&gt;
  # {{{ sub LoadByName&lt;br /&gt;
  &lt;br /&gt;
  =head2 LoadByName&lt;br /&gt;
  &lt;br /&gt;
  Loads a User into this CurrentUser object.&lt;br /&gt;
  Takes a Name.&lt;br /&gt;
  =cut&lt;br /&gt;
  &lt;br /&gt;
  sub LoadByName {&lt;br /&gt;
      my $self = shift;&lt;br /&gt;
      my $identifier = shift;&lt;br /&gt;
  &lt;br /&gt;
      $self-&amp;amp;gt;LoadByCol(&amp;quot;Name&amp;quot;,$identifier);&lt;br /&gt;
      if (!$self-&amp;amp;gt;Id and $RT::AutoCreateFromExternalUserInfo) {&lt;br /&gt;
          $self-&amp;amp;gt;CreateFromExternalUserInfo (&amp;quot;uid&amp;quot;, $identifier);&lt;br /&gt;
          $self-&amp;amp;gt;LoadByCol(&amp;quot;Name&amp;quot;,$identifier);&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  # }}}&lt;br /&gt;
  &lt;br /&gt;
  # {{{ sub Load&lt;br /&gt;
  &lt;br /&gt;
  =head2 Load&lt;br /&gt;
  &lt;br /&gt;
  Loads a User into this CurrentUser object.&lt;br /&gt;
  Takes either an integer (users id column reference) or a Name&lt;br /&gt;
  The latter is deprecated. Instead, you should use LoadByName.&lt;br /&gt;
  Formerly, this routine also took email addresses.&lt;br /&gt;
  &lt;br /&gt;
  =cut&lt;br /&gt;
  &lt;br /&gt;
  sub Load  {&lt;br /&gt;
    my $self = shift;&lt;br /&gt;
    my $identifier = shift;&lt;br /&gt;
  &lt;br /&gt;
    #if it&amp;#039;s an int, load by id. otherwise, load by name.&lt;br /&gt;
    if ($identifier !~ /\D/) {&lt;br /&gt;
      $self-&amp;amp;gt;SUPER::LoadById($identifier);&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    elsif (UNIVERSAL::isa($identifier,&amp;quot;RT::User&amp;quot;)) {&lt;br /&gt;
           # DWIM if they pass a user in&lt;br /&gt;
           $self-&amp;amp;gt;SUPER::LoadById($identifier-&amp;amp;gt;Id);&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
        # This is a bit dangerous, we might get false authen if somebody&lt;br /&gt;
        # uses ambigous userids or real names:&lt;br /&gt;
        $self-&amp;amp;gt;LoadByName($identifier);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  # }}}&lt;br /&gt;
  &lt;br /&gt;
  1;&lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
--Phillip Cole 30/09/05&lt;br /&gt;
[[Category:Outdated]]&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>