2 commits - lib/api lib/client lib/kolab_api_controller.php lib/kolab_api_service.php

Aleksander Machniak machniak at kolabsys.com
Wed Mar 14 14:59:01 CET 2012


 lib/api/kolab_api_service_user.php       |    7 ++
 lib/api/kolab_api_service_user_types.php |   18 -------
 lib/client/kolab_client_task_user.php    |   48 --------------------
 lib/kolab_api_controller.php             |    7 ++
 lib/kolab_api_service.php                |   73 +++++++++++++++++++++++++++++++
 5 files changed, 85 insertions(+), 68 deletions(-)

New commits:
commit 4872803486f298b98fb282c83c5c280201a0424c
Author: Aleksander Machniak <machniak at kolabsys.com>
Date:   Wed Mar 14 14:55:09 2012 +0100

    Move user type detection to service class, return type id in user.info result

diff --git a/lib/api/kolab_api_service_user.php b/lib/api/kolab_api_service_user.php
index 903771e..32f6b22 100644
--- a/lib/api/kolab_api_service_user.php
+++ b/lib/api/kolab_api_service_user.php
@@ -114,7 +114,12 @@ class kolab_api_service_user extends kolab_api_service
         }
 
         $auth   = Auth::get_instance();
-        $result = $auth->user_info($getdata['user']);
+        $user   = $getdata['user'];
+        $result = $auth->user_info($user);
+
+        // add user type id to the result
+        $objectclass = $result[$user]['objectclass'];
+        $result[$user]['user_type_id'] = $this->user_type_id($objectclass);
 
         if ($result) {
             return $result;
diff --git a/lib/api/kolab_api_service_user_types.php b/lib/api/kolab_api_service_user_types.php
index 1c5a6c4..164e872 100644
--- a/lib/api/kolab_api_service_user_types.php
+++ b/lib/api/kolab_api_service_user_types.php
@@ -37,23 +37,7 @@ class kolab_api_service_user_types extends kolab_api_service
 
     public function user_types_list($get, $post)
     {
-        $sql_result = $this->db->query("SELECT * FROM user_types");
-        $user_types = array();
-
-        while ($row = $this->db->fetch_assoc($sql_result)) {
-            $user_types[$row['id']] = array();
-
-            foreach ($row as $key => $value) {
-                if ($key != "id") {
-                    if ($key == "attributes") {
-                        $user_types[$row['id']][$key] = json_decode(unserialize($value), true);
-                    }
-                    else {
-                        $user_types[$row['id']][$key] = $value;
-                    }
-                }
-            }
-        }
+        $user_types = $this->user_types();
 
         return array(
             'list'  => $user_types,
diff --git a/lib/client/kolab_client_task_user.php b/lib/client/kolab_client_task_user.php
index 9fbffa4..c8a6c2a 100644
--- a/lib/client/kolab_client_task_user.php
+++ b/lib/client/kolab_client_task_user.php
@@ -198,57 +198,9 @@ class kolab_client_task_user extends kolab_client_task
         $add_mode  = empty($data['user']);
         $accttypes = array();
 
-        $result = Array();
-        $current_user_type_score = -1;
-
-        for ($i=0; $i < count($data['objectclass']); $i++) {
-            $data['objectclass'][$i] = strtolower($data['objectclass'][$i]);
-        }
-
-        $data_ocs = $data['objectclass'];
-
-        console("Data objectclasses (i.e. \$data_ocs): " . implode(", ", $data_ocs));
-
         foreach ($utypes as $idx => $elem) {
-
             $accttypes[$idx] = array('value' => $idx, 'content' => $elem['name']);
-
-            // Unless we're in add mode, detect the user type.
-            if (!$add_mode) {
-
-                $ref_ocs = $elem['attributes']['fields']['objectclass'];
-
-                console("Reference objectclasses (\$ref_ocs for " . $elem['key'] . "): " . implode(", ", $ref_ocs));
-
-                // Eliminate the duplicates between the $data_ocs and $ref_ocs
-                $_data_ocs = array_diff($data_ocs, $ref_ocs);
-                $_ref_ocs = array_diff($ref_ocs, $data_ocs);
-
-                console("\$data_ocs not in \$ref_ocs (" . $elem['key'] . "): " . implode(", ", $_data_ocs));
-                console("\$ref_ocs not in \$data_ocs (" . $elem['key'] . "): " . implode(", ", $_ref_ocs));
-
-                $differences = count($_data_ocs) + count($_ref_ocs);
-                $commonalities = count($data_ocs) - $differences;
-
-                console("Commonalities/differences (" . $elem['key'] . "): " . $commonalities . " / " . $differences);
-
-                if ($differences > 0) {
-                    $user_type_score = ($commonalities / $differences);
-                } else {
-                    $user_type_score = $commonalities;
-                }
-
-                console("Score for user type " . $elem['name'] . ": " . $user_type_score);
-
-                if ($user_type_score > $current_user_type_score) {
-                    console("Score for user type " . $elem['name'] . " is greater than score for user type " . $current_user_type['name']);
-                    $current_user_type = $elem;
-                    $current_user_type_score = $user_type_score;
-                }
-            }
         }
-
-        console("A little bird tells me we need to use user_type_name " . $current_user_type['name']);
 /*
         $fields = array(
             'personal' => array(
diff --git a/lib/kolab_api_service.php b/lib/kolab_api_service.php
index 5d144ff..8630cbe 100644
--- a/lib/kolab_api_service.php
+++ b/lib/kolab_api_service.php
@@ -107,4 +107,77 @@ abstract class kolab_api_service
         return $uta;
     }
 
+    /**
+     * Detects user type ID for specified objectClass attribute value
+     *
+     * @param array $object_class Value of objectClass attribute
+     *
+     * @return int User type identifier
+     */
+    protected function user_type_id($object_class)
+    {
+        if (empty($object_class)) {
+            return null;
+        }
+
+        $object_class = array_map('strtolower', $object_class);                                                                                         
+        $user_types   = $this->user_types();
+        $type_score   = -1;
+        $type_id      = null;
+
+        console("Data objectClasses: " . implode(", ", $object_class));
+
+        foreach ($user_types as $idx => $elem) {
+            $ref_class = $elem['attributes']['fields']['objectclass'];
+
+            console("Reference objectclasses for " . $elem['key'] . ": " . implode(", ", $ref_class));
+
+            // Eliminate the duplicates between the $data_ocs and $ref_ocs
+            $_object_class = array_diff($object_class, $ref_class);
+            $_ref_class    = array_diff($ref_class, $object_class);
+
+            $differences   = count($_object_class) + count($_ref_class);
+            $commonalities = count($object_class) - $differences;
+            $elem_score    = $differences > 0 ? ($commonalities / $differences) : $commonalities;
+
+//            console("\$object_class not in \$ref_class (" . $elem['key'] . "): " . implode(", ", $_object_class));
+//            console("\$ref_class not in \$object_class (" . $elem['key'] . "): " . implode(", ", $_ref_class));
+            console("Score for user type " . $elem['name'] . ": " . $elem_score . "(" . $commonalities . "/" . $differences . ")");
+
+            if ($elem_score > $type_score) {
+                $type_id    = $idx;
+                $type_score = $elem_score;
+            }
+        }
+
+        return $type_id;
+    }
+
+    /**
+     * Returns user types definitions.
+     *
+     * @return array User types.
+     */
+    protected function user_types()
+    {
+        $sql_result = $this->db->query("SELECT * FROM user_types");
+        $user_types = array();
+
+        while ($row = $this->db->fetch_assoc($sql_result)) {
+            $user_types[$row['id']] = array();
+
+            foreach ($row as $key => $value) {
+                if ($key != "id") {
+                    if ($key == "attributes") {
+                        $user_types[$row['id']][$key] = json_decode(unserialize($value), true);
+                    }
+                    else {
+                        $user_types[$row['id']][$key] = $value;
+                    }
+                }
+            }
+        }
+
+        return $user_types;
+    }
 }


commit 5b95b56165eddd823b5e3d8e5ee1489d4aa43c5c
Author: Aleksander Machniak <machniak at kolabsys.com>
Date:   Wed Mar 14 14:33:50 2012 +0100

    Fix service method existance check - exclude private methods

diff --git a/lib/kolab_api_controller.php b/lib/kolab_api_controller.php
index c0e36b6..b216a0e 100644
--- a/lib/kolab_api_controller.php
+++ b/lib/kolab_api_controller.php
@@ -148,10 +148,13 @@ class kolab_api_controller
         // call service method
         $service_handler = $this->get_service($service);
 
-        if (method_exists($service_handler, $method)) {
+        // get only public methods
+        $service_methods = get_class_methods($service_handler);
+
+        if (in_array($method, $service_methods)) {
             $result = $service_handler->$method($_GET, $postdata);
         }
-        else if (method_exists($service_handler, $service . "_" . $method)) {
+        else if (in_array($service . "_" . $method, $service_methods)) {
             $call_method = $service . "_" . $method;
             $result = $service_handler->$call_method($_GET, $postdata);
         }





More information about the commits mailing list