From 82914a005a9d16ea8d5f76feed43ca0223b65c46 Mon Sep 17 00:00:00 2001 From: Yannick Warnier Date: Tue, 24 Sep 2013 02:38:02 -0500 Subject: [PATCH 1/3] Added new Drupal SSO plugin counterpart - read first lines to know how to configure - refs BT#6733 --- main/auth/sso/sso.Drupal.class.php | 228 +++++++++++++++++++++++++++++ main/inc/local.inc.php | 7 +- 2 files changed, 234 insertions(+), 1 deletion(-) create mode 100644 main/auth/sso/sso.Drupal.class.php diff --git a/main/auth/sso/sso.Drupal.class.php b/main/auth/sso/sso.Drupal.class.php new file mode 100644 index 0000000000..eb9789d789 --- /dev/null +++ b/main/auth/sso/sso.Drupal.class.php @@ -0,0 +1,228 @@ +protocol = api_get_setting('sso_authentication_protocol'); + // There can be multiple domains, so make sure to take only the first + // This might be later extended with a decision process + $domains = split(',',api_get_setting('sso_authentication_domain')); + $this->domain = trim($domains[0]); + $this->auth_uri = api_get_setting('sso_authentication_auth_uri'); + $this->deauth_uri = api_get_setting('sso_authentication_unauth_uri'); + //cut the string to avoid recursive URL construction in case of failure + $this->referer = $this->protocol.$_SERVER['HTTP_HOST'].substr($_SERVER['REQUEST_URI'],0,strpos($_SERVER['REQUEST_URI'],'sso')); + $this->deauth_url = $this->protocol.$this->domain.$this->deauth_uri; + $this->master_url = $this->protocol.$this->domain.$this->auth_uri; + $this->target = api_get_path(WEB_PATH); + } + + /** + * Unlogs the user from the remote server + */ + public function logout() { + header('Location: '.$this->deauth_url); + exit; + } + + /** + * Sends the user to the master URL for a check of active connection + */ + public function ask_master() { + // Generate a single usage token that must be encoded by the master + $_SESSION['sso_challenge'] = api_generate_password(48); + // Redirect browser to the master URL + $params = 'sso_referer='.urlencode($this->referer).'&sso_target='.urlencode($this->target).'&sso_challenge='.urlencode($_SESSION['sso_challenge']); + if (strpos($this->master_url, "?") === false) { + $params = "?{$params}"; + } else { + $params = "&{$params}"; + } + header('Location: '.$this->master_url.$params); + exit; + } + + /** + * Validates the received active connection data with the database + * @return bool Return the loginFailed variable value to local.inc.php + */ + public function check_user() { + global $_user; + $loginFailed = false; + + //change the way we recover the cookie depending on how it is formed + $sso = $this->decode_cookie($_GET['sso_cookie']); + + //get token that should have been used and delete it + //from session since it can only be used once + $sso_challenge = ''; + if (isset($_SESSION['sso_challenge'])) { + $sso_challenge = $_SESSION['sso_challenge']; + unset($_SESSION['sso_challenge']); + } + + //lookup the user in the main database + $user_table = Database::get_main_table(TABLE_MAIN_USER); + $sql = "SELECT user_id, username, password, auth_source, active, expiration_date, status + FROM $user_table + WHERE username = '".trim(Database::escape_string($sso['username']))."'"; + $result = Database::query($sql); + if (Database::num_rows($result) > 0) { + $uData = Database::fetch_array($result); + //Check the user's password + if ($uData['auth_source'] == PLATFORM_AUTH_SOURCE) { + + if ($sso['secret'] === sha1($uData['username'].$sso_challenge.api_get_security_key()) + && ($sso['username'] == $uData['username'])) { + + //Check if the account is active (not locked) + if ($uData['active']=='1') { + // check if the expiration date has not been reached + if ($uData['expiration_date'] > date('Y-m-d H:i:s') OR $uData['expiration_date']=='0000-00-00 00:00:00') { + + //If Multiple URL is enabled + if (api_get_multiple_access_url()) { + //Check the access_url configuration setting if the user is registered in the access_url_rel_user table + //Getting the current access_url_id of the platform + $current_access_url_id = api_get_current_access_url_id(); + // my user is subscribed in these + //sites: $my_url_list + $my_url_list = api_get_access_url_from_user($uData['user_id']); + } else { + $current_access_url_id = 1; + $my_url_list = array(1); + } + + $my_user_is_admin = UserManager::is_admin($uData['user_id']); + + if ($my_user_is_admin === false) { + if (is_array($my_url_list) && count($my_url_list) > 0 ) { + if (in_array($current_access_url_id, $my_url_list)) { + // the user has permission to enter at this site + $_user['user_id'] = $uData['user_id']; + $_user = api_get_user_info($_user['user_id']); + Session::write('_user', $_user); + event_login(); + // Redirect to homepage + $sso_target = isset($sso['target']) ? $sso['target'] : api_get_path(WEB_PATH) .'.index.php'; + header('Location: '. $sso_target); + exit; + } else { + // user does not have permission for this site + $loginFailed = true; + Session::erase('_uid'); + header('Location: '.api_get_path(WEB_PATH).'index.php?loginFailed=1&error=access_url_inactive'); + exit; + } + } else { + // there is no URL in the multiple + // urls list for this user + $loginFailed = true; + Session::erase('_uid'); + header('Location: '.api_get_path(WEB_PATH).'index.php?loginFailed=1&error=access_url_inactive'); + exit; + } + } else { + //Only admins of the "main" (first) Chamilo + // portal can login wherever they want + if (in_array(1, $my_url_list)) { + //Check if this admin is admin on the + // principal portal + $_user['user_id'] = $uData['user_id']; + $_user = api_get_user_info($_user['user_id']); + $is_platformAdmin = $uData['status'] == COURSEMANAGER; + Session::write('is_platformAdmin', $is_platformAdmin); + Session::write('_user', $_user); + event_login(); + } else { + //Secondary URL admin wants to login + // so we check as a normal user + if (in_array($current_access_url_id, $my_url_list)) { + $_user['user_id'] = $uData['user_id']; + $_user = api_get_user_info($_user['user_id']); + Session::write('_user',$_user); + event_login(); + } else { + $loginFailed = true; + Session::erase('_uid'); + header('Location: '.api_get_path(WEB_PATH).'index.php?loginFailed=1&error=access_url_inactive'); + exit; + } + } + } + } else { + // user account expired + $loginFailed = true; + Session::erase('_uid'); + header('Location: '.api_get_path(WEB_PATH).'index.php?loginFailed=1&error=account_expired'); + exit; + } + } else { + //User not active + $loginFailed = true; + Session::erase('_uid'); + header('Location: '.api_get_path(WEB_PATH).'index.php?loginFailed=1&error=account_inactive'); + exit; + } + } else { + //SHA1 of password is wrong + $loginFailed = true; + Session::erase('_uid'); + header('Location: '.api_get_path(WEB_PATH).'index.php?loginFailed=1&error=wrong_password'); + exit; + } + } else { + //Auth_source is wrong + $loginFailed = true; + Session::erase('_uid'); + header('Location: '.api_get_path(WEB_PATH).'index.php?loginFailed=1&error=wrong_authentication_source'); + exit; + } + } else { + //No user by that login + $loginFailed = true; + Session::erase('_uid'); + header('Location: '.api_get_path(WEB_PATH).'index.php?loginFailed=1&error=user_not_found'); + exit; + } + return $loginFailed; + } + + /** + * Decode the cookie (this function may vary depending on the + * Single Sign On implementation + * @param string Encoded cookie + * @return array Parsed and unencoded cookie + */ + private function decode_cookie($cookie) { + return unserialize(base64_decode($cookie)); + } +} diff --git a/main/inc/local.inc.php b/main/inc/local.inc.php index cecd14c728..3245e48073 100644 --- a/main/inc/local.inc.php +++ b/main/inc/local.inc.php @@ -503,7 +503,12 @@ if (!empty($_SESSION['_user']['user_id']) && !($login || $logout)) { } } elseif(!$logout) { // Handle cookie comming from Master Server - if (!isset($_GET['sso_referer']) && !isset($_GET['loginFailed']) && isset($_GET['sso_cookie'])) { + // Use this first line if you want users to still see the + // homepage without connecting + //if (!isset($_GET['sso_referer']) && !isset($_GET['loginFailed']) && isset($_GET['sso_cookie'])) { + // Use this second line if you want all users to be redirected + // unless they are connected (removed req on sso_cookie) + if (!isset($_GET['sso_referer']) && !isset($_GET['loginFailed'])) { // Redirect to master server $osso->ask_master(); } elseif (isset($_GET['sso_cookie'])) { From 6a9c262618deb633c84bbedbf754cdbd162f5934 Mon Sep 17 00:00:00 2001 From: Yannick Warnier Date: Tue, 24 Sep 2013 02:45:23 -0500 Subject: [PATCH 2/3] Updated registration webservices group to allow for right sessions management for Drupal Ubercart module - refs BT#6246 --- main/webservices/registration.soap.php | 799 ++++++++++++++----------- 1 file changed, 437 insertions(+), 362 deletions(-) diff --git a/main/webservices/registration.soap.php b/main/webservices/registration.soap.php index 82b2e1dd3f..ac611653d7 100644 --- a/main/webservices/registration.soap.php +++ b/main/webservices/registration.soap.php @@ -175,14 +175,14 @@ array(array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType' => 'tns:result_createUs ); // Register the method to expose -$server->register('WSCreateUsers', // method name - array('createUsers' => 'tns:createUsers'), // input parameters - array('return' => 'tns:results_createUsers'), // output parameters - 'urn:WSRegistration', // namespace - 'urn:WSRegistration#WSCreateUsers', // soapaction - 'rpc', // style - 'encoded', // use - 'This service adds a user' // documentation +$server->register('WSCreateUsers', // method name + array('createUsers' => 'tns:createUsers'), // input parameters + array('return' => 'tns:results_createUsers'), // output parameters + 'urn:WSRegistration', // namespace + 'urn:WSRegistration#WSCreateUsers', // soapaction + 'rpc', // style + 'encoded', // use + 'This service adds a user' // documentation ); @@ -245,9 +245,9 @@ function WSCreateUsers($params) { $sql .= " password='".Database::escape_string($password)."',"; } if (!is_null($auth_source)) { - $sql .= " auth_source='".Database::escape_string($auth_source)."',"; + $sql .= " auth_source='".Database::escape_string($auth_source)."',"; } - $sql .= " + $sql .= " email='".Database::escape_string($email)."', status='".Database::escape_string($status)."', official_code='".Database::escape_string($official_code)."', @@ -255,7 +255,7 @@ function WSCreateUsers($params) { expiration_date='".Database::escape_string($expiration_date)."', active='1', hr_dept_id=".intval($hr_dept_id); - $sql .= " WHERE user_id='".$r_check_user[0]."'"; + $sql .= " WHERE user_id='".$r_check_user[0]."'"; Database::query($sql); $results[] = $r_check_user[0]; continue; @@ -295,9 +295,9 @@ function WSCreateUsers($params) { status = '".Database::escape_string($status)."', password = '".Database::escape_string($password)."', email = '".Database::escape_string($email)."', - official_code = '".Database::escape_string($official_code)."', - picture_uri = '".Database::escape_string($picture_uri)."', - creator_id = '".Database::escape_string($creator_id)."', + official_code = '".Database::escape_string($official_code)."', + picture_uri = '".Database::escape_string($picture_uri)."', + creator_id = '".Database::escape_string($creator_id)."', auth_source = '".Database::escape_string($auth_source)."', phone = '".Database::escape_string($phone)."', language = '".Database::escape_string($language)."', @@ -377,20 +377,21 @@ $server->wsdl->addComplexType( 'original_user_id_name' => array('name' => 'original_user_id_name', 'type' => 'xsd:string'), 'original_user_id_value' => array('name' => 'original_user_id_value', 'type' => 'xsd:string'), 'extra' => array('name' => 'extra', 'type' => 'tns:extrasList'), - 'secret_key' => array('name' => 'secret_key', 'type' => 'xsd:string') + 'secret_key' => array('name' => 'secret_key', 'type' => 'xsd:string'), + 'active' => array('name' => 'extra', 'type' => 'xsd:string') ) ); // Register the method to expose -$server->register('WSCreateUser', // method name - array('createUser' => 'tns:createUser'), // input parameters - array('return' => 'xsd:string'), // output parameters - 'urn:WSRegistration', // namespace - 'urn:WSRegistration#WSCreateUser', // soapaction - 'rpc', // style - 'encoded', // use - 'This service adds a user' // documentation +$server->register('WSCreateUser', // method name + array('createUser' => 'tns:createUser'), // input parameters + array('return' => 'xsd:string'), // output parameters + 'urn:WSRegistration', // namespace + 'urn:WSRegistration#WSCreateUser', // soapaction + 'rpc', // style + 'encoded', // use + 'This service adds a user' // documentation ); @@ -417,7 +418,7 @@ function WSCreateUser($params) { $picture_uri = ''; $auth_source = PLATFORM_AUTH_SOURCE; $expiration_date = '0000-00-00 00:00:00'; - $active = 1; + $active = !isset($params['active']) || !intval($params['active']) ? 0 : 1; $hr_dept_id = 0; $extra = null; $original_user_id_name = $params['original_user_id_name']; @@ -445,9 +446,9 @@ function WSCreateUser($params) { $sql .= " password='".Database::escape_string($password)."',"; } if (!is_null($auth_source)) { - $sql .= " auth_source='".Database::escape_string($auth_source)."',"; + $sql .= " auth_source='".Database::escape_string($auth_source)."',"; } - $sql .= " + $sql .= " email='".Database::escape_string($email)."', status='".Database::escape_string($status)."', official_code='".Database::escape_string($official_code)."', @@ -455,14 +456,14 @@ function WSCreateUser($params) { expiration_date='".Database::escape_string($expiration_date)."', active='1', hr_dept_id=".intval($hr_dept_id); - $sql .= " WHERE user_id='".$r_check_user[0]."'"; + $sql .= " WHERE user_id='".$r_check_user[0]."'"; Database::query($sql); return $r_check_user[0]; } else { return 0; - //return 0; // user id already exits + //return 0; // user id already exits } } @@ -495,9 +496,9 @@ function WSCreateUser($params) { status = '".Database::escape_string($status)."', password = '".Database::escape_string($password)."', email = '".Database::escape_string($email)."', - official_code = '".Database::escape_string($official_code)."', - picture_uri = '".Database::escape_string($picture_uri)."', - creator_id = '".Database::escape_string($creator_id)."', + official_code = '".Database::escape_string($official_code)."', + picture_uri = '".Database::escape_string($picture_uri)."', + creator_id = '".Database::escape_string($creator_id)."', auth_source = '".Database::escape_string($auth_source)."', phone = '".Database::escape_string($phone)."', language = '".Database::escape_string($language)."', @@ -625,14 +626,14 @@ array(array('ref' => 'SOAP-ENC:arrayType', 'wsdl:arrayType' => 'tns:result_creat ); // Register the method to expose -$server->register('WSCreateUsersPasswordCrypted', // method name - array('createUsersPasswordCrypted' => 'tns:createUsersPasswordCrypted'), // input parameters - array('return' => 'tns:results_createUsersPassEncrypt'), // output parameters - 'urn:WSRegistration', // namespace - 'urn:WSRegistration#WSCreateUsersPasswordCrypted', // soapaction - 'rpc', // style - 'encoded', // use - 'This service adds users to the system' // documentation +$server->register('WSCreateUsersPasswordCrypted', // method name + array('createUsersPasswordCrypted' => 'tns:createUsersPasswordCrypted'), // input parameters + array('return' => 'tns:results_createUsersPassEncrypt'), // output parameters + 'urn:WSRegistration', // namespace + 'urn:WSRegistration#WSCreateUsersPasswordCrypted', // soapaction + 'rpc', // style + 'encoded', // use + 'This service adds users to the system' // documentation ); // Define the method WSCreateUsersPasswordCrypted @@ -715,7 +716,7 @@ function WSCreateUsersPasswordCrypted($params) { if (!empty($user_param['expiration_date'])) { $expiration_date = $user_param['expiration_date']; } // Check whether x_user_id exists into user_field_values table. - $sql = "SELECT field_value,user_id FROM $t_uf uf,$t_ufv ufv WHERE ufv.field_id=uf.id AND field_variable='$original_user_id_name' AND field_value='$original_user_id_value'"; + $sql = "SELECT field_value,user_id FROM $t_uf uf,$t_ufv ufv WHERE ufv.field_id=uf.id AND field_variable='$original_user_id_name' AND field_value='$original_user_id_value'"; $res = Database::query($sql); $row = Database::fetch_row($res); $count_row = Database::num_rows($res); @@ -732,9 +733,9 @@ function WSCreateUsersPasswordCrypted($params) { username='".Database::escape_string($loginName)."',"; if (!is_null($auth_source)) { - $sql .= " auth_source='".Database::escape_string($auth_source)."',"; + $sql .= " auth_source='".Database::escape_string($auth_source)."',"; } - $sql .= " + $sql .= " password='".Database::escape_string($password)."', email='".Database::escape_string($email)."', status='".Database::escape_string($status)."', @@ -743,7 +744,7 @@ function WSCreateUsersPasswordCrypted($params) { expiration_date='".Database::escape_string($expiration_date)."', active='1', hr_dept_id=".intval($hr_dept_id); - $sql .= " WHERE user_id='".$r_check_user[0]."'"; + $sql .= " WHERE user_id='".$r_check_user[0]."'"; Database::query($sql); if (is_array($extra_list) && count($extra_list) > 0) { @@ -788,9 +789,9 @@ function WSCreateUsersPasswordCrypted($params) { status = '".Database::escape_string($status)."', password = '".Database::escape_string($password)."', email = '".Database::escape_string($email)."', - official_code = '".Database::escape_string($official_code)."', - picture_uri = '".Database::escape_string($picture_uri)."', - creator_id = '".Database::escape_string($creator_id)."', + official_code = '".Database::escape_string($official_code)."', + picture_uri = '".Database::escape_string($picture_uri)."', + creator_id = '".Database::escape_string($creator_id)."', auth_source = '".Database::escape_string($auth_source)."', phone = '".Database::escape_string($phone)."', language = '".Database::escape_string($language)."', @@ -878,12 +879,12 @@ $server->wsdl->addComplexType( // Register the method to expose $server->register('WSCreateUserPasswordCrypted', // method name - array('createUserPasswordCrypted' => 'tns:createUserPasswordCrypted'), // input parameters - array('return' => 'xsd:string'), // output parameters - 'urn:WSRegistration', // namespace + array('createUserPasswordCrypted' => 'tns:createUserPasswordCrypted'), // input parameters + array('return' => 'xsd:string'), // output parameters + 'urn:WSRegistration', // namespace 'urn:WSRegistration#WSCreateUserPasswordCrypted', // soapaction - 'rpc', // style - 'encoded', // use + 'rpc', // style + 'encoded', // use 'This service adds users' // documentation ); @@ -972,9 +973,9 @@ function WSCreateUserPasswordCrypted($params) { username='".Database::escape_string($loginName)."',"; if (!is_null($auth_source)) { - $sql .= " auth_source='".Database::escape_string($auth_source)."',"; + $sql .= " auth_source='".Database::escape_string($auth_source)."',"; } - $sql .= " + $sql .= " password='".Database::escape_string($password)."', email='".Database::escape_string($email)."', status='".Database::escape_string($status)."', @@ -983,7 +984,7 @@ function WSCreateUserPasswordCrypted($params) { expiration_date='".Database::escape_string($expiration_date)."', active='1', hr_dept_id=".intval($hr_dept_id); - $sql .= " WHERE user_id='".$r_check_user[0]."'"; + $sql .= " WHERE user_id='".$r_check_user[0]."'"; if ($debug) error_log($sql); Database::query($sql); @@ -1028,9 +1029,9 @@ function WSCreateUserPasswordCrypted($params) { status = '".Database::escape_string($status)."', password = '".Database::escape_string($password)."', email = '".Database::escape_string($email)."', - official_code = '".Database::escape_string($official_code)."', - picture_uri = '".Database::escape_string($picture_uri)."', - creator_id = '".Database::escape_string($creator_id)."', + official_code = '".Database::escape_string($official_code)."', + picture_uri = '".Database::escape_string($picture_uri)."', + creator_id = '".Database::escape_string($creator_id)."', auth_source = '".Database::escape_string($auth_source)."', phone = '".Database::escape_string($phone)."', language = '".Database::escape_string($language)."', @@ -1226,14 +1227,14 @@ array(array('ref' => 'SOAP-ENC:arrayType', 'wsdl:arrayType' => 'tns:result_editU ); // Register the method to expose -$server->register('WSEditUsers', // method name - array('editUsers' => 'tns:editUsers'), // input parameters - array('return' => 'tns:results_editUsers'), // output parameters - 'urn:WSRegistration', // namespace - 'urn:WSRegistration#WSEditUsers', // soapaction - 'rpc', // style - 'encoded', // use - 'This service edits a user from wiener' // documentation +$server->register('WSEditUsers', // method name + array('editUsers' => 'tns:editUsers'), // input parameters + array('return' => 'tns:results_editUsers'), // output parameters + 'urn:WSRegistration', // namespace + 'urn:WSRegistration#WSEditUsers', // soapaction + 'rpc', // style + 'encoded', // use + 'This service edits a user from wiener' // documentation ); // Define the method WSEditUsers @@ -1316,7 +1317,7 @@ function WSEditUsers($params) { $sql .= " password='".Database::escape_string($password)."',"; } if (!is_null($auth_source)) { - $sql .= " auth_source='".Database::escape_string($auth_source)."',"; + $sql .= " auth_source='".Database::escape_string($auth_source)."',"; } // Exception for admins in case no status is provided in WS call... $sqladmin = "SELECT user_id FROM $t_admin WHERE user_id = ".intval($user_id); @@ -1327,7 +1328,7 @@ function WSEditUsers($params) { } else { $status = 5; } - $sql .= " + $sql .= " email='".Database::escape_string($email)."', status='".Database::escape_string($status)."', official_code='".Database::escape_string($official_code)."', @@ -1340,7 +1341,7 @@ function WSEditUsers($params) { if (!is_null($creator_id)) { $sql .= ", creator_id='".Database::escape_string($creator_id)."'"; } - $sql .= " WHERE user_id='$user_id'"; + $sql .= " WHERE user_id='$user_id'"; $return = @Database::query($sql); if (is_array($extra_list) && count($extra_list) > 0) { @@ -1390,14 +1391,14 @@ $server->wsdl->addComplexType( ); // Register the method to expose -$server->register('WSEditUser', // method name - array('editUser' => 'tns:editUser'), // input parameters - array('return' => 'xsd:string'), // output parameters - 'urn:WSRegistration', // namespace - 'urn:WSRegistration#WSEditUser', // soapaction - 'rpc', // style - 'encoded', // use - 'This service edits a user from wiener' // documentation +$server->register('WSEditUser', // method name + array('editUser' => 'tns:editUser'), // input parameters + array('return' => 'xsd:string'), // output parameters + 'urn:WSRegistration', // namespace + 'urn:WSRegistration#WSEditUser', // soapaction + 'rpc', // style + 'encoded', // use + 'This service edits a user from wiener' // documentation ); // Define the method WSEditUser @@ -1470,7 +1471,7 @@ function WSEditUser($params) { $sql .= " password='".Database::escape_string($password)."',"; } if (!is_null($auth_source)) { - $sql .= " auth_source='".Database::escape_string($auth_source)."',"; + $sql .= " auth_source='".Database::escape_string($auth_source)."',"; } // Exception for admins in case no status is provided in WS call... $sqladmin = "SELECT user_id FROM $t_admin WHERE user_id = ".intval($user_id); @@ -1481,7 +1482,7 @@ function WSEditUser($params) { } else { $status = 5; } - $sql .= " + $sql .= " email='".Database::escape_string($email)."', status='".Database::escape_string($status)."', official_code='".Database::escape_string($official_code)."', @@ -1494,7 +1495,7 @@ function WSEditUser($params) { if (!is_null($creator_id)) { $sql .= ", creator_id='".Database::escape_string($creator_id)."'"; } - $sql .= " WHERE user_id='$user_id'"; + $sql .= " WHERE user_id='$user_id'"; $return = @Database::query($sql); if (is_array($extra_list) && count($extra_list) > 0) { @@ -1581,14 +1582,14 @@ array(array('ref' => 'SOAP-ENC:arrayType', 'wsdl:arrayType' => 'tns:result_editU ); // Register the method to expose -$server->register('WSEditUsersPasswordCrypted', // method name - array('editUsersPasswordCrypted' => 'tns:editUsersPasswordCrypted'), // input parameters - array('return' => 'tns:results_editUsersPasswordCrypted'), // output parameters - 'urn:WSRegistration', // namespace - 'urn:WSRegistration#WSEditUsersPasswordCrypted', // soapaction - 'rpc', // style - 'encoded', // use - 'This service edits a user' // documentation +$server->register('WSEditUsersPasswordCrypted', // method name + array('editUsersPasswordCrypted' => 'tns:editUsersPasswordCrypted'), // input parameters + array('return' => 'tns:results_editUsersPasswordCrypted'), // output parameters + 'urn:WSRegistration', // namespace + 'urn:WSRegistration#WSEditUsersPasswordCrypted', // soapaction + 'rpc', // style + 'encoded', // use + 'This service edits a user' // documentation ); // Define the method WSEditUsersPasswordCrypted @@ -1697,7 +1698,7 @@ function WSEditUsersPasswordCrypted($params) { $sql .= " password='".Database::escape_string($password)."',"; } if (!is_null($auth_source)) { - $sql .= " auth_source='".Database::escape_string($auth_source)."',"; + $sql .= " auth_source='".Database::escape_string($auth_source)."',"; } // Exception for admins in case no status is provided in WS call... $sqladmin = "SELECT user_id FROM $t_admin WHERE user_id = ".intval($user_id); @@ -1708,7 +1709,7 @@ function WSEditUsersPasswordCrypted($params) { } else { $status = 5; } - $sql .= " + $sql .= " email='".Database::escape_string($email)."', status='".Database::escape_string($status)."', official_code='".Database::escape_string($official_code)."', @@ -1721,7 +1722,7 @@ function WSEditUsersPasswordCrypted($params) { if (!is_null($creator_id)) { $sql .= ", creator_id='".Database::escape_string($creator_id)."'"; } - $sql .= " WHERE user_id='$user_id'"; + $sql .= " WHERE user_id='$user_id'"; $return = @Database::query($sql); if (is_array($extra_list) && count($extra_list) > 0) { @@ -1772,14 +1773,14 @@ $server->wsdl->addComplexType( ); // Register the method to expose -$server->register('WSEditUserPasswordCrypted', // method name - array('editUserPasswordCrypted' => 'tns:editUserPasswordCrypted'), // input parameters - array('return' => 'xsd:string'), // output parameters - 'urn:WSRegistration', // namespace - 'urn:WSRegistration#WSEditUserPasswordCrypted', // soapaction - 'rpc', // style - 'encoded', // use - 'This service edits a user' // documentation +$server->register('WSEditUserPasswordCrypted', // method name + array('editUserPasswordCrypted' => 'tns:editUserPasswordCrypted'), // input parameters + array('return' => 'xsd:string'), // output parameters + 'urn:WSRegistration', // namespace + 'urn:WSRegistration#WSEditUserPasswordCrypted', // soapaction + 'rpc', // style + 'encoded', // use + 'This service edits a user' // documentation ); // Define the method WSEditUserPasswordCrypted @@ -1871,7 +1872,7 @@ function WSEditUserPasswordCrypted($params) { $sql .= " password='".Database::escape_string($password)."',"; } if (!is_null($auth_source)) { - $sql .= " auth_source='".Database::escape_string($auth_source)."',"; + $sql .= " auth_source='".Database::escape_string($auth_source)."',"; } // Exception for admins in case no status is provided in WS call... $sqladmin = "SELECT user_id FROM $t_admin WHERE user_id = ".intval($user_id); @@ -1882,7 +1883,7 @@ function WSEditUserPasswordCrypted($params) { } else { $status = 5; } - $sql .= " + $sql .= " email='".Database::escape_string($email)."', status='".Database::escape_string($status)."', official_code='".Database::escape_string($official_code)."', @@ -1895,7 +1896,7 @@ function WSEditUserPasswordCrypted($params) { if (!is_null($creator_id)) { $sql .= ", creator_id='".Database::escape_string($creator_id)."'"; } - $sql .= " WHERE user_id='$user_id'"; + $sql .= " WHERE user_id='$user_id'"; $return = @Database::query($sql); if (is_array($extra_list) && count($extra_list) > 0) { @@ -1965,14 +1966,14 @@ function WSHelperActionOnUsers($params, $type) { } } -$server->register('WSDeleteUsers', // method name - array('user_ids' => 'tns:user_ids'), // input parameters - array(), // output parameters - 'urn:WSRegistration', // namespace - 'urn:WSRegistration#WSDeleteUsers', // soapaction - 'rpc', // style - 'encoded', // use - 'Deletes users provided as parameters from the system' // documentation +$server->register('WSDeleteUsers', // method name + array('user_ids' => 'tns:user_ids'), // input parameters + array(), // output parameters + 'urn:WSRegistration', // namespace + 'urn:WSRegistration#WSDeleteUsers', // soapaction + 'rpc', // style + 'encoded', // use + 'Deletes users provided as parameters from the system' // documentation ); function WSDeleteUsers($params) { @@ -1980,14 +1981,14 @@ function WSDeleteUsers($params) { } /** WSDisableUsers **/ -$server->register('WSDisableUsers', // method name - array('user_ids' => 'tns:user_ids'), // input parameters - array(), // output parameters - 'urn:WSRegistration', // namespace - 'urn:WSRegistration#WSDisableUsers', // soapaction - 'rpc', // style - 'encoded', // use - 'Disables users provided as parameters from the system' // documentation +$server->register('WSDisableUsers', // method name + array('user_ids' => 'tns:user_ids'), // input parameters + array(), // output parameters + 'urn:WSRegistration', // namespace + 'urn:WSRegistration#WSDisableUsers', // soapaction + 'rpc', // style + 'encoded', // use + 'Disables users provided as parameters from the system' // documentation ); function WSDisableUsers($params) { @@ -1995,14 +1996,14 @@ function WSDisableUsers($params) { } /** WSEnableUsers **/ -$server->register('WSEnableUsers', // method name - array('user_ids' => 'tns:user_ids'), // input parameters - array(), // output parameters - 'urn:WSRegistration', // namespace - 'urn:WSRegistration#WSEnableUsers', // soapaction - 'rpc', // style - 'encoded', // use - 'Enables users provided as parameters' // documentation +$server->register('WSEnableUsers', // method name + array('user_ids' => 'tns:user_ids'), // input parameters + array(), // output parameters + 'urn:WSRegistration', // namespace + 'urn:WSRegistration#WSEnableUsers', // soapaction + 'rpc', // style + 'encoded', // use + 'Enables users provided as parameters' // documentation ); function WSEnableUsers($params) { @@ -2091,14 +2092,14 @@ array(array('ref' => 'SOAP-ENC:arrayType', 'wsdl:arrayType' => 'tns:result_creat ); // Register the method to expose -$server->register('WSCreateCourse', // method name - array('createCourse' => 'tns:createCourse'), // input parameters - array('return' => 'tns:results_createCourse'), // output parameters - 'urn:WSRegistration', // namespace - 'urn:WSRegistration#WSCreateCourse', // soapaction - 'rpc', // style - 'encoded', // use - 'This service adds a course' // documentation +$server->register('WSCreateCourse', // method name + array('createCourse' => 'tns:createCourse'), // input parameters + array('return' => 'tns:results_createCourse'), // output parameters + 'urn:WSRegistration', // namespace + 'urn:WSRegistration#WSCreateCourse', // soapaction + 'rpc', // style + 'encoded', // use + 'This service adds a course' // documentation ); // Define the method WSCreateCourse @@ -2295,14 +2296,14 @@ array(array('ref' => 'SOAP-ENC:arrayType', 'wsdl:arrayType' => 'tns:result_creat // Register the method to expose -$server->register('WSCreateCourseByTitle', // method name - array('createCourseByTitle' => 'tns:createCourseByTitle'), // input parameters - array('return' => 'tns:results_createCourseByTitle'), // output parameters - 'urn:WSRegistration', // namespace - 'urn:WSRegistration#WSCreateCourseByTitle', // soapaction - 'rpc', // style - 'encoded', // use - 'This service adds a course by title' // documentation +$server->register('WSCreateCourseByTitle', // method name + array('createCourseByTitle' => 'tns:createCourseByTitle'), // input parameters + array('return' => 'tns:results_createCourseByTitle'), // output parameters + 'urn:WSRegistration', // namespace + 'urn:WSRegistration#WSCreateCourseByTitle', // soapaction + 'rpc', // style + 'encoded', // use + 'This service adds a course by title' // documentation ); // Define the method WSCreateCourseByTitle @@ -2314,10 +2315,10 @@ function WSCreateCourseByTitle($params) { return return_error(WS_ERROR_SECRET_KEY); } - $t_cfv = Database::get_main_table(TABLE_MAIN_COURSE_FIELD_VALUES); - $table_field = Database::get_main_table(TABLE_MAIN_COURSE_FIELD); - $table_course_category = Database::get_main_table(TABLE_MAIN_CATEGORY); - $table_course = Database::get_main_table(TABLE_MAIN_COURSE); + $t_cfv = Database::get_main_table(TABLE_MAIN_COURSE_FIELD_VALUES); + $table_field = Database::get_main_table(TABLE_MAIN_COURSE_FIELD); + $table_course_category = Database::get_main_table(TABLE_MAIN_CATEGORY); + $table_course = Database::get_main_table(TABLE_MAIN_COURSE); $courses_params = $params['courses']; $results = array(); @@ -2518,14 +2519,14 @@ array(array('ref' => 'SOAP-ENC:arrayType', 'wsdl:arrayType' => 'tns:result_editC ); // Register the method to expose -$server->register('WSEditCourse', // method name - array('editCourse' => 'tns:editCourse'), // input parameters - array('return' => 'tns:results_editCourse'), // output parameters - 'urn:WSRegistration', // namespace - 'urn:WSRegistration#WSEditCourse', // soapaction - 'rpc', // style - 'encoded', // use - 'This service edits a course' // documentation +$server->register('WSEditCourse', // method name + array('editCourse' => 'tns:editCourse'), // input parameters + array('return' => 'tns:results_editCourse'), // output parameters + 'urn:WSRegistration', // namespace + 'urn:WSRegistration#WSEditCourse', // soapaction + 'rpc', // style + 'encoded', // use + 'This service edits a course' // documentation ); // Define the method WSEditCourse @@ -2538,8 +2539,8 @@ function WSEditCourse($params){ $course_table = Database::get_main_table(TABLE_MAIN_COURSE); $course_user_table = Database::get_main_table(TABLE_MAIN_COURSE_USER); - $t_cfv = Database::get_main_table(TABLE_MAIN_COURSE_FIELD_VALUES); - $table_field = Database::get_main_table(TABLE_MAIN_COURSE_FIELD); + $t_cfv = Database::get_main_table(TABLE_MAIN_COURSE_FIELD_VALUES); + $table_field = Database::get_main_table(TABLE_MAIN_COURSE_FIELD); $courses_params = $params['courses']; $results = array(); @@ -2564,7 +2565,7 @@ function WSEditCourse($params){ $extra_list = $course_param['extra']; // Get course code from id from remote system. - $sql = "SELECT course_code FROM $table_field cf,$t_cfv cfv WHERE cfv.field_id=cf.id AND field_variable='$original_course_id_name' AND field_value='$original_course_id_value'"; + $sql = "SELECT course_code FROM $table_field cf,$t_cfv cfv WHERE cfv.field_id=cf.id AND field_variable='$original_course_id_name' AND field_value='$original_course_id_value'"; $res = Database::query($sql); $row = Database::fetch_row($res); @@ -2675,14 +2676,14 @@ array(array('ref' => 'SOAP-ENC:arrayType', 'wsdl:arrayType' => 'tns:fields_cours // Register the method to expose -$server->register('WSCourseDescription', // method name - array('courseDescription' => 'tns:courseDescription'), // input parameters - array('return' => 'tns:fields_course_desc_list'), // output parameters - 'urn:WSRegistration', // namespace - 'urn:WSRegistration#WSCourseDescription', // soapaction - 'rpc', // style - 'encoded', // use - 'This service edits a course description' // documentation +$server->register('WSCourseDescription', // method name + array('courseDescription' => 'tns:courseDescription'), // input parameters + array('return' => 'tns:fields_course_desc_list'), // output parameters + 'urn:WSRegistration', // namespace + 'urn:WSRegistration#WSCourseDescription', // soapaction + 'rpc', // style + 'encoded', // use + 'This service edits a course description' // documentation ); // Define the method WSCourseDescription @@ -2696,8 +2697,8 @@ function WSCourseDescription($params) { $course_table = Database::get_main_table(TABLE_MAIN_COURSE); $course_user_table = Database::get_main_table(TABLE_MAIN_COURSE_USER); - $t_cfv = Database::get_main_table(TABLE_MAIN_COURSE_FIELD_VALUES); - $table_field = Database::get_main_table(TABLE_MAIN_COURSE_FIELD); + $t_cfv = Database::get_main_table(TABLE_MAIN_COURSE_FIELD_VALUES); + $table_field = Database::get_main_table(TABLE_MAIN_COURSE_FIELD); $array_course_desc_id = array(); $array_course__desc_default_title = array(); @@ -2708,7 +2709,7 @@ function WSCourseDescription($params) { $original_course_id_value = $params['original_course_id_value']; // Get course code from id from remote system. - $sql = "SELECT course_code FROM $table_field cf,$t_cfv cfv WHERE cfv.field_id=cf.id AND field_variable='$original_course_id_name' AND field_value='$original_course_id_value'"; + $sql = "SELECT course_code FROM $table_field cf,$t_cfv cfv WHERE cfv.field_id=cf.id AND field_variable='$original_course_id_name' AND field_value='$original_course_id_value'"; $res = Database::query($sql); $row = Database::fetch_row($res); @@ -2840,14 +2841,14 @@ array(array('ref' => 'SOAP-ENC:arrayType', 'wsdl:arrayType' => 'tns:result_editC // Register the method to expose -$server->register('WSEditCourseDescription', // method name - array('editCourseDescription' => 'tns:editCourseDescription'), // input parameters - array('return' => 'tns:results_editCourseDescription'), // output parameters - 'urn:WSRegistration', // namespace - 'urn:WSRegistration#WSEditCourseDescription', // soapaction - 'rpc', // style - 'encoded', // use - 'This service edits a course description' // documentation +$server->register('WSEditCourseDescription', // method name + array('editCourseDescription' => 'tns:editCourseDescription'), // input parameters + array('return' => 'tns:results_editCourseDescription'), // output parameters + 'urn:WSRegistration', // namespace + 'urn:WSRegistration#WSEditCourseDescription', // soapaction + 'rpc', // style + 'encoded', // use + 'This service edits a course description' // documentation ); // Define the method WSEditCourseDescription @@ -2861,8 +2862,8 @@ function WSEditCourseDescription($params) { $course_table = Database::get_main_table(TABLE_MAIN_COURSE); $course_user_table = Database::get_main_table(TABLE_MAIN_COURSE_USER); - $t_cfv = Database::get_main_table(TABLE_MAIN_COURSE_FIELD_VALUES); - $table_field = Database::get_main_table(TABLE_MAIN_COURSE_FIELD); + $t_cfv = Database::get_main_table(TABLE_MAIN_COURSE_FIELD_VALUES); + $table_field = Database::get_main_table(TABLE_MAIN_COURSE_FIELD); $courses_params = $params['course_desc']; $results = array(); @@ -2878,7 +2879,7 @@ function WSEditCourseDescription($params) { $orig_course_id_value[] = $original_course_id_value; // Get course code from id from the remote system. - $sql = "SELECT course_code FROM $table_field cf,$t_cfv cfv WHERE cfv.field_id=cf.id AND field_variable='$original_course_id_name' AND field_value='$original_course_id_value'"; + $sql = "SELECT course_code FROM $table_field cf,$t_cfv cfv WHERE cfv.field_id=cf.id AND field_variable='$original_course_id_name' AND field_value='$original_course_id_value'"; $res = Database::query($sql); $row = Database::fetch_row($res); @@ -2998,14 +2999,14 @@ array(array('ref' => 'SOAP-ENC:arrayType', 'wsdl:arrayType' => 'tns:result_delet 'tns:result_deleteCourse' ); -$server->register('WSDeleteCourse', // method name - array('deleteCourse' => 'tns:deleteCourse'), // input parameters - array('return' => 'tns:results_deleteCourse'), // output parameters - 'urn:WSRegistration', // namespace - 'urn:WSRegistration#WSDeleteCourse', // soapaction - 'rpc', // style - 'encoded', // use - 'This service deletes a course ' // documentation +$server->register('WSDeleteCourse', // method name + array('deleteCourse' => 'tns:deleteCourse'), // input parameters + array('return' => 'tns:results_deleteCourse'), // output parameters + 'urn:WSRegistration', // namespace + 'urn:WSRegistration#WSDeleteCourse', // soapaction + 'rpc', // style + 'encoded', // use + 'This service deletes a course ' // documentation ); @@ -3017,8 +3018,8 @@ function WSDeleteCourse($params) { } $table_course = Database :: get_main_table(TABLE_MAIN_COURSE); - $t_cfv = Database::get_main_table(TABLE_MAIN_COURSE_FIELD_VALUES); - $table_field = Database::get_main_table(TABLE_MAIN_COURSE_FIELD); + $t_cfv = Database::get_main_table(TABLE_MAIN_COURSE_FIELD_VALUES); + $table_field = Database::get_main_table(TABLE_MAIN_COURSE_FIELD); $courses_params = $params['courses']; $results = array(); @@ -3030,7 +3031,7 @@ function WSDeleteCourse($params) { $original_course_id_name = $course_param['original_course_id_name']; $orig_course_id_value[] = $original_course_id_value; // Get course code from id from the remote system. - $sql_course = "SELECT course_code FROM $table_field cf,$t_cfv cfv WHERE cfv.field_id=cf.id AND field_variable='$original_course_id_name' AND field_value='$original_course_id_value'"; + $sql_course = "SELECT course_code FROM $table_field cf,$t_cfv cfv WHERE cfv.field_id=cf.id AND field_variable='$original_course_id_name' AND field_value='$original_course_id_value'"; $res_course = Database::query($sql_course); $row_course = Database::fetch_row($res_course); @@ -3138,14 +3139,14 @@ array(array('ref' => 'SOAP-ENC:arrayType', 'wsdl:arrayType' => 'tns:result_creat ); // Register the method to expose -$server->register('WSCreateSession', // method name - array('createSession' => 'tns:createSession'), // input parameters - array('return' => 'tns:results_createSession'), // output parameters - 'urn:WSRegistration', // namespace - 'urn:WSRegistration#WSCreateSession', // soapaction - 'rpc', // style - 'encoded', // use - 'This service edits a session' // documentation +$server->register('WSCreateSession', // method name + array('createSession' => 'tns:createSession'), // input parameters + array('return' => 'tns:results_createSession'), // output parameters + 'urn:WSRegistration', // namespace + 'urn:WSRegistration#WSCreateSession', // soapaction + 'rpc', // style + 'encoded', // use + 'This service edits a session' // documentation ); @@ -3158,10 +3159,10 @@ function WSCreateSession($params) { return return_error(WS_ERROR_SECRET_KEY); } - $tbl_user = Database::get_main_table(TABLE_MAIN_USER); - $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION); - $t_sf = Database::get_main_table(TABLE_MAIN_SESSION_FIELD); - $t_sfv = Database::get_main_table(TABLE_MAIN_SESSION_FIELD_VALUES); + $tbl_user = Database::get_main_table(TABLE_MAIN_USER); + $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION); + $t_sf = Database::get_main_table(TABLE_MAIN_SESSION_FIELD); + $t_sfv = Database::get_main_table(TABLE_MAIN_SESSION_FIELD_VALUES); $sessions_params = $params['sessions']; $results = array(); @@ -3185,7 +3186,7 @@ function WSCreateSession($params) { $orig_session_id_value[] = $session_param['original_session_id_value']; $extra_list = $session_param['extra']; // Check if exits remote system's session id into session_field_values table. - $sql = "SELECT field_value FROM $t_sf sf,$t_sfv sfv WHERE sfv.field_id=sf.id AND field_variable='$original_session_id_name' AND field_value='$original_session_id_value'"; + $sql = "SELECT field_value FROM $t_sf sf,$t_sfv sfv WHERE sfv.field_id=sf.id AND field_variable='$original_session_id_name' AND field_value='$original_session_id_value'"; $res = Database::query($sql); $row = Database::fetch_row($res); if (Database::num_rows($res) > 0) { @@ -3328,14 +3329,14 @@ array(array('ref' => 'SOAP-ENC:arrayType', 'wsdl:arrayType' => 'tns:result_editS // Register the method to expose -$server->register('WSEditSession', // method name - array('editSession' => 'tns:editSession'), // input parameters - array('return' => 'tns:results_editSession'), // output parameters - 'urn:WSRegistration', // namespace - 'urn:WSRegistration#WSEditSession', // soapaction - 'rpc', // style - 'encoded', // use - 'This service edits a session' // documentation +$server->register('WSEditSession', // method name + array('editSession' => 'tns:editSession'), // input parameters + array('return' => 'tns:results_editSession'), // output parameters + 'urn:WSRegistration', // namespace + 'urn:WSRegistration#WSEditSession', // soapaction + 'rpc', // style + 'encoded', // use + 'This service edits a session' // documentation ); // define the method WSEditSession @@ -3347,8 +3348,8 @@ function WSEditSession($params) { return return_error(WS_ERROR_SECRET_KEY); } - $tbl_user = Database::get_main_table(TABLE_MAIN_USER); - $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION); + $tbl_user = Database::get_main_table(TABLE_MAIN_USER); + $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION); $t_sf = Database::get_main_table(TABLE_MAIN_SESSION_FIELD); $t_sfv = Database::get_main_table(TABLE_MAIN_SESSION_FIELD_VALUES); @@ -3410,10 +3411,10 @@ function WSEditSession($params) { "name='".addslashes($name)."', " . "date_start='".$date_start."', " . "date_end='".$date_end."', " . - "id_coach='". $id_coach."', " . - "session_admin_id='". intval($_user['user_id'])."', " . - "nb_days_access_before_beginning='". $nb_days_acess_before."', " . - "nb_days_access_after_end='". $nb_days_acess_after."'" . + "id_coach='". $id_coach."', " . + "session_admin_id='". intval($_user['user_id'])."', " . + "nb_days_access_before_beginning='". $nb_days_acess_before."', " . + "nb_days_access_after_end='". $nb_days_acess_after."'" . " WHERE id='".$id."'"; Database::query($sql); $id_session = Database::insert_id(); @@ -3457,17 +3458,17 @@ array(array('ref' => 'SOAP-ENC:arrayType', 'wsdl:arrayType' => 'tns:deleteSessio ); $server->wsdl->addComplexType( - 'subscribeUserToCourseParams', - 'complexType', - 'struct', - 'all', - '', - array( - 'original_user_id_values' => array('name' => 'original_user_id_values', 'type' => 'tns:originalUsersList'), - 'original_user_id_name' => array('name' => 'original_user_id_name', 'type' => 'xsd:string'), - 'original_course_id_value' => array('name' => 'original_course_id_value', 'type' => 'xsd:string'), - 'original_course_id_name' => array('name' => 'original_course_id_value', 'type' => 'xsd:string') - ) + 'subscribeUserToCourseParams', + 'complexType', + 'struct', + 'all', + '', + array( + 'original_user_id_values' => array('name' => 'original_user_id_values', 'type' => 'tns:originalUsersList'), + 'original_user_id_name' => array('name' => 'original_user_id_name', 'type' => 'xsd:string'), + 'original_course_id_value' => array('name' => 'original_course_id_value', 'type' => 'xsd:string'), + 'original_course_id_name' => array('name' => 'original_course_id_value', 'type' => 'xsd:string') + ) ); /* Register WSDeleteSession function */ @@ -3531,14 +3532,14 @@ array(array('ref' => 'SOAP-ENC:arrayType', 'wsdl:arrayType' => 'tns:result_delet 'tns:result_deleteSession' ); -$server->register('WSDeleteSession', // method name - array('deleteSession' => 'tns:deleteSession'), // input parameters - array('return' => 'tns:results_deleteSession'), // output parameters - 'urn:WSRegistration', // namespace - 'urn:WSRegistration#WSDeleteSession', // soapaction - 'rpc', // style - 'encoded', // use - 'This service deletes a session ' // documentation +$server->register('WSDeleteSession', // method name + array('deleteSession' => 'tns:deleteSession'), // input parameters + array('return' => 'tns:results_deleteSession'), // output parameters + 'urn:WSRegistration', // namespace + 'urn:WSRegistration#WSDeleteSession', // soapaction + 'rpc', // style + 'encoded', // use + 'This service deletes a session ' // documentation ); // define the method WSDeleteSession @@ -3692,14 +3693,14 @@ $server->wsdl->addComplexType( // Register the method to expose -$server->register('WSSubscribeUserToCourse', // method name - array('subscribeUserToCourse' => 'tns:subscribeUserToCourse_arg'), // input parameters - array('return' => 'tns:subscribeUserToCourse_return'), // output parameters - 'urn:WSRegistration', // namespace - 'urn:WSRegistration#WSSubscribeUserToCourse', // soapaction - 'rpc', // style - 'encoded', // use - 'This service subscribes a user to a course' // documentation +$server->register('WSSubscribeUserToCourse', // method name + array('subscribeUserToCourse' => 'tns:subscribeUserToCourse_arg'), // input parameters + array('return' => 'tns:subscribeUserToCourse_return'), // output parameters + 'urn:WSRegistration', // namespace + 'urn:WSRegistration#WSSubscribeUserToCourse', // soapaction + 'rpc', // style + 'encoded', // use + 'This service subscribes a user to a course' // documentation ); // define the method WSSubscribeUserToCourse @@ -3734,11 +3735,13 @@ function WSSubscribeUserToCourse($params) { } else { // User was found $course_id = CourseManager::get_course_id_from_original_id($original_course_id['original_course_id_value'], $original_course_id['original_course_id_name']); + if ($debug) error_log('WSSubscribeUserToCourse course_id: '.$course_id); if ($course_id == 0) { // Course was not found $result['result'] = 0; } else { $course_code = CourseManager::get_course_code_from_course_id($course_id); + if ($debug) error_log('WSSubscribeUserToCourse course_code: '.$course_code); if (!CourseManager::add_user_to_course($user_id, $course_code, $status)) { $result['result'] = 0; } @@ -3773,27 +3776,24 @@ $server->wsdl->addComplexType( 'struct', 'all', '', -array ( - 'message' => array('name' => 'message', 'type' => 'xsd:string'), - ) + array('message' => array('name' => 'message', 'type' => 'xsd:string')) ); // Register the method to expose -$server->register('WSSubscribeUserToCourseSimple', // method name - array('subscribeUserToCourseSimple' => 'tns:subscribeUserToCourseSimple_arg'), // input parameters - array('return' => 'xsd:string'), // output parameters - 'urn:WSRegistration', // namespace - 'urn:WSRegistration#WSSubscribeUserToCourseSimple', // soapaction - 'rpc', // style - 'encoded', // use - 'This service subscribes a user to a course in a simple way' // documentation +$server->register('WSSubscribeUserToCourseSimple', // method name + array('subscribeUserToCourseSimple' => 'tns:subscribeUserToCourseSimple_arg'), // input parameters + array('return' => 'xsd:string'), // output parameters + 'urn:WSRegistration', // namespace + 'urn:WSRegistration#WSSubscribeUserToCourseSimple', // soapaction + 'rpc', // style + 'encoded', // use + 'This service subscribes a user to a course in a simple way' // documentation ); // define the method WSSubscribeUserToCourse function WSSubscribeUserToCourseSimple($params) { global $debug; - //$debug = true; if ($debug) error_log('WSSubscribeUserToCourseSimple'); if ($debug) error_log('Params '. print_r($params, 1)); @@ -3866,16 +3866,16 @@ array ( // Register the method to expose $server->register('WSGetUser', // method name - array('GetUser' => 'tns:GetUserArg'), // input parameters - array('return' => 'tns:User'), // output parameters + array('GetUser' => 'tns:GetUserArg'), // input parameters + array('return' => 'tns:User'), // output parameters 'urn:WSRegistration', // namespace - 'urn:WSRegistration#WSGetUser', // soapaction + 'urn:WSRegistration#WSGetUser', // soapaction 'rpc', // style 'encoded', // use 'This service get user information by id' // documentation ); -// define the method WSSubscribeUserToCourse +// define the method WSGetUser function WSGetUser($params) { global $debug; if ($debug) error_log('WSGetUser'); @@ -3916,17 +3916,17 @@ $server->wsdl->addComplexType( ) ); // Register the method to expose -$server->register('WSGetUserFromUsername', // method name - array('GetUserFromUsername' => 'tns:GetUserArgUsername'),// input params - array('return' => 'tns:User'), // output parameters - 'urn:WSRegistration', // namespace - 'urn:WSRegistration#WSGetUserFromUsername', // soapaction - 'rpc', // style - 'encoded', // use - 'This service get user information by username' // documentation +$server->register('WSGetUserFromUsername', // method name + array('GetUserFromUsername' => 'tns:GetUserArgUsername'), // input params + array('return' => 'tns:User'), // output parameters + 'urn:WSRegistration', // namespace + 'urn:WSRegistration#WSGetUserFromUsername', // soapaction + 'rpc', // style + 'encoded', // use + 'This service get user information by username' // documentation ); -// define the method WSSubscribeUserToCourse +// define the method WSGetUserFromUsername function WSGetUserFromUsername($params) { global $debug; if ($debug) error_log('WSGetUserFromUsername'); @@ -4019,14 +4019,14 @@ array(array('ref' => 'SOAP-ENC:arrayType', 'wsdl:arrayType' => 'tns:result_unsus ); // Register the method to expose -$server->register('WSUnsubscribeUserFromCourse', // method name - array('unsuscribeUserFromCourse' => 'tns:unsuscribeUserFromCourse'),// input parameters - array('return' => 'tns:results_unsuscribeUserFromCourse'), // output parameters - 'urn:WSRegistration', // namespace - 'urn:WSRegistration#WSUnsubscribeUserFromCourse', // soapaction - 'rpc', // style - 'encoded', // use - 'This service unsubscribes a user from a course' // documentation +$server->register('WSUnsubscribeUserFromCourse', // method name + array('unsuscribeUserFromCourse' => 'tns:unsuscribeUserFromCourse'), // input parameters + array('return' => 'tns:results_unsuscribeUserFromCourse'), // output parameters + 'urn:WSRegistration', // namespace + 'urn:WSRegistration#WSUnsubscribeUserFromCourse', // soapaction + 'rpc', // style + 'encoded', // use + 'This service unsubscribes a user from a course' // documentation ); // define the method WSUnsubscribeUserFromCourse @@ -4038,10 +4038,10 @@ function WSUnsubscribeUserFromCourse($params) { $user_table = Database::get_main_table(TABLE_MAIN_USER); $t_uf = Database::get_main_table(TABLE_MAIN_USER_FIELD); $t_ufv = Database::get_main_table(TABLE_MAIN_USER_FIELD_VALUES); - $table_course = Database :: get_main_table(TABLE_MAIN_COURSE); + $table_course = Database :: get_main_table(TABLE_MAIN_COURSE); $table_course_user = Database :: get_main_table(TABLE_MAIN_COURSE_USER); - $t_cfv = Database::get_main_table(TABLE_MAIN_COURSE_FIELD_VALUES); - $table_field = Database::get_main_table(TABLE_MAIN_COURSE_FIELD); + $t_cfv = Database::get_main_table(TABLE_MAIN_COURSE_FIELD_VALUES); + $table_field = Database::get_main_table(TABLE_MAIN_COURSE_FIELD); $userscourses_params = $params['userscourses']; $results = array(); @@ -4049,10 +4049,10 @@ function WSUnsubscribeUserFromCourse($params) { $orig_course_id_value = array(); foreach($userscourses_params as $usercourse_param) { - $original_user_id_values = $usercourse_param['original_user_id_values']; - $original_user_id_name = $usercourse_param['original_user_id_name']; - $original_course_id_value = $usercourse_param['original_course_id_value']; - $original_course_id_name = $usercourse_param['original_course_id_name']; + $original_user_id_values = $usercourse_param['original_user_id_values']; + $original_user_id_name = $usercourse_param['original_user_id_name']; + $original_course_id_value = $usercourse_param['original_course_id_value']; + $original_course_id_name = $usercourse_param['original_course_id_name']; $orig_course_id_value[] = $original_course_id_value; // Get user id from original user id @@ -4076,9 +4076,9 @@ function WSUnsubscribeUserFromCourse($params) { // Get course code from original course id - $sql_course = "SELECT course_code FROM $table_field cf,$t_cfv cfv WHERE cfv.field_id=cf.id AND field_variable='$original_course_id_name' AND field_value='$original_course_id_value'"; - $res_course = Database::query($sql_course); - $row_course = Database::fetch_row($res_course); + $sql_course = "SELECT course_code FROM $table_field cf,$t_cfv cfv WHERE cfv.field_id=cf.id AND field_variable='$original_course_id_name' AND field_value='$original_course_id_value'"; + $res_course = Database::query($sql_course); + $row_course = Database::fetch_row($res_course); $course_code = $row_course[0]; @@ -4184,14 +4184,14 @@ array(array('ref' => 'SOAP-ENC:arrayType', 'wsdl:arrayType' => 'tns:result_subsc ); // Register the method to expose -$server->register('WSSuscribeUsersToSession', // method name - array('subscribeUsersToSession' => 'tns:subscribeUsersToSession'), // input parameters - array('return' => 'tns:results_subscribeUsersToSession'), // output parameters - 'urn:WSRegistration', // namespace - 'urn:WSRegistration#WSSuscribeUsersToSession', // soapaction - 'rpc', // style - 'encoded', // use - 'This service subscribes a user to a session' // documentation +$server->register('WSSuscribeUsersToSession', // method name + array('subscribeUsersToSession' => 'tns:subscribeUsersToSession'), // input parameters + array('return' => 'tns:results_subscribeUsersToSession'), // output parameters + 'urn:WSRegistration', // namespace + 'urn:WSRegistration#WSSuscribeUsersToSession', // soapaction + 'rpc', // style + 'encoded', // use + 'This service subscribes a user to a session' // documentation ); // define the method WSSuscribeUsersToSession @@ -4206,10 +4206,10 @@ function WSSuscribeUsersToSession($params){ $t_ufv = Database::get_main_table(TABLE_MAIN_USER_FIELD_VALUES); $t_sf = Database::get_main_table(TABLE_MAIN_SESSION_FIELD); $t_sfv = Database::get_main_table(TABLE_MAIN_SESSION_FIELD_VALUES); - $tbl_session_rel_course = Database::get_main_table(TABLE_MAIN_SESSION_COURSE); - $tbl_session_rel_course_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER); - $tbl_session_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_USER); - $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION); + $tbl_session_rel_course = Database::get_main_table(TABLE_MAIN_SESSION_COURSE); + $tbl_session_rel_course_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER); + $tbl_session_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_USER); + $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION); $userssessions_params = $params['userssessions']; $results = array(); @@ -4327,6 +4327,71 @@ function WSSuscribeUsersToSession($params){ return $output; } +// -------------------------------------------------------------------- +// WSSubscribeUserToSessionSimple +// -------------------------------------------------------------------- +$server->wsdl->addComplexType( + 'subscribeUserToSessionSimple_arg', + 'complexType', + 'struct', + 'all', + '', + array( + 'session' => array('name' => 'session', 'type' => 'xsd:string'), // Session ID + 'user_id' => array('name' => 'user_id', 'type' => 'xsd:string'), // Chamilo user_id + 'secret_key' => array('name' => 'secret_key', 'type' => 'xsd:string') + ) +); +$server->register('WSSubscribeUserToSessionSimple', // method name + array('subscribeUserToSessionSimple' => 'tns:subscribeUserToSessionSimple_arg'), // input parameters + array('return' => 'xsd:string'), // output parameters + 'urn:WSRegistration', // namespace + 'urn:WSRegistration#WSSubscribeUserToSessionSimple', // soapaction + 'rpc', // style + 'encoded', // use + 'This service subscribes a user to a session in a simple way' // documentation +); +function WSSubscribeUserToSessionSimple($params) { + global $debug; + + if ($debug) { + error_log('WSSubscribeUserToSessionSimple with params=[' . serialize($params). ']'); + } + + // Check security key + if (!WSHelperVerifyKey($params)) { + return return_error(WS_ERROR_SECRET_KEY); + } + + // Get input parameters + $session_id = intval($params['session']); // Session ID + $user_id = intval($params['user_id']); // Chamilo user id + + // Get user id + $user_data = UserManager::get_user_info_by_id($user_id); + + // Prepare answer + $result = 0; + + if (empty($user_data)) { + $result = "User {$user_id} does not exist"; + if ($debug) { error_log($result); } + return $result; + } + if (!empty($session_id) && is_numeric($session_id)) { + $session_data = api_get_session_info($session_id); + if (empty($session_data)) { + $result = "Session {$session_id} does not exist."; + if ($debug) { error_log($result); } + } else { + SessionManager::suscribe_users_to_session($session_id, array($user_id), SESSION_VISIBLE_READ_ONLY, false, false); + if ($debug) error_log('User registered to the course: '.$session_id); + $result = 1; + } + } + return $result; +} + /* Register WSUnsuscribeUsersFromSession function */ // Register the data structures used by the service $server->wsdl->addComplexType( @@ -4392,14 +4457,14 @@ array(array('ref' => 'SOAP-ENC:arrayType', 'wsdl:arrayType' => 'tns:result_unsub ); // Register the method to expose -$server->register('WSUnsuscribeUsersFromSession', // method name - array('unsubscribeUsersFromSession' => 'tns:unsubscribeUsersFromSession'), // input parameters - array('return' => 'tns:results_unsubscribeUsersFromSession'), // output parameters - 'urn:WSRegistration', // namespace - 'urn:WSRegistration#WSUnsuscribeUsersFromSession', // soapaction - 'rpc', // style - 'encoded', // use - 'This service unsubscribes a user to a session' // documentation +$server->register('WSUnsuscribeUsersFromSession', // method name + array('unsubscribeUsersFromSession' => 'tns:unsubscribeUsersFromSession'), // input parameters + array('return' => 'tns:results_unsubscribeUsersFromSession'), // output parameters + 'urn:WSRegistration', // namespace + 'urn:WSRegistration#WSUnsuscribeUsersFromSession', // soapaction + 'rpc', // style + 'encoded', // use + 'This service unsubscribes a user to a session' // documentation ); // define the method WSUnsuscribeUsersFromSession @@ -4414,10 +4479,10 @@ function WSUnsuscribeUsersFromSession($params) { $t_ufv = Database::get_main_table(TABLE_MAIN_USER_FIELD_VALUES); $t_sf = Database::get_main_table(TABLE_MAIN_SESSION_FIELD); $t_sfv = Database::get_main_table(TABLE_MAIN_SESSION_FIELD_VALUES); - $tbl_session_rel_course = Database::get_main_table(TABLE_MAIN_SESSION_COURSE); - $tbl_session_rel_course_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER); - $tbl_session_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_USER); - $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION); + $tbl_session_rel_course = Database::get_main_table(TABLE_MAIN_SESSION_COURSE); + $tbl_session_rel_course_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER); + $tbl_session_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_USER); + $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION); $userssessions_params = $params['userssessions']; $results = array(); @@ -4656,14 +4721,14 @@ array(array('ref' => 'SOAP-ENC:arrayType', 'wsdl:arrayType' => 'tns:result_subsc ); // Register the method to expose -$server->register('WSSuscribeCoursesToSession', // method name - array('subscribeCoursesToSession' => 'tns:subscribeCoursesToSession'), // input parameters - array('return' => 'tns:results_subscribeCoursesToSession'), // output parameters - 'urn:WSRegistration', // namespace - 'urn:WSRegistration#WSSuscribeCoursesToSession', // soapaction - 'rpc', // style - 'encoded', // use - 'This service subscribes a course to a session' // documentation +$server->register('WSSuscribeCoursesToSession', // method name + array('subscribeCoursesToSession' => 'tns:subscribeCoursesToSession'), // input parameters + array('return' => 'tns:results_subscribeCoursesToSession'), // output parameters + 'urn:WSRegistration', // namespace + 'urn:WSRegistration#WSSuscribeCoursesToSession', // soapaction + 'rpc', // style + 'encoded', // use + 'This service subscribes a course to a session' // documentation ); // Define the method WSSuscribeCoursesToSession @@ -4677,11 +4742,11 @@ function WSSuscribeCoursesToSession($params) { if ($debug) error_log('WSSuscribeCoursesToSession: '.print_r($params, 1)); // initialisation - $tbl_session_rel_course_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER); - $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION); - $tbl_session_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_USER); - $tbl_session_rel_course = Database::get_main_table(TABLE_MAIN_SESSION_COURSE); - $tbl_course = Database::get_main_table(TABLE_MAIN_COURSE); + $tbl_session_rel_course_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER); + $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION); + $tbl_session_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_USER); + $tbl_session_rel_course = Database::get_main_table(TABLE_MAIN_SESSION_COURSE); + $tbl_course = Database::get_main_table(TABLE_MAIN_COURSE); $t_sf = Database::get_main_table(TABLE_MAIN_SESSION_FIELD); $t_sfv = Database::get_main_table(TABLE_MAIN_SESSION_FIELD_VALUES); $t_cfv = Database::get_main_table(TABLE_MAIN_COURSE_FIELD_VALUES); @@ -4885,14 +4950,14 @@ array(array('ref' => 'SOAP-ENC:arrayType', 'wsdl:arrayType' => 'tns:result_unsub // Register the method to expose -$server->register('WSUnsuscribeCoursesFromSession', // method name - array('unsubscribeCoursesFromSession' => 'tns:unsubscribeCoursesFromSession'), // input parameters - array('return' => 'tns:results_unsubscribeCoursesFromSession'), // output parameters - 'urn:WSRegistration', // namespace - 'urn:WSRegistration#WSUnsuscribeCoursesFromSession', // soapaction - 'rpc', // style - 'encoded', // use - 'This service subscribes a course to a session' // documentation +$server->register('WSUnsuscribeCoursesFromSession', // method name + array('unsubscribeCoursesFromSession' => 'tns:unsubscribeCoursesFromSession'), // input parameters + array('return' => 'tns:results_unsubscribeCoursesFromSession'), // output parameters + 'urn:WSRegistration', // namespace + 'urn:WSRegistration#WSUnsuscribeCoursesFromSession', // soapaction + 'rpc', // style + 'encoded', // use + 'This service subscribes a course to a session' // documentation ); // define the method WSUnsuscribeCoursesFromSession @@ -4903,10 +4968,10 @@ function WSUnsuscribeCoursesFromSession($params) { } // Initialisation - $tbl_session_rel_course_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER); - $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION); - $tbl_session_rel_course = Database::get_main_table(TABLE_MAIN_SESSION_COURSE); - $tbl_course = Database::get_main_table(TABLE_MAIN_COURSE); + $tbl_session_rel_course_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER); + $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION); + $tbl_session_rel_course = Database::get_main_table(TABLE_MAIN_SESSION_COURSE); + $tbl_course = Database::get_main_table(TABLE_MAIN_COURSE); $t_sf = Database::get_main_table(TABLE_MAIN_SESSION_FIELD); $t_sfv = Database::get_main_table(TABLE_MAIN_SESSION_FIELD_VALUES); $t_cfv = Database::get_main_table(TABLE_MAIN_COURSE_FIELD_VALUES); @@ -5029,14 +5094,14 @@ array(array('ref' => 'SOAP-ENC:arrayType', 'wsdl:arrayType' => 'tns:course[]')), // Register the method to expose -$server->register('WSListCourses', // method name - array('secret_key' => 'xsd:string', 'original_course_id_name' => 'xsd:string'), // input parameters - array('return' => 'tns:courses'), // output parameters - 'urn:WSRegistration', // namespace - 'urn:WSRegistration#WSListCourses', // soapaction - 'rpc', // style - 'encoded', // use - 'This service list courses available on the system' // documentation +$server->register('WSListCourses', // method name + array('secret_key' => 'xsd:string', 'original_course_id_name' => 'xsd:string'), // input parameters + array('return' => 'tns:courses'), // output parameters + 'urn:WSRegistration', // namespace + 'urn:WSRegistration#WSListCourses', // soapaction + 'rpc', // style + 'encoded', // use + 'This service list courses available on the system' // documentation ); // define the method WSListCourses @@ -5099,14 +5164,14 @@ $server->wsdl->addComplexType( ); // Register the method to expose -$server->register('WSUpdateUserApiKey', // method name - array('userApiKey' => 'tns:userApiKey'), // input parameters - array('return' => 'xsd:string'), // output parameters - 'urn:WSRegistration', // namespace - 'urn:WSRegistration#WSListCourses', // soapaction - 'rpc', // style - 'encoded', // use - 'This service return user api key' // documentation +$server->register('WSUpdateUserApiKey', // method name + array('userApiKey' => 'tns:userApiKey'), // input parameters + array('return' => 'xsd:string'), // output parameters + 'urn:WSRegistration', // namespace + 'urn:WSRegistration#WSListCourses', // soapaction + 'rpc', // style + 'encoded', // use + 'This service return user api key' // documentation ); @@ -5146,6 +5211,18 @@ function WSUpdateUserApiKey($params) { } /** WSListSessions **/ +$server->wsdl->addComplexType( + 'session_arg', + 'complexType', + 'struct', + 'all', + '', + array( + 'date_start' => array('name' => 'date_start', 'type' => 'xsd:string'), + 'date_end' => array('name' => 'date_end', 'type' => 'xsd:string'), + 'secret_key' => array('name' => 'secret_key', 'type' => 'xsd:string') + ) +); $server->wsdl->addComplexType( 'session', @@ -5177,16 +5254,14 @@ $server->wsdl->addComplexType( ); // Register the method to expose -$server->register('WSListSessions', // method name - array('secret_key' => 'xsd:string', - 'date_start' => 'xsd:string', - 'date_end' => 'xsd:string'), // input parameters - array('return' => 'tns:sessions'), // output parameters - 'urn:WSRegistration', // namespace +$server->register('WSListSessions', // method name + array('input' => 'tns:session_arg'), // input parameters + array('return' => 'tns:sessions'), // output parameters + 'urn:WSRegistration', // namespace 'urn:WSRegistration#WSListSessions', // soapaction - 'rpc', // style - 'encoded', // use - 'This service returns a list of sessions' // documentation + 'rpc', // style + 'encoded', // use + 'This service returns a list of sessions' // documentation ); @@ -5206,10 +5281,10 @@ function WSListSessions($params) { $sql_params = array(); // Dates should be provided in YYYY-MM-DD format, UTC if (!empty($params['date_start'])) { - $sql_params['date_start >='] = $params['date_start']; + $sql_params['s.date_start >='] = $params['date_start']; } if (!empty($params['date_end'])) { - $sql_params['date_end <='] = $params['date_end']; + $sql_params['s.date_end <='] = $params['date_end']; } $sessions_list = SessionManager::get_sessions_list($sql_params); $return_list = array(); From 26104dc64282d83c2e76a4816d5377aeda66fd9c Mon Sep 17 00:00:00 2001 From: Yannick Warnier Date: Tue, 24 Sep 2013 02:47:17 -0500 Subject: [PATCH 3/3] Added Gaetan to contributors --- documentation/credits.html | 1 + 1 file changed, 1 insertion(+) diff --git a/documentation/credits.html b/documentation/credits.html index 0e321cd434..3b5c9ced31 100644 --- a/documentation/credits.html +++ b/documentation/credits.html @@ -679,6 +679,7 @@ Note that we are infinitely grateful to our translators, having made the spread
  • Carlos del Solar, for bug reports and testing on exercises and learning paths in LMS 1.9.4
  • Alexander Hu, for bug reports in LMS 1.9.4
  • Fernando Muñoz (occasionally via Secunia SVCRP) for multiple security vulnerability reports in Chamilo 1.8-1.9
  • +
  • Gaëtan Frenoy, for efficient and well-coded updates to Drupal module and the integration with Drupal Ubercart in 1.9.8
  • All the supporting parents, partners, children, friends, colleagues and sometimes students, of the very special geeks that we are, for their continous support and inspiration