Pman/Login.php
[Pman.Base] / Pman / Login.php
index 7a33364..026b347 100644 (file)
@@ -2,6 +2,25 @@
 
 require_once 'Pman.php';
 
+/***
+* 
+* Auth wrapper..
+* 
+* User class must provide the following features.
+* 
+* logout()
+* isAuth() 
+* getAuthUser();
+* authUserArray() 
+* active()  -- is user active. // or set prior to checking..
+* authUserName(n) - sets the value prior to a find(true)
+* checkPassword($_REQUEST['password'])) {
+* login();
+* lang(val) - to set the language..
+*/
+
+
+
 class Pman_Login extends Pman
 { 
     
@@ -29,7 +48,11 @@ class Pman_Login extends Pman
             $u = $this->getAuthUser();
             //print_r($u);
             if ($u) {
+                
                 $this->addEvent('LOGOUT');
+                $e = DB_DataObject::factory('Events');
+              
+                session_regenerate_id(true);
                 $u->logout();
             }
             // log it..
@@ -40,6 +63,7 @@ class Pman_Login extends Pman
         
         // general query...
         if (!empty($_REQUEST['getAuthUser'])) {
+            //DB_Dataobject::debugLevel(5);
             $this->sendAuthUserDetails();
             exit;
            
@@ -47,13 +71,18 @@ class Pman_Login extends Pman
         if (!empty($_REQUEST['username'])) {
             $this->post();
         }
+        if (!empty($_REQUEST['switch'])) {
+            $this->switchUser($_REQUEST['switch']);
+        }
+        
+        
         $this->jerr("INVALID REQUEST");
         exit;
     }
     
     function sendAuthUserDetails()
     {
-        
+       // DB_DataObject::debugLevel(1);
         $ff = HTML_FlexyFramework::get();
         $tbl = empty($ff->Pman['authTable']) ? 'Person' : $ff->Pman['authTable'];
         
@@ -63,11 +92,35 @@ class Pman_Login extends Pman
             exit;
         }
         $au = $u->getAuthUser();
+        // might occur on shared systems.
+        $ff= HTML_FlexyFramework::get();
+        if (!empty($ff->Pman['auth_comptype']) && $ff->Pman['auth_comptype'] != $au->company()->comptype) {
+            $au->logout();
+            $this->jerr("Login not permited to outside companies - please reload");
+        }
         
-        $aur = $au->authUserArray();
         
+        $au = $u->getAuthUser();
+        
+        $aur = $au->authUserArray();
+         
         /** -- these need modulizing somehow! **/
         
+        
+        
+        // basically calls Pman_MODULE_Login::sendAuthUserDetails($aur) on all the modules
+        echo '<PRE>'; print_r($this->modules());
+        foreach($this->modules() as $m) {
+            if (!file_exists($this->rootDir.'/Pman/'.$m.'/Login.php')) {
+                continue;
+            }
+            $cls = 'Pman_'.$m.'_Login';
+            require_once 'Pman/'.$m.'/Login.php';
+            $x = new $cls;
+            $aur = $x->sendAuthUserDetails($aur);
+        }
+        
+                
         if ($this->hasModule('Fax')) {
             // should check fax module???
             $f = DB_DataObject::factory('Fax_Queue');
@@ -94,10 +147,40 @@ class Pman_Login extends Pman
     }
 
     
+    function switchUser($id)
+    {
+        $tbl = empty($ff->Pman['authTable']) ? 'Person' : $ff->Pman['authTable'];
+        $u = DB_DataObject::factory($tbl);
+        if (!$u->isAuth()) {
+            $this->err("not logged in");
+        }
+        
+        $au = $u->getAuthUser();
+        
+        
+        // first check they have perms to do this..
+        if (!$au|| ($au->company()->comptype != 'OWNER') || !$this->hasPerm('Core.Person', 'E')) {
+            $this->jerr("User switching not permitted");
+        }
+        
+        
+        $u = DB_DataObject::factory($tbl);
+        $u->get($id);
+        if (!$u->active()) {
+            $this->jerr('Account disabled');
+        }
+        $u->login();
+            // we might need this later..
+        $this->addEvent("SWITCH USER", false, $au->name . ' TO ' . $u->name);
+        $this->jok("SWITCH");
+        
+    }
+    
+    
     var $domObj = false;
     function post()
     {
-        
+        //DB_DataObject::debugLevel(1);
         if (!empty($_REQUEST['getAuthUser'])) {
             $this->sendAuthUserDetails();
             exit;
@@ -114,37 +197,49 @@ class Pman_Login extends Pman
             return $this->changePassword($_REQUEST);
         }
         
-         $ff = HTML_FlexyFramework::get();
+        // login attempt..
+        
+        $ff = HTML_FlexyFramework::get();
         $tbl = empty($ff->Pman['authTable']) ? 'Person' : $ff->Pman['authTable'];
         
        
         $u = DB_DataObject::factory($tbl);
         //$u->active = 1;
-        $u->whereAdd('LENGTH(passwd) > 1');
-        //$u->company_id = $this->company->id;
+        
         
         if (empty($_REQUEST['username'])) { //|| (strpos($_REQUEST['username'], '@') < 1)) {
             $this->jerr('You typed the wrong Username or Password (0)');
             exit;
         }
-         
-        $u->email = $_REQUEST['username'];
+        
+        $u->authUserName($_REQUEST['username']);
+        
+        
         if ($u->count() > 1 || !$u->find(true)) {
             $this->jerr('You typed the wrong Username or Password  (1)');
             exit;
         }
         
-        if (!$u->active) {
+        if (!$u->active()) {
             $this->jerr('Account disabled');
         }
         
+        // check if config allows non-owner passwords.
+        // auth_company = "OWNER" // auth_company = "CLIENT" or blank for all?
+        // perhaps it should support arrays..
+        $ff= HTML_FlexyFramework::get();
+        if (!empty($ff->Pman['auth_comptype']) && $ff->Pman['auth_comptype'] != $u->company()->comptype) {
+            $this->jerr("Login not permited to outside companies");
+        }
+        
+        
+        
         if ($u->checkPassword($_REQUEST['password'])) {
             $u->login();
-            $this->AddEvent("LOGIN");
-            if (!empty($_REQUEST['lang']) && $_REQUEST['lang'] != $u->lang) {
-                $uu = clone($u);
-                $uu->lang = $_REQUEST['lang'];
-                $uu->update();
+            // we might need this later..
+            $this->addEvent("LOGIN", false, session_id());
+            if (!empty($_REQUEST['lang'])) {
+                $u->lang($_REQUEST['lang']);
             }
              // log it..