From: jerome Date: Thu, 22 Jan 2009 05:22:05 +0000 (+0000) Subject: web service MDL-12886 few TODO comments X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=e6bdd128991733ad57f0a7b506f4542cfb165ac4;p=moodle.git web service MDL-12886 few TODO comments --- diff --git a/user/external.php b/user/external.php index d7f08b791f..fcd488a10b 100644 --- a/user/external.php +++ b/user/external.php @@ -81,12 +81,12 @@ final class user_external extends moodle_external { global $DB; $user = $DB->get_record('user', array('username'=>$username, 'mnethostid'=>$mnethostid)); /// PLEASE UNCOMMENT HERE ONCE AUTHENTICATION IS IMPLEMENTED - $USER/context need to be set here - //if (require_capability('moodle/user:delete', get_context_instance(CONTEXT_SYSTEM))) { +// if (has_capability('moodle/user:delete', get_context_instance(CONTEXT_SYSTEM))) { return delete_user($user); //this function is in moodlelib.php - //} - //else { - // throw new moodle_exception('couldnotdeleteuser'); - //} +// } +// else { +// throw new moodle_exception('couldnotdeleteuser'); +// } } /** diff --git a/webservice/rest/locallib.php b/webservice/rest/locallib.php new file mode 100644 index 0000000000..d5848133f4 --- /dev/null +++ b/webservice/rest/locallib.php @@ -0,0 +1,110 @@ + _mod_forum_) + $classname = substr($classname,1, strlen($classname) - 1); //remove first _ (e.g. _mod_forum => mod_forum) + $classname .= 'external'; + + require_once($CFG->dirroot.$apipath.'external.php'); + $wsapi = new $classname(); + $description = $wsapi->get_function_webservice_description($functionname); //retrieve the web service description for this function + +///This following line is only REST protocol + $params = retrieve_params ($description); //retrieve the REST params + +///Generic part to any protocols + if ($params === false) { + //return an error message, the REST params doesn't match with the web service description + } + $res = call_user_func_array ( $classname.'::'.$functionname, $params); + +///Transform result into xml in order to send the REST response + $return = mdl_conn_rest_object_to_xml ($res,key($description['return'])); + + return "$return"; +} + + +/** + * + * @author Jerome Mouneyrac + * @param $description + * @return + */ +function retrieve_params ($description) { + //retrieve REST param matching the description (warning: PHP assign the first instanciation as the first position in the table) + foreach ($description['wsparams'] as $paramname => $paramtype) { + $value = optional_param($paramname,null,$paramtype); + if (!empty($value)) { + $params[$paramname] = $value; + } + } + + return $params; +} + +/** + * auxiliar function for simplexml_object_to_xml + * @author Ferran Recio, David Castro Garcia + * @param $obj + * @param $tag + * @param $atts assoc array (key => value) + * @return string + */ +function mdl_conn_rest_object_to_xml ($obj, $tag,$atts=false) { + $res = ''; + $tag_atts = ''; + if ($atts) { + $main_atts = array(); + foreach ($atts as $att=>$val) { + $main_atts[] = "$att=\"".urlencode($val)."\""; + } + if (count($main_atts)) $tag_atts = ' '.implode(' ',$main_atts); + } + + //if is an object + if (is_object($obj)) { + $parts = get_object_vars($obj); + foreach ($parts as $tag2 => $val) { + $res.= mdl_conn_rest_object_to_xml ($val, $tag2); + } + return "<$tag$tag_atts>\n$res\n"; + } + //if it's an array all elements will be inside te same tag but with a new atribute key + if (is_array($obj)){ + if (!$atts) $atts = array(); + //we came from another array + if (isset($atts['keys'])) $atts = array(); + foreach ($obj as $key=>$val) { + $array_atts = $atts; + $array_atts['key'] = $key; + $res.= mdl_conn_rest_object_to_xml ($val, $tag,$array_atts); + } + return $res; + } + //any other type, just encapsule it + $obj = htmlentities($obj); + return "<$tag$tag_atts>$obj\n"; + +} + +?> \ No newline at end of file diff --git a/webservice/rest/server.php b/webservice/rest/server.php index 20eb8afbff..a07085464d 100644 --- a/webservice/rest/server.php +++ b/webservice/rest/server.php @@ -13,7 +13,7 @@ */ require_once(dirname(dirname(dirname(__FILE__))) . '/config.php'); -require_once('lib.php'); +require_once('locallib.php'); if (empty($CFG->enablewebservices)) { die; @@ -23,6 +23,6 @@ if (empty($CFG->enablewebservices)) { $rest_arguments = get_file_argument('server.php'); header ("Content-type: text/xml"); - +//TODO implement authentication (probably in the locallib.php) echo call_moodle_function($rest_arguments); ?> \ No newline at end of file diff --git a/webservice/soap/server.php b/webservice/soap/server.php index 703cca879a..03371edcfe 100644 --- a/webservice/soap/server.php +++ b/webservice/soap/server.php @@ -20,9 +20,14 @@ if (empty($CFG->enablewebservices)) { $classpath = optional_param(classpath,null,PARAM_ALPHA); require_once(dirname(__FILE__) . '/../../'.$classpath.'/external.php'); +//TODO retrieve the token from the url +// if the token doesn't exist create a server with a connection.wsdl +// and set a class containing only get_token() (need to create connection.wsdl and class soapiniconnection) +// if token exist, do the authentication here + /// run the server -$server = new SoapServer("moodle.wsdl"); -$server->setClass($classpath."_external"); +$server = new SoapServer("moodle.wsdl"); //TODO: need to call the wsdl generation on the fly +$server->setClass($classpath."_external"); //TODO: pass $user as parameter $server->handle(); ?> \ No newline at end of file