summaryrefslogtreecommitdiff
path: root/spamassassin-courier/AuthCourier.pm
blob: a9e136eae13c221c6e8a84feede859a4bf4b2085 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#    Copyright (C) 2003  Corporation of Balclutha.  All rights reserved.
#
#    Visit us at http://www.balclutha.org for all of your open source
#    software development and support requirements and hosted solutions.
#
#    This program is free software; you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation; either version 2 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program; if not, write to the Free Software
#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
package Mail::SpamAssassin::AuthCourier;

$VERSION=1.0.1;

#
# A mechanism which uses the Courier MTA's authdaemond server to
# determine mail account information.  Courier is found at http://courier-mta.org
#
# This module automagically overrides the builtin getpwnam and getpwuid
# functions.
#
use Exporter;
use IO::Socket::UNIX;


@ISA = qw(Exporter);
@EXPORT = qw( getpwnam getpwuid );

#
# ensure overriding for our own internal usage as well ...
#
use subs qw( getpwnam getpwuid );

#
# For some frustrating reason, the socket seems to be unusable unless set each time.
# Please contact us if you have the solution to this enhancement.
#

BEGIN {
    # $socket = IO::Socket::UNIX->new('/usr/lib/courier/var/authdaemon/socket');
}

END {
    $socket->close if $socket;
}

sub getpwnam {
    my $name = shift;
    my $socket = IO::Socket::UNIX->new('/usr/lib/courier/var/authdaemon/socket');
         $socket = IO::Socket::UNIX->new('/var/run/courier/authdaemon/socket') unless $socket;
         $socket = IO::Socket::UNIX->new('/run/authdaemon/socket') unless $socket;
         die "authdaemond socket error: $!\n" unless $socket;

    print $socket "PRE . login $name\n";

    my %results = ();
    my ($k, $v);
    while (<$socket>) {
	($k,$v) = split '=', $_, 2;
	chomp $v if $v;
	$results{$k} = $v;
    }

    $socket->close if $socket;

    # some auth mechanisms don't return UID - these must be fetched from /etc/passwd or
    # it's moral equivalent until Sam patches these as per my request...
    my $uid = $results{'UID'} || CORE::getpwnam($name); 

    # the same seems to be true for the GID
    my $gid = $results{'GID'} || CORE::getgrnam($name);

    # stop some naf 'uninitialized' errors ...
    return wantarray ? ('','','','','','','') : undef unless $uid; # uid 0 = root !!!

    return wantarray ? ( $results{'USERNAME'}, 
			 $results{'PASSWD'},
			 int($uid),
			 int($gid),
			 $results{'QUOTA'},
			 $results{'COMMENT'},
			 $results{'GCOS'},
			 $results{'HOME'},
			 '/bin/bash') : $uid;
}

sub getpwuid {
    return (getpwnam($_[0]))[2];
}


1;


__END__

=head1 SYNOPSIS

  use Mail::SpamAssassin::AuthCourier;


=head1 DESCRIPTION

  Overrides the builtin functions getpwnam, and getpwuid to return 
  information as per the Courier Mail (http://courier-mta.org) 
  authdaemond process rather than from the /etc/passwd file (or it's
  moral equivalent).

  All of the magick happens courtesy of the Exporter module.  If you 
  need the old functions, these are still available via the CORE module.


=head1 INSTALLATION

  Copy this file into the Mail/SpamAssassin directory on your @INC path
  and edit spamd as per the SYNOPSIS.


=head1 AUTHOR

Alan Milligan <alan\x40balclutha.org> ("\x40" is "@" of course)

=cut