Merge branch 'master' of git.uio.no:usit-rt
[usit-rt.git] / local / html / Callbacks / UiOCallbacks / Elements / Login / AfterForm
1 %# Add template named 'Password Change', with description
2 %#
3 %#   Automatically generate password for external users who have forgotten their password
4 %#
5 %# and content
6 %#
7 %#
8 %# Hei {$RealName} !
9 %#
10 %# Denne meldingen er automatisk generert som svar på
11 %# din henvendelse, som ekstern bruker av Request Tracker
12 %# ved UiO, om bytte av passord på følgende hjemmeside:
13 %#
14 %# https://hjelp.uio.no
15 %#
16 %# For å logge deg på RT bruker du:
17 %# Brukernavn (Username): {$Username}
18 %# Passord (Password): {$Password}
19 %#
20 %# Har du ellers problemer med din innlogging så sender
21 %# du en e-post til:
22 %#
23 %# general@hjelp.uio.no
24 %#
25 %# mvh
26 %# RT drift
27
28 <DIV ALIGN="CENTER">
29 <P align="CENTER">
30 <U><B>Glemt passord?/Forgot Your password?</B></U><br>
31 <B>
32 %print $customMessage2;
33 </B><br>
34 %print $customMessage; 
35 <form method="post" action="<% RT->Config->Get('WebPath') %>/NoAuth/Login.html">
36 <input type="text" name="email">
37 <input type="submit">
38 </form>
39 </P>
40 </DIV>
41
42 <%INIT>
43 use Net::LDAP qw(LDAP_SUCCESS LDAP_PARTIAL_RESULTS);
44 use Net::LDAP::Util qw(ldap_error_name);
45
46 my $customMessage;
47 my $customMessage2;
48
49 if ($email) {
50 my $targetType = (GetEmailTypeFromLdap($email) || "none" );
51 if ($targetType !~ /(Sympa|none)/)      {
52     $customMessage = "[ You can not change or request a password for an UiO account here. See: <a href=https://brukerinfo.uio.no/>UiO user administration services</a>. ]";
53     $customMessage2  = "[ ERROR: Use your UiO username and password to log in above. ]";
54   }
55     else {
56     my $UserObj = RT::User->new($RT::SystemUser);
57     $UserObj->LoadByEmail($email);
58     if (defined($UserObj->Id)) {
59       my ($val, $str) = ResetPassword($UserObj);
60       $customMessage2 = $str;
61       $customMessage = "";
62     }
63     else {
64       $customMessage2 = "[ ERROR: No account matches that email address ]";
65       $customMessage = "[ Please enter your email address again ]";
66     }
67   }
68 } else {
69   $customMessage = "[ Please enter your email address ]";
70 }
71
72 sub ResetPassword {
73     my $self = shift;
74
75     unless ( $self->CurrentUserCanModify('Password') ) {
76         return ( 0, $self->loc("Permission Denied") );
77     }  
78     my ( $status, $pass ) = $self->SetRandomPassword();
79
80     unless ($status) {
81         return ( 0, "$pass" );
82     }
83     
84     my $ret = RT::Interface::Email::SendEmailUsingTemplate(
85         To        => $self->EmailAddress,
86         Template  => 'Password Change',
87         Arguments => {
88             Password => $pass,
89             RealName => $self->RealName,
90             Username => $self->Name
91         },
92         );
93     
94     if ($ret) {
95         return ( 1, $self->loc('[ SUCCESS: New password notification sent to Your email address ]') );
96     }
97     else {
98         return ( 0, $self->loc('[ ERROR: Notification could not be sent ]') );
99     }
100 }
101
102 sub GetEmailTypeFromLdap {
103     my $email = shift;
104     my $ldap = LdapConnect($RT::LdapServer);
105     my $targetType;
106     my $mesg = $ldap->search (
107             base    => $RT::LdapMailBase,
108             scope   => "one",
109             filter  => "(&(&(objectClass=mailAddr))(mail=$email))",
110             attributes => ["targetType"],
111             );
112     
113     if ( ($mesg->code != LDAP_SUCCESS) and
114          ($mesg->code != LDAP_PARTIAL_RESULTS) ) {
115         $RT::Logger->critical("Login-After-Form: Search failed: ",
116                               "retval=", $mesg->code, " ",
117                               ldap_error_name($mesg->code));
118         LdapDisconnect($ldap);
119         return undef;
120     }
121
122     while (my $entry = $mesg->shift_entry) {
123         $targetType = $entry->get_value("targetType");
124     }
125     LdapDisconnect($ldap);
126     return $targetType;
127 }
128
129 sub LdapConnect {
130     my $LdapServer = shift;
131     my $mesg;
132     my $ldap = Net::LDAP->new($LdapServer,
133                               version => 3);
134     unless ($ldap) {
135         $RT::Logger->critical("Login-After-Form: Cannot connect to",
136                               "LDAP server ", $LdapServer);
137         return undef;
138     }
139     $mesg = $ldap->bind;
140     if ($mesg->code != LDAP_SUCCESS) {
141         $RT::Logger->critical("Login-After-Form: Cannot bind to LDAP: ",
142                               "retval=", $mesg->code, " ",
143                               ldap_error_name($mesg->code));
144         return undef;
145     }
146     return $ldap;
147 }
148
149 sub LdapDisconnect {
150     my $ldap = shift;
151     my $mesg = $ldap->unbind();
152     if ($mesg->code != LDAP_SUCCESS) {
153         $RT::Logger->critical("Login-After-Form: unbind failed: ",
154                               "retval=", $mesg->code, " ",
155                               ldap_error_name($mesg->code));
156     }
157 }
158
159 </%INIT>
160
161 <%ARGS>
162 $email => undef
163 </%ARGS>