fix SQL injection
[Pman.Core] / DataObjects / Core_person.php
index 5e30028..0a499a4 100644 (file)
@@ -254,11 +254,14 @@ class Pman_Core_DataObjects_Core_person extends DB_DataObject
     function isAuth()
     {
         // do not start a session if we are using http auth...
-        if (empty($_SERVER['PHP_AUTH_USER']) && php_sapi_name() != "cli") {
-            @session_start();
-        }
-       
+        // we have a situation where the app is behind a http access and is also login
+        // need to work out a way to handle that.
         $ff= HTML_FlexyFramework::get();
+        if (php_sapi_name() != "cli" && (empty($_SERVER['PHP_AUTH_USER']) || !empty($ff->disable_http_auth)))  {
+             @session_start();
+        }
+        
+         
        
         $sesPrefix = $this->sesPrefix();
         
@@ -287,7 +290,9 @@ class Pman_Core_DataObjects_Core_person extends DB_DataObject
         // http basic auth..
         $u = DB_DataObject::factory($this->tableName());
         
-        if (!empty($_SERVER['PHP_AUTH_USER']) 
+        if (empty($ff->disable_http_auth)  // http auth requests should not have this...
+            &&
+            !empty($_SERVER['PHP_AUTH_USER']) 
             &&
             !empty($_SERVER['PHP_AUTH_PW'])
             &&
@@ -301,6 +306,10 @@ class Pman_Core_DataObjects_Core_person extends DB_DataObject
             self::$authUser = $u;
             return true; 
         }
+        
+        // at this point all http auth stuff is done, so we can init session
+        
+        
         //die("test init");
         if (!$this->canInitializeSystem()) {
           //  die("can not init");
@@ -694,6 +703,9 @@ class Pman_Core_DataObjects_Core_person extends DB_DataObject
         $uu = clone($this);
         $this->lang = $val;
         $this->update($uu);
+        if(!empty(self::$authUser) && self::$authUser->id == $this->id) {
+            self::$authUser->lang = $this->lang;
+        }
         return $this->lang;
     }
             
@@ -755,18 +767,28 @@ class Pman_Core_DataObjects_Core_person extends DB_DataObject
         $oath_require = $s->lookup('core', 'two_factor_auth_required');
         $aur['require_oath'] = $oath_require ?  $oath_require->val : 0;
         
-        $aur['core_person_settings'] = array();
-                
-        $core_person_settings = DB_DataObject::factory('core_person_settings');
-        $core_person_settings->setFrom(array(
-            'person_id' => $this->id
-        ));
-        
-        $aur['core_person_settings'] = $core_person_settings->fetchAll('scope', 'data');
+        $aur['core_person_settings'] = $this->settings();
         
         return $aur;
     }
     
+    function settings($return_obj = false)
+    {
+        $cs = DB_DataObject::factory('core_person_settings');
+        $cs->setFrom(array(
+            'person_id' => $this->id
+        ));
+        return $return_obj ? $cs->fetchAll() : $cs->fetchAll('scope', 'data');;
+    }
+    function toRooSingleArray($authUser, $request)  
+    {
+        $ret = $this->toArray();
+        foreach( $this->settings() as $k=>$v) {
+            $ret['core_person_settings['. $k .']'] = $v;
+        }
+    
+        return $ret;
+    }
     //   ----------PERMS------  ----------------
     function getPerms() 
     {
@@ -1029,7 +1051,7 @@ class Pman_Core_DataObjects_Core_person extends DB_DataObject
         // #2307 Search Country!!
         if (!empty($q['query']['in_country'])) {
             // DB_DataObject::debugLevel(1);
-            $inc = $q['query']['in_country'];
+            $inc = $this->escape($q['query']['in_country']);
             $this->whereAdd("$tn_p.countries LIKE '%{$inc}%'");
         }
         
@@ -1363,10 +1385,18 @@ class Pman_Core_DataObjects_Core_person extends DB_DataObject
         // determine if it's staff!!!
         $owncomp = DB_DataObject::Factory('core_company');
         $owncomp->get('comptype', 'OWNER');
-        $isStaff = ($au->company_id ==  $owncomp->id);
-       
+        $editor_is_staff = ($au->company_id ==  $owncomp->id);
+        
+        if (!$editor_is_staff) {
+            // non staff editing should not user roo/isPerm?
+            return false; // no permission if user is not staff!?
+        
+        }
+        
+        $this_is_staff = ($this->company_id ==  $owncomp->id);
        
-        if (!$isStaff) {
+       /*
+        if (!$this_is_staff ) {
             
             // - can not change company!!!
             if ($changes && 
@@ -1390,7 +1420,7 @@ class Pman_Core_DataObjects_Core_person extends DB_DataObject
             
             //return $this->company_id == $au->company_id;
         }
-        
+        */
          
         // yes, only owner company can mess with this...
         
@@ -1401,11 +1431,13 @@ class Pman_Core_DataObjects_Core_person extends DB_DataObject
             // extra case change passwod?
             case 'P': //??? password
                 // standard perms -- for editing + if the user is dowing them selves..
-                $ret = $isStaff ? $au->hasPerm("Core.Staff", "E") : $au->hasPerm("Core.Person", "E");
-                return $ret || $au->id == $this->id;
+                $ret = $this_is_staff  ? $au->hasPerm("Core.Staff", "E") : $au->hasPerm("Core.Person", "E");
+                return $ret || $au->id == $this->id;   // can change own data?
             
             default:                
-                return $isStaff ? $au->hasPerm("Core.Staff", $lvl) : $au->hasPerm("Core.Person", $lvl);
+                return $this_is_staff ? $au->hasPerm("Core.Staff", $lvl) : $au->hasPerm("Core.Person", $lvl);
+                
+                    
         
         }
         return false;
@@ -1415,6 +1447,13 @@ class Pman_Core_DataObjects_Core_person extends DB_DataObject
     {
         $p = DB_DataObject::factory('core_person');
         if ($roo->authUser->id > -1 ||  $p->count() > 1) {
+            $pp = DB_DataObject::factory('core_person');
+            $pp->email  =  trim($this->email);
+            if ($pp->count()){
+                $roo->jerr("that email already exists in the database");
+            }
+            
+            
             return;
         }
         $c = DB_DataObject::Factory('core_company');
@@ -1427,6 +1466,11 @@ class Pman_Core_DataObjects_Core_person extends DB_DataObject
         $this->company_id = $c->id;
         $this->email = trim($this->email);
         
+        
+        
+        
+        
+        
     }
     
     function onInsert($req, $roo)
@@ -1460,9 +1504,45 @@ class Pman_Core_DataObjects_Core_person extends DB_DataObject
             $pd->company_id = $this->company_id;
             $pd->insert();
         }
-        
+        if (!empty($req['core_person_settings'])) {
+            $this->updateSettings($req['core_person_settings'], $roo);
+        }
     }
     
+    function onUpdate($old, $req,$roo, $event)
+    {
+        if (!empty($req['core_person_settings'])) {
+            $this->updateSettings($req['core_person_settings'], $roo);
+        }
+    }
+    
+    // there should really be a registry of valid scope values!?
+    function updateSettings($ar, $roo)
+    {
+        //DB_DataObject::debugLevel(1);
+        $old = array();
+        foreach($this->settings(true) as $o) {
+            $old[$o->scope] = $o;
+        }
+        foreach($ar as $k=>$v) {
+            if (isset($old[$k])) {
+                $oo = clone($old[$k]);
+                $old[$k]->data = $v;
+                $old[$k]->update($oo);
+                continue;
+            }
+            $cs = DB_DataObject::Factory('core_person_settings');
+            $cs->setFrom(array(
+                'person_id' =>$this->id,
+                'scope' => $k,
+                'data' => $v
+            ));
+            $cs->insert();
+        }
+        // we dont delete old stuff....
+    }
+    
+    
     function importFromArray($roo, $persons, $opts)
     {
         if (empty($opts['prefix'])) {