Ich würde gerne die Authentifizierung von ejabberd mit Hilfe der mysql-Datenbank von phpbb 3.08. bewerkstelligen.
Da mir leider die Kenntnisse der Programmierung fehlen, hoffe ich hier auf ein paar fähige Coder, für die das wahrscheinlich kein größeres Problem darstellen sollte.
Nach einigen Recherchen bin ich auf ein Skript gestoßen, das allerdings nur mit per Crypt verschlüsselten Passwörtern in Datenbanken zurecht kommt.
Somit sollte sich die Anpassungsarbeit in Grenzen halten.
Hinzugefügt habe ich bisher:
Code: Alles auswählen
use Digest::MD5 qw(md5 md5_hex md5_base64);
Code: Alles auswählen
bei 'auth' "crypt" durch "md5" ersetzt.
Hier das vorläufige Skript:
Code: Alles auswählen
#!/usr/bin/perl
# Mysql external auth script
# Features: auth isUser and change password
# Password is an encrypted password !!
# Settings
my $sDatabaseHost='localhost'; # The hostname of the database server
my $sDatabaseUser="*********"; # The username to connect to mysql
my $sDatabasePass='*********'; # The password to connect to mysql
my $sDatabaseName="forum"; # The name of the database contain the user table
my $sUserTable="phpbb_users"; # The name of the table containing the username and password
my $sUsernameTableField="username"; # The name of the field that holds jabber user names
my $sPasswordTableField="user_password"; # The name of the field that holds jabber passwords
# Libs
use DBI;
use DBD::mysql;
use Digest::MD5 qw(md5 md5_hex md5_base64);
while(1) {
my $sBuffer = "";
my $readBuffer = sysread STDIN,$sBuffer,2;
my $iBufferLength = unpack "n",$sBuffer;
my $readBuffer = sysread STDIN,$sBuffer,$iBufferLength;
my ($sOperation,$sUsername,$sDomain,$sPassword) = split /:/,$sBuffer;
my $bResult;
SWITCH: {
$sOperation eq 'auth' and do {
$bResult = 0;
$connect = DBI->connect('DBI:mysql:'.$sDatabaseName, $sDatabaseUser, $sDatabasePass) || die "Could not connect to database: $DBI::errstr";
$query = "SELECT $sPasswordTableField FROM $sUserTable WHERE $sUsernameTableField='$sUsername';";
$statement = $connect->prepare($query);
$statement->execute();
while ($row = $statement->fetchrow_hashref()) {
$sCryptstring = md5($sPassword,$row->{$sPasswordTableField});
if ($row->{$sPasswordTableField} eq $sCryptstring) {
$bResult = 1;
}
}
},last SWITCH;
$sOperation eq 'setpass' and do {
$connect = DBI->connect('DBI:mysql:'.$sDatabaseName, $sDatabaseUser, $sDatabasePass) || die "Could not connect to database: $DBI::errstr";
$myquery = "UPDATE $sUserTable SET $sPasswordTableField=ENCRYPT('$sPassword') WHERE $sUsernameTableField='$sUsername';";
$statement = $connect->prepare($myquery);
$statement->execute();
$bResult = 1;
},last SWITCH;
$sOperation eq 'isuser' and do {
$bResult = 0;
$connect = DBI->connect('DBI:mysql:'.$sDatabaseName, $sDatabaseUser, $sDatabasePass) || die "Could not connect to database: $DBI::errstr";
$myquery = "SELECT count(*) AS iCount FROM $sUserTable WHERE $sUsernameTableField='$sUsername';";
$statement = $connect->prepare($myquery);
$statement->execute();
$row = $statement->fetchrow_hashref();
if($row->{'iCount'} >= 1){
$bResult = 1;
}
},last SWITCH;
};
my $sOutput = pack "nn",2,$bResult ? 1 : 0;
syswrite STDOUT,$sOutput;
}
closelog;
Wirklich wichtig ist nur ein funktionierende Authentifizierung.
Es gibt übrigens noch einige andere Personen die auch Interesse an diesem Skript hätten. Das ist mir beim suchen aufgefallen...
Nette Grüße
Andreas