Using ExternalAuth to authenticate against POP3
I have a need to tie RT to email authentication so that users can authenticate regardless of what the email platform is. Here is a patch I wrote against RT::Authen::ExternalAuth that may help someone:
diff -ruN /usr/local/rt4/local/plugins/RT-Authen-ExternalAuth/etc/RT_SiteConfig.pm RT-Authen-ExternalAuth/etc/RT_SiteConfig.pm
--- /usr/local/rt4/local/plugins/RT-Authen-ExternalAuth/etc/RT_SiteConfig.pm 2011-04-25 07:57:20.000000000 -0800
+++ RT-Authen-ExternalAuth/etc/RT_SiteConfig.pm 2012-01-11 10:44:45.000000000 -0900
@@ -38,6 +38,16 @@
# Set(ExternalAuthPriority,['My_LDAP','My_MySQL','My_Oracle','SecondaryLDAP','Other-DB']);
#
Set($ExternalSettings, { # AN EXAMPLE DB SERVICE
+ 'POP3' => {
+ # pop3 type
+ 'type' => 'pop3',
+ # pop3 server
+ 'host' => 'mail.domain.com',
+ # if you want to use SSL or not
+ 'ssl' => 1,
+ # auth mode passed to Mail::POP3Client ('BEST', 'PASS', 'APOP' and 'CRAM-MD5')
+ 'authmode' => 'PASS'
+ },
'My_MySQL' => { ## GENERIC SECTION
# The type of service (db/ldap/cookie)
'type' => 'db',
diff -ruN /usr/local/rt4/local/plugins/RT-Authen-ExternalAuth/lib/RT/Authen/ExternalAuth/POP3.pm RT-Authen-ExternalAuth/lib/RT/Authen/ExternalAuth/POP3.pm
--- /usr/local/rt4/local/plugins/RT-Authen-ExternalAuth/lib/RT/Authen/ExternalAuth/POP3.pm 1969-12-31 14:00:00.000000000 -1000
+++ RT-Authen-ExternalAuth/lib/RT/Authen/ExternalAuth/POP3.pm 2012-01-11 10:37:54.000000000 -0900
@@ -0,0 +1,74 @@
+package RT::Authen::ExternalAuth::POP3;
+
+use Mail::POP3Client;
+
+use strict;
+
+sub GetAuth {
+
+ my ($service, $username, $password) = @_;
+
+ my $config = $RT::ExternalSettings->{$service};
+ $RT::Logger->debug( "Trying external auth service:",$service);
+
+ my $host = $config->{'host'};
+ my $ssl = $config->{'ssl'};
+ my $mode = $config->{'authmode'};
+
+ if( $ssl ){
+ $ssl = 1;
+ } else {
+ $ssl = 0;
+ }
+
+ my $pop = new Mail::POP3Client( USER => $username,
+ PASSWORD => $password,
+ HOST => $host,
+ USESSL => $ssl,
+ AUTH_MODE => $mode,
+ );
+
+ $RT::Logger->debug( "POP3 Autentication as", $username, "@", $host );
+
+ if( $pop->State eq 'TRANSACTION' ){
+ $RT::Logger->info( "External Auth OK (", $service, "):", $username);
+ return 1;
+ } else {
+ $RT::Logger->info( "External Auth FAILED (", $service, "):", $username);
+ return 0;
+ }
+}
+
+
+sub CanonicalizeUserInfo {
+
+ my ($service, $key, $value) = @_;
+
+ my $found = 1;
+ my %params = (Name => undef,
+ EmailAddress => undef,
+ RealName => undef);
+
+ return ($found, %params);
+}
+
+sub UserExists {
+ my ($username,$service) = @_;
+ $RT::Logger->debug("UserExists params:\nusername: $username , service: $service");
+ my $config = $RT::ExternalSettings->{$service};
+
+ my $base = $config->{'base'};
+ my $filter = $config->{'filter'};
+
+ return 1;
+
+}
+
+sub UserDisabled {
+
+ my ($username,$service) = @_;
+
+ return 0;
+}
+
+1;
diff -ruN /usr/local/rt4/local/plugins/RT-Authen-ExternalAuth/lib/RT/Authen/ExternalAuth.pm RT-Authen-ExternalAuth/lib/RT/Authen/ExternalAuth.pm
--- /usr/local/rt4/local/plugins/RT-Authen-ExternalAuth/lib/RT/Authen/ExternalAuth.pm 2011-05-06 13:07:37.000000000 -0800
+++ RT-Authen-ExternalAuth/lib/RT/Authen/ExternalAuth.pm 2012-01-11 09:04:33.000000000 -0900
@@ -25,6 +25,7 @@
use RT::Authen::ExternalAuth::LDAP;
use RT::Authen::ExternalAuth::DBI;
+use RT::Authen::ExternalAuth::POP3;
use strict;
@@ -320,6 +321,8 @@
my ($service,$username,$password) = @_;
my $success = 0;
+
+`echo $service,$username,$password > /tmp/test`;
# Get the full configuration for that service as a hashref
my $config = $RT::ExternalSettings->{$service};
@@ -332,6 +335,9 @@
} elsif ($config->{'type'} eq 'ldap') {
$success = RT::Authen::ExternalAuth::LDAP::GetAuth($service,$username,$password);
$RT::Logger->debug("LDAP password validation result:",$success);
+ } elsif ($config->{'type'} eq 'pop3') {
+ $success = RT::Authen::ExternalAuth::POP3::GetAuth($service,$username,$password);
+ $RT::Logger->debug("POP3 password validation result:",$success);
} else {
$RT::Logger->error("Invalid service type for GetAuth:",$service);
}
@@ -357,6 +363,8 @@
$success = RT::Authen::ExternalAuth::DBI::UserExists($username,$service);
} elsif ($config->{'type'} eq 'ldap') {
$success = RT::Authen::ExternalAuth::LDAP::UserExists($username,$service);
+ } elsif ($config->{'type'} eq 'pop3') {
+ $success = RT::Authen::ExternalAuth::POP3::UserExists($username,$service);
} else {
$RT::Logger->debug("Invalid service type for UserExists:",$service);
}
@@ -413,7 +421,19 @@
next;
}
$user_disabled = RT::Authen::ExternalAuth::LDAP::UserDisabled($username,$service);
-
+
+ } elsif ($config->{'type'} eq 'pop3') {
+
+ unless(RT::Authen::ExternalAuth::POP3::UserExists($username,$service)) {
+ $RT::Logger->debug("User (",
+ $username,
+ ") doesn't exist in service (",
+ $service,
+ ") - Cannot update information - Skipping...");
+ next;
+ }
+ $user_disabled = RT::Authen::ExternalAuth::POP3::UserDisabled($username,$service);
+
} elsif ($config->{'type'} eq 'cookie') {
RT::Logger->error("You cannot use SSO Cookies as an information service.");
next;
@@ -507,6 +527,8 @@
($found, %params) = RT::Authen::ExternalAuth::LDAP::CanonicalizeUserInfo($service,$key,$value);
} elsif ($config->{'type'} eq 'db') {
($found, %params) = RT::Authen::ExternalAuth::DBI::CanonicalizeUserInfo($service,$key,$value);
+ } elsif ($config->{'type'} eq 'pop3') {
+ ($found, %params) = RT::Authen::ExternalAuth::POP3::CanonicalizeUserInfo($service,$key,$value);
} else {
$RT::Logger->debug( (caller(0))[3],
"does not consider",
diff -ruN /usr/local/rt4/local/plugins/RT-Authen-ExternalAuth/lib/perllocal.pod RT-Authen-ExternalAuth/lib/perllocal.pod
--- /usr/local/rt4/local/plugins/RT-Authen-ExternalAuth/lib/perllocal.pod 2012-01-11 10:38:38.000000000 -0900
+++ RT-Authen-ExternalAuth/lib/perllocal.pod 2012-01-06 00:47:41.000000000 -0900
@@ -1,4 +1,4 @@
-=head2 Wed Jan 11 10:38:38 2012: C<Module> L<RT::Authen::ExternalAuth|RT::Authen::ExternalAuth>
+=head2 Fri Jan 6 00:47:41 2012: C<Module> L<RT::Authen::ExternalAuth|RT::Authen::ExternalAuth>
=over 4