WordPressInt: ext_db_auth.php

File ext_db_auth.php, 26.2 KB (added by carlgt1, 13 years ago)

modified ext_db_auth.php WordPress? plugin, based on v3.15

Line 
1<?php
2/*
3Plugin Name: External DB authentication
4Plugin URI: http://www.ploofle.com/tag/ext_db_auth/
5Description: Used to externally authenticate WP users with an existing user DB.
6Version: 3.15
7Author: Charlene Barina
8Author URI: http://www.ploofle.com
9
10    Copyright 2007  Charlene Barina  (email : cbarina@u.washington.edu)
11
12    This program is free software; you can redistribute it and/or modify
13    it  under the terms of the GNU General Public License as published by
14    the Free Software Foundation; either version 2 of the License, or
15    (at your option) any later version.
16
17    This program is distributed in the hope that it will be useful,
18    but WITHOUT ANY WARRANTY; without even the implied warranty of
19    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20    GNU General Public License for more details.
21
22    You should have received a copy of the GNU General Public License
23    along with this program; if not, write to the Free Software
24    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
25*/
26
27//backwords compatability with php < 5 for htmlspecialchars_decode
28if ( !function_exists('htmlspecialchars_decode') )
29{
30    function htmlspecialchars_decode($text)
31    {
32        return strtr($text, array_flip(get_html_translation_table(HTML_SPECIALCHARS)));
33    }
34}
35
36function ext_db_auth_activate() {
37        add_option('ext_db_type',"MySQL","External database type");
38        add_option('ext_db_mdb2_path',"","Path to MDB2 (if non-standard)");
39        add_option('ext_host',"","External database hostname");
40        add_option('ext_db_port',"","Database port (if non-standard)");
41        add_option('ext_db',"","External database name");
42        add_option('ext_db_user',"","External database username");
43        add_option('ext_db_pw',"","External database password");
44        add_option('ext_db_table',"","External database table for authentication");
45        add_option('ext_db_namefield',"","External database field for username");
46        add_option('ext_db_pwfield',"","External database field for password");
47        add_option('ext_db_first_name',"");
48        add_option('ext_db_last_name',"");
49        add_option('ext_db_user_url',"");
50        add_option('ext_db_user_email',"");
51        add_option('ext_db_description',"");
52        add_option('ext_db_aim',"");
53        add_option('ext_db_yim',"");
54        add_option('ext_db_jabber',"");
55        add_option('ext_db_enc',"","Type of encoding for external db (default SHA1? or MD5?)");
56        add_option('ext_db_error_msg',"","Custom login message");   
57        add_option('ext_db_other_enc','$password2 = $password;');
58        add_option('ext_db_role_bool','');
59        add_option('ext_db_role','');
60        add_option('ext_db_role_value','');
61        add_option('ext_db_authenticator_cookie','');    // CMC
62}
63
64function ext_db_auth_init(){
65        register_setting('ext_db_auth','ext_db_type');
66        register_setting('ext_db_auth','ext_db_mdb2_path');
67        register_setting('ext_db_auth','ext_host');
68        register_setting('ext_db_auth','ext_db_port');
69        register_setting('ext_db_auth','ext_db');
70        register_setting('ext_db_auth','ext_db_user');
71        register_setting('ext_db_auth','ext_db_pw');
72        register_setting('ext_db_auth','ext_db_table');
73        register_setting('ext_db_auth','ext_db_namefield');
74        register_setting('ext_db_auth','ext_db_pwfield');
75        register_setting('ext_db_auth','ext_db_first_name');
76        register_setting('ext_db_auth','ext_db_last_name');
77        register_setting('ext_db_auth','ext_db_user_url');
78        register_setting('ext_db_auth','ext_db_user_email');
79        register_setting('ext_db_auth','ext_db_description');
80        register_setting('ext_db_auth','ext_db_aim');
81        register_setting('ext_db_auth','ext_db_yim');
82        register_setting('ext_db_auth','ext_db_jabber');
83        register_setting('ext_db_auth','ext_db_enc');
84        register_setting('ext_db_auth','ext_db_error_msg');   
85        register_setting('ext_db_auth','ext_db_other_enc');
86        register_setting('ext_db_auth','ext_db_role');
87        register_setting('ext_db_auth','ext_db_role_bool');
88        register_setting('ext_db_auth','ext_db_role_value');
89        register_setting('ext_db_auth','ext_db_authenticator_cookie');  // CMC
90}
91
92//page for config menu
93function ext_db_auth_add_menu() {
94        add_options_page("External DB settings", "External DB settings", 10, __FILE__,"ext_db_auth_display_options");
95}
96
97//actual configuration screen
98function ext_db_auth_display_options() { 
99    $db_types[] = "MySQL";
100    $db_types[] = "MSSQL";
101    $db_types[] = "PgSQL";
102?>
103        <div class="wrap">
104        <h2>External Database Authentication Settings</h2>       
105        <form method="post" action="options.php">
106        <?php settings_fields('ext_db_auth'); ?>
107        <h3>External Database Settings</h3>
108          <strong>Make sure your WP admin account exists in the external db prior to saving these settings.</strong>
109        <table class="form-table">
110        <tr valign="top">
111            <th scope="row">Database type</th>
112                <td><select name="ext_db_type" >
113                <?php 
114                    foreach ($db_types as $key=>$value) { //print out radio buttons
115                        if ($value == get_option('ext_db_type'))
116                            echo '<option value="'.$value.'" selected="selected">'.$value.'<br/>';
117                        else echo '<option value="'.$value.'">'.$value.'<br/>';;
118                    }               
119                ?>
120                </select>
121                                </td>
122                                <td>
123                                        <span class="description"><strong style="color:red;">required</strong>; If not MySQL, requires <a href="http://pear.php.net/package/MDB2/" target="_blank">PEAR MDB2 package</a> and relevant database driver package installation.</span>
124                                </td>
125        </tr>       
126        <tr valign="top">
127            <th scope="row"><label>Path to MDB2.php</label></th>
128                                <td><input type="text" name="ext_db_mdb2_path" value="<?php echo get_option('ext_db_mdb2_path'); ?>" /> </td>
129                                <td><span class="description">Only when using non-MySQL database and in case this isn't in some sort of include path in your PHP configuration.  No trailing slash! e.g., /home/username/php </span></td>
130        </tr>
131        <tr valign="top">
132            <th scope="row"><label>Host</label></th>
133                                <td><input type="text" name="ext_host" value="<?php echo get_option('ext_host'); ?>" /> </td>
134                                <td><span class="description"><strong style="color:red;">required</strong>; (often localhost)</span> </td>
135        </tr>
136        <tr valign="top">
137            <th scope="row"><label>Port</label></th>
138                                <td><input type="text" name="ext_db_port" value="<?php echo get_option('ext_db_port'); ?>" /> </td>
139                                <td><span class="description">Only set this if you have a non-standard port for connecting.</span></td>
140        </tr>       
141        <tr valign="top">
142            <th scope="row"><label>Name</label></th>
143                                <td><input type="text" name="ext_db" value="<?php echo get_option('ext_db'); ?>" /></td>
144                                <td><span class="description"><strong style="color:red;">required</strong></span></td>
145        </tr>
146        <tr valign="top">
147            <th scope="row"><label>Username</label></th>
148                                <td><input type="text" name="ext_db_user" value="<?php echo get_option('ext_db_user'); ?>" /></td>
149                                <td><span class="description"><strong style="color:red;">required</strong>; (recommend select privileges only)</span></td>
150        </tr>
151        <tr valign="top">
152            <th scope="row"><label>Password</label></th>
153                                <td><input type="password" name="ext_db_pw" value="<?php echo get_option('ext_db_pw'); ?>" /></td>
154                                <td><span class="description"><strong style="color:red;">required</strong></span></td>
155        </tr>
156        <tr valign="top">
157            <th scope="row"><label>User table</label></th>
158                                <td><input type="text" name="ext_db_table" value="<?php echo get_option('ext_db_table'); ?>" /></td>
159                                <td><span class="description"><strong style="color:red;">required</strong></span></td>
160        </tr>
161        </table>
162       
163        <h3>External Database Source Fields</h3>
164        <table class="form-table">
165        <tr valign="top">
166            <th scope="row"><label>Username</label></th>
167                                <td><input type="text" name="ext_db_namefield" value="<?php echo get_option('ext_db_namefield'); ?>" /></td>
168                                <td><span class="description"><strong style="color:red;">required</strong></span></td>
169        </tr>
170        <tr valign="top">
171            <th scope="row"><label>Password</label></th>
172                                <td><input type="text" name="ext_db_pwfield" value="<?php echo get_option('ext_db_pwfield'); ?>" /></td>
173                                <td><span class="description"><strong style="color:red;">required</strong></span><td>
174        </tr>
175        <tr valign="top">
176            <th scope="row">Password encryption method</th>
177                <td><select name="ext_db_enc">
178                <?php 
179                    switch(get_option('ext_db_enc')) {
180                    case "SHA1" :
181                        echo '<option selected="selected">SHA1</option><option>MD5</option><option>Other</option>';
182                        break;
183                    case "MD5" :
184                        echo '<option>SHA1</option><option selected="selected">MD5</option><option>Other</option>';
185                        break;               
186                    case "Other" :
187                        echo '<option>SHA1</option><option  selected="selected">MD5</option><option selected="selected">Other</option>';
188                        break;                                       
189                    default :
190                        echo '<option selected="selected">SHA1</option><option>MD5</option><option>Other</option>';
191                        break;
192                    }
193                ?>
194                                </select></td>
195                        <td><span class="description"><strong style="color:red;">required</strong>; (using "Other" requires you to enter PHP code below!)</td>           
196        </tr>
197        <tr valign="top">
198            <th scope="row"><label>Hash code</label></th>
199                                <td><input type="text" name="ext_db_other_enc" size="50" value="<?php echo get_option('ext_db_other_enc'); ?>" /></td>
200                                <td><span class="description">Only will run if "Other" is selected and needs to be PHP code. Variable you need to set is $password2, and you have access to (original) $username and $password.</td>
201        </tr>
202                <tr valign="top">
203            <th scope="row"><label>Role check</label></th>
204                        <td><input type="text" name="ext_db_role" value="<?php echo get_option('ext_db_role'); ?>" />
205                                <br />
206                                <select name="ext_db_role_bool">
207                <?php 
208                    switch(get_option('ext_db_role_bool')) {
209                    case "is" :
210                        echo '<option selected="selected">is</option><option>greater than</option><option>less than</option>';
211                        break;
212                    case "greater than" :
213                        echo '<option>is</option><option selected="selected">greater than</option><option>less than</option>';
214                        break;               
215                    case "less than" :
216                        echo '<option>is</option><option>greater than</option><option selected="selected">less than</option>';
217                        break;                                       
218                    default :
219                        echo '<option selected="selected">is</option><option>greater than</option><option>less than</option>';
220                        break;
221                    }
222                ?>
223                                </select><br />
224                                <input type="text" name="ext_db_role_value" value="<?php echo get_option('ext_db_role_value'); ?>" /></td>
225                                <td><span class="description">Use this if you have certain user role ids in your external database to further restrict allowed logins.  If unused, leave fields blank.</span></td>
226        </tr>
227        <tr valign="top">
228            <th scope="row"><label>First name</label></th>
229                        <td><input type="text" name="ext_db_first_name" value="<?php echo get_option('ext_db_first_name'); ?>" /></td>
230        </tr>
231        <tr valign="top">
232            <th scope="row"><label>Last name</label></th>
233                        <td><input type="text" name="ext_db_last_name" value="<?php echo get_option('ext_db_last_name'); ?>" /></td>
234        </tr>
235        <tr valign="top">
236            <th scope="row"><label>Homepage</label></th>
237                        <td><input type="text" name="ext_db_user_url" value="<?php echo get_option('ext_db_user_url'); ?>" /></td>
238        </tr>
239        <tr valign="top">
240            <th scope="row"><label>Email</label></th>
241                        <td><input type="text" name="ext_db_user_email" value="<?php echo get_option('ext_db_user_email'); ?>" /></td>
242        </tr>
243        <!-- CMC here - next tr section -->
244        <tr valign="top">
245            <th scope="row"><label>Authenticator Cookie Field</label></th>
246                        <td><input type="text" name="ext_db_authenticator_cookie" value="<?php echo get_option('ext_db_authenticator_cookie'); ?>" /></td>
247              <td><span class="description">Use this if other parts of your domain are 'outside' of WordPress
248               but you want to save an authentication cookie to be used if successfully logged in via WordPress (and this ext_db plugin). 
249              You will have a cookie named 'auth' that can be checked on the non-WordPress bits to facilitate with auto-login there etc. 
250              If unused, leave this blank.</span></td>
251        </tr>
252      <!-- CMC here -- end of mods  -->
253        <tr valign="top">
254            <th scope="row"><label>Bio/description</label></th>
255                        <td><input type="text" name="ext_db_description" value="<?php echo get_option('ext_db_description'); ?>" /></td>
256        </tr>
257        <tr valign="top">
258            <th scope="row"><label>AIM screen name</label></th>
259                        <td><input type="text" name="ext_db_aim" value="<?php echo get_option('ext_db_aim'); ?>" /></td>
260        </tr>
261        <tr valign="top">
262            <th scope="row"><label>YIM screen name</label></th>
263                        <td><input type="text" name="ext_db_yim" value="<?php echo get_option('ext_db_yim'); ?>" /></td>
264        </tr>
265        <tr valign="top">
266            <th scope="row"><label>JABBER screen name</label></th>
267                        <td><input type="text" name="ext_db_jabber" value="<?php echo get_option('ext_db_jabber'); ?>" /></td>
268        </tr>
269        </table>
270        <h3>Other</h3>
271        <table class="form-table">
272        <tr valign="top">
273                <th scope="row">Custom login message</th>
274                <td><textarea name="ext_db_error_msg" cols=40 rows=4><?php echo htmlspecialchars(get_option('ext_db_error_msg'));?></textarea></td>
275                <td><span class="description">Shows up in login box, e.g., to tell them where to get an account. You can use HTML in this text.</td>
276        </tr>       
277    </table>
278       
279        <p class="submit">
280        <input type="submit" name="Submit" value="Save changes" />
281        </p>
282        </form>
283        </div>
284<?php
285}
286
287//sort-of wrapper for all DB interactions
288function db_functions($driver,$process,$resource,$query) {
289    if ($driver == "MySQL") {   //use built-in PHP mysql connection
290        switch($process) {
291            case "connect" :
292                $port = get_option('ext_db_port');               
293                if (!empty($port))   $port = ":".get_option('ext_db_port');
294                $resource = mysql_connect(get_option('ext_host').$port, get_option('ext_db_user'), get_option('ext_db_pw'),true) or die(mysql_error());               
295                mysql_select_db(get_option('ext_db'),$resource) or die(mysql_error());
296                return $resource;
297                break;
298            case "query":
299                $result = mysql_query($query,$resource) or die(mysql_error());
300                return $result;
301                break;           
302            case "numrows":
303                return mysql_num_rows($resource);
304                break;
305            case "fetch":
306                return mysql_fetch_assoc($resource);           
307                break;
308            case "close":
309                mysql_close($resource);           
310                break;
311        }
312    }
313    else {  //Use MDB2   
314        $mdbpath = get_option('ext_db_mdb2_path')."/MDB2.php";       
315        require_once($mdbpath);
316        switch($process) {
317            case "connect" :               
318                $port = get_option('ext_db_port');               
319                if (!empty($port))   $port = ":".get_option('ext_db_port');               
320                $url = strtolower($driver)."://".get_option('ext_db_user').":".get_option('ext_db_pw')."@".get_option('ext_host').$port."/".get_option('ext_db');               
321                $resource =& MDB2::connect($url);
322                if(PEAR::isError($resource)) die("Error while connecting : " . $resource->getMessage());
323                return $resource;       
324                break;
325            case "query":   
326                $result = $resource->query($query);
327                if(PEAR::isError($result)) die('Failed to issue query, error message : ' . $result->getMessage());                           
328                return $result;
329                break;           
330            case "numrows":
331                return $resource->numRows();
332                break;
333            case "fetch":
334                return $resource->fetchRow(MDB2_FETCHMODE_ASSOC);               
335                break;
336            case "close":
337                $resource->disconnect();               
338                break;
339        }
340    }
341}
342
343//actual meat of plugin - essentially, you're setting $username and $password to pass on to the system.
344//You check from your external system and insert/update users into the WP system just before WP actually
345//authenticates with its own database.
346function ext_db_auth_check_login($username,$password) {
347        require_once('./wp-includes/registration.php');
348     
349    //first figure out the DB type and connect...
350    $driver = get_option('ext_db_type');
351        //if on same host have to use resource id to make sure you don't lose the wp db connection       
352         
353    $mdbpath = get_option('ext_db_mdb2_path')."/MDB2.php";       
354    if ($mdbpath != "/MDB2.php") @require_once($mdbpath);
355   
356    $resource = db_functions($driver,"connect","","");
357        //prepare the db for unicode queries
358        //to pick up umlauts, non-latin text, etc., without choking
359        $utfquery = "SET NAMES 'utf8'";
360        $resultutf = db_functions($driver,"query",$resource,$utfquery); 
361
362        //do the password hash for comparing
363        switch(get_option('ext_db_enc')) {
364                case "SHA1" :
365                        $password2 = sha1($password);
366                        break;
367                case "MD5" :
368                        $password2 = md5($password);
369                        break;                 
370        case "Other" :             //right now defaulting to plaintext.  People can change code here for their own special hash
371            eval(get_option('ext_db_other_enc'));
372            break;
373        }
374       
375   
376   //first check to see if login exists in external db
377   $query = "SELECT count(*) AS numrows FROM " . get_option('ext_db_table') . " WHERE ".get_option('ext_db_namefield')." = '$username'";
378   $result = db_functions($driver,"query",$resource,$query);   
379   $numrows = db_functions($driver,"fetch",$result,"");
380   $numrows = $numrows["numrows"];
381       
382    if ($numrows) {
383             //then check to see if pw matches and get other fields...
384        $sqlfields['first_name'] = get_option('ext_db_first_name');
385        $sqlfields['last_name'] = get_option('ext_db_last_name');
386        $sqlfields['user_url'] = get_option('ext_db_user_url');
387        $sqlfields['user_email'] = get_option('ext_db_user_email');
388        $sqlfields['description'] = get_option('ext_db_description');
389        $sqlfields['aim'] = get_option('ext_db_aim');
390        $sqlfields['yim'] = get_option('ext_db_yim');
391        $sqlfields['jabber'] = get_option('ext_db_jabber');     
392        $sqlfields['ext_db_role'] = get_option('ext_db_role');
393        $sqlfields['authenticator'] = get_option('ext_db_authenticator_cookie');    // CMC
394                 
395        foreach($sqlfields as $key=>$value) {                           
396            if ($value == "") unset($sqlfields[$key]);
397        }
398        $sqlfields2 = implode(", ",$sqlfields);
399   
400        //just so queries won't error out if there are no relevant fields for extended data.
401        if (empty($sqlfields2)) $sqlfields2 = get_option('ext_db_namefield');
402            $query = "SELECT $sqlfields2 FROM " . get_option('ext_db_table') . " WHERE ".get_option('ext_db_namefield')." = '$username' AND ".get_option('ext_db_pwfield')." = '$password2'";                                                   
403            $result = db_functions($driver,"query",$resource,$query);   
404        $numrows = db_functions($driver,"numrows",$result,"");         
405               
406                if ($numrows) {    //create/update wp account from external database if login/pw exact match exists in that db         
407            $extfields = db_functions($driver,"fetch",$result,""); 
408                        $process = TRUE;
409                               
410                        //check role, if present.
411                        $role = get_option('ext_db_role');
412                        if (!empty($role)) {    //build the role checker too                                   
413                                $rolevalue = $extfields[$sqlfields['ext_db_role']];                     
414                                $rolethresh = get_option('ext_db_role_value');
415                                $rolebool = get_option('ext_db_role_bool');                                     
416                                global $ext_error;
417                                if ($rolebool == 'is') {
418                                        if ($rolevalue == $rolethresh) {}
419                                        else {
420                                                $username = NULL;
421                                                $ext_error = "wrongrole";                                                                                                       
422                                                $process = FALSE;
423                                        }
424                                }
425                                if ($rolebool == 'greater than') {
426                                        if ($rolevalue > $rolethresh) {}
427                                        else {                                 
428                                                $username = NULL;
429                                                $ext_error = "wrongrole";                                                                                                               
430                                                $process = FALSE;
431                                        }
432                                }
433                                if ($rolebool == 'less than') {
434                                        if ($rolevalue < $rolethresh) {}
435                                        else {
436                                                $username = NULL;
437                                                $ext_error = "wrongrole";
438                                                $process = FALSE;
439                                        }
440                                }                       
441                        }                                                               
442                        //only continue with user update/creation if login/pw is valid AND, if used, proper role perms
443                        if ($process) {
444                                $userarray['user_login'] = $username;
445                                $userarray['user_pass'] = $password;                   
446                                $userarray['first_name'] = $extfields[$sqlfields['first_name']];
447                                $userarray['last_name'] = $extfields[$sqlfields['last_name']];       
448                                $userarray['user_url'] = $extfields[$sqlfields['user_url']];
449                                $userarray['user_email'] = $extfields[$sqlfields['user_email']];
450                                $userarray['description'] = $extfields[$sqlfields['description']];
451                                $userarray['aim'] = $extfields[$sqlfields['aim']];
452                                $userarray['yim'] = $extfields[$sqlfields['yim']];
453                                $userarray['jabber'] = $extfields[$sqlfields['jabber']];
454                                $userarray['display_name'] = $extfields[$sqlfields['first_name']]." ".$extfields[$sqlfields['last_name']];           
455                               
456                                //also if no extended data fields
457                                if ($userarray['display_name'] == " ") $userarray['display_name'] = $username;
458                               
459                                db_functions($driver,"close",$resource,"");
460                               
461    // CMC hack - set auth cookies
462   $auth = $extfields[$sqlfields['authenticator']];
463   if (! empty($auth)) { // we want to set an authenticator cookie for other parts of the website
464       setcookie("auth",  $auth, time()+3600*24*365, "/");
465   }
466    // end CMC hack
467
468                                //looks like wp functions clean up data before entry, so I'm not going to try to clean out fields beforehand.
469                                if ($id = username_exists($username)) {   //just do an update
470                                         $userarray['ID'] = $id;
471                                         wp_update_user($userarray);
472                                }
473                                else wp_insert_user($userarray);          //otherwise create
474
475                        }
476        }                         
477                else {  //username exists but wrong password...                 
478                        global $ext_error;
479                        $ext_error = "wrongpw";                         
480                        $username = NULL;
481                }
482        }
483        else {  //don't let login even if it's in the WP db - it needs to come only from the external db.
484                global $ext_error;
485                $ext_error = "notindb";
486                $username = NULL;
487        }           
488}
489
490
491//gives warning for login - where to get "source" login
492function ext_db_auth_warning() {
493   echo "<p class=\"message\">".get_option('ext_db_error_msg')."</p>";
494}
495
496function ext_db_errors() {
497        global $error;
498        global $ext_error;
499        if ($ext_error == "notindb")
500                return "<strong>ERROR:</strong> Username not found.";
501        else if ($ext_error == "wrongrole")
502                return "<strong>ERROR:</strong> You don't have permissions to log in.";
503        else if ($ext_error == "wrongpw")
504                return "<strong>ERROR:</strong> Invalid password.";
505        else
506                return $error;
507}
508
509//hopefully grays stuff out.
510function ext_db_warning() {
511        echo '<strong style="color:red;">Any changes made below WILL NOT be preserved when you login again. You have to change your personal information per instructions found in the <a href="../wp-login.php">login box</a>.</strong>'; 
512}
513
514//disables the (useless) password reset option in WP when this plugin is enabled.
515function ext_db_show_password_fields() {
516        return 0;
517}
518
519
520/*
521 * Disable functions.  Idea taken from http auth plugin.
522 */
523function disable_function_register() { 
524        $errors = new WP_Error();
525        $errors->add('registerdisabled', __('User registration is not available from this site, so you can\'t create an account or retrieve your password from here. See the message above.'));
526        ?></form><br /><div id="login_error">User registration is not available from this site, so you can't create an account or retrieve your password from here. See the message above.</div>
527                <p id="backtoblog"><a href="<?php bloginfo('url'); ?>/" title="<?php _e('Are you lost?') ?>"><?php printf(__('&larr; Back to %s'), get_bloginfo('title', 'display' )); ?></a></p>
528        <?php
529        exit();
530}
531
532function disable_function() {   
533        $errors = new WP_Error();
534        $errors->add('registerdisabled', __('User registration is not available from this site, so you can\'t create an account or retrieve your password from here. See the message above.'));
535        login_header(__('Log In'), '', $errors);
536        ?>
537        <p id="backtoblog"><a href="<?php bloginfo('url'); ?>/" title="<?php _e('Are you lost?') ?>"><?php printf(__('&larr; Back to %s'), get_bloginfo('title', 'display' )); ?></a></p>
538        <?php
539        exit();
540}
541
542
543add_action('admin_init', 'ext_db_auth_init' );
544add_action('admin_menu', 'ext_db_auth_add_menu');
545add_action('wp_authenticate', 'ext_db_auth_check_login', 1, 2 );
546add_action('lost_password', 'disable_function');
547add_action('user_register', 'disable_function');
548add_action('register_form', 'disable_function_register');
549add_action('retrieve_password', 'disable_function');
550add_action('password_reset', 'disable_function');
551add_action('profile_personal_options','ext_db_warning');
552add_filter('login_errors','ext_db_errors');
553add_filter('show_password_fields','ext_db_show_password_fields');
554add_filter('login_message','ext_db_auth_warning');
555
556register_activation_hook( __FILE__, 'ext_db_auth_activate' );
557