linker.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. <?php
  2. /**
  3. * LoginZone linker script.
  4. *
  5. * Allows an in-world LoginZone to communicate with the main server
  6. *
  7. * @package sloodleregenrol
  8. * @copyright Copyright (c) 2007 Sloodle (various contributors)
  9. * @license http://www.gnu.org/licenses/gpl-3.0.html GNU GPL v3
  10. *
  11. * @contributor Edmund Edgar
  12. * @contributor Peter R. Bloomfield
  13. *
  14. */
  15. // This script is expected to be accessed by objects from in-world.
  16. // The following parameters are required at all times:
  17. //
  18. // sloodlecontrollerid = integer ID of a Sloodle controller
  19. // sloodlepwd = password for authentication
  20. //
  21. // There are two modes of operation.
  22. // In Mode 1, a LoginZone is reporting its own size and position. That requires the following parameters:
  23. //
  24. // sloodlepos = a vector "<x,y,z>" indicating the position of the loginzone
  25. // sloodlesize = a vector "<x,y,z>" indicating the size of the loginzone
  26. // sloodleregion = the name of the region where the loginzone is located
  27. //
  28. // In Mode 2, a LoginZone is reporting that a user has teleported in to authenticate their avatar, requiring the following parameters:
  29. //
  30. // sloodlepos = the position at which the avatar has appeared
  31. // sloodleavname = the name of the avatar
  32. // sloodleuuid = the UUID of the avatar
  33. //
  34. // ***** Note: the script assumes Mode 2 if either the avatar name or the UUID is specified *****
  35. // In either mode, the success response status code will be 1 ("OK").
  36. // Various errors codes may also be used.
  37. // The avatar UUID (if specified) will be returned in the request for Mode 2, according to the communications specification.
  38. /** Get the Sloodle configuration. */
  39. require_once('../../init.php');
  40. /** Get the Sloodle API. */
  41. require_once(SLOODLE_LIBROOT.'/sloodle_session.php');
  42. // Start handling the request
  43. $sloodle = new SloodleSession();
  44. $sloodle->authenticate_request();
  45. // Are we using Mode 1?
  46. if ($sloodle->request->get_avatar_name(false) == null && $sloodle->request->get_avatar_uuid(false) == null) {
  47. // Mode 1
  48. // We require therefore that position, size and region are all specified
  49. $sloodlepos = $sloodle->request->required_param('sloodlepos', PARAM_TEXT);
  50. $sloodlesize = $sloodle->request->required_param('sloodlesize', PARAM_TEXT);
  51. $sloodleregion = $sloodle->request->required_param('sloodleregion', PARAM_TEXT);
  52. // Remove the decimal places
  53. $sloodlepos = sloodle_round_vector($sloodlepos);
  54. $sloodlesize = sloodle_round_vector($sloodlesize);
  55. // Add all the data
  56. $sloodle->course->set_loginzone_position($sloodlepos);
  57. $sloodle->course->set_loginzone_size($sloodlesize);
  58. $sloodle->course->set_loginzone_region($sloodleregion);
  59. $sloodle->course->set_loginzone_time_updated();
  60. // Attempt to update the database
  61. if ($sloodle->course->write()) {
  62. $sloodle->response->set_status_code(1);
  63. $sloodle->response->set_status_descriptor('OK');
  64. } else {
  65. $sloodle->response->set_status_code(-101);
  66. $sloodle->response->set_status_descriptor('SYSTEM');
  67. $sloodle->response->add_data_line('Failed to store LoginZone data');
  68. }
  69. } else {
  70. // Mode 2
  71. // We require therefore that position is specified
  72. $sloodlepos = $sloodle->request->required_param('sloodlepos', PARAM_TEXT);
  73. // Remove the decimal places
  74. $sloodlepos = sloodle_round_vector($sloodlepos);
  75. // Make sure the avatar name and UUID were specified
  76. $sloodleuuid = $sloodle->request->get_avatar_uuid();
  77. $sloodleavname = $sloodle->request->get_avatar_name();
  78. // Check to see if the user identified in the request is already in the database
  79. $sloodle_user_exists = $sloodle->user->load_avatar($sloodleuuid, $sloodleavname);
  80. if ($sloodle_user_exists) {
  81. // Nothing we need to do - just stop here
  82. $sloodle->response->set_status_code(301);
  83. $sloodle->response->set_status_descriptor('MISC_REGISTER');
  84. $sloodle->response->add_data_line('Avatar already registered');
  85. $sloodle->response->render_to_output();
  86. exit();
  87. }
  88. // Attempt to find the Sloodle user specified by login position in the request
  89. if ($sloodle->course->load_user_by_loginzone($sloodlepos, $sloodle->user)) {
  90. // Success
  91. // Make sure the user has permission to register their avatar
  92. $sloodle->user->login();
  93. if (!has_capability('mod/sloodle:registeravatar', get_context_instance(CONTEXT_SYSTEM))) {
  94. $sloodle->response->set_status_code(-331);
  95. $sloodle->response->set_status_descriptor('USER_AUTH');
  96. $sloodle->response->add_data_line('User does not have permission to register an avatar.');
  97. } else {
  98. // Add the avatar to our database
  99. if ($sloodle->user->add_linked_avatar($sloodle->user->get_user_id(), $sloodleuuid, $sloodleavname)) {
  100. // Delete the LoginZone allocation now
  101. $sloodle->course->delete_loginzone_allocation($sloodle->user);
  102. // We've been successful
  103. $sloodle->response->set_status_code(1);
  104. $sloodle->response->set_status_descriptor('OK');
  105. } else {
  106. // Failed to add the avatar
  107. $sloodle->response->set_status_code(-102);
  108. $sloodle->response->set_status_descriptor('SYSTEM');
  109. $sloodle->response->add_data_line('Failed to add avatar to database');
  110. }
  111. }
  112. } else {
  113. // Report the problem back in the response
  114. $sloodle->response->set_status_code(-301);
  115. $sloodle->response->set_status_descriptor('USER_AUTH');
  116. $sloodle->response->add_data_line('No user found with specified Login Position.');
  117. }
  118. }
  119. // Output the response
  120. sloodle_debug("<pre>");
  121. $sloodle->response->render_to_output();
  122. sloodle_debug("</pre>");
  123. exit();
  124. ?>