12 db_auth.pl - Database auth helper for Squid
16 my $dsn = "DBI:mysql:database=squid";
18 my $db_passwd = undef;
19 my $db_table = "passwd";
20 my $db_usercol = "user";
21 my $db_passwdcol = "password";
22 my $db_cond = "enabled = 1";
34 This program verifies username & password to a database
40 Database DSN. Default "DBI:mysql:database=squid"
52 Database table. Default "passwd".
56 Username column. Default "user".
60 Password column. Default "password".
64 Condition, defaults to enabled=1. Specify 1 or "" for no condition
68 Database contains plain-text passwords
72 Keep a persistent database connection open between queries.
80 'user=s' => \$db_user,
81 'password=s' => \$db_passwd,
82 'table=s' => \$db_table,
83 'usercol=s' => \$db_usercol,
84 'passwdcol=s' => \$db_passwdcol,
85 'cond=s' => \$db_cond,
86 'plaintext' => \$plaintext,
87 'persist' => \$persist,
94 return if !defined($_dbh);
102 return $_sth if defined $_sth;
103 $_dbh = DBI->connect($dsn, $db_user, $db_passwd);
104 if (!defined $_dbh) {
105 warn ("Could not connect to $dsn\n");
108 $_sth = $_dbh->prepare("SELECT $db_passwdcol FROM $db_table WHERE $db_usercol = ?" . ($db_cond ne "" ? " AND $db_cond" : "")) || die;
112 sub check_password($$)
114 my ($password, $key) = @_;
116 return 1 if crypt($password, $key) eq $key;
118 return 1 if $plaintext && $password eq $key;
125 my ($sth) = open_db() || return undef;
126 if (!$sth->execute($user)) {
128 open_db() || return undef;
129 $sth->execute($user) || return undef;;
136 my ($user, $password) = split;
138 $user =~ s/%(..)/pack("H*", $1)/ge;
139 $password =~ s/%(..)/pack("H*", $1)/ge;
141 $status = "ERR database error";
142 my $sth = query_db($user) || next;
143 $status = "ERR unknown login";
144 my $row = $sth->fetchrow_arrayref() || next;
145 $status = "ERR login failure";
146 next if (!check_password($password, @$row[0]));
149 close_db() if (!$persist);
150 print $status . "\n";
157 Copyright (C) 2007 Henrik Nordstrom <henrik@henriknordstrom.net>
158 This program is free software. You may redistribute copies of it under the
159 terms of the GNU General Public License version 2, or (at youropinion) any