]> git.mjollnir.org Git - moodle.git/commitdiff
MDL-12886 fixed DML use in service access control
authorskodak <skodak>
Wed, 7 Oct 2009 22:29:00 +0000 (22:29 +0000)
committerskodak <skodak>
Wed, 7 Oct 2009 22:29:00 +0000 (22:29 +0000)
webservice/rest/simpleserver.php

index 9119ee948f5a045276eedd808876dc56304db85c..7b8b81a5918cbb4741cf152b4fc9518b3cc78920 100644 (file)
@@ -437,23 +437,25 @@ abstract class webservice_base_server {
                       JOIN {external_services_functions} sf ON (sf.externalserviceid = s.id AND sf.functionname = :name)
                       JOIN {external_services_users} su ON (su.externalserviceid = s.id AND su.userid = :userid)
                      WHERE su.validuntil IS NULL OR su.validuntil < :now";
-            $services = $DB->get_records_sql($sql, array('userid'=>$USER->id, 'name'=>$function->name, 'now'=>time()));
+            $rs = $DB->get_recordset_sql($sql, array('userid'=>$USER->id, 'name'=>$function->name, 'now'=>time()));
             // now make sure user may access at least one service
             $syscontext = get_context_instance(CONTEXT_SYSTEM);
             $remoteaddr = getremoteaddr();
-            foreach ($services as $key=>$service) {
+            $allowed = false;
+            foreach ($rs as $service) {
                 if ($service->requiredcapability and !has_capability($service->requiredcapability, $syscontext)) {
-                    unset($services[$key]); // cap required, sorry
+                    continue; // cap required, sorry
                 }
                 if ($service->iprestriction and !address_in_subnet($remoteaddr, $service->iprestriction)) {
-                    unset($services[$key]); // wrong request source ip, sorry
+                    continue; // wrong request source ip, sorry
                 }
+                $allowed = true;
                 break; // one service is enough, no need to continue
             }
-            if (!$services) {
+            $rs->close();
+            if (!$allowed) {
                 throw new invalid_parameter_exception('Access to external function not allowed');
             }
-            unset($services);
             // now we finally know the user may execute this function,
             // the last step is to set context restriction - in this simple case
             // we use system context because each external system has different user account