Merge branch 'MDL-40050-master' of git://github.com/FMCorz/moodle
authorEloy Lafuente (stronk7) <stronk7@moodle.org>
Mon, 30 Sep 2013 19:55:41 +0000 (21:55 +0200)
committerEloy Lafuente (stronk7) <stronk7@moodle.org>
Mon, 30 Sep 2013 19:55:41 +0000 (21:55 +0200)
1  2 
login/token.php
webservice/lib.php

diff --combined login/token.php
@@@ -68,7 -68,7 +68,7 @@@ if (!empty($user)) 
      enrol_check_plugins($user);
  
      // setup user session to check capability
 -    session_set_user($user);
 +    \core\session\manager::set_user($user);
  
      //check if the service exists and is enabled
      $service = $DB->get_record('external_services', array('shortname' => $serviceshortname, 'enabled' => 1));
          $unsettoken = false;
          //if sid is set then there must be a valid associated session no matter the token type
          if (!empty($token->sid)) {
 -            $session = session_get_instance();
 -            if (!$session->session_exists($token->sid)){
 +            if (!\core\session\manager::session_exists($token->sid)){
                  //this token will never be valid anymore, delete it
                  $DB->delete_records('external_tokens', array('sid'=>$token->sid));
                  $unsettoken = true;
                  or (!is_siteadmin($user) && has_capability('moodle/webservice:createtoken', context_system::instance()))) {
              // if service doesn't exist, dml will throw exception
              $service_record = $DB->get_record('external_services', array('shortname'=>$serviceshortname, 'enabled'=>1), '*', MUST_EXIST);
-             // create a new token
+             // Create a new token.
              $token = new stdClass;
              $token->token = md5(uniqid(rand(), 1));
              $token->userid = $user->id;
              $token->creatorid = $user->id;
              $token->timecreated = time();
              $token->externalserviceid = $service_record->id;
-             $tokenid = $DB->insert_record('external_tokens', $token);
-             add_to_log(SITEID, 'webservice', 'automatically create user token', '' , 'User ID: ' . $user->id);
-             $token->id = $tokenid;
+             $token->id = $DB->insert_record('external_tokens', $token);
+             $params = array(
+                 'objectid' => $token->id,
+                 'relateduserid' => $user->id,
+                 'other' => array(
+                     'auto' => true
+                 )
+             );
+             $event = \core\event\webservice_token_created::create($params);
+             $event->add_record_snapshot('external_tokens', $token);
+             $event->trigger();
          } else {
              throw new moodle_exception('cannotcreatetoken', 'webservice', '', $serviceshortname);
          }
      // log token access
      $DB->set_field('external_tokens', 'lastaccess', time(), array('id'=>$token->id));
  
-     add_to_log(SITEID, 'webservice', 'sending requested user token', '' , 'User ID: ' . $user->id);
+     $params = array(
+         'objectid' => $token->id,
+     );
+     $event = \core\event\webservice_token_sent::create($params);
+     $event->add_record_snapshot('external_tokens', $token);
+     $event->trigger();
  
      $usertoken = new stdClass;
      $usertoken->token = $token->token;
diff --combined webservice/lib.php
@@@ -69,16 -69,36 +69,36 @@@ class webservice 
              throw new moodle_exception('invalidtoken', 'webservice');
          }
  
+         $loginfaileddefaultparams = array(
+             'other' => array(
+                 'method' => WEBSERVICE_AUTHMETHOD_PERMANENT_TOKEN,
+                 'reason' => null,
+                 'tokenid' => $token->id
+             )
+         );
          // Validate token date
          if ($token->validuntil and $token->validuntil < time()) {
-             add_to_log(SITEID, 'webservice', get_string('tokenauthlog', 'webservice'), '', get_string('invalidtimedtoken', 'webservice'), 0);
+             $params = $loginfaileddefaultparams;
+             $params['other']['reason'] = 'token_expired';
+             $event = \core\event\webservice_login_failed::create($params);
+             $event->add_record_snapshot('external_tokens', $token);
+             $event->set_legacy_logdata(array(SITEID, 'webservice', get_string('tokenauthlog', 'webservice'), '',
+                 get_string('invalidtimedtoken', 'webservice'), 0));
+             $event->trigger();
              $DB->delete_records('external_tokens', array('token' => $token->token));
              throw new webservice_access_exception('Invalid token - token expired - check validuntil time for the token');
          }
  
          // Check ip
          if ($token->iprestriction and !address_in_subnet(getremoteaddr(), $token->iprestriction)) {
-             add_to_log(SITEID, 'webservice', get_string('tokenauthlog', 'webservice'), '', get_string('failedtolog', 'webservice') . ": " . getremoteaddr(), 0);
+             $params = $loginfaileddefaultparams;
+             $params['other']['reason'] = 'ip_restricted';
+             $event = \core\event\webservice_login_failed::create($params);
+             $event->add_record_snapshot('external_tokens', $token);
+             $event->set_legacy_logdata(array(SITEID, 'webservice', get_string('tokenauthlog', 'webservice'), '',
+                 get_string('failedtolog', 'webservice') . ": " . getremoteaddr(), 0));
+             $event->trigger();
              throw new webservice_access_exception('Invalid token - IP:' . getremoteaddr()
                      . ' is not supported');
          }
          enrol_check_plugins($user);
  
          // setup user session to check capability
 -        session_set_user($user);
 +        \core\session\manager::set_user($user);
  
          //assumes that if sid is set then there must be a valid associated session no matter the token type
          if ($token->sid) {
 -            $session = session_get_instance();
 -            if (!$session->session_exists($token->sid)) {
 +            if (!\core\session\manager::session_exists($token->sid)) {
                  $DB->delete_records('external_tokens', array('sid' => $token->sid));
                  throw new webservice_access_exception('Invalid session based token - session not found or expired');
              }
  
          //only confirmed user should be able to call web service
          if (empty($user->confirmed)) {
-             add_to_log(SITEID, 'webservice', 'user unconfirmed', '', $user->username);
+             $params = $loginfaileddefaultparams;
+             $params['other']['reason'] = 'user_unconfirmed';
+             $event = \core\event\webservice_login_failed::create($params);
+             $event->add_record_snapshot('external_tokens', $token);
+             $event->set_legacy_logdata(array(SITEID, 'webservice', 'user unconfirmed', '', $user->username));
+             $event->trigger();
              throw new moodle_exception('usernotconfirmed', 'moodle', '', $user->username);
          }
  
          //check the user is suspended
          if (!empty($user->suspended)) {
-             add_to_log(SITEID, 'webservice', 'user suspended', '', $user->username);
+             $params = $loginfaileddefaultparams;
+             $params['other']['reason'] = 'user_suspended';
+             $event = \core\event\webservice_login_failed::create($params);
+             $event->add_record_snapshot('external_tokens', $token);
+             $event->set_legacy_logdata(array(SITEID, 'webservice', 'user suspended', '', $user->username));
+             $event->trigger();
              throw new webservice_access_exception('Refused web service access for suspended username: ' . $user->username);
          }
  
          //check if the auth method is nologin (in this case refuse connection)
          if ($user->auth == 'nologin') {
-             add_to_log(SITEID, 'webservice', 'nologin auth attempt with web service', '', $user->username);
+             $params = $loginfaileddefaultparams;
+             $params['other']['reason'] = 'nologin';
+             $event = \core\event\webservice_login_failed::create($params);
+             $event->add_record_snapshot('external_tokens', $token);
+             $event->set_legacy_logdata(array(SITEID, 'webservice', 'nologin auth attempt with web service', '', $user->username));
+             $event->trigger();
              throw new webservice_access_exception('Refused web service access for nologin authentication username: ' . $user->username);
          }
  
          if (!empty($auth->config->expiration) and $auth->config->expiration == 1) {
              $days2expire = $auth->password_expire($user->username);
              if (intval($days2expire) < 0) {
-                 add_to_log(SITEID, 'webservice', 'expired password', '', $user->username);
+                 $params = $loginfaileddefaultparams;
+                 $params['other']['reason'] = 'password_expired';
+                 $event = \core\event\webservice_login_failed::create($params);
+                 $event->add_record_snapshot('external_tokens', $token);
+                 $event->set_legacy_logdata(array(SITEID, 'webservice', 'expired password', '', $user->username));
+                 $event->trigger();
                  throw new moodle_exception('passwordisexpired', 'webservice');
              }
          }
@@@ -822,6 -863,15 +862,15 @@@ abstract class webservice_server implem
              throw new coding_exception('Cookies must be disabled in WS servers!');
          }
  
+         $loginfaileddefaultparams = array(
+             'context' => context_system::instance(),
+             'other' => array(
+                 'method' => $this->authmethod,
+                 'reason' => null,
+                 'token' => $this->token
+             )
+         );
          if ($this->authmethod == WEBSERVICE_AUTHMETHOD_USERNAME) {
  
              //we check that authentication plugin is enabled
              }
  
              if (!$auth->user_login_webservice($this->username, $this->password)) {
-                 // log failed login attempts
-                 add_to_log(SITEID, 'webservice', get_string('simpleauthlog', 'webservice'), '' , get_string('failedtolog', 'webservice').": ".$this->username."/".$this->password." - ".getremoteaddr() , 0);
+                 // Log failed login attempts.
+                 $params = $loginfaileddefaultparams;
+                 $params['other']['reason'] = 'password';
+                 $params['other']['username'] = $this->username;
+                 $event = \core\event\webservice_login_failed::create($params);
+                 $event->set_legacy_logdata(array(SITEID, 'webservice', get_string('simpleauthlog', 'webservice'), '' ,
+                     get_string('failedtolog', 'webservice').": ".$this->username."/".$this->password." - ".getremoteaddr() , 0));
+                 $event->trigger();
                  throw new moodle_exception('wrongusernamepassword', 'webservice');
              }
  
  
          //only confirmed user should be able to call web service
          if (!empty($user->deleted)) {
-             add_to_log(SITEID, '', '', '', get_string('wsaccessuserdeleted', 'webservice', $user->username) . " - ".getremoteaddr(), 0, $user->id);
+             $params = $loginfaileddefaultparams;
+             $params['other']['reason'] = 'user_deleted';
+             $params['other']['username'] = $user->username;
+             $event = \core\event\webservice_login_failed::create($params);
+             $event->set_legacy_logdata(array(SITEID, '', '', '', get_string('wsaccessuserdeleted', 'webservice',
+                 $user->username) . " - ".getremoteaddr(), 0, $user->id));
+             $event->trigger();
              throw new webservice_access_exception('Refused web service access for deleted username: ' . $user->username);
          }
  
          //only confirmed user should be able to call web service
          if (empty($user->confirmed)) {
-             add_to_log(SITEID, '', '', '', get_string('wsaccessuserunconfirmed', 'webservice', $user->username) . " - ".getremoteaddr(), 0, $user->id);
+             $params = $loginfaileddefaultparams;
+             $params['other']['reason'] = 'user_unconfirmed';
+             $params['other']['username'] = $user->username;
+             $event = \core\event\webservice_login_failed::create($params);
+             $event->set_legacy_logdata(array(SITEID, '', '', '', get_string('wsaccessuserunconfirmed', 'webservice',
+                 $user->username) . " - ".getremoteaddr(), 0, $user->id));
+             $event->trigger();
              throw new moodle_exception('wsaccessuserunconfirmed', 'webservice', '', $user->username);
          }
  
          //check the user is suspended
          if (!empty($user->suspended)) {
-             add_to_log(SITEID, '', '', '', get_string('wsaccessusersuspended', 'webservice', $user->username) . " - ".getremoteaddr(), 0, $user->id);
+             $params = $loginfaileddefaultparams;
+             $params['other']['reason'] = 'user_unconfirmed';
+             $params['other']['username'] = $user->username;
+             $event = \core\event\webservice_login_failed::create($params);
+             $event->set_legacy_logdata(array(SITEID, '', '', '', get_string('wsaccessusersuspended', 'webservice',
+                 $user->username) . " - ".getremoteaddr(), 0, $user->id));
+             $event->trigger();
              throw new webservice_access_exception('Refused web service access for suspended username: ' . $user->username);
          }
  
          if (!empty($auth->config->expiration) and $auth->config->expiration == 1) {
              $days2expire = $auth->password_expire($user->username);
              if (intval($days2expire) < 0 ) {
-                 add_to_log(SITEID, '', '', '', get_string('wsaccessuserexpired', 'webservice', $user->username) . " - ".getremoteaddr(), 0, $user->id);
+                 $params = $loginfaileddefaultparams;
+                 $params['other']['reason'] = 'password_expired';
+                 $params['other']['username'] = $user->username;
+                 $event = \core\event\webservice_login_failed::create($params);
+                 $event->set_legacy_logdata(array(SITEID, '', '', '', get_string('wsaccessuserexpired', 'webservice',
+                     $user->username) . " - ".getremoteaddr(), 0, $user->id));
+                 $event->trigger();
                  throw new webservice_access_exception('Refused web service access for password expired username: ' . $user->username);
              }
          }
  
          //check if the auth method is nologin (in this case refuse connection)
          if ($user->auth=='nologin') {
-             add_to_log(SITEID, '', '', '', get_string('wsaccessusernologin', 'webservice', $user->username) . " - ".getremoteaddr(), 0, $user->id);
+             $params = $loginfaileddefaultparams;
+             $params['other']['reason'] = 'login';
+             $params['other']['username'] = $user->username;
+             $event = \core\event\webservice_login_failed::create($params);
+             $event->set_legacy_logdata(array(SITEID, '', '', '', get_string('wsaccessusernologin', 'webservice',
+                 $user->username) . " - ".getremoteaddr(), 0, $user->id));
+             $event->trigger();
              throw new webservice_access_exception('Refused web service access for nologin authentication username: ' . $user->username);
          }
  
          // now fake user login, the session is completely empty too
          enrol_check_plugins($user);
 -        session_set_user($user);
 +        \core\session\manager::set_user($user);
          $this->userid = $user->id;
  
          if ($this->authmethod != WEBSERVICE_AUTHMETHOD_SESSION_TOKEN && !has_capability("webservice/$this->wsname:use", $this->restricted_context)) {
       */
      protected function authenticate_by_token($tokentype){
          global $DB;
+         $loginfaileddefaultparams = array(
+             'context' => context_system::instance(),
+             'other' => array(
+                 'method' => $this->authmethod,
+                 'reason' => null,
+                 'token' => $this->token
+             )
+         );
          if (!$token = $DB->get_record('external_tokens', array('token'=>$this->token, 'tokentype'=>$tokentype))) {
-             // log failed login attempts
-             add_to_log(SITEID, 'webservice', get_string('tokenauthlog', 'webservice'), '' , get_string('failedtolog', 'webservice').": ".$this->token. " - ".getremoteaddr() , 0);
+             // Log failed login attempts.
+             $params = $loginfaileddefaultparams;
+             $params['other']['reason'] = 'invalid_token';
+             $event = \core\event\webservice_login_failed::create($params);
+             $event->set_legacy_logdata(array(SITEID, 'webservice', get_string('tokenauthlog', 'webservice'), '' ,
+                 get_string('failedtolog', 'webservice').": ".$this->token. " - ".getremoteaddr() , 0));
+             $event->trigger();
              throw new moodle_exception('invalidtoken', 'webservice');
          }
  
          }
  
          if ($token->sid){//assumes that if sid is set then there must be a valid associated session no matter the token type
 -            $session = session_get_instance();
 -            if (!$session->session_exists($token->sid)){
 +            if (!\core\session\manager::session_exists($token->sid)){
                  $DB->delete_records('external_tokens', array('sid'=>$token->sid));
                  throw new webservice_access_exception('Invalid session based token - session not found or expired');
              }
          }
  
          if ($token->iprestriction and !address_in_subnet(getremoteaddr(), $token->iprestriction)) {
-             add_to_log(SITEID, 'webservice', get_string('tokenauthlog', 'webservice'), '' , get_string('failedtolog', 'webservice').": ".getremoteaddr() , 0);
+             $params = $loginfaileddefaultparams;
+             $params['other']['reason'] = 'ip_restricted';
+             $params['other']['tokenid'] = $token->id;
+             $event = \core\event\webservice_login_failed::create($params);
+             $event->add_record_snapshot('external_tokens', $token);
+             $event->set_legacy_logdata(array(SITEID, 'webservice', get_string('tokenauthlog', 'webservice'), '' ,
+                 get_string('failedtolog', 'webservice').": ".getremoteaddr() , 0));
+             $event->trigger();
              throw new webservice_access_exception('Invalid service - IP:' . getremoteaddr()
                      . ' is not supported - check this allowed user');
          }
@@@ -1055,8 -1166,15 +1164,15 @@@ abstract class webservice_zend_server e
          // tell server what functions are available
          $this->zend_server->setClass($this->service_class);
  
-         //log the web service request
-         add_to_log(SITEID, 'webservice', '', '' , $this->zend_class." ".getremoteaddr() , 0, $this->userid);
+         // Log the web service request.
+         $params = array(
+             'other' => array(
+                 'function' => 'unknown'
+             )
+         );
+         $event = \core\event\webservice_function_called::create($params);
+         $event->set_legacy_logdata(array(SITEID, 'webservice', '', '', $this->zend_class.' '.getremoteaddr(), 0, $this->userid));
+         $event->trigger();
  
          //send headers
          $this->send_headers();
@@@ -1516,8 -1634,15 +1632,15 @@@ abstract class webservice_base_server e
          // find all needed function info and make sure user may actually execute the function
          $this->load_function_info();
  
-         //log the web service request
-         add_to_log(SITEID, 'webservice', $this->functionname, '' , getremoteaddr() , 0, $this->userid);
+         // Log the web service request.
+         $params = array(
+             'other' => array(
+                 'function' => $this->functionname
+             )
+         );
+         $event = \core\event\webservice_function_called::create($params);
+         $event->set_legacy_logdata(array(SITEID, 'webservice', $this->functionname, '' , getremoteaddr() , 0, $this->userid));
+         $event->trigger();
  
          // finally, execute the function - any errors are catched by the default exception handler
          $this->execute();