ws
[Pman.Base] / Pman / Login.php
index fae3e12..b17a8c5 100644 (file)
@@ -47,7 +47,7 @@ class Pman_Login extends Pman
     {
         $this->initErrorHandling();
         
-         //DB_DataObject::DebugLevel(1);
+         // DB_DataObject::DebugLevel(5);
         if (!empty($_REQUEST['logout'])) {
            return $this->logout();
         }
@@ -88,7 +88,7 @@ class Pman_Login extends Pman
     {
         $ff = class_exists('HTML_FlexyFramework2') ?  HTML_FlexyFramework2::get()  :  HTML_FlexyFramework::get();
         
-       //DB_DAtaObject::debugLevel(1);
+               //DB_DAtaObject::debugLevel(1);
         $u = $this->getAuthUser();
         //print_r($u);
         if ($u) {
@@ -129,15 +129,22 @@ class Pman_Login extends Pman
         $tbl = empty($ff->Pman['authTable']) ? 'core_person' : $ff->Pman['authTable'];
         
         $u = DB_DataObject::factory($tbl);
-        $s = DB_DataObject::Factory('core_setting');
-        $oath_require = $s->lookup('core', 'two_factor_authentication_requirement');
+        $s = DB_DataObject::factory('core_setting');
+        $require_oath_val = 1;
+        $require_oath = $s->lookup('core', 'two_factor_auth_required');
+        if(!empty($require_oath)) {
+            if($require_oath->val == 0) {
+                $require_oath_val = 0;
+            }
+        } 
+        
         if (!$u->isAuth()) {
             $this->jok(array(
-                'id' => 0,
-                'oath_require' => (bool)  ? 1 : 0
-             )); // not logged in..
-             exit;
+                'id' => 0
+            ));
+            exit;
         }
+        
         //die("got here?");
         $au = $u->getAuthUser();
         
@@ -227,7 +234,7 @@ class Pman_Login extends Pman
         if(!$u->loginPublic()){
             $this->jerr('Switch fail');
         }
-        
+         
         $this->jok('OK');
     }
     
@@ -245,13 +252,46 @@ class Pman_Login extends Pman
         if (!empty($_REQUEST['logout'])) {
            return $this->logout();
         }
-        
-        if (!empty($_REQUEST['passwordRequest'])) { //|| (strpos($_REQUEST['username'], '@') < 1)) {
-            
-            return $this->passwordRequest($_REQUEST['passwordRequest']);
-            
+         
+        if(!empty($_REQUEST['check_owner_company'])) {
+            $core_company = DB_DataObject::factory('core_company');
+            $core_company->comptype = 'OWNER';
+            $this->jok($core_company->count());
         }
         
+        if (!empty($_REQUEST['passwordRequest'])) { //|| (strpos($_REQUEST['username'], '@') < 1)) {
+            return $this->passwordRequest($_REQUEST['passwordRequest']);   
+        }
+                       
+               if (!empty($_REQUEST['ResetPassword'])) {
+                       if (empty($_REQUEST['id']) || 
+                       empty($_REQUEST['ts']) ||
+                       empty($_REQUEST['key']) ||
+                       empty($_REQUEST['password1']) ||
+                       empty($_REQUEST['password2']) ||
+                       ($_REQUEST['password1'] != $_REQUEST['password2'])
+                       ) {
+                       $this->jerr("Invalid request to reset password");
+                       }
+                       
+                       $this->resetPassword($_REQUEST['id'], $_REQUEST['ts'], $_REQUEST['key'], $_REQUEST['password1'] );
+               }
+               
+               
+               if (!empty($_REQUEST['_verifyCheckSum'])) {
+                       if (empty($_REQUEST['id']) || 
+                       empty($_REQUEST['ts']) ||
+                       empty($_REQUEST['key'])
+                        
+                       ) {
+                       $this->jerr("Invalid request to reset password");
+                       }
+                       
+                       $this->verifyResetPassword($_REQUEST['id'], $_REQUEST['ts'], $_REQUEST['key']);
+                       $this->jok("Checksum is ok");
+               }
+       
+       // this is 'classic' change password...
         if (!empty($_REQUEST['changePassword'])) {
             return $this->changePassword($_REQUEST);
         }
@@ -277,7 +317,9 @@ class Pman_Login extends Pman
             }
         }
         
-        //$u->active = 1;
+       // this was removed before - not quite sure why.
+       // when a duplicate login account is created, this stops the old one from interfering..
+        $u->active = 1;
         
         // empty username = not really a hacking attempt.
         
@@ -293,12 +335,12 @@ class Pman_Login extends Pman
             exit;
         }
         
-        if (!$u->active()) {
+        if (!$u->active()) { 
             $this->jerror('LOGIN-BAD','Account disabled');
         }
         
         if(!empty($u->oath_key) && empty($_REQUEST['oath_password'])){
-            $this->jerror('LOGIN-BAD','Your account requires Two-Factor Authentication');
+            $this->jerror('LOGIN-2FA','Your account requires Two-Factor Authentication');
         }
         
         // check if config allows non-owner passwords.
@@ -319,9 +361,12 @@ class Pman_Login extends Pman
         }
         
         if(
-            !empty($u->oath_key) && 
-            !$u->checkTwoFactorAuthentication($_REQUEST['oath_password'])
-        ){
+            !empty($u->oath_key) &&
+           (
+               empty($_REQUEST['oath_password']) ||
+               !$u->checkTwoFactorAuthentication($_REQUEST['oath_password'])
+           )
+        ) {
             $this->jerror('LOGIN-BAD', 'You typed the wrong Username or Password  (3)');
             exit;
         }
@@ -369,9 +414,11 @@ class Pman_Login extends Pman
         // sort out sender.
         $cm = DB_DataObject::factory('core_email');
         if (!$cm->get('name', 'ADMIN_PASSWORD_RESET')) {
-            $this->jerr("no template ADMIN_PASSWORD_RESET exists - please run importer ");
-            
+            $this->jerr("no template  Admin password reset (ADMIN_PASSWORD_RESET) exists - please run importer ");
         }
+               if (!$cm->active) {
+                       $this->jerr("template for Admin password reset has been disabled");
+               }
         /*
         
         $g = DB_DAtaObject::factory('Groups');
@@ -406,13 +453,18 @@ class Pman_Login extends Pman
         $this->bcc = $bcc;
         $this->rcpts = $u->getEmailFrom();
         
-        $ret = $cm->send($this);
-        //$this->jerr(print_r($r->toData(),true));
-        
-        if (is_object($ret)) {
-            $this->addEvent('SYSERR',false, $ret->getMessage());
-            $this->jerr($ret->getMessage());
-        }
+       
+               $mailer = $cm->toMailer($this, false);
+               if (is_a($mailer,'PEAR_Error') ) {
+                       $this->addEvent('SYSERR',false, $mailer->getMessage());
+                       $this->jerr($mailer->getMessage());
+               }
+        $sent = $mailer->send();
+               if (is_a($sent,'PEAR_Error') ) {
+                       $this->addEvent('SYSERR',false, $sent->getMessage());
+                       $this->jerr($sent->getMessage());
+        }
+       
         $this->addEvent('PASSREQ',$u, $u->email);
         $uu = clone($u);
         $uu->no_reset_sent++;
@@ -421,46 +473,66 @@ class Pman_Login extends Pman
         
     }
     
-    function changePassword($r)
-    {   
-        $au = $this->getAuthUser();
+    function verifyResetPassword($id,$t, $key)
+    {
+               $au = $this->getAuthUser();
+               //print_R($au);
         if ($au) {
-            $uu = clone($au);
-            $au->setPassword($r['passwd1']);
-            $au->update($uu);
-            $this->addEvent("CHANGEPASS", $au);
-            $this->jok($au);
-        }
-        // not logged in -> need to validate 
-        if (empty($r['passwordReset'])) {
-            $this->jerr("invalid request");
-        }
-        // same code as reset pasword
-       
-        $bits = explode('/', $r['passwordReset']);
-        //print_R($bits);
-      
-        $res= $this->resetPassword(@$bits[0],@$bits[1],@$bits[2]);
-          
-        if ($res !== false) {
-            $this->jerr($res);
+            $this->jerr( "Already Logged in - no need to use Password Reset");
         }
-        // key is correct.. let's change password...
         
         $u = DB_DataObject::factory('core_person');
-        
         //$u->company_id = $this->company->id;
-        $u->whereAdd('LENGTH(passwd) > 1');
         $u->active = 1;
-        if (!$u->get($bits[0])) {
-           $this->jerr("invalid id"); // should not happen!!!!
+        if (!$u->get($id) || !strlen($u->passwd)) {
+            $this->jerr("Password reset link is not valid (id)");
+        }
+        
+        // validate key.. 
+        if ($key != $u->genPassKey($t)) {
+            $this->jerr("Password reset link is not valid (key)");
+        }
+       
+               if ($t < strtotime("NOW - 1 DAY")) {
+            $this->jerr("Password reset link has expired");
         }
+       return $u;
+       
+       
+       
+    }
+    
+    
+    function resetPassword($id,$t, $key, $newpass )
+    {
+        
+        $u = $this->verifyResetPassword($id,$t,$key);
+       
+       
         $uu = clone($u);
-        $u->setPassword($r['passwd1']);
+        $u->no_reset_sent = 0;
+               if ($newpass != false) {
+                       $u->setPassword($newpass);
+               }
         $u->update($uu);
-        $u->login();
-        $this->addEvent("CHANGEPASS", $u);
-        $this->jok($u);
+               $this->addEvent("CHANGEPASS", $u);
+
+        $this->jok("Password has been Updated");
+    }
+    
+    
+    function changePassword($r)
+    {   
+        $au = $this->getAuthUser();
+        if (!$au) {
+                       $this->jerr("Password change attempted when not logged in");
+               }
+               $uu = clone($au);
+               $au->setPassword($r['passwd1']);
+               $au->update($uu);
+               $this->addEvent("CHANGEPASS", $au);
+               $this->jok($au);
+                        
     }
     
     function ip_checking()
@@ -512,22 +584,22 @@ class Pman_Login extends Pman
             
             $core_ip_access->sendXMPP();
             
-            $this->jerr('NEW-IP-ADDRESS', array('ip' => $ip));
+            $this->jerror('NEW-IP-ADDRESS', "New IP Address = needs approving", array('ip' => $ip));
             
             return;
         }
         
         if(empty($core_ip_access->status)){
-            $this->jerr('PENDING-IP-ADDRESS', array('ip' => $ip));
+            $this->jerror('PENDING-IP-ADDRESS', "IP is still pending approval", array('ip' => $ip));
         }
         
         if($core_ip_access->status == -1){
-            $this->jerr('BLOCKED-IP-ADDRESS', array('ip' => $ip));
+            $this->jerror('BLOCKED-IP-ADDRESS', "Your IP is blocked", array('ip' => $ip));
             return;
         }
         
         if($core_ip_access->status == -2 && strtotime($core_ip_access->expire_dt) < strtotime('NOW')){
-            $this->jerr('BLOCKED-IP-ADDRESS', array('ip' => $ip));
+            $this->jerrpr('BLOCKED-IP-ADDRESS', "Your IP is blocked", array('ip' => $ip));
             return;
         }