Hi Michael, <div><br></div><div>I find I make a careless mistake. I thought the following would be OK.<blockquote class="gmail_quote" style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
%%{auth_method, internal}.<br>{auth_method, external}.<br>...<br> </blockquote><div><br></div><div>But host_config is controlling the settings too. I use host_config to set the auth method to be internal.</div><div><br></div>
<div>Thanks!<br><div class="gmail_quote">2012/4/27 Michael Weibel <span dir="ltr"><<a href="mailto:michael.weibel@gmail.com" target="_blank">michael.weibel@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Ah and also, do you have anywhere in the ejabberd.cfg an auth_method internal which is active?<br>
As you see in the log it seems to be still active..<br>
<div class="im HOEnZb"><br>
<br>
Am 27.04.2012 um 05:15 schrieb Coiby Xu:<br>
<br>
</div><div class="HOEnZb"><div class="h5">> Can anybody give any suggestion?<br>
><br>
> Supplements: I called the external auth script from bash and it's OK.<br>
><br>
> 2012/4/23 Coiby Xu <<a href="mailto:coiby.xu@gmail.com">coiby.xu@gmail.com</a>><br>
> Hi all,<br>
> I met a weird problem(My post at forum is not approved. So I resend this question to this mailing list): ejabberd already starts external auth script but doesn't use it to auth users.<br>
> Here are my configs(key part) and auth script:<br>
> 1. in /etc/ejabberd/ejabberd.cfg<br>
> %%{auth_method, internal}.<br>
> %%<br>
> %% Store the plain passwords or hashed for SCRAM:<br>
> %%{auth_password_format, plain}.<br>
> %%{auth_password_format, scram}.<br>
> %%<br>
> %% Authentication using external script<br>
> %% Make sure the script is executable by ejabberd.<br>
> %%<br>
> {auth_method, external}.<br>
> {extauth_program, "/usr/share/gforge/src/plugins/ejabberd/auth/<a href="http://gforge-auth.pl" target="_blank">gforge-auth.pl</a>"}.<br>
> %%{extauth_cache, 600}.<br>
> %%{extauth_instances, 3}.<br>
> 2. in /usr/share/gforge/src/plugins/ejabberd/auth/<a href="http://gforge-auth.pl" target="_blank">gforge-auth.pl</a><br>
> #!/usr/bin/perl<br>
> # Postgresql-gforge external auth script<br>
> # Features: auth works. isUser works, and setPass works, with MD5 encryption.<br>
> # Restrictions: Username or passwords may not contain some special characters: $'"` nor line breaks<br>
> # Security considerations:<br>
> #  - character filtering may not be perfect, but the most important '$"` are filtered out by this script<br>
> # CHANGELOG:<br>
> #<br>
> # Based on <a href="http://check_postgresql.pl" target="_blank">check_postgresql.pl</a><br>
> # which can be found here: <a href="http://www.ejabberd.im/files/efiles/check_postgresql.pl.txt" target="_blank">http://www.ejabberd.im/files/efiles/check_postgresql.pl.txt</a><br>
> my $dbUser="gforge";  # The username to connect to postgresql<br>
> my $dbName="gforge";  # The name of the database inside postgresql<br>
> my $dbTable="users"; # The name of the table inside the database<br>
> my $fieldUser="user_name";   # The name of the field that holds jabber user names<br>
> my $fieldPass="user_pw";   # The name of the field that holds jabber passwords<br>
> my $fieldUnixPass="unix_pw";<br>
> use Unix::Syslog qw(:macros :subs);<br>
> use Digest::MD5 "md5_hex";<br>
> use Crypt::PasswdMD5 "unix_md5_crypt";<br>
> sub gensalt<br>
> {<br>
>     my @salt = ( '.', '/', 0 .. 9, 'A' .. 'Z', 'a' .. 'z' );<br>
>     my $salt;<br>
>     $salt .= (@salt)[rand @salt];<br>
>     $salt .= (@salt)[rand @salt];<br>
>     return $salt;<br>
> }<br>
> while(1)<br>
>   {<br>
>     my $buf = "";<br>
>     syslog LOG_INFO,"waiting for packet, hello";<br>
>     my $nread = sysread STDIN,$buf,2;<br>
>     do { syslog LOG_INFO,"port closed"; exit; } unless $nread == 2;<br>
>     my $len = unpack "n",$buf;<br>
>     my $nread = sysread STDIN,$buf,$len;<br>
>     my ($op,$user,$domain,$password) = split /:/,$buf;<br>
><br>
>     # Filter dangerous characters<br>
>     $user =~ s/[."\n\r'\$`]//g;<br>
>     $password =~ s/[."\n\r'\$`]//g;<br>
><br>
>     $unix_password = unix_md5_crypt( $password, gensalt() );<br>
>     $password = md5_hex($password);<br>
>     #$user =~ s/\./\//og;<br>
>     #my $jid = "$user\@$domain";<br>
>     my $result;<br>
>     syslog LOG_INFO,"nice, very nice";<br>
>     syslog(LOG_INFO,"request (%s)", $op);<br>
>     syslog(LOG_INFO,"buffer (%s)", $buf);<br>
>   SWITCH:<br>
>       {<br>
> $op eq 'auth' and do<br>
>   {<br>
>         $orden = "psql -U $dbUser $dbName --command \"select count(*) from $dbTable where $fieldUser='$user' and $fieldPass='$password';\" |<br>
> grep '^ *[1-9][0-9]* *\$' &> /dev/null";<br>
>      syslog(LOG_INFO,"Executing: %s",$orden);<br>
>      # if command returned 0 we return 1<br>
>      $result = !system($orden);<br>
>   },last SWITCH;<br>
> $op eq 'setpass' and do<br>
>   {<br>
>             $unix_password =~ s/\$/\\\$/g;<br>
>             $orden = "psql -U $dbUser $dbName --command \"UPDATE $dbTable SET $fieldPass='$password', $fieldUnixPass='$unix_password' where $fieldUser='$user';\" | grep '^.*[1-9][0-9]* *\$' &> /dev/null";<br>

>             syslog(LOG_INFO,"Executing: %s",$orden);<br>
><br>
>             # if command returned 0 we return 1<br>
>             $result = !system($orden);<br>
><br>
>   },last SWITCH;<br>
>         $op eq 'isuser' and do<br>
>           {<br>
>              # password is null. Return 1 if the user $user exists.<br>
>      $result = 0;<br>
>              $orden = "psql -U $dbUser $dbName --command \"select count(*) from $dbTable where $fieldUser='$user';\" | grep '^ *[1-9][0-9]* *\$' &> /dev/null";<br>
>      syslog(LOG_INFO,"auth: Executing is_user: %s",$orden);<br>
>      # if command returned 0 we return 1<br>
>      $result = !system($orden);<br>
>           },last SWITCH;<br>
>       };<br>
>     my $out = pack "nn",2,$result ? 1 : 0;<br>
>     syswrite STDOUT,$out;<br>
>   }<br>
> closelog;<br>
> In /var/log/message, there are logs and we only have these:<br>
> Apr 23 10:41:45 innov perl: waiting for packet, hello<br>
> and /var/log/ejabberd/ejabber.log<br>
> I(<0.500.0>:ejabberd_c2s:775) : ({socket_state,gen_tcp,#Port<0.3374>,<0.499.0>}) Accepted authentication for coibyt by ejabberd_auth_internal<br>
> ...<br>
> I(<0.485.0>:ejabberd_c2s:810) : ({socket_state,gen_tcp,#Port<0.3351>,<0.484.0>}) Failed authentication for <a href="mailto:coibyt@innov.zjustu.org">coibyt@innov.zjustu.org</a><br>
> According to the logs, ejabberd is starting the auth script but doesn't use that script to auth user, why?<br>
> Btw, who's the user that runs the external auth script?<br>
> Thanks!<br>
><br>
</div></div><div class="HOEnZb"><div class="h5">> _______________________________________________<br>
> ejabberd mailing list<br>
> <a href="mailto:ejabberd@jabber.ru">ejabberd@jabber.ru</a><br>
> <a href="http://lists.jabber.ru/mailman/listinfo/ejabberd" target="_blank">http://lists.jabber.ru/mailman/listinfo/ejabberd</a><br>
<br>
_______________________________________________<br>
ejabberd mailing list<br>
<a href="mailto:ejabberd@jabber.ru">ejabberd@jabber.ru</a><br>
<a href="http://lists.jabber.ru/mailman/listinfo/ejabberd" target="_blank">http://lists.jabber.ru/mailman/listinfo/ejabberd</a><br>
</div></div></blockquote></div><br></div></div>