<div class="gmail_extra">Hi CGS,</div><div class="gmail_extra"><br></div><div class="gmail_extra">Thanks for your reply!</div><div class="gmail_extra"><br></div><div class="gmail_extra">I've found what is wrong.</div><div class="gmail_extra">
<br></div><div class="gmail_extra">Btw, user who run ejabberd is ejabberd instead of root. </div><div class="gmail_extra"><br></div><div class="gmail_extra">Regards,</div><div class="gmail_extra">Coiby<br><br><div class="gmail_quote">
2012/4/27 CGS <span dir="ltr"><<a href="mailto:cgsmcmlxxv@gmail.com" target="_blank">cgsmcmlxxv@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div class="gmail_extra">Hi Coiby,<br><br>Why do you say it's not using your script? It runs, only it fails to authenticate the user.<br><br>By default, if you installed from a repository or you didn't set any user at installation (when it required root privileges), the user running Ejabberd is root and, consequently, your PL script was called under the same user.<span><font color="#888888"><br>


<br>CGS<br><br><br><br><br><br></font></span><div class="gmail_quote"><div><div>On Mon, Apr 23, 2012 at 8:50 AM, Coiby Xu <span dir="ltr"><<a href="mailto:coiby.xu@gmail.com" target="_blank">coiby.xu@gmail.com</a>></span> wrote:<br>

</div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div>
<p style="margin-top:0.5em;margin-bottom:0.9em;font-family:Verdana,Arial,Helvetica,sans-serif;font-size:12px;line-height:17px">Hi all,</p><p style="margin-top:0.5em;margin-bottom:0.9em;font-family:Verdana,Arial,Helvetica,sans-serif;font-size:12px;line-height:17px">



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.</p><p style="margin-top:0.5em;margin-bottom:0.9em;font-family:Verdana,Arial,Helvetica,sans-serif;font-size:12px;line-height:17px">



Here are my configs(key part) and auth script:</p><p style="margin-top:0.5em;margin-bottom:0.9em;font-family:Verdana,Arial,Helvetica,sans-serif;font-size:12px;line-height:17px">1. in /etc/ejabberd/ejabberd.cfg</p><div style="padding-top:5px;padding-right:5px;padding-bottom:5px;padding-left:5px;border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-top-color:rgb(204,204,204);border-right-color:rgb(204,204,204);border-bottom-color:rgb(204,204,204);border-left-color:rgb(204,204,204);background-color:rgb(238,238,238);font-family:Verdana,Arial,Helvetica,sans-serif;font-size:12px;line-height:17px">




<code>%%{auth_method, internal}.<br>%%<br>%% Store the plain passwords or hashed for SCRAM:<br>%%{auth_password_format, plain}.<br>%%{auth_password_format, scram}.<p style="margin-top:0.5em;margin-bottom:0.9em">%%<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}.</p></code></div><p style="margin-top:0.5em;margin-bottom:0.9em;font-family:Verdana,Arial,Helvetica,sans-serif;font-size:12px;line-height:17px">2. in /usr/share/gforge/src/plugins/ejabberd/auth/<a href="http://gforge-auth.pl" target="_blank">gforge-auth.pl</a></p>




<div style="padding-top:5px;padding-right:5px;padding-bottom:5px;padding-left:5px;border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-top-color:rgb(204,204,204);border-right-color:rgb(204,204,204);border-bottom-color:rgb(204,204,204);border-left-color:rgb(204,204,204);background-color:rgb(238,238,238);font-family:Verdana,Arial,Helvetica,sans-serif;font-size:12px;line-height:17px">




<code>#!/usr/bin/perl<p style="margin-top:0.5em;margin-bottom:0.9em"># 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</p>




<p style="margin-top:0.5em;margin-bottom:0.9em"># Security considerations: <br>#  - character filtering may not be perfect, but the most important '$"` are filtered out by this script</p><p style="margin-top:0.5em;margin-bottom:0.9em">




# 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" title="http://www.ejabberd.im/files/efiles/check_postgresql.pl.txt" style="text-decoration:none;font-weight:bold;color:rgb(51,102,153)" target="_blank">http://www.ejabberd.im/files/efiles/check_postgresql.pl.txt</a></p>




<p style="margin-top:0.5em;margin-bottom:0.9em">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";</p>




<p style="margin-top:0.5em;margin-bottom:0.9em">use Unix::Syslog qw(:macros :subs);<br>use Digest::MD5 "md5_hex";<br>use Crypt::PasswdMD5 "unix_md5_crypt";</p><p style="margin-top:0.5em;margin-bottom:0.9em">




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>}</p><p style="margin-top:0.5em;margin-bottom:0.9em">while(1)<br>  {</p><p style="margin-top:0.5em;margin-bottom:0.9em">    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;</p><p style="margin-top:0.5em;margin-bottom:0.9em">




    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);</p><p style="margin-top:0.5em;margin-bottom:0.9em">    #$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);</p><p style="margin-top:0.5em;margin-bottom:0.9em">     # if command returned 0 we return 1<br>     $result = !system($orden);<br>




  },last SWITCH;</p><p style="margin-top:0.5em;margin-bottom:0.9em">$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;</p><p style="margin-top:0.5em;margin-bottom:0.9em">




        $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);</p><p style="margin-top:0.5em;margin-bottom:0.9em">     # 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>  }</p><p style="margin-top:0.5em;margin-bottom:0.9em">closelog;</p></code></div><p style="margin-top:0.5em;margin-bottom:0.9em;font-family:Verdana,Arial,Helvetica,sans-serif;font-size:12px;line-height:17px">




In /var/log/message, there are logs and we only have these:</p><blockquote style="font-family:Verdana,Arial,Helvetica,sans-serif;font-size:12px;line-height:17px"><p style="margin-top:0.5em;margin-bottom:0.9em">Apr 23 10:41:45 innov perl: waiting for packet, hello</p>




</blockquote><p style="margin-top:0.5em;margin-bottom:0.9em;font-family:Verdana,Arial,Helvetica,sans-serif;font-size:12px;line-height:17px">and /var/log/ejabberd/ejabber.log</p><blockquote style="font-family:Verdana,Arial,Helvetica,sans-serif;font-size:12px;line-height:17px">




<p style="margin-top:0.5em;margin-bottom:0.9em">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" style="text-decoration:none;font-weight:bold;color:rgb(51,102,153)" target="_blank">coibyt@innov.zjustu.org</a></p>




</blockquote><p style="margin-top:0.5em;margin-bottom:0.9em;font-family:Verdana,Arial,Helvetica,sans-serif;font-size:12px;line-height:17px">According to the logs, ejabberd is starting the auth script but doesn't use that script to auth user, why?</p>




<p style="margin-top:0.5em;margin-bottom:0.9em;font-family:Verdana,Arial,Helvetica,sans-serif;font-size:12px;line-height:17px">Btw, who's the user that runs the external auth script?</p><p style="margin-top:0.5em;margin-bottom:0.9em;font-family:Verdana,Arial,Helvetica,sans-serif;font-size:12px;line-height:17px">




Thanks!</p>
<br></div></div><div>_______________________________________________<br>
ejabberd mailing list<br>
<a href="mailto:ejabberd@jabber.ru" target="_blank">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></div></blockquote></div><br></div>
<br>_______________________________________________<br>
ejabberd mailing list<br>
<a href="mailto:ejabberd@jabber.ru" target="_blank">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></blockquote></div><br></div>