diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md index 0995c6364661c790956d4742d8c0b134ee3c6188..e445acae7e1ccc15a615084113f18d17a78a5872 100644 --- a/RELEASE-NOTES.md +++ b/RELEASE-NOTES.md @@ -59,6 +59,7 @@ - Die Klasse `AuxLockRules` wurde ausgebaut. ([Issue #4187](https://gitlab.studip.de/studip/studip/-/issues/4187)) - Die Klasse `ProfileModel` wurde gelöscht. Die darin enthaltenen Methoden wurden in den `Profile_Controller` verschoben. ([Issue #4185]https://gitlab.studip.de/studip/studip/-/issues/4185)) - Die Klasse `StudipTransformFormat` wurde ausgebaut ([Issue #4188](https://gitlab.studip.de/studip/studip/-/issues/4188)) +- Die REST-API (`public/api.php`) wurde zu Stud.IP 5.0 deprecated und nun mit Stud.IP 6.0 entfernt. Als Ersatz steht die JSONAPI zur Verfügung. ([Issue #2798](https://gitlab.studip.de/studip/studip/-/issues/2798)) ## Security related issues diff --git a/app/controllers/activityfeed.php b/app/controllers/activityfeed.php index 8e81912b32fd95716f8226868534b3852a8dced3..ee838261b7878b5b3d05ccfe33e926f643389c51 100644 --- a/app/controllers/activityfeed.php +++ b/app/controllers/activityfeed.php @@ -92,4 +92,193 @@ class ActivityfeedController extends AuthenticatedController PageLayout::setTitle(_('Aktivitäten konfigurieren')); } + + public function load_action(): void + { + $user = User::findCurrent(); + + // failsafe einbauen - falls es keine älteren Aktivitäten mehr im System gibt, Abbruch! + + $oldest_activity = \Studip\Activity\Activity::getOldestActivity(); + $max_age = $oldest_activity ? $oldest_activity->mkdate : time(); + + + $contexts = []; + + // create system context + $system_context = new \Studip\Activity\SystemContext($user); + $contexts[] = $system_context; + + $contexts[] = new \Studip\Activity\UserContext($user, $user); + $user->contacts->each(function ($another_user) use (&$contexts, $user) { + $contexts[] = new \Studip\Activity\UserContext($another_user, $user); + }); + + if (!in_array($user->perms, ['admin','root'])) { + // create courses and institutes context + foreach (\Course::findMany($user->course_memberships->pluck('seminar_id')) as $course) { + $contexts[] = new \Studip\Activity\CourseContext($course, $user); + } + foreach (\Institute::findMany($user->institute_memberships->pluck('institut_id')) as $institute) { + $contexts[] = new \Studip\Activity\InstituteContext($institute, $user); + } + } + + + // add filters + $filter = new \Studip\Activity\Filter(); + + $start = Request::int('start', strtotime('yesterday')); + $end = Request::int('end', time()); + + + $scrollfrom = Request::int('scrollfrom', false); + $filtertype = Request::get('filtertype', ''); + + $objectType = Request::get('object_type'); + $filter->setObjectType($objectType); + + $objectId = Request::get('object_id'); + $filter->setObjectId($objectId); + + $context = Request::get('context_type'); + $filter->setContext($context); + + $contextId = Request::get('context_id'); + $filter->setContextId($contextId); + + if (!empty($filtertype)) { + $filter->setType(json_decode($filtertype)); + } + + if ($scrollfrom) { + // shorten "watch-window" by one second to prevent duplication of activities + $scrollfrom -= 1; + + if ($scrollfrom > $max_age){ + $end = $scrollfrom; + $start = strtotime('yesterday', $end); + $data = []; + + $backtrack = 1; + + while (empty($data)) { + $filter->setStartDate($start); + $filter->setEndDate($end); + + $data = $this->getStreamData($contexts, $filter); + + if ($start < $max_age) { + break; + } + + // move "watch-window" back one day at a time + $end = $start - 1; + $start = strtotime("-{$backtrack} days", $start); + + // enforce maximum "watch-window", currently 2 weeks + $backtrack = min(14, $backtrack + 1); + } + } else { + $data = false; + } + } else { + $filter->setStartDate($start); + $filter->setEndDate($end); + $data = $this->getStreamData($contexts, $filter); + } + + // set etag for preventing resending the same stuff over and over again + $etag = md5(serialize($data)); + $this->response->add_header('ETag', '"' . $etag . '"'); + if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && $this->etagMatches($etag, $_SERVER['HTTP_IF_NONE_MATCH'])) { + $this->set_status(304); + $this->render_nothing(); + return; + } + if (isset($_SERVER['HTTP_IF_MATCH']) && !$this->etagMatches($etag, $_SERVER['HTTP_IF_MATCH'])) { + $this->set_status(412); + $this->render_nothing(); + return; + } + + $this->render_json($data); + } + + /** + * private helper function to get stream data for given contexts and filter + * + * @param $contexts + * @param $filter + * @return array + */ + + private function getStreamData($contexts, $filter): array + { + $stream = new Studip\Activity\Stream($contexts, $filter); + $data = $stream->toArray(); + + foreach ($data as $key => $act) { + $actor = [ + 'type' => $act['actor_type'], + 'id' => $act['actor_id'], + ]; + + if ($act['actor_type'] == 'user') { + $a_user = \User::findFull($act['actor_id']); + $actor['details'] = $this->getMiniUser($a_user ?: new \User()); + } elseif ($act['actor_type'] === 'anonymous') { + $actor['details'] = [ + 'name' => _('Anonym'), + ]; + } + + unset($data[$key]['actor_type']); + unset($data[$key]['actor_id']); + + $data[$key]['actor'] = $actor; + } + + return $data; + } + + private function getMiniUser(User $user): array + { + $avatar = \Avatar::getAvatar($user->id); + + return [ + 'id' => $user->id, + 'name' => $this->getNamesOfUser($user), + 'avatar_small' => $avatar->getURL(\Avatar::SMALL), + 'avatar_medium' => $avatar->getURL(\Avatar::MEDIUM), + 'avatar_normal' => $avatar->getURL(\Avatar::NORMAL), + 'avatar_original' => $avatar->getURL(\Avatar::NORMAL) + ]; + } + + private function getNamesOfUser(User $user): array + { + return [ + 'username' => $user->username, + 'formatted' => $user->getFullName(), + 'family' => $user->nachname, + 'given' => $user->vorname, + 'prefix' => $user->title_front, + 'suffix' => $user->title_rear, + ]; + } + + // Helper method checking if a ETag value list includes the current ETag. + private function etagMatches(string $etag, string $list) + { + if ($list === '*') { + return true; + } + + return in_array( + $etag, + preg_split('/\s*,\s*/', $list) + ); + } + } diff --git a/app/controllers/admin/api.php b/app/controllers/admin/api.php deleted file mode 100644 index 96adb651bbfd0d75033ead261c31483925cea112..0000000000000000000000000000000000000000 --- a/app/controllers/admin/api.php +++ /dev/null @@ -1,210 +0,0 @@ -<?php -/** - * - **/ -class Admin_ApiController extends AuthenticatedController -{ - /** - * - **/ - public function before_filter(&$action, &$args) - { - parent::before_filter($action, $args); - - require_once 'lib/bootstrap-api.php'; - - $GLOBALS['perm']->check('root'); - - Navigation::activateItem('/admin/config/api'); - PageLayout::setTitle(_('API Verwaltung')); - - $this->types = [ - 'website' => _('Website'), - 'desktop' => _('Herkömmliches Desktopprogramm'), - 'mobile' => _('Mobile App') - ]; - - // Sidebar - $views = new ViewsWidget(); - $views->addLink(_('Registrierte Applikationen'), - $this->url_for('admin/api')) - ->setActive($action === 'index'); - $views->addLink(_('Globale Zugriffseinstellungen'), - $this->url_for('admin/api/permissions')) - ->setActive($action == 'permissions'); - $views->addLink(_('Konfiguration'), - $this->url_for('admin/api/config')) - ->setActive($action == 'config'); - Sidebar::get()->addWidget($views); - - $actions = new ActionsWidget(); - $actions->addLink(_('Neue Applikation registrieren'), - $this->url_for('admin/api/edit'), - Icon::create('add', 'clickable')) - ->asDialog(); - Sidebar::get()->addWidget($actions); - } - - /** - * - **/ - public function index_action() - { - $this->consumers = RESTAPI\Consumer\Base::findAll(); - $this->routes = RESTAPI\Router::getInstance()->getRoutes(true); - } - - /** - * - **/ - public function render_keys($id) - { - $consumer = RESTAPI\Consumer\Base::find($id); - - return [ - 'Consumer Key = ' . $consumer->auth_key, - 'Consumer Secret = ' . $consumer->auth_secret, - ]; - } - - /** - * - **/ - public function keys_action($id) - { - $details = $this->render_keys($id); - - if (Request::isXhr()) { - $this->render_text(implode('<br>', $details)); - } else { - PageLayout::postMessage(MessageBox::info(_('Die Schlüssel in den Details dieser Meldung sollten vertraulich behandelt werden!'), $details, true)); - $this->redirect('admin/api/#' . $id); - } - } - - /** - * - **/ - public function edit_action($id = null) - { - $consumer = $id - ? RESTAPI\Consumer\Base::find($id) - : RESTAPI\Consumer\Base::create(Request::option('consumer_type') ?: 'oauth'); - - if (Request::submitted('store')) { - $errors = []; - - $consumer->active = (bool) Request::int('active'); - $consumer->title = Request::get('title'); - $consumer->contact = Request::get('contact'); - $consumer->email = Request::get('email'); - $consumer->callback = Request::get('callback'); - $consumer->url = Request::get('url'); - $consumer->type = Request::get('type') ?: null; - $consumer->commercial = Request::int('commercial'); - $consumer->notes = Request::get('notes'); - $consumer->description = Request::get('description'); - - if (!empty($errors)) { - $message = MessageBox::error(_('Folgende Fehler sind aufgetreten:'), $errors); - PageLayout::postMessage($message); - return; - } - - $consumer->store(); - - if ($id) { - $message = MessageBox::success(_('Die Applikation wurde erfolgreich gespeichert.')); - } else { - $details = $this->render_keys($consumer->id); - $message = MessageBox::success(_('Die Applikation wurde erfolgreich erstellt, die Schlüssel finden Sie in den Details dieser Meldung.'), $details, true); - } - PageLayout::postMessage($message); - $this->redirect('admin/api/index#' . $consumer->id); - return; - } - - $this->consumer = $consumer; - $this->id = $id; - } - - /** - * - **/ - public function toggle_action($id, $state = null) - { - $consumer = RESTAPI\Consumer\Base::find($id); - - $consumer->active = $state === null ? !$consumer->active : ($state === 'on'); - $consumer->store(); - - $message = $state - ? _('Die Applikation wurde erfolgreich aktiviert.') - : _('Die Applikation wurde erfolgreich deaktiviert.'); - - PageLayout::postMessage(MessageBox::success($message)); - $this->redirect('admin/api/#' . $consumer->id); - } - - /** - * - **/ - public function delete_action($id) - { - if (!Request::isPost()) { - throw new MethodNotAllowedException(); - } - if ($consumer = RESTAPI\Consumer\Base::find($id)) { - $consumer->delete(); - - PageLayout::postSuccess(_('Die Applikation wurde erfolgreich gelöscht.')); - } - $this->redirect('admin/api'); - } - - /** - * - **/ - public function permissions_action($consumer_id = null) - { - if (Request::submitted('store')) { - $perms = Request::getArray('permission'); - $permissions = RESTAPI\ConsumerPermissions::get($consumer_id ?: 'global'); - - foreach ($perms as $route => $methods) { - foreach ($methods as $method => $granted) { - $permissions->set(urldecode($route), urldecode($method), (bool)$granted, true); - } - } - - $permissions->store(); - - PageLayout::postMessage(MessageBox::success(_('Die Zugriffsberechtigungen wurden erfolgreich gespeichert'))); - $this->redirect($consumer_id ? 'admin/api' : 'admin/api/permissions'); - return; - } - - $title = $consumer_id ? _('Zugriffsberechtigungen') : _('Globale Zugriffsberechtigungen'); - $title .= ' - ' . PageLayout::getTitle(); - PageLayout::setTitle($title); - - $this->consumer_id = $consumer_id; - $this->router = RESTAPI\Router::getInstance(); - $this->routes = $this->router->getRoutes(true, false); - $this->permissions = RESTAPI\ConsumerPermissions::get($consumer_id ?: 'global'); - $this->global = $consumer_id ? RESTAPI\ConsumerPermissions::get('global') : false; - } - - public function config_action() - { - $this->config = Config::get(); - - if (Request::isPost()) { - $this->config->store('API_ENABLED', Request::int('active', 0)); - $this->config->store('API_OAUTH_AUTH_PLUGIN', Request::option('auth')); - - PageLayout::postMessage(MessageBox::success(_('Die Einstellungen wurden gespeichert.'))); - $this->redirect('admin/api/config'); - } - } -} diff --git a/app/controllers/api/authorizations.php b/app/controllers/api/authorizations.php deleted file mode 100644 index 543bc7951cb7a4fb6b8c6ac12eb435b8ad0888a4..0000000000000000000000000000000000000000 --- a/app/controllers/api/authorizations.php +++ /dev/null @@ -1,58 +0,0 @@ -<?php - -require_once 'lib/bootstrap-api.php'; - -/** -* @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - **/ -class Api_AuthorizationsController extends AuthenticatedController -{ - /** - * - **/ - public function before_filter(&$action, &$args) - { - parent::before_filter($action, $args); - - $GLOBALS['perm']->check('autor'); - - Navigation::activateItem('/profile/settings/api'); - PageLayout::setTitle(_('Applikationen')); - - $this->types = [ - 'website' => _('Website'), - 'program' => _('Herkömmliches Desktopprogramm'), - 'app' => _('Mobile App') - ]; - } - - /** - * - **/ - public function index_action() - { - $this->consumers = RESTAPI\UserPermissions::get($GLOBALS['user']->id)->getConsumers(); - $this->types = [ - 'website' => _('Website'), - 'program' => _('Herkömmliches Desktopprogramm'), - 'app' => _('Mobile App') - ]; - - $widget = new SidebarWidget(); - $widget->setTitle(_('Informationen')); - $widget->addElement(new WidgetElement(_('Dies sind die Apps, die Zugriff auf Ihren Account haben.'))); - Sidebar::Get()->addWidget($widget); - } - - /** - * - **/ - public function revoke_action($id) - { - $consumer = new RESTAPI\Consumer\OAuth($id); - $consumer->revokeAccess($GLOBALS['user']->id); - - PageLayout::postMessage(MessageBox::success(_('Der Applikation wurde der Zugriff auf Ihre Daten untersagt.'))); - $this->redirect('api/authorizations'); - } -} diff --git a/app/controllers/api/oauth.php b/app/controllers/api/oauth.php deleted file mode 100644 index bc80c9004c47482c842a0d9b851a926f001436e2..0000000000000000000000000000000000000000 --- a/app/controllers/api/oauth.php +++ /dev/null @@ -1,113 +0,0 @@ -<?php - -require_once 'lib/bootstrap-api.php'; - -/** - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - **/ -class Api_OauthController extends StudipController -{ - /** - * - **/ - public function before_filter(&$action, &$args) - { - parent::before_filter($action, $args); - - # initialize Stud.IP-Session - page_open(['sess' => 'Seminar_Session', - 'auth' => 'Seminar_Default_Auth', - 'perm' => 'Seminar_Perm', - 'user' => 'Seminar_User']); - - $this->set_layout(null); - } - - /** - * - **/ - public function index_action() - { - $this->render_text('TODO'); - } - - /** - * - **/ - public function request_token_action() - { - $server = new OAuthServer(); - $token = $server->requestToken(); - - $this->response->headers = []; - $this->render_nothing(); - } - - /** - * - **/ - public function authorize_action() - { - global $user, $auth; - - $auth_plugin = Config::get()->API_OAUTH_AUTH_PLUGIN; - if ($GLOBALS['user']->id === 'nobody' && $auth_plugin !== 'Standard' && !Request::option('sso')) { - $params = $_GET; - $params['sso'] = strtolower($auth_plugin); - $this->redirect($this->url_for('api/oauth/authorize?' . http_build_query($params))); - return; - } else { - $auth->login_if($user->id === 'nobody'); - } - - $user_id = RESTAPI\Consumer\OAuth::getOAuthId($GLOBALS['user']->id); - - try { - $consumer = RESTAPI\Consumer\Base::detectConsumer('oauth', 'request'); - if (!$consumer) { - $this->response->set_status(400, 'No consumer detected'); - $this->render_nothing(); - return; - } - - if (Request::submitted('allow')) { - $result = $consumer->grantAccess($GLOBALS['user']->id); - - $redirect_uri = Request::get('oauth_callback', $consumer->callback); - - if ($redirect_uri) { - $this->redirect($redirect_uri); - } else { - // No oauth_callback, show the user the result of the authorization - // ** your code here ** - PageLayout::postMessage(MessageBox::success(_('Sie haben der Applikation Zugriff auf Ihre Daten gewährt.'))); - $this->redirect('api/authorizations#' . $consumer->auth_key); - } - return; - } - } catch (OAuthException2 $e) { - // No token to be verified in the request, show a page where the user can enter the token to be verified - // **your code here** - die('invalid'); - } - - PageLayout::disableHeader(); - PageLayout::setTitle(sprintf(_('"%s" bittet um Zugriff'), $consumer->title)); - $this->set_layout($GLOBALS['template_factory']->open('layouts/base.php')); - $this->consumer = $consumer; - $this->token = Request::option('oauth_token'); - $this->oauth_callback = Request::get('oauth_callback'); - } - - /** - * - **/ - public function access_token_action() - { - $server = new OAuthServer(); - $server->accessToken(); - - $this->response->headers = []; - $this->render_nothing(); - } -} diff --git a/app/controllers/resources/ajax.php b/app/controllers/resources/ajax.php index 998acaf5b21cd0f75557783c4d9a250f5e195adb..cffd87837086cb810a2a420f95d8b59d90ad81c8 100644 --- a/app/controllers/resources/ajax.php +++ b/app/controllers/resources/ajax.php @@ -16,22 +16,22 @@ class Resources_AjaxController extends AuthenticatedController { public function toggle_marked_action($request_id) { - $request = \ResourceRequest::find($request_id); + $request = ResourceRequest::find($request_id); if (!$request) { throw new Exception('Resource request object not found!'); } - $current_user = \User::findCurrent(); + $current_user = User::findCurrent(); if ($request->isReadOnlyForUser($current_user)) { - throw new \AccessDeniedException(); + throw new AccessDeniedException(); } //Switch to the next marking state or return to the unmarked state //if the next marking state would be after the last defined //marking state. - $request->marked = ($request->marked + 1) % \ResourceRequest::MARKING_STATES; + $request->marked = ($request->marked + 1) % ResourceRequest::MARKING_STATES; $request->store(); $this->render_json($request->toArray()); @@ -39,46 +39,46 @@ class Resources_AjaxController extends AuthenticatedController public function get_resource_booking_intervals_action($booking_id) { - $booking = \ResourceBooking::find($booking_id); + $booking = ResourceBooking::find($booking_id); if (!$booking) { throw new Exception('Resource booking object not found!'); } $resource = $booking->resource->getDerivedClassInstance(); - if (!$resource->bookingPlanVisibleForUser(\User::findCurrent())) { - throw new \AccessDeniedException(); + if (!$resource->bookingPlanVisibleForUser(User::findCurrent())) { + throw new AccessDeniedException(); } //Get begin and end: - $begin_str = \Request::get('begin'); - $end_str = \Request::get('end'); + $begin_str = Request::get('begin'); + $end_str = Request::get('end'); $begin = null; $end = null; if ($begin_str && $end_str) { //Try the ISO format first: YYYY-MM-DDTHH:MM:SS±ZZ:ZZ - $begin = \DateTime::createFromFormat(\DateTime::RFC3339, $begin_str); - $end = \DateTime::createFromFormat(\DateTime::RFC3339, $end_str); - if (!($begin instanceof \DateTime) || !($end instanceof \DateTime)) { - $tz = new \DateTime(); + $begin = DateTime::createFromFormat(DateTime::RFC3339, $begin_str); + $end = DateTime::createFromFormat(DateTime::RFC3339, $end_str); + if (!($begin instanceof DateTime) || !($end instanceof DateTime)) { + $tz = new DateTime(); $tz = $tz->getTimezone(); //Try the ISO format without timezone: - $begin = \DateTime::createFromFormat('Y-m-d\TH:i:s', $begin_str, $tz); - $end = \DateTime::createFromFormat('Y-m-d\TH:i:s', $end_str, $tz); + $begin = DateTime::createFromFormat('Y-m-d\TH:i:s', $begin_str, $tz); + $end = DateTime::createFromFormat('Y-m-d\TH:i:s', $end_str, $tz); } } $sql = "booking_id = :booking_id "; $sql_data = ['booking_id' => $booking->id]; - if ($begin instanceof \DateTime && $end instanceof \DateTime) { + if ($begin instanceof DateTime && $end instanceof DateTime) { $sql .= "AND begin >= :begin AND end <= :end "; $sql_data['begin'] = $begin->getTimestamp(); $sql_data['end'] = $end->getTimestamp(); } - if (\Request::submitted('exclude_cancelled_intervals')) { + if (Request::submitted('exclude_cancelled_intervals')) { $sql .= "AND takes_place = '1' "; } $sql .= "ORDER BY begin ASC, end ASC"; - $intervals = \ResourceBookingInterval::findBySql($sql, $sql_data); + $intervals = ResourceBookingInterval::findBySql($sql, $sql_data); $result = []; foreach ($intervals as $interval) { @@ -90,7 +90,7 @@ class Resources_AjaxController extends AuthenticatedController public function toggle_takes_place_field_action($interval_id) { - $interval = \ResourceBookingInterval::find($interval_id); + $interval = ResourceBookingInterval::find($interval_id); if (!$interval) { throw new Exception('ResourceBookingInterval object not found!'); } @@ -103,13 +103,13 @@ class Resources_AjaxController extends AuthenticatedController $resource = $resource->getDerivedClassInstance(); - if (!$resource->userHasPermission(\User::findCurrent(), 'autor', [$interval->begin, $interval->end])) { + if (!$resource->userHasPermission(User::findCurrent(), 'autor', [$interval->begin, $interval->end])) { throw new Exception('You do not have sufficient permissions to modify the interval!'); } if ( !$interval->takes_place - && $resource->isAssigned(new \DateTime('@' . $interval->begin), new \DateTime('@' . $interval->end)) + && $resource->isAssigned(new DateTime('@' . $interval->begin), new DateTime('@' . $interval->end)) ) { throw new Exception('Already booked'); } @@ -121,13 +121,14 @@ class Resources_AjaxController extends AuthenticatedController 'takes_place' => $interval->takes_place ]); } else { - throw new Exception('Error while storing the interval!'); + $this->set_status(500); + $this->render_text('Error while storing the interval!'); } } public function get_semester_booking_plan_action($resource_id) { - $resource = \Resource::find($resource_id); + $resource = Resource::find($resource_id); if (!$resource) { throw new Exception('Resource object not found!'); } @@ -143,8 +144,8 @@ class Resources_AjaxController extends AuthenticatedController $display_requests = Request::get('display_requests'); $display_all_requests = Request::get('display_all_requests'); - $begin = new \DateTime(); - $end = new \DateTime(); + $begin = new DateTime(); + $end = new DateTime(); $semester_id = Request::get('semester_id'); @@ -194,7 +195,7 @@ class Resources_AjaxController extends AuthenticatedController $requests_sql_params['user_id'] = $current_user->id; } - $requests = \ResourceRequest::findBySql( + $requests = ResourceRequest::findBySql( $requests_sql, $requests_sql_params ); @@ -207,7 +208,7 @@ class Resources_AjaxController extends AuthenticatedController $booking->resource = $resource; $irrelevant_booking = $booking->getRepetitionType() !== 'weekly' && ( - !\Request::get('display_single_bookings') + !Request::get('display_single_bookings') || $booking->end < strtotime('today') ); if ($booking->getAssignedUserType() === 'course' && in_array($booking->assigned_course_date->metadate_id, $meta_dates)) { @@ -261,7 +262,7 @@ class Resources_AjaxController extends AuthenticatedController $relevant_request = false; foreach ($requests as $request) { - if ($request->cycle instanceof \SeminarCycleDate) { + if ($request->cycle instanceof SeminarCycleDate) { $cycle_dates = $request->cycle->getAllDates(); foreach ($cycle_dates as $cycle_date) { $relevant_request = $semester->beginn <= $cycle_date->date @@ -488,7 +489,7 @@ class Resources_AjaxController extends AuthenticatedController $clipboard = Clipboard::find($clipboard_id); if (!empty($_SESSION['selected_clipboard_id'])) { - $clipboard = \Clipboard::find($_SESSION['selected_clipboard_id']); + $clipboard = Clipboard::find($_SESSION['selected_clipboard_id']); } if (!$clipboard) { throw new Exception('Clipboard object not found!'); @@ -497,7 +498,7 @@ class Resources_AjaxController extends AuthenticatedController //Permission check: if ($clipboard->user_id !== $current_user->id) { - throw new \AccessDeniedException(); + throw new AccessDeniedException(); } $display_requests = Request::bool('display_requests'); @@ -656,4 +657,186 @@ class Resources_AjaxController extends AuthenticatedController $this->render_json($data); } + + public function move_booking_action($booking_id): void + { + $booking = ResourceBooking::find($booking_id); + if (!$booking) { + $this->notFound('Resource booking object not found!'); + return; + } + + $current_user = User::findCurrent(); + + if ($booking->isReadOnlyForUser($current_user)) { + throw new AccessDeniedException(); + } + + $resource_id = Request::get('resource_id'); + $interval_id = Request::get('interval_id'); + + $begin = $this->convertDatetime(Request::get('begin')); + $end = $this->convertDatetime(Request::get('end')); + + //Check if a specific interval has been moved: + if ($interval_id) { + $interval = ResourceBookingInterval::findOneBySql( + 'interval_id = ? AND booking_id = ?', + [$interval_id, $booking->id] + ); + if (!$interval) { + $this->notFound('Resource booking interval not found!'); + return; + } + $interval_begin = new DateTime(); + $interval_begin->setTimestamp($interval->begin); + $interval_end = new DateTime(); + $interval_end->setTimestamp($interval->end); + + //Calculate the difference from the interval time range + //to the time range from the request. That difference + //is then applied to the booking. + $begin_diff = $interval_begin->diff($begin); + $end_diff = $interval_end->diff($end); + + $new_booking_begin = new DateTime(); + $new_booking_begin->setTimestamp($booking->begin); + $new_booking_end = new DateTime(); + $new_booking_end->setTimestamp($booking->end); + + $new_booking_begin = $new_booking_begin->add($begin_diff); + $new_booking_end = $new_booking_end->add($end_diff); + //We must substract the preparation time to the begin timestamp + //to get the real begin: + $real_begin = clone $new_booking_begin; + if ($booking->preparation_time > 0) { + $real_begin->sub(new DateInterval('PT' . ($booking->preparation_time / 60 ) . 'M')); + } + $booking->begin = $real_begin->getTimestamp(); + $booking->end = $new_booking_end->getTimestamp(); + } else { + //We must substract the preparation time to the begin timestamp + //to get the real begin: + $real_begin = clone $begin; + if ($booking->preparation_time > 0) { + $real_begin->sub(new DateInterval('PT' . ($booking->preparation_time / 60 ) . 'M')); + } + $booking->begin = $real_begin->getTimestamp(); + $booking->end = $end->getTimestamp(); + } + if ($resource_id) { + //The resource-ID has changed: + //The booking was moved from one resource to another. + $booking->resource_id = $resource_id; + } + + //Update the booking_user_id field: + $booking->booking_user_id = User::findCurrent()->id; + + try { + $booking->store(); + + if (Request::bool('quiet')) { + $this->render_nothing(); + } else { + $this->render_json($booking->toRawArray()); + } + } catch (Exception $e) { + $this->set_status(500); + $this->render_text($e->getMessage()); + } + } + + public function move_request_action($request_id): void + { + $request = ResourceRequest::find($request_id); + if (!$request) { + $this->notFound('Resource request object not found!'); + return; + } + + $current_user = User::findCurrent(); + + if ($request->isReadOnlyForUser($current_user)) { + throw new AccessDeniedException(); + } + + $request->begin = $this->convertDatetime(Request::get('begin')); + $request->end = $this->convertDatetime(Request::get('end')); + + try { + $request->store(); + $this->renderObject($request); + } catch (\Exception $e) { + $this->set_status(500); + $this->render_text($e->getMessage()); + } + } + + public function semester_week_action($timestamp) + { + $semester = \Semester::findByTimestamp($timestamp); + if (!$semester) { + $this->notFound('No semester found for given timestamp'); + throw new RecordNotFoundException(); + } + + $timestamp = strtotime('today', $timestamp); + $week_begin_timestamp = strtotime('monday this week', $semester->vorles_beginn); + $end_date = $semester->vorles_ende; + + $i = 0; + $result = [ + 'semester_name' => (string)$semester->name, + 'week_number' => sprintf(_('KW %u'), date('W', $timestamp)), + 'current_day' => strftime('%x', $timestamp) + ]; + while ($week_begin_timestamp < $end_date) { + $next_week_timestamp = strtotime('+1 week', $week_begin_timestamp); + if ($week_begin_timestamp <= $timestamp && $timestamp < $next_week_timestamp) { + $result['sem_week'] = sprintf( + _('%u. Vorlesungswoche (ab %s)'), + $i + 1, + strftime('%x', $week_begin_timestamp)); + break; + } + $i += 1; + + $week_begin_timestamp = $next_week_timestamp; + } + + $this->render_json($result); + } + + private function notFound(string $message = ''): void + { + $this->set_status(404); + $this->render_text($message); + } + + private function renderObject(SimpleORMap $object): void + { + if (Request::bool('quiet')) { + $this->render_nothing(); + } else{ + $this->render_json($object->toArray()); + } + } + + /** + * Tries the ISO format first: YYYY-MM-DDTHH:MM:SS±ZZ:ZZ + */ + private function convertDatetime(?string $input): ?Datetime + { + if (!$input) { + return null; + } + + return DateTime::createFromFormat(DateTime::RFC3339, $input) + ?? DateTime::createFromFormat( + 'Y-m-d\TH:i:s', + $input, + (new DateTime())->getTimezone() + ); + } } diff --git a/app/routes/Activity.php b/app/routes/Activity.php deleted file mode 100644 index fadca0f148ce437efccce413a51d23abf092832d..0000000000000000000000000000000000000000 --- a/app/routes/Activity.php +++ /dev/null @@ -1,168 +0,0 @@ -<?php -namespace RESTAPI\Routes; - -/** - * @author Till Glöggler <tgloeggl@uos.de> - * @author André Klaßen <klassen@elan-ev.de> - * @license GPL 2 or later - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - * - * @condition user_id ^[a-f0-9]{1,32}$ - */ -class Activity extends \RESTAPI\RouteMap -{ - /** - * List activities for an user - * - * @get /user/:user_id/activitystream - * - * @param string $user_id the user to get the activities for - * - * @return array the activities as array('collection' => array(...), 'pagination' => array()) - */ - public function getActivities($user_id) - { - // only root can retrieve arbitrary streams - if (!$GLOBALS['perm']->have_perm('root') && $GLOBALS['user']->id != $user_id) { - $this->error(401); - } - - // failsafe einbauen - falls es keine älteren Aktivitäten mehr im System gibt, Abbruch! - - $oldest_activity = \Studip\Activity\Activity::getOldestActivity(); - $max_age = $oldest_activity ? $oldest_activity->mkdate : time(); - - - $contexts = []; - - $user = \User::find($user_id); - - // create system context - $system_context = new \Studip\Activity\SystemContext($user); - $contexts[] = $system_context; - - $contexts[] = new \Studip\Activity\UserContext($user, $user); - $user->contacts->each(function($another_user) use (&$contexts, $user) { - $contexts[] = new \Studip\Activity\UserContext($another_user, $user); - }); - - if (!in_array($user->perms, ['admin','root'])) { - // create courses and institutes context - foreach (\Course::findMany($user->course_memberships->pluck('seminar_id')) as $course) { - $contexts[] = new \Studip\Activity\CourseContext($course, $user); - } - foreach (\Institute::findMany($user->institute_memberships->pluck('institut_id')) as $institute) { - $contexts[] = new \Studip\Activity\InstituteContext($institute, $user); - } - } - - - // add filters - $filter = new \Studip\Activity\Filter(); - - $start = \Request::int('start', strtotime('-1 days')); - $end = \Request::int('end', time()); - - - $scrollfrom = \Request::int('scrollfrom', false); - $filtertype = \Request::get('filtertype', ''); - - $objectType = \Request::get('object_type'); - $filter->setObjectType($objectType); - - $objectId = \Request::get('object_id'); - $filter->setObjectId($objectId); - - $context = \Request::get('context_type'); - $filter->setContext($context); - - $contextId = \Request::get('context_id'); - $filter->setContextId($contextId); - - if (!empty($filtertype)) { - $filter->setType(json_decode($filtertype)); - } - - if ($scrollfrom) { - // shorten "watch-window" by one second to prevent duplication of activities - $scrollfrom -= 1; - - if ($scrollfrom > $max_age){ - $end = $scrollfrom; - $start = strtotime('-1 day', $end); - $data = []; - - $backtrack = 1; - - while (empty($data)) { - $filter->setStartDate($start); - $filter->setEndDate($end); - - $data = $this->getStreamData($contexts, $filter); - - if ($start < $max_age) { - break; - } - - // move "watch-window" back one day at a time - $end = $start - 1; - $start = strtotime('-'. $backtrack . ' days', $start); - - // enforce maximum "watch-window", currently 2 weeks - $backtrack = min (14, $backtrack + 1); - } - } else { - $data = false; - } - } else { - - $filter->setStartDate($start); - $filter->setEndDate($end); - $data = $this->getStreamData($contexts, $filter); - - } - - // set etag for preventing resending the same stuff over and over again - $this->etag(md5(serialize($data))); - - return $data; - } - - /** - * private helper function to get stream data for given contexts and filter - * - * @param $contexts - * @param $filter - * @return array - */ - - private function getStreamData($contexts, $filter) - { - $stream = new \Studip\Activity\Stream($contexts, $filter); - $data = $stream->toArray(); - - foreach ($data as $key => $act) { - $actor = [ - 'type' => $data[$key]['actor_type'], - 'id' => $data[$key]['actor_id'] - ]; - - if ($data[$key]['actor_type'] == 'user') { - $a_user = \User::findFull($data[$key]['actor_id']); - $actor['details'] = User::getMiniUser($this, $a_user ?: new \User()); - } elseif ($data[$key]['actor_type'] === 'anonymous') { - $actor['details'] = [ - 'name' => _('Anonym'), - ]; - } - - unset($data[$key]['actor_type']); - unset($data[$key]['actor_id']); - - $data[$key]['actor'] = $actor; - } - - return $data; - - } -} diff --git a/app/routes/Blubber.php b/app/routes/Blubber.php deleted file mode 100644 index 14450887b707bf169cc01db68f842f2b1565dd1f..0000000000000000000000000000000000000000 --- a/app/routes/Blubber.php +++ /dev/null @@ -1,321 +0,0 @@ -<?php -namespace RESTAPI\Routes; - -/** - * @license GPL 2 or later - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - * - * @condition course_id ^[a-f0-9]{1,32}$ - * @condition stream_id ^(global|[a-f0-9]{1,32})$ - * @condition user_id ^[a-f0-9]{1,32}$ - * @condition blubber_id ^[a-f0-9]{1,32}$ - */ -class Blubber extends \RESTAPI\RouteMap -{ - - /** - * Get content and some comments for a blubber-thread or for the "global" thread all "public" threads. - * - * @get /blubber/threads/:thread_id - * @param string $thread_id id of the blubber thread or "global" if you want public threads (not comments). Remind the global thread is a virtual thread with a special behaviour. - * @return array the blubber as array - */ - public function getThreadData($thread_id) - { - if (!$GLOBALS['perm']->have_perm('autor')) { - $this->error(401); - } - $GLOBALS['user']->cfg->store('BLUBBER_DEFAULT_THREAD', $thread_id); - - $thread = new \BlubberThread($thread_id); - $thread = \BlubberThread::upgradeThread($thread); - if (!$thread->isReadable()) { - $this->error(401); - } - - $json = $thread->getJSONData(50, null, \Request::get("search")); - $thread->markAsRead(); - - $this->etag(md5(serialize($json))); - - return $json; - } - - /** - * Get threads - * - * @get /blubber/threads - * @return array the stream as array - */ - public function getMyThreads() - { - $threads_data = [ - 'threads' => [], - 'more_down' => 0, - ]; - $limit = \Request::int('limit', 50); - - $threads = \BlubberThread::findMyGlobalThreads( - $limit + 1, - null, - \Request::int('timestamp'), - null, - \Request::get("search") ?: null - ); - if (count($threads) > $limit) { - array_pop($threads); - $threads_data['more_down'] = 1; - } - foreach ($threads as $thread) { - $threads_data['threads'][] = [ - 'thread_id' => $thread->getId(), - 'avatar' => $thread->getAvatar(), - 'name' => $thread->getName(), - 'timestamp' => (int) $thread->getLatestActivity(), - ]; - } - return $threads_data; - } - - /** - * Write a comment to a thread - * - * @post /blubber/threads/:thread_id/comments - * @param string $thread_id id of the blubber thread - * @return array the comment as array - */ - public function postComment($thread_id) - { - if (!$GLOBALS['perm']->have_perm('autor')) { - $this->error(401); - } - - if (!trim($this->data['content'])) { - $this->error(406); - } - - $thread = \BlubberThread::find($thread_id); - if (!$thread->isCommentable()) { - $this->error(401); - } - - $comment = new \BlubberComment(); - $comment['thread_id'] = $thread_id; - $comment['content'] = $this->data['content']; - $comment['user_id'] = $GLOBALS['user']->id; - $comment['external_contact'] = 0; - $comment->store(); - - $thread->setLastVisit(); - - return $comment->getJSONData(); - } - - /** - * Write a comment to a thread - * - * @put /blubber/threads/:thread_id/comments/:comment_id - * - * @param string $thread_id id of the blubber thread - * @param string $comment id of the comment - * - * @return array the comment as array - */ - public function editComment($thread_id, $comment_id) - { - $comment = \BlubberComment::find($comment_id); - if (!$comment->isWritable()) { - $this->error(401); - } - $old_content = $comment['content']; - $comment['content'] = $this->data['content']; - - if ($comment['user_id'] !== $GLOBALS['user']->id) { - $messaging = new \messaging(); - $message = sprintf( - _("%s hat als Moderator gerade Ihren Beitrag in Blubber editiert.\n\nDie alte Version des Beitrags lautete:\n\n%s\n\nDie neue lautet:\n\n%s\n"), - get_fullname(), $old_content, $comment['content'] - ); - - $message .= "\n\n"; - - $message .= '[' . _('Link zu diesem Beitrag') . ']'; - $message .= \URLHelper::getURL( - "{$GLOBALS['ABSOLUTE_URI_STUDIP']}dispatch.php/blubber/index/{$comment->thread_id}", - [], - true - ); - - $messaging->insert_message( - $message, - get_username($comment['user_id']), - $GLOBALS['user']->id, - null, null, null, null, - _("Änderungen an Ihrem Blubber.") - ); - } - - if (!trim($this->data['content'])) { - $data = $comment->getJSONData(); - $comment->delete(); - } else { - $comment->store(); - $data = $comment->getJSONData(); - } - return $data; - } - - /** - * Write a comment to a thread - * - * @get /blubber/threads/:thread_id/comments - * - * @param string $thread_id id of the blubber thread - * - * @return array the comments as array - */ - public function getComments($thread_id) - { - if (!$GLOBALS['perm']->have_perm('autor')) { - $this->error(401); - } - - $thread = new \BlubberThread($thread_id); - if (!$thread->isReadable()) { - $this->error(401); - } - - $modifier = \Request::get('modifier'); - if ($modifier === 'olderthan') { - $limit = \Request::int('limit', 50); - - $query = "SELECT blubber_comments.* - FROM blubber_comments - WHERE blubber_comments.thread_id = :thread_id - AND blubber_comments.mkdate <= :timestamp - ORDER BY mkdate DESC - LIMIT :limit"; - $result = \DBManager::get()->fetchAll($query, [ - 'thread_id' => $thread_id, - 'timestamp' => \Request::int('timestamp', time()), - 'limit' => $limit + 1, - ]); - - $output = ['comments' => []]; - - if (count($result) > $limit) { - array_pop($result); - $output['more_up'] = 1; - } else { - $output['more_up'] = 0; - } - foreach ($result as $data) { - $comment = \BlubberComment::buildExisting($data); - $output['comments'][] = $comment->getJSONData(); - } - return $output; - } - - if ($modifier === 'newerthan') { - $limit = \Request::int('limit', 50); - - $query = "SELECT blubber_comments.* - FROM blubber_comments - WHERE blubber_comments.thread_id = :thread_id - AND blubber_comments.mkdate >= :timestamp - ORDER BY mkdate - LIMIT :limit"; - $comments = \DBManager::get()->fetchAll($query, [ - 'thread_id' => $thread_id, - 'timestamp' => \Request::int('timestamp', time()), - 'limit' => $limit + 1, - ], function ($comment) { - return \BlubberComment::buildExisting($comment)->getJSONData(); - }); - - $output = ['comments' => $comments]; - - if (count($comments) > $limit) { - array_pop($output['comments']); - $output['more_down'] = 1; - } else { - $output['more_down'] = 0; - } - - return $output; - } - - $query = "SELECT blubber_comments.* - FROM blubber_comments - WHERE blubber_comments.thread_id = :thread_id "; - $parameters = ['thread_id' => $thread_id]; - - if (\Request::get('search')) { - $query .= " AND blubber_comments.content LIKE :search "; - $parameters['search'] = '%'.\Request::get('search').'%'; - } - $query .= " ORDER BY mkdate ASC "; - - $output['comments'] = \DBManager::get()->fetchAll($query, $parameters, function ($comment) { - return \BlubberComment::buildExisting($comment)->getJSONData(); - }); - $output['more_up'] = 0; - $output['more_down'] = 0; - - return $output; - } - - /** - * Does the current user follow the thread? - * - * @get /blubber/threads/:thread_id/follow - */ - public function threadIsFollowed($thread_id) - { - return $this->requireThread($thread_id)->isFollowedByUser(); - } - - /** - * User follows a thread. - * - * @post /blubber/threads/:thread_id/follow - * - * @param string $thread_id id of the blubber thread - */ - public function followThread($thread_id) - { - $this->requireThread($thread_id)->addFollowingByUser(); - } - - /** - * User unfollows a thread. - * - * @delete /blubber/threads/:thread_id/follow - * - * @param string $thread_id id of the blubber thread - */ - public function unfollowThread($thread_id) - { - $this->requireThread($thread_id)->removeFollowingByUser(); - } - - /** - * Returns a blubber thread and checks permissions. - * - * @param string $thread_id Id of the blubber thread - * @return \BlubberThread - */ - private function requireThread($thread_id) - { - if (!$GLOBALS['perm']->have_perm('autor')) { - $this->error(401); - } - - $thread = new \BlubberThread($thread_id); - if (!$thread->isReadable()) { - $this->error(401); - } - - return \BlubberThread::upgradeThread($thread); - } -} diff --git a/app/routes/Clipboard.php b/app/routes/Clipboard.php deleted file mode 100644 index dfe22e0acf696c532f98de63d568a02828187089..0000000000000000000000000000000000000000 --- a/app/routes/Clipboard.php +++ /dev/null @@ -1,193 +0,0 @@ -<?php -namespace RESTAPI\Routes; - - -/** - * This file contains the REST class for the clipboard system. - * - * @author Moritz Strohm <strohm@data-quest.de> - * @copyright 2017-2019 - * @license http://www.gnu.org/licenses/gpl-2.0.html GPL version 2 - * @since 4.5 - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - */ -class Clipboard extends \RESTAPI\RouteMap -{ - /** - * Adds a new clipboard. - * - * @post /clipboard/add - */ - public function addClipboard() - { - $name = \Request::get('name'); - - if (!$name) { - $this->halt(400, _('Es wurde kein Name angegeben!')); - } - - $clipboard = new \Clipboard(); - $clipboard->user_id = $GLOBALS['user']->id; - $clipboard->name = $name; - if (!$clipboard->store()) { - $this->halt(500, _('Fehler beim Speichern des Merkzettels!')); - } - - $result = $clipboard->toRawArray(); - //A special treatment for the widget_id parameter: - //It is passed through: - $widget_id = \Request::get('widget_id'); - if ($widget_id) { - $result['widget_id'] = $widget_id; - } - - return $result; - } - - - /** - * Edits a clipboard. - * - * @put /clipboard/:clipboard_id - */ - public function editCliboard($clipboard_id = null) - { - $clipboard = \Clipboard::find($clipboard_id); - if (!$clipboard) { - $this->notFound(_('Ungültige Merkzettel-ID!')); - } - - if ($clipboard->user_id != $GLOBALS['user']->id) { - //Thou shalt not delete clipboards - //which don't belong to you! - throw new \AccessDeniedException(); - } - - $name = $this->data['name']; - if (!$name) { - $this->halt(400, _('Es wurde kein Name angegeben!')); - } - - $clipboard->name = $name; - - if ($clipboard->isDirty()) { - $success = $clipboard->store(); - } else { - $success = true; - } - - if (!$success) { - $this->halt(500, _('Fehler beim Bearbeiten des Merkzettels!')); - } - - $result = $clipboard->toRawArray(); - - //A special treatment for the widget_id parameter: - //It is passed through: - $widget_id = \Request::get('widget_id'); - if ($widget_id) { - $result['widget_id'] = $widget_id; - } - - return $result; - } - - - /** - * Deletes a clipboard. - * - * @delete /clipboard/:clipboard_id - */ - public function deleteClipboard($clipboard_id = null) - { - $clipboard = \Clipboard::find($clipboard_id); - if (!$clipboard) { - $this->notFound(_('Ungültige Merkzettel-ID!')); - } - - if ($clipboard->user_id !== $GLOBALS['user']->id) { - //Thou shalt not delete items of clipboards - //which don't belong to you! - throw new \AccessDeniedException(); - } - - if (!$clipboard->delete()) { - $this->halt(500, _('Fehler beim Löschen des Merkzettels!')); - } - - return ""; - } - - - /** - * Adds an item to a clipboard. - * - * @post /clipboard/:clipboard_id/item - */ - public function addClipboardItem($clipboard_id = null) - { - $clipboard = \Clipboard::find($clipboard_id); - if (!$clipboard) { - $this->notFound(_('Ungültige Merkzettel-ID!')); - } - - if ($clipboard->user_id != $GLOBALS['user']->id) { - //Thou shalt not add items to clipboards - //which don't belong to you! - throw new \AccessDeniedException(); - } - - $range_id = \Request::get('range_id'); - $range_type = \Request::get('range_type'); - $widget_id = \Request::get('widget_id'); - - if (!is_a($range_type, $clipboard->allowed_item_class, true)) { - $this->halt( - 400, - sprintf( - _('Die Klasse %s ist in dieser Merkzettel-Klasse nicht erlaubt!'), - $range_type - ) - ); - } - - try { - $item = $clipboard->addItem($range_id, $range_type); - - $result = $item->toRawArray(); - $result['name'] = $item->__toString(); - if ($widget_id) { - $result['widget_id'] = $widget_id; - } - return $result; - } catch (\Exception $e) { - $this->halt(500, $e->getMessage()); - } - } - - - /** - * Removes an item (selected by its range-ID) from a clipboard. - * - * @delete /clipboard/:clipboard_id/item/:range_id - */ - public function removeClipboardItem($clipboard_id = null, $range_id = null) - { - $clipboard = \Clipboard::find($clipboard_id); - if (!$clipboard) { - $this->notFound(_('Ungültige Merkzettel-ID!')); - } - - if ($clipboard->user_id != $GLOBALS['user']->id) { - //Thou shalt not delete items of clipboards - //which don't belong to you! - throw new \AccessDeniedException(); - } - - if ($clipboard->removeItem($range_id)) { - return ['range_id' => $range_id]; - } else { - $this->halt(500, _('Fehler beim Löschen des Eintrags!')); - } - } -} diff --git a/app/routes/Contacts.php b/app/routes/Contacts.php deleted file mode 100644 index d7fd01040bb9b79d6f6fd35598ea647553caa9d1..0000000000000000000000000000000000000000 --- a/app/routes/Contacts.php +++ /dev/null @@ -1,302 +0,0 @@ -<?php -namespace RESTAPI\Routes; - -/** - * @author <mlunzena@uos.de> - * @license GPL 2 or later - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - * - * @condition user_id ^[a-f0-9]{1,32}$ - * @condition friend_id ^[a-f0-9]{1,32}$ - * @condition group_id ^[a-f0-9]{1,32}$ - */ -class Contacts extends \RESTAPI\RouteMap -{ - - public static function before() - { - require_once 'User.php'; - require_once 'lib/statusgruppe.inc.php'; - } - - /** - * Lists all contacts of a user - * - * @get /user/:user_id/contacts - */ - public function getUserContacts($user_id) - { - if ($GLOBALS['user']->id !== $user_id) { - $this->error(401); - } - - // quite degenerated as long as we can only see our own contacts - $user = $this->requireUser($user_id); - - $total = count($user->contacts); - $contacts = $user->contacts->limit($this->offset, $this->limit); - - $contacts_json = $this->contactsToJSON($contacts); - $this->etag(md5(serialize($contacts_json))); - - return $this->paginated($contacts_json, - $total, compact('user_id')); - } - - /** - * Adds/Updates a contact to user's list of contacts - * - * @put /user/:user_id/contacts/:friend_id - */ - public function addUserContact($user_id, $buddy_user_id) - { - if ($GLOBALS['user']->id !== $user_id) { - $this->error(401); - } - - $user = $this->requireUser($user_id); - $friend = $this->requireUser($buddy_user_id); - - // prevent duplicates - if ($user->isFriendOf($friend)) { - $this->error(409, sprintf('User "%s" is already a contact', htmlReady($friend->id))); - } - - $user->contacts[] = $friend; - $user->store(); - - $this->status(201); - } - - /** - * Deletes a contact - * - * @delete /user/:user_id/contacts/:friend_id - */ - public function removeUserContact($user_id, $buddy_user_id) - { - if ($GLOBALS['user']->id !== $user_id) { - $this->error(401); - } - - $user = $this->requireUser($user_id); - $friend = $this->requireUser($buddy_user_id); - - if (!$user->isFriendOf($friend)) { - $this->notFound("Contact not found"); - } - - $user->contacts->unsetByPK($friend->id); - $user->store(); - - $this->status(204); - } - - - /** - * List all contact groups of a user - * - * @get /user/:user_id/contact_groups - */ - public function getUserContactGroups($user_id) - { - if ($GLOBALS['user']->id !== $user_id) { - $this->error(401); - } - - $contact_groups = \SimpleCollection::createFromArray( - \Statusgruppen::findByRange_id($GLOBALS['user']->id)) - ->orderBy('name ASC'); - - $total = count($contact_groups); - $contact_groups = $contact_groups->limit($this->offset, $this->limit); - - $contact_groups_json = $this->contactGroupsToJSON($contact_groups); - $this->etag(md5(serialize($contact_groups_json))); - - return $this->paginated($contact_groups_json, - $total, compact('user_id')); - } - - /** - * Create a new contact group for a user. - * - * @post /user/:user_id/contact_groups - */ - public function createContactGroup($user_id) - { - if ($GLOBALS['user']->id !== $user_id) { - $this->error(401); - } - - if (!isset($this->data['name']) || !mb_strlen($name = trim($this->data['name']))) { - $this->error(400, 'Contact group name required.'); - } - - $group = new \Statusgruppen(); - $group->range_id = $GLOBALS['user']->id; - $group->name = $name; - $group->size = 0; - $group->selfassign = 0; - $group->calendar_group = 0; - $group->store(); - $this->redirect('contact_group/' . $group->id, 201, 'ok'); - } - - /** - * Show a single contact group - * - * @get /contact_group/:group_id - */ - public function showContactGroup($group_id) - { - $group = $this->requireContactGroup($group_id); - $contact_group_json = $this->contactGroupToJSON($group); - $this->etag(md5(serialize($contact_group_json))); - return $contact_group_json; - } - - /** - * Remove a contact group - * - * @delete /contact_group/:group_id - */ - public function destroyContactGroup($group_id) - { - $group = $this->requireContactGroup($group_id); - - $group->remove(); - - $this->status(204); - } - - /** - * List all members of a contact group - * - * @get /contact_group/:group_id/members - */ - public function indexOfContactGroupMembers($group_id) - { - $group = $this->requireContactGroup($group_id); - $contacts = $group->members->limit($this->offset, $this->limit); - - $json = []; - foreach ($contacts as $contact) { - $url = $this->urlf('/contact_group/%s/members/%s', [$group_id, $contact->user_id]); - $json[$url] = User::getMiniUser($this, $contact->user); - } - - $this->etag(md5(serialize($json))); - - return $this->paginated($json, count($group->members), compact('group_id')); - } - - /** - * Add a user to a contact group - * - * @put /contact_group/:group_id/members/:user_id - */ - public function addToContactGroup($group_id, $user_id) - { - $group = $this->requireContactGroup($group_id); - $user = $this->requireUser($user_id); - - // prevent duplicates - $exists = $group->members->findBy('user_id', $user_id)->first(); - if ($exists) { - $this->halt(204); - } - - $new_contact = [ - 'owner_id' => $GLOBALS['user']->id, - 'user_id' => $user->id]; - - $new_contact['group_assignments'][] = ['statusgruppe_id' => $group->id, - 'user_id' => $user->id]; - - $success = (bool)\Contact::import($new_contact)->store(); - - - if (!$success) { - $this->error(500); - } - - $this->status(201); - } - - /** - * Remove a user from a contact group - * - * @delete /contact_group/:group_id/members/:user_id - */ - public function removeFromContactGroup($group_id, $user_id) - { - $group = $this->requireContactGroup($group_id); - $membership = $group->members->findBy('user_id', $user_id)->first(); - if (!$membership) { - $this->notFound(); - } - - $membership->delete(); - - $this->status(204); - } - - - /**************************************************/ - /* PRIVATE HELPER METHODS */ - /**************************************************/ - - private function requireUser($user_id) - { - $user = \User::find($user_id); - // TODO: checks visibility using the global perm object! - if (!$user || !get_visibility_by_id($user_id)) { - $this->notFound(sprintf("Could not find user with id: %s", htmlReady($user_id))); - } - - return $user; - } - - private function requireContactGroup($group_id) - { - $group = \Statusgruppen::find($group_id); - if (!$group) { - $this->notFound(); - } - - if ($group->range_id !== $GLOBALS['user']->id) { - $this->error(401); - } - return $group; - } - - private function contactsToJSON($contacts) { - $result = []; - foreach ($contacts as $contact) { - $result[] = User::getMiniUser($this, $contact); - } - return $result; - } - - private function contactGroupsToJSON($contact_groups) - { - $result = []; - foreach ($contact_groups as $cg) { - $url = $this->urlf('/contact_group/%s', [htmlReady($cg->id)]); - $result[$url] = $this->contactGroupToJSON($cg); - } - return $result; - } - - private function contactGroupToJSON($group) - { - $json = [ - 'id' => $group->id, - 'name' => (string) $group->name, - 'contacts' => $this->urlf('/contact_group/%s/members', [htmlReady($group->id)]), - 'contacts_count' => sizeof($group->members) - ]; - return $json; - } -} diff --git a/app/routes/Course.php b/app/routes/Course.php deleted file mode 100644 index d1fad96d0fe50a6a2bba5a5ad9ee4ca4c96650d1..0000000000000000000000000000000000000000 --- a/app/routes/Course.php +++ /dev/null @@ -1,242 +0,0 @@ -<?php -namespace RESTAPI\Routes; - -/** - * @author <mlunzena@uos.de> - * @license GPL 2 or later - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - * - * @condition course_id ^[a-f0-9]{1,32}$ - * @condition user_id ^[a-f0-9]{1,32}$ - */ -class Course extends \RESTAPI\RouteMap -{ - - public function before() - { - require_once 'User.php'; - } - - /** - * Lists all courses of a user including the semesters in which - * that course is active. - * Optionally filtered by a URL parameter 'semester'. - * - * @get /user/:user_id/courses - */ - public function getUserCourses($user_id) - { - if (($GLOBALS['user']->id !== $user_id) && !$GLOBALS['perm']->have_perm("root")) { - $this->error(401); - } - - // setting up semester to filter by - $semester = null; - $semester_id = \Request::get('semester'); - if ($semester_id) { - $semester = \Semester::find($semester_id); - if (!$semester) { - $this->error(400, "Semester not found."); - } - } - - $memberships = $this->findMembershipsByUserId($user_id, $semester); - - $total = count($memberships); - $memberships = $memberships->limit($this->offset, $this->limit); - $memberships_json = $this->membershipsToJSON($memberships); - $this->etag(md5(serialize($memberships_json))); - return $this->paginated( - $memberships_json, - $total, - compact('user_id'), - ['semester' => $semester_id] - ); - } - - /** - * Show a single course - * - * @get /course/:course_id - */ - public function getCourse($course_id) - { - if (!$course = \Course::find($course_id)) { - $this->notFound("Course not found"); - } - - $course = $this->requireCourse($course_id); - $this->lastmodified($course->chdate); - $course_json = $this->courseToJSON($course); - $this->etag(md5(serialize($course_json))); - return $course_json; - } - - /** - * List all members of a course. - * Optionally filtered by a URL parameter 'status'. - * - * @get /course/:course_id/members - */ - public function getMembers($course_id) - { - $status_filter = \Request::get('status'); - if ($status_filter && !in_array($status_filter, words("user autor tutor dozent"))) { - $this->error(400, "Status may be one of: user, autor, tutor, dozent"); - } - - $course = $this->requireCourse($course_id); - $members = $course->members; - if ($status_filter) { - $members = $members->findBy('status', $status_filter); - } - - $total = count($members); - $members = $members->limit($this->offset, $this->limit); - $members_json = $this->membersToJSON($course, $members); - $this->etag(md5(serialize($members_json))); - return $this->paginated( - $members_json, - $total, - compact('course_id'), - ['status' => $status_filter] - ); - } - - /** - * Get the root file folder of a course. - * - * @get /course/:course_id/top_folder - */ - public function getTopFolder($course_id) - { - $top_folder = \Folder::findTopFolder( - $this->requireCourse($course_id)->id, - 'course' - ); - - if (!$top_folder) { - $this->notFound("No folder found for course with id {$course_id}!"); - } - - return (new FileSystem())->getFolder($top_folder->id); - } - - /**************************************************/ - /* PRIVATE HELPER METHODS */ - /**************************************************/ - - private function findMembershipsByUserId($user_id, $semester) - { - $memberships = \SimpleORMapCollection::createFromArray( - \CourseMember::findBySQL('user_id = ? ORDER BY mkdate ASC', [$user_id]) - ); - - // filter by semester - if ($semester) { - - $memberships = $memberships->filter(function ($m) use ($semester) { - return $m->course->isInSemester($semester); - }); - } - - return $memberships; - } - - private function membershipsToJSON($memberships) - { - $json = []; - - foreach ($memberships as $membership) { - $course_json = $this->courseToJSON($course = $membership->course); - - $json[$this->urlf("/course/%s", [$course->id])] = $course_json; - } - return $json; - } - - private function courseToJSON($course) - { - $json = []; - - $json['course_id'] = $course->id; - $json['number'] = $course->VeranstaltungsNummer; - $json['title'] = (string) $course->Name; - $json['subtitle'] = (string) $course->Untertitel; - $json['type'] = $course->status; - $json['description'] = (string) $course->Beschreibung; - $json['location'] = (string) $course->Ort; - - // lecturers - foreach ($course->getMembersWithStatus('dozent') as $lecturer) { - $url = $this->urlf('/user/%s', [htmlReady($lecturer->user_id)]); - $json['lecturers'][$url] = User::getMiniUser($this, $lecturer->user); - } - - // other members - foreach (words("user autor tutor dozent") as $status) { - $json['members'][$status] = $this->urlf('/course/%s/members?status=%s', [$course->id, $status]); - $json['members'][$status . '_count'] = $course->countMembersWithStatus($status); - } - - foreach (words("start_semester end_semester") as $key) { - $json[$key] = $course->$key ? $this->urlf('/semester/%s', [htmlReady($course->$key->id)]) : null; - } - - $activated = array_map('get_class', $course->getActivatedTools()); - - $json['modules'] = []; - foreach (['forum' => 'forum_categories', - 'documents' => 'top_folder', - 'wiki' => 'wiki'] as $module => $uri) - { - if (in_array('Core' . ucfirst($module), $activated)) { - $json['modules'][$module] = $this->urlf('/course/%s/%s', [htmlReady($course->id), $uri]); - } - } - - // Add group if current user is member of the group - $json['group'] = null; - - $member = \CourseMember::find([$course->id, $GLOBALS['user']->id]); - if ($member) { - $json['group'] = (int) $member->gruppe; - } - - - return $json; - } - - private function requireCourse($id) - { - if (!$course = \Course::find($id)) { - $this->notFound("Course not found"); - } - - //This route is used in the room management system. - //Therefore, we need not only to check if the user is in the course, - //but also, if the user is a global resource admin. In the latter case, - //access shall also be granted. - if (!$GLOBALS['perm']->have_studip_perm('user', $id, $GLOBALS['user']->id) - && !\ResourceManager::userHasGlobalPermission(\User::findCurrent(), 'admin')) { - $this->error(401); - } - - return $course; - } - - private function membersToJSON($course, $members) - { - $json = []; - - foreach ($members as $member) { - $url = $this->urlf('/user/%s', [$member->user_id]); - $avatar = \Avatar::getAvatar($member->user_id); - $json[$url] = [ - 'member' => User::getMiniUser($this, $member->user), - 'status' => $member->status - ]; - } - return $json; - } -} diff --git a/app/routes/Discovery.php b/app/routes/Discovery.php deleted file mode 100644 index c83f524125e1130aa1e8cc0ab0837760d9016a35..0000000000000000000000000000000000000000 --- a/app/routes/Discovery.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php -namespace RESTAPI\Routes; - -/** - * @author Jan-Hendrik Willms <tleilax+studip@gmail.com> - * @author <mlunzena@uos.de> - * @license GPL 2 or later - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - */ -class Discovery extends \RESTAPI\RouteMap -{ - /** - * Schnittstellenbeschreibung - * - * @get /discovery - */ - public function getDiscovery() - { - $routes = $this->router->getRoutes(true); - foreach ($routes as $uri_template => $methods) { - foreach ($methods as $method => $route) { - $routes[$uri_template][$method] = $route['description']; - } - } - return $routes; - } -} diff --git a/app/routes/Events.php b/app/routes/Events.php deleted file mode 100644 index 368d6150af91b4c74b43b4ec017fabf8fd642c1d..0000000000000000000000000000000000000000 --- a/app/routes/Events.php +++ /dev/null @@ -1,186 +0,0 @@ -<?php -namespace RESTAPI\Routes; - -use Config; -use Resource; -use Room; -use Seminar; -use Issue; - - -/** - * @author André Klaßen <andre.klassen@elan-ev.de> - * @author <mlunzena@uos.de> - * @license GPL 2 or later - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - * - * @condition course_id ^[a-f0-9]{1,32}$ - * @condition user_id ^[a-f0-9]{1,32}$ - * @condition semester_id ^[a-f0-9]{1,32}$ - */ -class Events extends \RESTAPI\RouteMap -{ - - /** - * returns all upcoming events within the next two weeks for a given user - * - * @get /user/:user_id/events - */ - public function getEvents($user_id) - { - if ($user_id !== $GLOBALS['user']->id) { - $this->error(401); - } - - $start = new \DateTime(); - $end = clone $start; - $end = $end->add(new \DateInterval('P2W')); - - $list = array_merge( - \CalendarCourseDate::getEvents($start, $end, $user_id), - \CalendarCourseExDate::getEvents($start, $end, $user_id) - ); - - $json = []; - $events = array_slice($list, $this->offset, $this->limit); ; - foreach ($events as $event) { - - $course_uri = $this->urlf('/course/%s', [htmlReady($event->range_id)]); - - $json[] = [ - 'event_id' => $event->id, - 'course' => $course_uri, - 'start' => $event->date, - 'end' => $event->end_time, - 'title' => $event->getTitle(), - 'description' => $event->getDescription() ?: '', - 'categories' => $event->getTypeName(), - 'room' => $event->getRoomName(), - 'canceled' => $event instanceof \CourseExDate || holiday($event->date), - ]; - } - - $this->etag(md5(serialize($json))); - - return $this->paginated($json, count($list), compact('user_id')); - } - - /** - * returns an iCAL Export of all events for a given user - * - * @get /user/:user_id/events.ics - */ - public function getEventsICAL($user_id) - { - if ($user_id !== $GLOBALS['user']->id) { - $this->error(401); - } - $end = new \DateTime(); - $end->setTimestamp(\CalendarDate::NEVER_ENDING); - $start = new \DateTime(); - $start->modify('-4 week'); - $ical_export = new \ICalendarExport(); - $ical = $ical_export->exportCalendarDates($user_id, $start, $end) - . $ical_export->exportCourseDates($user_id, $start, $end) - . $ical_export->exportCourseExDates($user_id, $start, $end); - $content = $ical_export->writeHeader() . $ical . $ical_export->writeFooter(); - - $this->contentType('text/calendar'); - $this->headers([ - 'Content-Length' => strlen($content), - 'Content-Disposition' => 'attachment; ' . encode_header_parameter('filename', 'studip.ics'), - ]); - $this->halt(200, $this->response->headers, function () use ($content) { - echo $content; - }); - } - - - /** - * returns events for a given course - * - * @get /course/:course_id/events - */ - public function getEventsForCourse($course_id) - { - if (!$GLOBALS['perm']->have_studip_perm('user', $course_id, $GLOBALS['user']->id)) { - $this->error(401); - } - - $seminar = new Seminar($course_id); - $dates = getAllSortedSingleDates($seminar); - $total = sizeof($dates); - - $events = []; - foreach (array_slice($dates, $this->offset, $this->limit) as $date) { - - // get issue titles - $issue_titles = []; - if (is_array($issues = $date->getIssueIDs())) { - foreach ($issues as $is) { - $issue = new Issue(['issue_id' => $is]); - $issue_titles[] = $issue->getTitle(); - } - } - - $room = self::getRoomForSingleDate($date); - $events[] = [ - 'event_id' => $date->getSingleDateID(), - 'start' => $date->getStartTime(), - 'end' => $date->getEndTime(), - 'title' => $date->toString(), - 'description' => implode(', ', $issue_titles), - 'categories' => $date->getTypeName() ?: '', - 'room' => $room ?: '', - 'deleted' => $date->isExTermin(), - 'canceled' => $date->isHoliday() ?: false, - ]; - } - - $this->etag(md5(serialize($events))); - - return $this->paginated($events, $total, compact('course_id')); - } - - private static function getRoomForSingleDate($val) { - - /* css-Klasse auswählen, sowie Template-Feld für den Raum mit Text füllen */ - if (Config::get()->RESOURCES_ENABLE) { - - if ($val->getResourceID()) { - $resObj = Resource::find($val->getResourceID()); - if ($resObj) { - $room_object = $resObj->getDerivedClassInstance(); - if ($room_object instanceof Room) { - $room = _("Raum: "); - $room .= $room_object->getActionURL('booking_plan'); - } - } - } else { - $room = _("keine Raumangabe"); - - if ($val->isExTermin()) { - if ($name = $val->isHoliday()) { - $room = '('.$name.')'; - } else { - $room = '('._('fällt aus').')'; - } - } - - else { - if ($val->getFreeRoomText()) { - $room = '('.htmlReady($val->getFreeRoomText()).')'; - } - } - } - } else { - $room = ''; - if ($val->getFreeRoomText()) { - $room = '('.htmlReady($val->getFreeRoomText()).')'; - } - } - - return html_entity_decode(strip_tags($room)); - } - -} diff --git a/app/routes/Feedback.php b/app/routes/Feedback.php deleted file mode 100644 index 9a2834779742d06813e8ba496928eecc0c1edd88..0000000000000000000000000000000000000000 --- a/app/routes/Feedback.php +++ /dev/null @@ -1,271 +0,0 @@ -<?php - -namespace RESTAPI\Routes; - -/** - * @author Nils Gehrke <nils.gehrke@uni-goettingen.de> - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - * - * @condition feedback_id ^\d*$ - * @condition course_id ^[a-f0-9]{32}$ - * - */ -class Feedback extends \RESTAPI\RouteMap -{ - /** - * Create feedback element for a range - * - * @post /feedback/range/:range_id/:range_type - * - */ - public function createFeedbackElement($range_id, $range_type) - { - $course_id = $range_type::find($range_id)->getRangeCourseId(); - if (!\Feedback::hasRangeAccess($range_id, $range_type) || !\Feedback::hasCreatePerm($course_id)) { - $this->error(403); - } - $feedback = \FeedbackElement::build([ - 'range_id' => $range_id, - 'range_type' => $range_type, - 'user_id' => $GLOBALS['user']->id, - 'course_id' => $course_id, - 'question' => $this->data['question'], - 'description' => $this->data['description'], - 'results_visible' => intval($this->data['results_visible']), - 'commentable' => intval($this->data['commentable']), - 'mode' => $this->data['mode'] - ]); - $feedback->store(); - return $feedback->toArray(); - } - - /** - * Get a feedback element - * - * @get /feedback/:feedback_id - * - */ - public function getFeedbackElement($feedback_id) - { - if (!$feedback = \FeedbackElement::find($feedback_id)) { - $this->error(404); - } - if (!\Feedback::hasRangeAccess($feedback->range_id, $feedback->range_type)) { - $this->error(403); - } - return $feedback->toArray(); - } - - - /** - * Get all entries of a feedback element - * - * @get /feedback/:feedback_id/entries - * - */ - public function getFeedbackEntries($feedback_id) - { - if (!$feedback = \FeedbackElement::find($feedback_id)) { - $this->error(404); - } - if (!\Feedback::hasRangeAccess($feedback->range_id, $feedback->range_type)) { - $this->error(403); - } - if ($feedback->results_visible == 1 && !$feedback->isFeedbackable()) { - foreach($feedback->entries as $entry) { - $result['entries'][] = $entry->toArray(); - } - } elseif (!$feedback->isFeedbackable()) { - $result['entries'][] = $feedback->getOwnEntry()->toArray(); - } else { - $result = []; - } - - return $result; - } - - /** - * Edit a feedback element - * - * @put /feedback/:feedback_id - * - */ - public function editFeedbackElement($feedback_id) - { - if (!$feedback = \FeedbackElement::find($feedback_id)) { - $this->error(404); - } - $course_id = $feedback->course_id; - if (!\Feedback::hasRangeAccess($feedback->range_id, $feedback->range_type) || !\Feedback::hasAdminPerm($course_id)) { - $this->error(403); - } - $feedback->question = $this->data['question'] !== null ? $this->data['question'] : $feedback->question; - $feedback->description = $this->data['description'] !== null ? $this->data['description'] : $feedback->description; - $feedback->results_visible = $this->data['results_visible'] !== null ? - intval($this->data['results_visible']) : $feedback->results_visible; - $feedback->store(); - return $feedback->toArray(); - } - - /** - * Delete a feedback element - * - * @delete /feedback/:feedback_id - * - */ - public function deleteFeedbackElement($feedback_id) - { - if (!$feedback = \FeedbackElement::find($feedback_id)) { - $this->error(404); - } - $course_id = $feedback->course_id; - if (!\Feedback::hasRangeAccess($feedback->range_id, $feedback->range_type) || !\Feedback::hasAdminPerm($course_id)) { - $this->error(403); - } - $feedback->delete(); - $this->halt(200); - } - - /** - * List all feedback elements for a range - * - * @get /feedback/range/:range_id/:range_type - * - * @param string $range_id - * @param string $range_type - */ - public function getFeedbackElementsForRange($range_id, $range_type) - { - if (!\Feedback::hasRangeAccess($range_id, $range_type)) { - $this->error(403, 'You may not access the given range object.'); - } - $feedback_elements = \FeedbackElement::findBySQL('range_id = ? AND range_type = ? ORDER BY mkdate DESC', [$range_id, $range_type]); - foreach($feedback_elements as $feedback) { - $result['feedback_elements'][] = $feedback->toArray(); - } - return $result; - } - - /** - * List all feedback elements of a course - * - * @get /course/:course_id/feedback - * - */ - public function getFeedbackElementsForCourse($course_id) - { - if (!\Feedback::hasAdminPerm($course_id)) { - $this->error(403, 'You may not list all feedback elements of the course. Only feedback admins can.'); - } - $feedback_elements = \FeedbackElement::findBySQL('course_id = ? ORDER BY mkdate DESC', [$course_id]); - foreach($feedback_elements as $feedback) { - $result['feedback_elements'][] = $feedback->toArray(); - } - return $result; - } - - /** - * add an entry for a feedback element - * - * @post /feedback/:feedback_id/entry - * - */ - public function addFeedbackEntry($feedback_id) - { - if (!$feedback = \FeedbackElement::find($feedback_id)) { - $this->error(404); - } - if (!$feedback->isFeedbackable()) { - $this->error(403, 'You may not add an entry here. Maybe you have already given feedback or you are the author of the feedback element.'); - } - $entry = \FeedbackEntry::build([ - 'feedback_id' => $feedback->id, - 'user_id' => $GLOBALS['user']->id - ]); - - $entry->rating = $this->getRating( - $feedback->mode, - (int) $this->data['rating'] - ); - - if ($feedback->commentable) { - $entry->comment = $this->data['comment']; - } - - $entry->store(); - return $entry->toArray(); - } - - /** - * edit an entry of a feedback element - * - * @put /feedback/entry/:entry_id - * - */ - public function editFeedbackEntry($entry_id) - { - $entry = \FeedbackEntry::find($entry_id); - - if (!$entry) { - $this->notFound(); - } - - if (!$entry->isEditable()) { - $this->error(403); - } - - $entry->rating = $this->getRating( - $entry->feedback->mode, - (int) $this->data['rating'] - ); - - if ($entry->feedback->commentable) { - $entry->comment = $this->data['comment'] ?? $entry->comment; - } - - $entry->store(); - return $entry->toArray(); - } - - /** - * delete an entry of a feedback element - * - * @delete /feedback/entry/:entry_id - * - */ - public function deleteFeedbackEntry($entry_id) - { - if (!$entry = \FeedbackEntry::find($entry_id)) { - $this->error(404); - } - if ($entry->delete()){ - $this->halt(200); - } - } - - /** - * @param int $mode - * @param int $rating - * @return int - */ - private function getRating(int $mode, int $rating): int - { - if ($mode === 0) { - return 0; - } - - if ($rating === 0) { - return 1; - } - - if ($mode === 1) { - return min(5, $rating); - } - - if ($mode === 2) { - return min(10, $rating); - } - - throw new \InvalidArgumentException("Invalid mode {$mode}"); - } -} diff --git a/app/routes/FileSystem.php b/app/routes/FileSystem.php deleted file mode 100644 index 9abd7132692a8118f55b00b626b9f643e4f40bcd..0000000000000000000000000000000000000000 --- a/app/routes/FileSystem.php +++ /dev/null @@ -1,684 +0,0 @@ -<?php -namespace RESTAPI\Routes; - -/** - * This class implements REST routes for the new Stud.IP file system. - * - * @author Moritz Strohm <strohm@data-quest.de> - * @license GNU General Public License Version 2 or later - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - * - * Partially based upon the Files.php source code from Jan-Hendrik Willms - * (tleilax+studip@gmail.com) and mluzena@uos.de which is also - * licensed under the terms of the GNU General Public License Version 2 - * or later. - */ - -class FileSystem extends \RESTAPI\RouteMap -{ - // FILE REFERENCE AND FILE ROUTES: - - /** - * Get a file reference object (metadata) - * @get /file/:file_ref_id - */ - public function getFileRef($file_ref_id) - { - return $this->filerefToJSON( - $this->requireFileRef($file_ref_id), - (bool) \Request::int('extended') - ); - } - - /** - * Get the data of a file by the ID of an associated FileRef object - * - * @get /file/:file_ref_id/download - */ - public function getFileRefData($file_ref_id) - { - $file_ref = $this->requireFileRef($file_ref_id); - - // check if the current user has the permissions to read this file reference: - $user = \User::findCurrent(); - if (!$file_ref->folder->getTypedFolder()->isFileDownloadable($file_ref_id, $user->id)) { - $this->error(403, "You may not download the file reference with the id {$file_ref_id}"); - } - - // check if file exists: - if (!$file_ref->file) { - $this->error(500, 'File reference has no associated file object!'); - } - - $data_path = $file_ref->file->getPath(); - if (!file_exists($data_path)) { - $this->error(500, "File was not found in the operating system's file system!"); - } - - $this->lastModified($file_ref->file->chdate); - $this->sendFile($data_path, ['filename' => $file_ref->name]); - } - - /** - * Update file data using a FileReference to it. - * - * @post /file/:file_ref_id/update - */ - public function updateFileData($file_ref_id) - { - // We only update the first file: - $uploaded_file = array_shift($this->data['_FILES']); - - // FileManager::updateFileRef handles the whole file upload - // and does all the necessary security checks: - $result = \FileManager::updateFileRef( - $this->requireFileRef($file_ref_id), - \User::findCurrent(), - $uploaded_file, - true, - false - ); - - if (!$result instanceof \FileRef) { - $this->error(500, 'Error while updating a file reference: ' . implode(' ', $result)); - } - - return $this->filerefToJSON($result); - } - - /** - * Edit a file reference. - * - * @put /file/:file_ref_id - */ - public function editFileRef($file_ref_id) - { - $result = \FileManager::editFileRef( - $this->requireFileRef($file_ref_id), - \User::findCurrent(), - $this->data['name'], - $this->data['description'], - $this->data['content_term_of_use_id'], - $this->data['license'] - ); - - if (!$result instanceof \FileRef) { - $this->error(500, 'Error while editing a file reference: ' . implode(' ', $result)); - } - - return $this->filerefToJSON($result); - } - - /** - * Copies a file reference. - * - * @post /file/:file_ref_id/copy/:destination_folder_id - */ - public function copyFileRef($file_ref_id, $destination_folder_id) - { - $result = \FileManager::copyFile( - $this->requireFileRef($file_ref_id)->getFileType(), - $this->requireFolder($destination_folder_id)->getTypedFolder(), - \User::findCurrent() - ); - - if (!($result instanceof \FileType)) { - $this->error(500, 'Error while copying a file reference: ' . implode(' ', $result)); - } - - return $this->filerefToJSON($result->getFileRef()); - } - - /** - * Moves a file reference. - * - * @post /file/:file_ref_id/move/:destination_folder_id - */ - public function moveFileRef($file_ref_id, $destination_folder_id) - { - $result = \FileManager::moveFile( - $this->requireFileRef($file_ref_id)->getFileType(), - $this->requireFolder($destination_folder_id)->getTypedFolder(), - \User::findCurrent() - ); - - if (!($result instanceof \FileType)) { - $this->error(500, 'Error while moving a file reference: ' . implode(' ', $result)); - } - - return $this->filerefToJSON($result->getFileRef()); - } - - /** - * Deletes a file reference. - * - * @delete /file/:file_ref_id - */ - public function deleteFileRef($file_ref_id) - { - $result = \FileManager::deleteFileRef( - $this->requireFileRef($file_ref_id), - \User::findCurrent() - ); - - if (!$result instanceof \FileRef) { - $this->error(500, 'Error while deleting a file reference: ' . implode(' ', $result)); - } - - $this->halt(200); - } - - /** - * Upload file to given folder. - * file data has to be attached as multipart/form-data - * - * @post /file/:folder_id - */ - public function uploadFile($folder_id) - { - $typed_folder = $this->requireFolder($folder_id)->getTypedFolder(); - if (isset($this->data['_FILES'])) { - $file_data = array_map(function ($a) { - return is_array($a) ? $a : [$a]; - }, array_shift($this->data['_FILES'])); - } - if (is_array($file_data)) { - $validated_files = \FileManager::handleFileUpload( - $file_data, - $typed_folder, - $this->requireUser()->id - ); - - if (count($validated_files['error']) > 0) { - $this->error(500, 'Error while uploading files: ' . implode(' ', $validated_files['error'])); - } - - $uploaded_files = \SimpleCollection::createFromArray($validated_files['files']); - $default_license = \ContentTermsOfUse::findDefault(); - $uploaded_files->setValue('content_terms_of_use_id', $default_license->id); - $uploaded_files->store(); - if (count($uploaded_files) === 1) { - $result = $this->filerefToJSON($uploaded_files->first()); - } else { - $result = $uploaded_files->map(function ($f) { - return $this->filerefToJSON($f); - }); - } - $this->halt(201, [], $result); - } else { - $this->error(400, 'No files found in request.'); - } - } - - // FOLDER ROUTES: - - /** - * Returns a list of defined folder types, separated by range type. - * @get /studip/file_system/folder_types - */ - public function getDefinedFolderTypes() - { - return \FileManager::getFolderTypes(); - } - - /** - * Get a folder object with its file references, subdirectories and the permissions for the user who has made the API call. - * @get /folder/:folder_id - */ - public function getFolder($folder_id) - { - return $this->folderToJSON( - $this->requireFolder($folder_id), - true - ); - } - - /** - * Creates a new folder inside of another folder and returns the new object on success. - * @post /folder/:parent_folder_id/new_folder - */ - public function createNewFolder($parent_folder_id) - { - $user = \User::findCurrent(); - $parent = $this->requireTypedFolder($parent_folder_id); - - if (!$parent->isWritable($user->id)) { - $this->error(403, 'You are not permitted to create a subfolder in the parent folder!'); - } - - $result = \FileManager::createSubFolder( - $parent, - $user, - 'StandardFolder', //to be extended - $this->data['name'], - $this->data['description'] - ); - - if (!$result instanceof \FolderType) { - $this->error(500, 'Error while creating a folder: ' . implode(' ', $result)); - } - - return $this->folderToJSON( - $this->requireFolder($result->getId()) - ); - } - - /** - * Get a list with all FileRef objects of a folder. - * @get /folder/:folder_id/files - */ - public function getFileRefsOfFolder($folder_id) - { - $folder = $this->requireFolder($folder_id); - - $query = "folder_id = :folder_id ORDER BY name ASC"; - $parameters[':folder_id'] = $folder->id; - - if ($this->limit || $this->offset) { - $query .= " LIMIT :limit OFFSET :offset"; - $parameters[':limit'] = $this->limit; - $parameters[':offset'] = $this->offset; - } - - $file_refs = \FileRef::findAndMapBySql(function (\FileRef $ref) { - return $this->filerefToJSON($ref); - }, $query, $parameters); - - return $this->paginated( - $file_refs, - \FileRef::countByFolder_id($folder->id), - ['folder_id' => $folder->id] - ); - } - - - /** - * Get a list with all FileRef objects of a folder. - * @get /folder/:folder_id/subfolders - */ - public function getSubfoldersOfFolder($folder_id) - { - $user = $this->requireUser(); - $folder = $this->requireFolder($folder_id); - - $query = "parent_id = :parent_id ORDER BY name ASC"; - $parameters = [':parent_id' => $folder->id]; - - if ($this->limit || $this->offset) { - $query .= " LIMIT :limit OFFSET :offset"; - $parameters[':limit'] = $this->limit; - $parameters[':offset'] = $this->offset; - } - - $subfolders = \Folder::findAndMapBySql(function (\Folder $subfolder) use ($user) { - $type = $subfolder->getTypedFolder(); - if (!$type || !$type->isVisible($user->id)) { - return false; - } - return $this->folderToJSON($subfolder); - }, $query, $parameters); - - return $this->paginated( - array_filter($subfolders), - \Folder::countByParent_id($folder_id), - ['folder_id' => $folder_id] - ); - } - - /** - * Get a list with permissions the current user has for a folder. - * @get /folder/:folder_id/permissions - */ - public function getFolderPermissions($folder_id) - { - $user = $this->requireUser(); - $folder = $this->requireFolder($folder_id); - - // read permissions of the user and return them: - return array_merge([ - 'folder_id' => $folder->id, - 'user_id' => $user->id, - ], $this->folderPermissionsToJSON($folder)); - } - - /** - * Allows editing the name or the description (or both) of a folder. - * - * @put /folder/:folder_id - */ - public function editFolder($folder_id) - { - if (isset($this->data['name']) && !$this->data['name']) { - $this->error(400, "The name for the folder with the id {$folder_id} must not be empty!"); - } - - $user = $this->requireUser(); - $typed_folder = $this->requireTypedFolder($folder_id); - - if (!$typed_folder->isEditable($user->id)) { - $this->error(403, "You may not edit the folder with id {$folder_id}!"); - } - - if (!$typed_folder instanceof \StandardFolder) { - $this->error(501, "Editing is only allowed for folders of type StandardFolder for now!"); - } - - if ($this->data['name']) { - $typed_folder->name = $this->data['name']; - } - if (isset($this->data['description'])) { - $typed_folder->description = $this->data['description'] ?: ''; - } - - if (!$typed_folder->store()) { - $this->error(500, "Could not store folder with id {$folder_id}!"); - } - - return $this->folderToJSON( - $this->requireFolder($folder_id) - ); - } - - /** - * Copies a folder into another folder. - * - * @post /folder/:folder_id/copy/:destination_folder_id - */ - public function copyFolder($folder_id, $destination_folder_id) - { - $result = \FileManager::copyFolder( - $this->requireTypedFolder($folder_id), - $this->requireTypedFolder($destination_folder_id), - \User::findCurrent() - ); - - if (!$result instanceof \FolderType) { - $this->error(500, 'Error while copying a folder: ' . implode(' ', $result)); - } - - return $this->folderToJSON( - $this->requireFolder($result->getId()) - ); - } - - - /** - * Move a folder into another folder. - * @post /folder/:folder_id/move/:destination_folder_id - */ - public function moveFolder($folder_id, $destination_folder_id) - { - $result = \FileManager::moveFolder( - $this->requireTypedFolder($folder_id), - $this->requireTypedFolder($destination_folder_id), - \User::findCurrent() - ); - - if (!$result instanceof \FolderType) { - $this->error(500, 'Error while moving a folder: ' . implode(' ', $result)); - } - - return $this->folderToJSON( - $this->requireFolder($folder_id) - ); - } - - - /** - * Deletes a folder. - * - * @delete /folder/:folder_id - */ - public function deleteFolder($folder_id) - { - $result = \FileManager::deleteFolder( - $this->requireTypedFolder($folder_id), - \User::findCurrent() - ); - - if (!$result instanceof \FolderType) { - $this->error(500, 'Error while deleting a folder: ' . implode(' ', $result)); - } - - $this->halt(200); - } - - // RELATED OBJECT ROUTES: - - /** - * Get a collection of all ContentTermsOfUse objects - * - * @get /studip/content_terms_of_use_list - */ - public function getContentTermsOfUseList() - { - $objects = \ContentTermsOfUse::findBySql( - '1 ORDER BY name ASC LIMIT :limit OFFSET :offset', - ['limit' => $this->limit, 'offset' => $this->offset] - ); - - return $this->paginated( - array_map([$this, 'termsOfUseToJSON'], $objects), - \ContentTermsOfUse::countBySql('1') - ); - } - - // UTILITY METHODS - - /** - * Requires a valid user object. - * @return \User object - */ - private function requireUser() - { - return \User::findCurrent(); - } - - /** - * Requires a valid file reference object - * @param mixed $id_or_object Either a file reference id or object - * @return \FileRef object - */ - private function requireFileRef($id_or_object) - { - if ($id_or_object instanceof \FileRef) { - $file_ref = $id_or_object; - } else { - //check if the file_id references a file reference object: - $file_ref = \FileRef::find($id_or_object); - if (!$file_ref) { - $this->notFound("File reference with id {$id_or_object} not found!"); - } - } - - // check if the file reference is placed inside a folder. - // (must be present to check for permissions) - if (!$file_ref->folder) { - $this->error(500, "File reference with id {$file_ref->id} has no folder!"); - } - - $typed_folder = $file_ref->folder->getTypedFolder(); - if (!$typed_folder) { - $this->error(500, "The folder of file reference with id {$file_ref->id} has no folder type!"); - } - - //check if the current user has the permissions to read this file reference: - if (!$typed_folder->isReadable($this->requireUser()->id)) { - $this->error(403, "You are not permitted to read the file reference with id {$file_ref->id}!"); - } - - return $file_ref; - } - - /** - * Converts a file reference object to JSON. - * @param \FileRef $ref File reference object - * @param boolean $extended Extended output? (includes folder, owner and terms of use) - * @return array representation for json encoding - */ - private function filerefToJSON(\FileRef $ref, $extended = false) - { - $user = $this->requireUser(); - $typed_folder = $ref->folder->getTypedFolder(); - $filetype = $ref->getFileType(); - - $result = array_merge($ref->toRawArray(), [ - 'size' => (int) $ref->file->size, - 'mime_type' => $ref->file->mime_type, - 'storage' => $ref->file->filetype === "URLFile" ? "url" : "disk", - - 'is_readable' => $typed_folder->isReadable($user->id), - 'is_downloadable' => $filetype->isDownloadable($user->id), - 'is_editable' => $filetype->isEditable($user->id), - 'is_writable' => $filetype->isWritable($user->id), - ]); - - $result['downloads'] = (int) $result['downloads']; - $result['mkdate'] = (int) $result['mkdate']; - $result['chdate'] = (int) $result['chdate']; - - if ($result['storage'] === 'url') { - $result['url'] = $ref->getFileType()->getDownloadURL(); - } - - if ($extended) { - //folder does exist (since we checked for its existence above) - $result['folder'] = $this->folderToJSON($ref->folder); - - if ($ref->owner) { - $result['owner'] = User::getMiniUser($this, $ref->owner); - } - - //$result['license'] = $file_ref->license; //to be activated when licenses are defined - - if ($ref->terms_of_use) { - $result['terms_of_use'] = $this->termsOfUseToJSON($ref->terms_of_use); - } - } - - return $result; - } - - /** - * Requires a valid folder object - * @param mixed $id_or_object Either a folder id or object - * @return Folder object - */ - private function requireFolder($id_or_object) - { - if ($id_or_object instanceof \Folder) { - $folder = $id_or_object; - } else { - $folder = \Folder::find($id_or_object); - if (!$folder) { - $this->notFound("Folder with id {$id_or_object} not found!"); - } - } - - $typed_folder = $folder->getTypedFolder(); - if (!$typed_folder) { - $this->error(500, "Cannot find folder type of folder with id {$folder->id}!"); - return; - } - - if (!$typed_folder->isReadable($this->requireUser()->id)) { - $this->error(403, "You are not allowed to read the contents of the folder with the id {$folder->id}!"); - } - - return $folder; - } - - /** - * Requires a valid typed folder object - * @param mixed $id_or_object Either a folder id or object - * @return FolderType instance - */ - private function requireTypedFolder($id_or_object) - { - return $this->requireFolder($id_or_object)->getTypedFolder(); - } - - /** - * Converts a given folder to JSON. - * @param Folder $folder Folder object - * @param boolean $extended Extended output? (includes subfolders and file references) - * @return array representation for json encoding - */ - private function folderToJSON(\Folder $folder, $extended = false) - { - $result = $this->folderPermissionsToJSON($folder); - - if ($result['is_readable']) { - $result = array_merge($folder->toRawArray(), $result); - - $result['mkdate'] = (int) $result['mkdate']; - $result['chdate'] = (int) $result['chdate']; - - //The field "data_content" must be handled differently - //than the other fields since it contains JSON data. - $data_content = json_decode($folder->data_content); - $result['data_content'] = $data_content; - - if ($extended) { - $user = $this->requireUser(); - - $result['subfolders'] = []; - foreach ($folder->subfolders as $subfolder) { - if (!$subfolder->getTypedFolder()->isVisible($user->id)) { - continue; - } - $result['subfolders'][] = $this->folderToJSON($subfolder); - } - - $result['file_refs'] = []; - foreach ($folder->getTypedFolder()->getFiles() as $file) { - if (method_exists($file,"getFileRef")) { - $result['file_refs'][] = $this->filerefToJSON( - $file->getFileRef() - ); - } - } - } - } - - return $result; - } - - /** - * Converts permissions of a folder to JSON. - * @param Folder $folder Folder object - * @param User $user User object to check permissions against - * @return array representation for json encoding - */ - private function folderPermissionsToJSON(\Folder $folder) - { - $user = $this->requireUser(); - $type = $folder = $folder->getTypedFolder(); - if (!$type) { - $this->error(500, 'Folder type not found!'); - } - - return [ - 'is_visible' => $type->isVisible($user->id), - 'is_readable' => $type->isReadable($user->id), - 'is_writable' => $type->isWritable($user->id), - ]; - } - - /** - * Converts a terms of use object to JSON. - * @param ContentTermsOfUse $object Object - * @return array representation for json encoding - */ - private function termsOfUseToJSON(\ContentTermsOfUse $object) - { - $result = $object->toRawArray(); - - $result['is_default'] = (bool) $result['is_default']; - - $result['mkdate'] = (int) $result['mkdate']; - $result['chdate'] = (int) $result['chdate']; - - return $result; - } -} diff --git a/app/routes/Forum.php b/app/routes/Forum.php deleted file mode 100644 index 35aad913afebbddb191db1a0bd91b12bf926a041..0000000000000000000000000000000000000000 --- a/app/routes/Forum.php +++ /dev/null @@ -1,419 +0,0 @@ -<?php -namespace RESTAPI\Routes; - -/** - * @author <mlunzena@uos.de> - * @license GPL 2 or later - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - * - * @condition course_id ^[a-f0-9]{1,32}$ - */ -class Forum extends \RESTAPI\RouteMap -{ - /** - * List all categories of a forum - * - * @get /course/:course_id/forum_categories - */ - public function getForumCategories($course_id) - { - if (!\ForumPerm::has('view', $course_id)) { - $this->error(401); - } - - $categories = \ForumCat::findBySeminar_id($course_id, 'ORDER BY pos ASC'); - $total = sizeof($categories); - $categories = array_splice($categories, (int)$this->offset, (int)$this->limit ?: 10); - - $json = []; - foreach ($categories as $cat) { - $json_cat = $cat->toArray(); - $uri = $this->urlf('/forum_category/%s', [htmlReady($json_cat['category_id'])]); - $json_cat['course_id'] = $json_cat['seminar_id']; - $json[$uri] = $this->categoryToJson($json_cat); - } - - $this->etag(md5(serialize($json))); - - return $this->paginated($json, $total, compact('course_id')); - } - - /** - * Create a new category - * - * @post /course/:course_id/forum_categories - */ - public function createForumCategory($course_id) - { - if (!\ForumPerm::has("add_category", $course_id)) { - $this->error(401); - } - - if (!isset($this->data['name']) || !mb_strlen($name = trim($this->data['name']))) { - $this->error(400, 'Category name required.'); - } - - $category_id = \ForumCat::add($course_id, $name); - if (!$category_id) { - $this->error(500, 'Error creating the forum category.'); - } - - $this->redirect('forum_category/' . $category_id, 201, 'ok'); - } - - /** - * Read a category - * - * @get /forum_category/:category_id - */ - public function getForumCategory($category_id) - { - $category = $this->findCategory($category_id); - $cid = $category['course_id']; - - if (!\ForumPerm::has('view', $cid)) { - $this->error(401); - } - - $category_json = $this->categoryToJson($category); - $this->etag(md5(serialize($category_json))); - return $category_json; - } - - /** - * Update a category - * - * @put /forum_category/:category_id - */ - public function updateForumCategory($category_id) - { - $category = $this->findCategory($category_id); - - if (!\ForumPerm::has("edit_category", $category['course_id'])) { - $this->error(401); - } - - if (!isset($this->data['name']) || !mb_strlen($name = trim($this->data['name']))) { - $this->error(400, 'Category name required.'); - } - - \ForumCat::setName($category_id, $this->data['name']); - - $this->status(204); - } - - /** - * Delete a category - * - * @delete /forum_category/:category_id - */ - public function deleteForumCategory($category_id) - { - $category = $this->findCategory($category_id); - $cid = $category['course_id']; - - if (!\ForumPerm::has("remove_category", $cid)) { - $this->error(401); - } - - \ForumCat::remove($category_id, $cid); - - $this->status(204); - } - - /** - * Show entries of a category - * - * @get /forum_category/:category_id/areas - */ - public function getCategoryEntries($category_id) - { - $category = $this->findCategory($category_id); - - if (!\ForumPerm::has('view', $category['course_id'])) { - $this->error(401); - } - - $areas = $this->getAreas($category_id, $this->offset, $this->limit); - - $this->etag(md5(serialize($areas))); - return $this->paginated($areas, $this->countAreas($category_id), compact('category_id')); - } - - - - /** - * Add a new forum entry to an existing one - * - * @post /forum_category/:category_id/areas - */ - public function appendForumEntry($category_id) - { - $category = $this->findCategory($category_id); - $cid = $category['course_id']; - - if (!\ForumPerm::has('add_area', $cid)) { - $this->error(401); - } - - if (!isset($this->data['subject']) || !mb_strlen($subject = trim($this->data['subject']))) { - $this->error(400, 'Subject required.'); - } - - if (!isset($this->data['content'])) { - $this->error(400, 'Content required.'); - } - $content = trim($this->data['content']); - - $anonymous = isset($this->data['anonymous']) ? intval($this->data['anonymous']) : 0; - - $entry_id = $this->createEntry($cid, $cid, $subject, $content, $anonymous); - - \ForumCat::addArea($category_id, $entry_id); - - $this->redirect('forum_entry/' . $entry_id, 201, "ok"); - } - - /** - * Get a forum entry - * - * @get /forum_entry/:entry_id - */ - public function getForumEntry($entry_id) - { - $entry = \ForumEntry::getConstraints($entry_id); - $cid = $entry['seminar_id']; - - if (!\ForumPerm::has('view', $cid)) { - $this->error(401); - } - - $entry = $this->findEntry($entry_id); - $this->lastmodified($entry->chdate); - $this->etag(md5(serialize($entry))); - return $entry; - } - - /** - * Add a new forum entry to an existing one - * - * @post /forum_entry/:entry_id - */ - public function addForumEntry($parent_id) - { - $parent = \ForumEntry::getConstraints($parent_id); - $cid = $parent['seminar_id']; - - $perm = self::isArea($parent) ? 'add_area' : 'add_entry'; - - if (!\ForumPerm::has($perm, $cid)) { - $this->error(401); - } - - $subject = (string) trim($this->data['subject']); - $content = (string) trim($this->data['content']); - - // areas and threads need a subject, postings do not - if ($parent['depth'] < 3 && !$subject) { - $this->error(400, 'Subject required.'); - } - - // all entries besides the area need content - if ($parent['depth'] > 1 && !$content) { - $this->error(400, 'Content required.'); - } - - if ($parent['depth'] >= 3 && $subject) { - $this->error(400, 'Must not have subject here.'); - } - - $anonymous = isset($this->data['anonymous']) ? (int) $this->data['anonymous'] : 0; - - $entry_id = $this->createEntry($parent_id, $cid, $subject, $content, $anonymous); - - $this->redirect('forum_entry/' . $entry_id, 201, "ok"); - } - - /** - * Update an existing one forum entry - * - * @put /forum_entry/:entry_id - */ - public function updateForumEntry($entry_id) - { - $entry = \ForumEntry::getConstraints($entry_id); - $cid = $entry['seminar_id']; - - $perm = self::isArea($entry) ? 'edit_area' : 'edit_entry'; - - if (!\ForumPerm::hasEditPerms($entry_id) || !\ForumPerm::has($perm, $cid)) { - $this->error(401); - } - - $subject = (string) trim($this->data['subject']); - $content = (string) trim($this->data['content']); - - // areas and threads need a subject, postings do not - if ($entry['depth'] < 3 && !$subject) { - $this->error(400, 'Subject required.'); - } - - // all entries besides the area need content - if ($entry['depth'] > 1 && !$content) { - $this->error(400, 'Content required.'); - } - - if ($entry['depth'] >= 3 && $subject) { - $this->error(400, 'Must not have subject here.'); - } - - \ForumEntry::update($entry_id, $subject, $content); - - $this->status(204); - } - - /** - * Delete an entry - * - * @delete /forum_entry/:entry_id - */ - public function deleteForumEntry($entry_id) - { - $entry = \ForumEntry::getConstraints($entry_id); - $cid = $entry['seminar_id']; - - if (!\ForumPerm::hasEditPerms($entry_id) || !\ForumPerm::has('remove_entry', $cid)) { - $this->error(401); - } - - \ForumEntry::delete($entry_id); - - $this->status(204); - } - - /********************* - * * - * PRIVATE FUNCTIONS * - * * - *********************/ - - - private function findEntry($entry_id) - { - $raw = \ForumEntry::getConstraints($entry_id); - if ($raw === false) { - $this->notFound(); - } - - $entry = $this->convertEntry($raw); - - $children = \ForumEntry::getEntries($entry_id, \ForumEntry::WITHOUT_CHILDS, '', 'ASC', 0, false); - - if (isset($children['list'][$entry_id])) { - unset($children['list'][$entry_id]); - } - - $entry['children'] = []; - foreach (array_values($children['list']) as $childentry) { - $entry['children'][] = $this->convertEntry($childentry); - } - - return $entry; - } - - public function convertEntry($raw) - { - $entry = []; - foreach(words("topic_id mkdate chdate anonymous depth") as $key) { - $entry[$key] = $raw[$key]; - } - - $hide_user = $entry['anonymous'] && $raw['user_id'] !== $GLOBALS['user']->id; - - $entry['subject'] = $raw['name']; - $entry['user'] = $hide_user ? null : $this->urlf('/user/%s', [$raw['user_id']]); - $entry['course'] = $this->urlf('/course/%s', [$raw['seminar_id']]); - $entry['content_html'] = \ForumEntry::getContentAsHtml($raw['content']); - $entry['content'] = \ForumEntry::killEdit($raw['content']); - - return $entry; - } - - - private static function isArea($entry) - { - return 1 === $entry['depth']; - } - - private function createEntry($parent_id, $course_id, $subject, $content, $anonymous) - { - $topic_id = self::generateID(); - - $data = [ - 'topic_id' => $topic_id, - 'seminar_id' => $course_id, - 'user_id' => $GLOBALS['user']->id, - 'name' => $subject, - 'content' => $content, - 'author' => $GLOBALS['user']->getFullName(), - 'author_host' => $_SERVER['REMOTE_ADDR'], - 'anonymous' => (int) $anonymous - ]; - \ForumEntry::insert($data, $parent_id); - - return $topic_id; - } - - private function findCategory($category_id) - { - $result = []; - - if ($cat = \ForumCat::get($category_id)) { - $result = $cat; - $result['course_id'] = $cat['seminar_id']; - $result['name'] = $cat['entry_name']; - } else { - $this->error(404); - } - - return $result; - } - - private function categoryToJson($category) - { - $json = $category; - - $json['course'] = $this->urlf('/course/%s', [htmlReady($json['course_id'])]); - unset($json['course_id']); - - $json['areas'] = $this->urlf('/forum_category/%s/areas', [$json['category_id']]); - $json['areas_count'] = $this->countAreas($json['category_id']); - - return $json; - } - - private function countAreas($category_id) - { - return sizeof(\ForumCat::getAreas($category_id)); - } - - private function getAreas($category_id, $offset = 0, $limit = 10) - { - $offset = (int) $offset; - $limit = (int) $limit; - - $areas = []; - - foreach (\ForumCat::getAreas($category_id, $offset, $limit) as $area) { - $url = $this->urlf('/forum_entry/%s', [htmlReady($area['topic_id'])]); - $areas[$url] = $this->convertEntry($area); - } - - return $areas; - } - - private static function generateID() - { - return md5(uniqid(rand())); - } -} diff --git a/app/routes/Messages.php b/app/routes/Messages.php deleted file mode 100644 index db9cb2e9f3cca5a6fc0c2ec0f5efa258356c350c..0000000000000000000000000000000000000000 --- a/app/routes/Messages.php +++ /dev/null @@ -1,301 +0,0 @@ -<?php -namespace RESTAPI\Routes; - -/** - * @author <mlunzena@uos.de> - * @license GPL 2 or later - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - * - * @condition message_id ^[a-f0-9]{1,32}$ - * @condition user_id ^[a-f0-9]{1,32}$ - * @condition box ^(inbox|outbox)$ - */ -class Messages extends \RESTAPI\RouteMap -{ - /** - * Liefert die Anzahl der vorhandenen Nachrichten des autorisierten Nutzers - * zurück. Der Parameter bestimmt je nach Wert, auf welchen Bereich - * (Posteingang bzw. Postausgang) zugegriffen werden soll. - * Die Rückgabe beinhaltet jeweils die Anzahl aller Nachrichten sowie die - * Anzahl der ungelesenen Nachrichten. - * - * @head /user/:user_id/:box - */ - public function indexOfMessages($user_id, $box) - { - if ($user_id !== self::currentUser()) { - $this->error(401); - } - - $count = $this->countMessages($user_id, $box); - - $this->headers([ - 'X-Messages-Total' => $count['total'], - 'X-Messages-Unread' => $count['unread'], - ]); - - return null; - } - - /** - * Liefert die vorhandenen Nachrichten des autorisierten Nutzers zurück. - * - * @get /user/:user_id/:box - */ - public function getMessages($user_id, $box) - { - if ($user_id !== self::currentUser()) { - $this->error(401); - } - - $ids = $this->getMessageIds($user_id, $box); - $total = count($ids); - - $ids = array_slice($ids, $this->offset, $this->limit); - - $messages = []; - if (count($ids) > 0) { - \Message::findEachMany(function ($message) use (&$messages) { - $url = $this->urlf('/message/%s', $message->id); - $messages[$url] = $this->messageToJSON($message); - }, $ids, 'ORDER BY mkdate DESC'); - } - - return $this->paginated($messages, $total, compact('user_id', 'box')); - } - - /** - * Liefert die Daten der angegebenen Nachricht zurück. - * - * @get /message/:message_id - */ - public function showMessage($message_id) - { - $message = $this->requireMessage($message_id); - $message_json = $this->messageToJSON($message); - $this->etag(md5(serialize($message_json))); - return $message_json; - } - - - /** - * Get the root file folder of a message. The root file folder contains all - * files that were appended to the message. - * - * @get /message/:message_id/file_folder - */ - public function getTopFolder($message_id) - { - //first we check if the user exists: - $message = \Message::find($message_id); - - $user = \User::findCurrent(); - - if (!$user) { - $this->halt(404, 'User not found!'); - } - - if(!$message->permissionToRead($user->id)) { - $this->halt(403, 'You are not allowed to read this message or its appended files!'); - } - - //we can get the top folder: - $top_folder = \Folder::findTopFolder($message->id, 'message'); - - if($top_folder) { - $file_system_api = new FileSystem(); - return $file_system_api->getFolder($top_folder->id); - } else { - $this->halt(404, 'Folder not found!'); - } - } - - - /** - * Schreibt eine neue Nachricht. - * - * @post /messages - */ - public function createMessage() - { - if (!mb_strlen($subject = trim($this->data['subject'] ?: ''))) { - $this->error(400, 'No subject provided'); - } - - if (!mb_strlen($message = trim($this->data['message'] ?: ''))) { - $this->error(400, 'No message provided'); - } - - $recipients = (array) ($this->data['recipients'] ?: null); - if (!sizeof($recipients)) { - $this->error(400, 'No recipient(s) provided'); - } - - $usernames = array_map(function ($id) { $user = \User::find($id); return @$user['username']; }, $recipients); - - if (sizeof($usernames) !== sizeof(array_filter($usernames))) { - $this->error(400, "Some recipients do not exist."); - } - - $message = \Message::send($GLOBALS['user']->id, $usernames, $subject, $message); - if (!$message) { - $this->error(500, 'Could not create message'); - } - - $this->redirect('message/' . $message->id, 201, "ok"); - } - - - /** - * Eine Nachricht als (un)gelesen markieren. - * - * @put /message/:message_id - */ - public function updateMessage($message_id) - { - - $message = $this->requireMessage($message_id); - $user_id = $this->currentUser(); - - if (isset($this->data['unread'])) { - if ($this->data['unread']) { - $message->markAsUnread($user_id); - } else { - $message->markAsRead($user_id); - } - } - - $this->halt(204); - } - - /** - * Löscht eine Nachricht. - * - * @delete /message/:message_id - */ - public function destroyMessage($message_id) - { - $message = $this->requireMessage($message_id); - - $msgin = new \messaging(); - if (!$msgin->delete_message($message_id, self::currentUser(), true)) { - $this->error(500); - } - - $this->status(204); - } - - /**************************************************/ - /* PRIVATE HELPER METHODS */ - /**************************************************/ - - private static function currentUser() - { - return $GLOBALS['user']->id; - } - - private function requireMessage($message_id) - { - if (!$message = \Message::find($message_id)) { - $this->notFound("Message not found"); - } - - $current_user = self::currentUser(); - $message_user = $message->originator->user_id === $current_user - ? $message->originator - : $message->receivers->findOneBy('user_id', $current_user); - - if (!$message_user) { - $this->error(401); - } - - if ($message_user->deleted) { - $this->notFound("Message not found"); - } - - return $message; - } - - private function messageToJSON($message) - { - $user_id = self::currentUser(); - - $my_mu = $message->receivers->filter(function ($mu) use ($user_id) { - return $mu->user_id === $user_id; - }); - if ($message->originator->user_id === $user_id) { - $my_mu[] = $message->originator; - } - - $my_roles = [ - 'snd' => $message->autor_id === $user_id, - 'rec' => in_array('rec', $my_mu->pluck('snd_rec')), - ]; - - $json = $message->toArray(words('message_id subject message mkdate priority')); - - // formatted message - $json['message_html'] = formatReady($json['message']) ?: ''; - - // Tags - $json['tags'] = $message->getTags($user_id); - - // sender - $sender = $message->getSender(); - $json['sender'] = $this->urlf('/user/%s', [$message->author->id]); - - // recipients - if ($my_roles['snd']) { - $json['recipients'] = []; - foreach ($message->getRecipients() as $r) { - $json['recipients'][] = $this->urlf('/user/%s', [$r->user_id]); - } - } else { - $json['recipients'] = [$this->urlf('/user/%s', [$user_id])]; - } - - // attachments - if ($message->attachment_folder && count($message->attachment_folder->file_refs) > 0) { - $json['attachments'] = []; - foreach ($message->attachment_folder->file_refs as $ref) { - $json['attachments'][] = $this->urlf('/file/%s', [$ref->id]); - } - } - - // unread only if in inbox - if ($my_roles['rec']) { - foreach ($my_mu as $mu) { - if ($mu->snd_rec === 'rec') { - $json['unread'] = !$mu->readed; - break; - } - } - } - - return $json; - } - - private function countMessages($user_id, $box) - { - $condition = 'user_id = ? AND snd_rec = ? AND deleted = 0'; - $params = [$user_id, $box === 'inbox' ? 'rec' : 'snd']; - - $total = \MessageUser::countBySQL($condition, $params); - $unread = \MessageUser::countBySQL( - $condition . ' AND readed = 0', - $params - ); - - return compact('total', 'unread'); - } - - private function getMessageIds($user_id, $box) - { - return \MessageUser::findAndMapBySQL(function ($row) { - return $row->message_id; - }, 'user_id = ? AND snd_rec = ? AND deleted = 0 ORDER BY mkdate DESC', [ - $user_id, $box === 'inbox' ? 'rec' : 'snd' - ]); - } - -} diff --git a/app/routes/News.php b/app/routes/News.php deleted file mode 100644 index c9b258baf968bf0c19539582a5257ddd9be72623..0000000000000000000000000000000000000000 --- a/app/routes/News.php +++ /dev/null @@ -1,375 +0,0 @@ -<?php -namespace RESTAPI\Routes; - -/** - * @author <mlunzena@uos.de> - * @license GPL 2 or later - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - * - * @condition news_id ^[0-9a-f]{1,32}$ - * @condition course_id ^[0-9a-f]{1,32}$ - * @condition user_id ^[0-9a-f]{1,32}$ - * @condition comment_id ^[0-9a-f]{1,32}$ - */ -class News extends \RESTAPI\RouteMap -{ - public static function before() - { - require_once 'lib/models/StudipNews.class.php'; - } - - /** - * Globale News auslesen - * - * @get /studip/news - */ - public function getGlobalNews() - { - list($json, $total) = $this->getRangedNews('studip'); - - $this->etag(md5(serialize($json))); - return $this->paginated($json, $total); - } - - /** - * News einer Veranstaltung auslesen - * - * @get /course/:course_id/news - */ - public function getCourseNews($course_id) - { - list($json, $total) = $this->getRangedNews($course_id); - - $this->etag(md5(serialize($json))); - return $this->paginated($json, $total, compact('course_id')); - } - - /** - * News eines Nutzers auslesen - * - * @get /user/:user_id/news - */ - public function getUserNews($user_id) - { - list($json, $total) = $this->getRangedNews($user_id); - - $this->etag(md5(serialize($json))); - return $this->paginated($json, $total, compact('user_id')); - } - - - /** - * News auslesen - * - * @get /news/:news_id - */ - public function getNews($news_id) - { - $news = $this->requireNews($news_id); - $news_json = $this->newsToJson($news); - - $this->lastmodified($news->chdate); - $this->expires($news->expire); - $this->etag(md5(serialize($news_json))); - - return $news_json; - } - - /** - * News löschen - * - * @delete /news/:news_id - */ - public function destroyNews($news_id) - { - $news = $this->requireNews($news_id); - - if (!$news->havePermission('delete', '', $GLOBALS['user']->id)) { - $this->error(401); - } - - $news->delete(); - $this->status(204); - } - - - /** - * News updaten - * - * @put /news/:news_id - */ - public function updateNews($news_id) - { - $news = $this->requireNews($news_id); - if (!$news->havePermission('edit', '', $GLOBALS['user']->id)) { - $this->error(401); - } - - if (isset($this->data['topic'])) { - if (!mb_strlen(trim($topic = $this->data['topic']))) { - $this->error(400, 'Topic must not be empty.'); - } - $news->topic = $topic; - } - - if (isset($this->data['body'])) { - if (!mb_strlen(trim($body = $this->data['body']))) { - $this->error(400, 'Body must not be empty.'); - } - $news->body = $body; - } - - if (isset($this->data['expire'])) { - $news->expire = (int) $this->data['expire']; - } - - if (isset($this->data['allow_comments'])) { - $news->allow_comments = (int) $this->data['allow_comments']; - } - - $news->chdate_uid = $GLOBALS['user']->id; - - if (!$news->store()) { - $this->error(500, 'Could not update news'); - - } - $this->status(204); - } - - /** - * News anlegen - * - * @post /course/:course_id/news - * @post /user/:user_id/news - * @post /studip/news - */ - public function createNews($range_id = 'studip') - { - - if (!\StudipNews::haveRangePermission('edit', $range_id, $GLOBALS['user']->id)) { - $this->error(401, "Not authorized to create a news here."); - } - - $news = new \StudipNews(); - $news->setData([ - 'user_id' => $GLOBALS['user']->id, - 'author' => $GLOBALS['user']->getFullName(), - 'topic' => trim(@$this->data['topic']), - 'body' => trim(@$this->data['body']), - 'date' => time(), - 'expire' => isset($this->data['expire']) ? intval($this->data['expire']) : 2 * 7 * 24 * 60 * 60, - 'allow_comments' => isset($this->data['allow_comments']) ? intval($this->data['allow_comments']) : 0 - ]); - $news->addRange($range_id); - - if ($errors = $this->validateNews($news)) { - $this->error(400, compact('errors')); - } - - if (!$news->store()) { - $this->error(500); - } - - $news->storeRanges(); - - $this->redirect('news/' . $news->id, 201, "ok"); - } - - /** - * News-Comments auslesen - * - * @get /news/:news_id/comments - */ - public function getNewsComments($news_id) - { - $comments = $this->requireNews($news_id)->comments->orderBy("mkdate asc"); - - $total = count($comments); - $json = []; - foreach ($comments->limit($this->offset, $this->limit) as $comment) { - $tmp = $comment->toArray("comment_id object_id user_id content mkdate chdate"); - $tmp['content_html'] = htmlReady($comment->content); - $json[$this->urlf('/comment/%s', [htmlReady($comment->id)])] = $tmp; - } - - $this->etag(md5(serialize($json))); - - return $this->paginated($json, $total, compact('news_id')); - } - - /** - * News-Comment auslesen - * - * @get /comment/:comment_id - */ - public function getComment($comment_id) - { - $comment = $this->requireComment($comment_id); - $comment_json = $this->commentToJson($comment); - - $this->lastmodified($comment->chdate); - $this->etag(md5(serialize($comment_json))); - - return $comment_json; - } - - /** - * News-Comment anlegen - * - * @post /news/:news_id/comments - */ - public function appendComment($news_id) - { - $news = $this->requireNews($news_id); - - if (!$news->allow_comments) { - $this->error(409, 'Comments are not allowed'); - } - - if (!isset($this->data['content']) || !mb_strlen($content = trim($this->data['content']))) { - $this->error(400, 'Content required.'); - } - - $comment = new \StudipComment(); - $comment->setData( - [ - 'object_id' => $news_id, - 'user_id' => $GLOBALS['user']->id, - 'content' => $content - ]); - - if (!$comment->store()) { - $this->halt(500, 'Could not create comment.'); - } - - $this->redirect('comment/' . $comment->id, 201, "ok"); - } - - /** - * News-Comment löschen - * - * @delete /comment/:comment_id - */ - public function destroyComment($comment_id) - { - $comment = $this->requireComment($comment_id); - - if (!$comment->delete()) { - $this->error(500, 'Comment could not be deleted.'); - } - - $this->halt(204); - } - - - /**************************************************/ - /* PRIVATE HELPER METHODS */ - /**************************************************/ - - private function getRangedNews($range_id) - { - - $news = \StudipNews::getNewsByRange($range_id, true, true); - - if (!self::checkRangePermission($range_id, $GLOBALS['user']->id)) { - $this->error(401); - } - - $total = count($news); - $news = array_slice($news, $this->offset, $this->limit); - - $json = []; - foreach ($news as $n) { - $json[$this->urlf('/news/%s', [$n->id])] = $this->newsToJson($n); - } - - return [$json, $total]; - } - - private function validateNews($news) - { - $errors = []; - - $retain = $_SESSION['messages']; - $_SESSION['messages'] = []; - - if (!$news->validate()) { - foreach ($_SESSION['messages'] as $message_box) { - $errors[] = $message_box->message; - } - } - - $_SESSION['messages'] = $retain; - return $errors; - } - - private static function checkRangePermission($range_id, $user_id) - { - return \StudipNews::haveRangePermission('view', $range_id, $user_id); - } - - - private function requireNews($id) - { - if (!$news = \StudipNews::find($id)) { - $this->notFound("News not found"); - } - - if (!$news->havePermission('view', '', $GLOBALS['user']->id)) { - $this->error(401); - } - - return $news; - } - - private function newsToJson($news) - { - $json = $news->toArray(words("news_id topic body date user_id expire allow_comments chdate chdate_uid mkdate")); - - $json['topic'] = (string) $news->topic; - $json['body_html'] = formatReady((string) $news->body); - $json['chdate_uid'] = trim($json['chdate_uid']); - - if ($news->allow_comments) { - $json['comments'] = $this->urlf('/news/%s/comments', [$news->id]); - $json['comments_count'] = sizeof($news->comments); - } - - $json['ranges'] = []; - foreach ($news->news_ranges as $range) { - if (self::checkRangePermission($range->range_id, $GLOBALS['user']->id)) { - switch ($range->type) { - case 'global': $url = $this->url('/studip/news'); break; - case 'sem': $url = $this->urlf('/course/%s/news', [$range->range_id]); break; - case 'user': $url = $this->urlf('/user/%s/news', [$range->range_id]); break; - case 'inst': $url = $this->urlf('/TODO/%s/news', [$range->range_id]); break; - case 'fak': $url = $this->urlf('/TODO/%s/news', [$range->range_id]); break; - } - - $json['ranges'][] = $url; - } - } - return $json; - } - - private function requireComment($id) - { - if (!$comment = \StudipComment::find($id)) { - $this->notFound("Comment not found"); - } - if (!$comment->news->havePermission('view', '', $GLOBALS['user']->id)) { - $this->error(401); - } - - return $comment; - } - - private function commentToJson($comment) - { - $json = $comment->toArray(words("comment_id mkdate chdate content")); - $json['content_html'] = formatReady($json['content']); - $json['author'] = $this->urlf('/user/%s', [$comment->user_id]); - $json['news'] = $this->urlf('/news/%s', [$comment->object_id]); - return $json; - } -} diff --git a/app/routes/ResourceBooking.php b/app/routes/ResourceBooking.php deleted file mode 100644 index a5d027f44b23912791820e7c6e1c5572d28f1e0c..0000000000000000000000000000000000000000 --- a/app/routes/ResourceBooking.php +++ /dev/null @@ -1,192 +0,0 @@ -<?php -namespace RESTAPI\Routes; - -/** - * This file contains the REST class for the - * room and resource management system. - * - * @author Moritz Strohm <strohm@data-quest.de> - * @copyright 2017-2019 - * @license http://www.gnu.org/licenses/gpl-2.0.html GPL version 2 - * @since 4.5 - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - */ -class ResourceBooking extends \RESTAPI\RouteMap -{ - - /** - * Helper method that either returns the specified data - * or simply an empty string in case that no request result - * is requested. - */ - protected function sendReturnData($data) - { - if (\Request::submitted('quiet')) { - //Return nothing. - return ''; - } - - //Return data. - return $data; - } - - - /** - * Moves a resource booking, if permitted. - * - * @post /resources/booking/:booking_id/move - */ - public function move($booking_id) - { - $booking = \ResourceBooking::find($booking_id); - if (!$booking) { - $this->notFound('Resource booking object not found!'); - } - - $current_user = \User::findCurrent(); - - if ($booking->isReadOnlyForUser($current_user)) { - throw new \AccessDeniedException(); - } - - $resource_id = \Request::get('resource_id'); - $begin_str = \Request::get('begin'); - $end_str = \Request::get('end'); - $interval_id = \Request::get('interval_id'); - - //Try the ISO format first: YYYY-MM-DDTHH:MM:SS±ZZ:ZZ - $begin = \DateTime::createFromFormat(\DateTime::RFC3339, $begin_str); - $end = \DateTime::createFromFormat(\DateTime::RFC3339, $end_str); - if (!($begin instanceof \DateTime) || !($end instanceof \DateTime)) { - $tz = new \DateTime(); - $tz = $tz->getTimezone(); - //Try the ISO format without timezone: - $begin = \DateTime::createFromFormat('Y-m-d\TH:i:s', $begin_str, $tz); - $end = \DateTime::createFromFormat('Y-m-d\TH:i:s', $end_str, $tz); - } - - //Check if a specific interval has been moved: - if ($interval_id) { - $interval = \ResourceBookingInterval::findOneBySql( - 'interval_id = :interval_id AND booking_id = :booking_id', - [ - 'interval_id' => $interval_id, - 'booking_id' => $booking->id - ] - ); - if (!$interval) { - $this->notFound('Resource booking interval not found!'); - } - $interval_begin = new \DateTime(); - $interval_begin->setTimestamp($interval->begin); - $interval_end = new \DateTime(); - $interval_end->setTimestamp($interval->end); - - //Calculate the difference from the interval time range - //to the time range from the request. That difference - //is then applied to the booking. - $begin_diff = $interval_begin->diff($begin); - $end_diff = $interval_end->diff($end); - - $new_booking_begin = new \DateTime(); - $new_booking_begin->setTimestamp($booking->begin); - $new_booking_end = new \DateTime(); - $new_booking_end->setTimestamp($booking->end); - - $new_booking_begin = $new_booking_begin->add($begin_diff); - $new_booking_end = $new_booking_end->add($end_diff); - //We must substract the preparation time to the begin timestamp - //to get the real begin: - $real_begin = clone $new_booking_begin; - if ($booking->preparation_time > 0) { - $real_begin->sub(new \DateInterval('PT' . ($booking->preparation_time / 60 ) . 'M')); - } - $booking->begin = $real_begin->getTimestamp(); - $booking->end = $new_booking_end->getTimestamp(); - } else { - //We must substract the preparation time to the begin timestamp - //to get the real begin: - $real_begin = clone $begin; - if ($booking->preparation_time > 0) { - $real_begin->sub(new \DateInterval('PT' . ($booking->preparation_time / 60 ) . 'M')); - } - $booking->begin = $real_begin->getTimestamp(); - $booking->end = $end->getTimestamp(); - } - if ($resource_id) { - //The resource-ID has changed: - //The booking was moved from one resource to another. - $booking->resource_id = $resource_id; - } - - //Update the booking_user_id field: - $booking->booking_user_id = \User::findCurrent()->id; - - try { - $booking->store(); - return $this->sendReturnData($booking->toRawArray()); - } catch (\Exception $e) { - $this->halt(500, $e->getMessage()); - } - } - - - /** - * Retrieves the intervals of the resource booking. - * These can be filtered by a time range. - * - * @get /resources/booking/:booking_id/intervals - */ - public function getIntervals($booking_id) - { - $booking = \ResourceBooking::find($booking_id); - if (!$booking) { - $this->notFound('Resource booking object not found!'); - } - - $current_user = \User::findCurrent(); - - $resource = $booking->resource->getDerivedClassInstance(); - if (!$resource->bookingPlanVisibleForUser($current_user)) { - throw new \AccessDeniedException(); - } - - //Get begin and end: - $begin_str = \Request::get('begin'); - $end_str = \Request::get('end'); - $begin = null; - $end = null; - if ($begin_str && $end_str) { - //Try the ISO format first: YYYY-MM-DDTHH:MM:SS±ZZ:ZZ - $begin = \DateTime::createFromFormat(\DateTime::RFC3339, $begin_str); - $end = \DateTime::createFromFormat(\DateTime::RFC3339, $end_str); - if (!($begin instanceof \DateTime) || !($end instanceof \DateTime)) { - $tz = new \DateTime(); - $tz = $tz->getTimezone(); - //Try the ISO format without timezone: - $begin = \DateTime::createFromFormat('Y-m-d\TH:i:s', $begin_str, $tz); - $end = \DateTime::createFromFormat('Y-m-d\TH:i:s', $end_str, $tz); - } - } - - $sql = "booking_id = :booking_id "; - $sql_data = ['booking_id' => $booking->id]; - if (($begin instanceof \DateTime) && ($end instanceof \DateTime)) { - $sql .= "AND begin >= :begin AND end <= :end "; - $sql_data['begin'] = $begin->getTimestamp(); - $sql_data['end'] = $end->getTimestamp(); - } - if (\Request::submitted('exclude_cancelled_intervals')) { - $sql .= "AND takes_place = '1' "; - } - $sql .= "ORDER BY begin ASC, end ASC"; - $intervals = \ResourceBookingInterval::findBySql($sql, $sql_data); - - $result = []; - foreach ($intervals as $interval) { - $result[] = $interval->toRawArray(); - } - - return $result; - } -} diff --git a/app/routes/ResourceCategories.php b/app/routes/ResourceCategories.php deleted file mode 100644 index bdd3d15a855a7b568cc66799cfdfede096d3da54..0000000000000000000000000000000000000000 --- a/app/routes/ResourceCategories.php +++ /dev/null @@ -1,349 +0,0 @@ -<?php -namespace RESTAPI\Routes; - -/** - * This file contains API routes related to ResourceCategory objects. - * - * @author Moritz Strohm <strohm@data-quest.de> - * @copyright 2017-2019 - * @license http://www.gnu.org/licenses/gpl-2.0.html GPL version 2 - * @since 4.5 - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - */ -class ResourceCategories extends \RESTAPI\RouteMap -{ - /** - * Validate access to each route. - */ - public function before() - { - if (!\ResourceManager::userHasGlobalPermission(\User::findCurrent(), 'admin')) { - throw new \AccessDeniedException(); - } - } - - /** - * Returns all defined resource categories. - * - * @get /resources/categories - */ - public function getAllResourceCategories() - { - return \ResourceCategory::findAndMapBySql( - function (\ResourceCategory $category) { - return $category->toRawArray(); - }, - 'TRUE ORDER BY name ASC' - ); - } - - - /** - * Get a resource category object. - * - * @get /resources/category/:category_id - */ - public function getResourceCategory($category_id) - { - $category = \ResourceCategory::find($category_id); - if (!$category) { - $this->notFound('ResourceCategory object not found!'); - } - - return $category->toRawArray(); - } - - - /** - * Creates a resource category object. - * - * @post /resources/new_category - */ - public function addResourceCategory() - { - $name = \Request::get('name'); - $description = \Request::get('description'); - $class_name = \Request::get('class_name'); - $iconnr = \Request::int('iconnr'); - - $properties_name = \Request::getArray('properties_name'); - $properties_type = \Request::getArray('properties_type'); - $properties_requestable = \Request::getArray('properties_requestable'); - $properties_protected = \Request::getArray('properties_protected'); - - $set_properties = []; - foreach ($properties_name as $key => $property_name) { - $set_properties[] = [ - 'name' => $property_name, - 'type' => $properties_type[$key], - 'requestable' => $properties_requestable[$key], - 'protected' => $properties_protected[$key] - ]; - } - - //validation: - if (!$name) { - $this->halt( - 400, - _('Der Name der Kategorie ist leer!') - ); - } - - if (!is_a($class_name, 'Resource', true)) { - $this->halt( - 400, - _('Es wurde keine gültige Ressourcen-Datenklasse ausgewählt!') - ); - } - - switch ($class_name) { - case 'Location': - $category = \ResourceManager::createLocationCategory( - $name, - $description - ); - break; - case 'Building': - $category = \ResourceManager::createBuildingCategory( - $name, - $description - ); - break; - case 'Room': - $category = \ResourceManager::createRoomCategory( - $name, - $description - ); - break; - default: - $category = \ResourceManager::createCategory( - $name, - $description, - $class_name, - false, - $iconnr - ); - } - - if ($category->store() === false) { - $this->halt( - 500, - _('Fehler beim Speichern der Kategorie!') - ); - } - - //After we have stored the category we must store - //the properties or create them, if necessary: - - foreach ($set_properties as $set_property) { - $category->addProperty( - $set_property['name'], - $set_property['type'], - $set_property['requestable'], - $set_property['protected'] - ); - } - - return $category->toRawArray(); - } - - /** - * Modifies a resource category. - * - * @put /resources/category/:category_id - */ - public function editResourceCategory($category_id) - { - $category = \ResourceCategory::find($category_id); - if (!$category) { - $this->notFound('ResourceCategory object not found!'); - } - - if ($category->system) { - $this->halt(403, 'System categories must not be modified!'); - return; - } - - $name = $this->data['name']; - $description = $this->data['description']; - $iconnr = intval($this->data['iconnr']); - - //validation: - if ($name) { - $category->name = $name; - } - if ($description) { - $category->description = $description; - } - if ($iconnr) { - $category->iconnr = $iconnr; - } - - if ($category->store() === false) { - $this->halt( - 500, - 'Error while saving the category!' - ); - } - - return $category->toRawArray(); - } - - - /** - * Deletes a resource category. - * - * @delete /resources/category/:category_id - */ - public function deleteResourceCategory($category_id) - { - $category = \ResourceCategory::find($category_id); - if (!$category) { - $this->notFound('ResourceCategory object not found!'); - } - - if ($category->system) { - $this->halt(403,'System resource categories must not be deleted!'); - return; - } - - if ($category->delete()) { - return 'OK'; - } else { - $this->halt( - 500, - 'Error while deleting the resource category!' - ); - } - } - - - /** - * Get all resource category property objects for a resource category. - * - * @get /resources/category/:category_id/properties - */ - public function getResourceCategoryProperties($category_id) - { - $category = \ResourceCategory::find($category_id); - if (!$category) { - $this->notFound('ResourceCategory object not found!'); - } - - $result = []; - $properties = \ResourceCategoryProperty::findBySql( - 'INNER JOIN resource_property_definitions rpd - USING (property_id) - WHERE category_id = :category_id ORDER BY rpd.name ASC', - [ - 'category_id' => $category->id - ] - ); - - if ($properties) { - foreach ($properties as $property) { - $data = $property->toRawArray(); - $data['name'] = $property->definition->name; - $data['type'] = $property->definition->type; - $result[] = $data; - } - } - - return $result; - } - - - /** - * Returns all resources which belong to the specified category. - * The result set can be limited by the parameters 'offset' and 'limit'. - * If the parameter 'with_full_name' is set to 1, the resources full name - * as provided by its responsible class, is added to the result set. - * - * @get /resources/category/:category_id/resources - */ - public function getResourceCategoryResources($category_id) - { - $category = \ResourceCategory::find($category_id); - if (!$category) { - $this->notFound('ResourceCategory object not found!'); - } - - $offset = \Request::int('offset'); - $limit = \Request::int('limit'); - $with_full_name = \Request::get('with_full_name'); - - $result = []; - - $sql = 'category_id = :category_id ORDER BY name ASC '; - $sql_array = ['category_id' => $category->id]; - - if ($limit > 0) { - $sql .= 'limit :limit '; - $sql_array['limit'] = $limit; - if ($offset > 0) { - $sql .= 'offset :offset '; - $sql_array['offset'] = $offset; - } - } - - $resources = \Resource::findBySql($sql, $sql_array); - - if ($resources) { - foreach ($resources as $r) { - if ($with_full_name) { - $r = $r->getDerivedClassInstance(); - $data = $r->toRawArray(); - $data['full_name'] = $r->getFullName(); - $result[] = $data; - } else { - $result[] = $r->toRawArray(); - } - } - } - - return $result; - } - - - /** - * Creates a resource. - * - * @post /resources/category/:category_id/create_resource - */ - public function createResource($category_id) - { - $category = \ResourceCategory::find($category_id); - if (!$category) { - $this->notFound('ResourceCategory object not found!'); - } - - - $name = \Request::get('name'); - $description = \Request::get('description'); - $parent_id = \Request::get('parent_id'); - $properties = \Request::getArray('properties'); - - if (!$name) { - $this->halt( - 400, - 'The parameter \'name\' is not set!' - ); - } - - try { - $resource = $category->createResource( - $name, - $description, - $parent_id, - $properties - ); - - return $resource; - } catch (\Exception $e) { - $this->halt( - 400, - $e->getMessage() - ); - } - } -} diff --git a/app/routes/ResourcePermissions.php b/app/routes/ResourcePermissions.php deleted file mode 100644 index be5c6477242da221e0f4bd87f8f301a663fc23e3..0000000000000000000000000000000000000000 --- a/app/routes/ResourcePermissions.php +++ /dev/null @@ -1,585 +0,0 @@ -<?php -namespace RESTAPI\Routes; - -/** - * This file contains API routes related to ResourcePermission - * and ResourceTemporaryPermission objects. - * - * @author Moritz Strohm <strohm@data-quest.de> - * @copyright 2017-2019 - * @license http://www.gnu.org/licenses/gpl-2.0.html GPL version 2 - * @since 4.5 - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - */ -class ResourcePermissions extends \RESTAPI\RouteMap -{ - - //Methods for permanent permissions: - - - /** - * Get the permission levels of users for the specified resource. - * - * @param levels: Limit the result set to the specified permission levels. - * Allowed permission levels: user, autor, tutor, admin. - * The permission levels have to be comma separated like in the - * following example: "autor,tutor,admin". - * - * @get /resources/permissions/:resource_id - */ - public function getResourcePermissions($resource_id) - { - $resource = \Resource::find($resource_id); - if (!$resource) { - $this->notFound('Resource object not found!'); - } - - $resource = $resource->getDerivedClassInstance(); - - if (!$resource->userHasPermission(\User::findCurrent(), 'admin')) { - throw new \AccessDeniedException(); - } - - $levels_str = \Request::get('levels'); - $levels = []; - if ($levels_str) { - $levels = explode(',', $levels_str); - } - - $sql = 'resource_id = :resource_id '; - $sql_array = [ - 'resource_id' => $resource->id - ]; - - if ($levels) { - $sql .= 'AND perms IN ( :levels ) '; - $sql_array['levels'] = $levels; - } - - $permissions = \ResourcePermission::findBySql($sql, $sql_array); - - $result = []; - if ($permissions) { - foreach ($permissions as $permission) { - $result[] = $permission->toRawArray(); - } - } - - return $result; - } - - - /** - * Returns the permissions a specific user has on a specified resource. - * - * @get /resources/permissions/:resource_id/:user:_id - */ - public function getPermission($resource_id, $user_id) - { - if ($resource_id !== 'global') { - if (!\Resource::exists($resource_id)) { - $this->halt( - 404, - 'Resource not found!' - ); - } - } - - $user = \User::find($user_id); - if (!$user) { - $this->halt( - 400, - 'No user was provided!' - ); - } - - $current_user = \User::findCurrent(); - - if (!\ResourceManager::userHasGlobalPermission($current_user, 'admin')) { - if ($resource_id !== 'global') { - $resource = \Resource::find($resource_id); - $resource = $resource->getDerivedClassInstance(); - if (!$resource->userHasPermission($current_user, 'admin')) { - $this->halt(403); - } - } else { - //$resource_id == 'global': One must be admin - //to perform this action! - $this->halt(403); - } - } - - $permission = \ResourcePermission::findOneBySql( - "resource_id = :resource_id AND user_id = :user_id", - [ - 'resource_id' => $resource_id, - 'user_id' => $user->id - ] - ); - - if ($permission) { - return $permission->toRawArray(); - } else { - //The user already had no global permissions! - return NULL; - } - } - - - /** - * @post /resources/permissions/:resource_id/:user_id - */ - public function setPermission($resource_id, $user_id) - { - if ($resource_id !== 'global') { - if (!\Resource::exists($resource_id)) { - $this->halt( - 404, - 'Resource not found!' - ); - return; - } - } - - $user = \User::find($user_id); - if (!$user) { - $this->halt( - 400, - 'No user was provided!' - ); - } - - $current_user = \User::findCurrent(); - - if (!\ResourceManager::userHasGlobalPermission($current_user, 'admin')) { - if ($resource_id !== 'global') { - $resource = \Resource::find($resource_id); - $resource = $resource->getDerivedClassInstance(); - if (!$resource->userHasPermission($current_user, 'admin')) { - $this->halt(403); - } - } else { - //$resource_id == 'global': One must be admin - //to perform this action! - $this->halt(403); - } - } - - //Verify permission level: - $perms = \Request::get('perms'); - - if (!in_array($perms, ['user', 'autor', 'tutor', 'admin'])) { - $this->halt( - 400, - 'Invalid permission level specified!' - ); - } - - //Check if permissions are already present for the user. - //If not, create a new permission object. - $permission = \ResourcePermission::findOneBySql( - "resource_id = :resource_id AND user_id = :user_id", - [ - 'resource_id' => $resource_id, - 'user_id' => $user->id - ] - ); - - if (!$permission) { - $permission = new \ResourcePermission(); - $permission->resource_id = $resource_id; - $permission->user_id = $user->id; - } - - $permission->perms = $perms; - - if ($permission->store() === false) { - $this->halt( - 500, - 'Error while saving permissions!' - ); - } - - return $permission->toRawArray(); - } - - - /** - * @delete /resources/permissions/:resource_id/:user_id - */ - public function deletePermission($resource_id, $user_id) - { - if ($resource_id !== 'global' && !\Resource::exists($resource_id)) { - $this->notFound('Resource not found!'); - } - - $user = \User::find($user_id); - if (!$user) { - $this->halt( - 400, - 'No user was provided!' - ); - } - - $current_user = \User::findCurrent(); - - if (!\ResourceManager::userHasGlobalPermission($current_user, 'admin')) { - if ($resource_id !== 'global') { - $resource = \Resource::find($resource_id); - $resource = $resource->getDerivedClassInstance(); - if (!$resource->userHasPermission($current_user, 'admin')) { - $this->halt(403); - } - } else { - //$resource_id == 'global': One must be admin - //to perform this action! - $this->halt(403); - } - } - - $permission = \ResourcePermission::findOneBySql( - "resource_id = :resource_id AND user_id = :user_id", - [ - 'resource_id' => $resource_id, - 'user_id' => $user->id - ] - ); - - if (!$permission) { - //The user already had no global permissions! - return 'OK'; - } - - if ($permission->delete()) { - return 'OK'; - } else { - $this->halt( - 500, - 'Error while deleting global permissions!' - ); - } - } - - - //Methods for temporary permissions: - - - /** - * Get the temporary permission levels of users for the specified resource. - * The begin and end parameters are mandatory to determine a time range - * to collect the temporary permissions in that range. - * - * @param begin: The begin timestamp of the time range. - * @param end: The end timestamp of the time range. - * @param levels: Limit the result set to the specified temporary permission - * levels. Allowed permission levels: user, autor, tutor, admin. - * The permission levels have to be comma separated like in the - * following example: "autor,tutor,admin". - * - * @get /resources/temporary_permissions/:resource_id - */ - public function getTemporaryResourcePermissions($resource_id) - { - $resource = \Resource::find($resource_id); - if (!$resource) { - $this->notFound('Resource object not found!'); - } - - $resource = $resource->getDerivedClassInstance(); - - if (!$resource->userHasPermission(\User::findCurrent(), 'admin')) { - throw new \AccessDeniedException(); - } - - $begin = \Request::get('begin'); - $end = \Request::get('end'); - $levels_str = \Request::get('levels'); - $levels = []; - if ($levels_str) { - $levels = explode(',', $levels_str); - } - - if (!$begin or !$end) { - //Use the current day: - $begin = strtotime('today 0:00:00'); - $end = strtotime('today 23:59:59'); - } - - $sql = 'resource_id = :resource_id - AND - ((begin >= :begin AND begin <= :end) - OR - (end >= :begin AND end <= :end)) - OR - (begin < :begin AND end > :end)'; - $sql_array = [ - 'resource_id' => $resource->id, - 'begin' => $begin, - 'end' => $end - ]; - - if ($levels) { - $sql .= 'AND perms IN ( :levels ) '; - $sql_array['levels'] = $levels; - } - - return \ResourceTemporaryPermission::findAndMapBySql( - function (\ResourceTemporaryPermission $permission) { - return $permission->toRawArray(); - }, - $sql, - $sql_array - ); - } - - - /** - * Returns the permissions a specific user has on a specified resource. - * - * @get /resources/temporary_permissions/:resource_id/:user:_id - */ - public function getTemporaryPermission($resource_id, $user_id) - { - if ($resource_id !== 'global') { - if (!\Resource::exists($resource_id)) { - $this->notFound('Resource not found!'); - } - } - - $user = \User::find($user_id); - if (!$user) { - $this->halt( - 400, - 'No user was provided!' - ); - } - - $current_user = \User::findCurrent(); - - $begin_str = \Request::get('begin'); - $end_str = \Request::get('end'); - $begin = null; - $end = null; - $with_time_range = false; - if ($begin_str && $end_str) { - $with_time_range = true; - $begin = new \DateTime(); - $begin->setTimestamp($begin_str); - $end = new \DateTime(); - $end->setTimestamp($end_str); - } - - if (!\ResourceManager::userHasGlobalPermission($current_user, 'admin')) { - if ($resource_id !== 'global') { - $resource = \Resource::find($resource_id); - $resource = $resource->getDerivedClassInstance(); - if (!$resource->userHasPermission($current_user, 'admin')) { - $this->halt(403); - } - } else { - //$resource_id == 'global': One must be admin - //to perform this action! - $this->halt(403); - } - } - - $permissions = null; - if ($with_time_range) { - $permissions = \ResourceTemporaryPermission::findBySql( - "resource_id = :resource_id AND user_id = :user_id - AND ( - (begin >= :begin AND begin <= :end) - OR - (end >= :begin AND end <= :end) - )", - [ - 'resource_id' => $resource_id, - 'user_id' => $user->id, - 'begin' => $begin->getTimestamp(), - 'end' => $end->getTimestamp() - ] - ); - } else { - $permissions = \ResourceTemporaryPermission::findBySql( - "resource_id = :resource_id AND user_id = :user_id", - [ - 'resource_id' => $resource_id, - 'user_id' => $user->id - ] - ); - } - - if ($permissions) { - $result = []; - foreach ($permissions as $permission) { - $result[] = $permission->toRawArray(); - } - return $result; - } else { - //The user already had no global permissions! - return NULL; - } - } - - - /** - * Sets temporary permissions for a user. - * - * @param begin The begin timestamp for the temporary permisssion. - * @param end The end timestamp for the temporary permission. - * @param perms The permission level for the temporary permission. - * - * @post /resources/temporary_permissions/:resource_id/:user_id - */ - public function setTemporaryPermission($resource_id, $user_id) - { - $resource = \Resource::find($resource_id); - if (!$resource) { - $this->notFound('Resource not found!'); - } - - $user = \User::find($user_id); - if (!$user) { - $this->notFound('User not found!'); - } - - $current_user = \User::findCurrent(); - - if (!\ResourceManager::userHasGlobalPermission($current_user, 'admin') - && !$resource->userHasPermission($current_user, 'admin')) { - $this->halt(403); - } - - $begin_str = \Request::get('begin'); - $end_str = \Request::get('end'); - if (!$begin_str || !$end_str) { - $this->halt( - 400, - 'No time range specified for temporary permission!' - ); - } - - $begin = new \DateTime(); - $begin->setTimestamp($begin_str); - $end = new \DateTime(); - $end->setTimestamp($end_str); - - //Verify permission level: - $perms = \Request::get('perms'); - - if (!in_array($perms, ['user', 'autor', 'tutor', 'admin'])) { - $this->halt( - 400, - 'Invalid permission level specified!' - ); - } - - //Check if permissions are already present for the user. - //If not, create a new permission object. - $permission = \ResourceTemporaryPermission::findOneBySql( - "resource_id = :resource_id AND user_id = :user_id - AND begin = :begin AND end = :end", - [ - 'resource_id' => $resource_id, - 'user_id' => $user->id, - 'begin' => $begin->getTimestamp(), - 'end' => $end->getTimestamp() - ] - ); - - if (!$permission) { - $permission = new \ResourceTemporaryPermission(); - $permission->resource_id = $resource_id; - $permission->user_id = $user->id; - $permission->begin = $begin->getTimestamp(); - $permission->end = $end->getTimestamp(); - } - - $permission->perms = $perms; - - if ($permission->store() === false) { - $this->halt( - 500, - 'Error while saving permissions!' - ); - } - - return $permission->toRawArray(); - } - - - /** - * Deletes all temporary permissions of a user. - * If a time interval is given all permissions inside the interval - * are deleted. - * - * @delete /resources/temporary_permissions/:resource_id/:user_id - */ - public function deleteTemporaryPermission($resource_id, $user_id) - { - if ($resource_id !== 'global') { - if (!\Resource::exists($resource_id)) { - $this->notFound('Resource not found!'); - } - } - - $user = \User::find($user_id); - if (!$user) { - $this->notFound('User not found!'); - } - - $current_user = \User::findCurrent(); - - if (!\ResourceManager::userHasGlobalPermission($current_user, 'admin')) { - if ($resource_id !== 'global') { - $resource = \Resource::find($resource_id); - $resource = $resource->getDerivedClassInstance(); - if (!$resource->userHasPermission($current_user, 'admin')) { - $this->halt(403); - } - } else { - //$resource_id == 'global': One must be admin - //to perform this action! - $this->halt(403); - } - } - - $begin_str = \Request::get('begin'); - $end_str = \Request::get('end'); - $begin = null; - $end = null; - $with_time_range = false; - if ($begin_str and $end_str) { - $with_time_range = true; - $begin = new \DateTime(); - $begin->setTimestamp($begin_str); - $end = new \DateTime(); - $end->setTimestamp($end_str); - } - - if ($with_time_range) { - \ResourceTemporaryPermission::deleteBySql( - "resource_id = :resource_id AND user_id = :user_id - AND ( - (begin >= :begin AND end <= :end) - )", - [ - 'resource_id' => $resource_id, - 'user_id' => $user->id, - 'begin' => $begin->getTimestamp(), - 'end' => $end->getTimestamp() - ] - ); - } else { - \ResourceTemporaryPermission::deleteBySql( - "resource_id = :resource_id AND user_id = :user_id", - [ - 'resource_id' => $resource_id, - 'user_id' => $user->id - ] - ); - } - - return 'OK'; - } -} diff --git a/app/routes/ResourceProperties.php b/app/routes/ResourceProperties.php deleted file mode 100644 index 2ddbbaf74ea5f3082444020b5ebacca521ee938e..0000000000000000000000000000000000000000 --- a/app/routes/ResourceProperties.php +++ /dev/null @@ -1,224 +0,0 @@ -<?php -namespace RESTAPI\Routes; - -/** - * This file contains API routes related to ResourceProperty objects. - * - * @author Moritz Strohm <strohm@data-quest.de> - * @copyright 2017-2019 - * @license http://www.gnu.org/licenses/gpl-2.0.html GPL version 2 - * @since 4.5 - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - */ -class ResourceProperties extends \RESTAPI\RouteMap -{ - /** - * Validate access to each route. - */ - public function before() - { - if (!\ResourceManager::userHasGlobalPermission(\User::findCurrent(), 'admin')) { - throw new \AccessDeniedException(); - } - } - - /** - * Returns all resource property definitions. - * - * @get /resources/properties - */ - public function getAllResourcePropertyDefinitions() - { - $properties = \ResourcePropertyDefinition::findBySql('TRUE ORDER BY name ASC'); - - $result = []; - - if ($properties) { - foreach ($properties as $p) { - $result[] = $p->toRawArray(); - } - } - - return $result; - } - - - /** - * Creates a new resource property definition. - * - * @post /resources/add_property - */ - public function addResourcePropertyDefinition() - { - $name = \Request::get('name'); - $description = \Request::i18n('description'); - $type = \Request::get('type'); - $write_permission_level = \Request::get('write_permission_level'); - $options = \Request::get('options', ''); - $range_search = \Request::bool('range_search'); - - if (!$name) { - $this->halt( - 400, - 'The field \'name\' must not be empty!' - ); - } - if (!in_array($type, \ResourcePropertyDefinition::getDefinedTypes())) { - $this->halt( - 400, - 'Invalid property type specified!' - ); - } - if (!in_array($write_permission_level, ['user', 'autor', 'tutor', 'admin'])) { - $this->halt( - 400, - 'Invalid permission level in field \'write_permission_level\'!' - ); - } - - $property = new \ResourcePropertyDefinition(); - $property->name = $name; - $property->description = $description; - $property->type = $type; - $property->options = $options ?: ''; - $property->range_search = $range_search; - $property->write_permission_level = $write_permission_level; - - if (!$property->store()) { - $this->halt( - 500, - 'Error while saving the property!' - ); - } - return $property->toRawArray(); - } - - - /** - * Get a resource property definition object. - * - * @get /resources/property/:property_id - */ - public function getResourcePropertyDefinition($property_id) - { - $property = \ResourcePropertyDefinition::find($property_id); - if (!$property) { - $this->notFound('ResourcePropertyDefinition object not found!'); - } - - return $property->toRawArray(); - } - - - /** - * Modifies a resource property definition. - * - * @put /resources/property/:property_id - */ - public function editResourcePropertyDefinition($property_id) - { - $property = \ResourcePropertyDefinition::find($property_id); - if (!$property) { - $this->notFound('ResourcePropertyDefinition object not found!'); - } - - if ($property->system) { - $this->halt( - 403, - 'System properties must not be edited!' - ); - } - - $name = $this->data['name']; - $description = $this->data['description']; - $type = $this->data['type']; - $write_permission_level = $this->data['write_permission_level']; - $options = $this->data['options']; - $range_search = $this->data['range_search']; - - if ($name) { - $property->name = $name; - } - - if ($description) { - $property->description = $description; - } - - if ($type) { - if (!in_array($type, \ResourcePropertyDefinition::getDefinedTypes())) { - $this->halt( - 400, - 'Invalid property type specified!' - ); - } - $property->type = $type; - } - - if ($write_permission_level) { - if (!in_array($write_permission_level, ['user', 'autor', 'tutor', 'admin'])) { - $this->halt( - 400, - 'Invalid permission level in field \'write_permission_level\'!' - ); - } - $property->write_permission_level = $write_permission_level; - } - - if ($options) { - $property->options = $options; - } - - if ($range_search) { - $property->range_search = $range_search; - } - - if ($property->isDirty()) { - if ($property->store()) { - return $property->toRawArray(); - } else { - $this->halt( - 500, - 'Error while saving the property!' - ); - } - } - - return $property->toRawArray(); - } - - - /** - * Deletes a resource property definition object. - * - * @delete /resources/property/:property_id - */ - public function deleteResourcePropertyDefinition($property_id) - { - $property = \ResourcePropertyDefinition::find($property_id); - if (!$property) { - $this->notFound('ResourcePropertyDefinition object not found!'); - } - - if (!\ResourceManager::userHasGlobalPermission(\User::findCurrent(), 'admin')) { - $this->halt(403); - } - - //Check if the property is in use: - - if ($property->isInUse()) { - $this->halt( - 403, - 'The property is in use and can therefore not be deleted!' - ); - } - - if ($property->delete()) { - return "OK"; - } else { - $this->halt( - 500, - 'Error while deleting resource property definition!' - ); - } - } -} diff --git a/app/routes/ResourceRequest.php b/app/routes/ResourceRequest.php deleted file mode 100644 index 24dfd2efb781e1d6d782fa93a3d864017b4b00f9..0000000000000000000000000000000000000000 --- a/app/routes/ResourceRequest.php +++ /dev/null @@ -1,138 +0,0 @@ -<?php -namespace RESTAPI\Routes; - -/** - * This file contains the REST class for resource requests from the - * room and resource management system. - * - * @author Moritz Strohm <strohm@data-quest.de> - * @copyright 2017-2019 - * @license http://www.gnu.org/licenses/gpl-2.0.html GPL version 2 - * @since 4.5 - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - */ -class ResourceRequest extends \RESTAPI\RouteMap -{ - - /** - * Helper method that either returns the specified data - * or simply an empty string in case that no request result - * is requested. - */ - protected function sendReturnData($data) - { - if (\Request::submitted('quiet')) { - //Return nothing. - return ''; - } - - //Return data. - return $data; - } - - - /** - * Moves a resource request, if permitted. - * - * @post /resources/request/:request_id/move - */ - public function move($request_id) - { - $request = \ResourceRequest::find($request_id); - if (!$request) { - $this->notFound('Resource request object not found!'); - } - - $current_user = \User::findCurrent(); - - if ($request->isReadOnlyForUser($current_user)) { - throw new \AccessDeniedException(); - } - - $begin_str = \Request::get('begin'); - $end_str = \Request::get('end'); - - //Try the ISO format first: YYYY-MM-DDTHH:MM:SS±ZZ:ZZ - $begin = \DateTime::createFromFormat(\DateTime::RFC3339, $begin_str); - $end = \DateTime::createFromFormat(\DateTime::RFC3339, $end_str); - if (!($begin instanceof \DateTime) || !($end instanceof \DateTime)) { - $tz = new \DateTime(); - $tz = $tz->getTimezone(); - $begin = \DateTime::createFromFormat('Y-m-d\TH:i:s', $begin_str, $tz); - $end = \DateTime::createFromFormat('Y-m-d\TH:i:s', $end_str, $tz); - } - - $request->begin = $begin->getTimestamp(); - $request->end = $end->getTimestamp(); - - try { - $request->store(); - return $this->sendReturnData($request->toRawArray()); - } catch (\Exception $e) { - $this->halt(500, $e->getMessage()); - } - } - - - /** - * Changes the reply comment of a request. - * - * @post /resources/request/:request_id/edit_reply_comment - */ - public function editReplyComment($request_id) - { - $request = \ResourceRequest::find($request_id); - if (!$request) { - $this->notFound('Resource request object not found!'); - } - - $current_user = \User::findCurrent(); - - if ($request->isReadOnlyForUser($current_user)) { - throw new \AccessDeniedException(); - } - - $request->reply_comment = \Request::get('reply_comment'); - - try { - if ($request->store() === false) { - throw new \RuntimeException('Could not store comment'); - } - } catch (\Exception $e) { - $this->halt(500, $e->getMessage()); - } - - return $this->sendReturnData($request->toRawArray()); - } - - - /** - * Changes the reply comment of a request. - * - * @post /resources/request/:request_id/toggle_marked - */ - public function toggleMarkedFlag($request_id) - { - $request = \ResourceRequest::find($request_id); - if (!$request) { - $this->notFound('Resource request object not found!'); - } - - $current_user = \User::findCurrent(); - - if ($request->isReadOnlyForUser($current_user)) { - throw new \AccessDeniedException(); - } - - //Switch to the next marking state or return to the unmarked state - //if the next marking state would be after the last defined - //marking state. - $request->marked = (++$request->marked % \ResourceRequest::MARKING_STATES); - - if ($request->isDirty()) { - $request->store(); - } - - return $request; - } -} diff --git a/app/routes/Resources.php b/app/routes/Resources.php deleted file mode 100644 index 7117546517bfc6a04dd8b4a4fe52be964363b5b0..0000000000000000000000000000000000000000 --- a/app/routes/Resources.php +++ /dev/null @@ -1,950 +0,0 @@ -<?php -namespace RESTAPI\Routes; - -/** - * This file contains the REST class for the - * room and resource management system. - * - * @author Moritz Strohm <strohm@data-quest.de> - * @copyright 2017-2019 - * @license http://www.gnu.org/licenses/gpl-2.0.html GPL version 2 - * @since 4.5 - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - */ -class Resources extends \RESTAPI\RouteMap -{ - - //Resource routes: - - - /** - * Get a resource object. - * @param derived_class: If the URL parameter derived_class is set - * the resource object is converted to an instance of the - * class that does correct handling of the resource object. - * - * @get /resources/resource/:resource_id - */ - public function getResource($resource_id) - { - $resource = \Resource::find($resource_id); - if (!$resource) { - $this->notFound('Resource object not found!'); - } - - $resource = $resource->getDerivedClassInstance(); - - if (!$resource->userHasPermission(\User::findCurrent(), 'user')) { - throw new \AccessDeniedException(); - } - - if (\Request::submitted('derived_classes')) { - $resource = $resource->getDerivedClassInstance(); - } - - $result = $resource->toRawArray(); - - $result['full_name'] = $resource->getFullName(); - $result['has_children'] = $resource->children ? true : false; - - return $result; - } - - - /** - * Modifies a resource object. - * - * @put /resources/resource/:resource_id - */ - public function editResource($resource_id) - { - $resource = \Resource::find($resource_id); - if (!$resource) { - $this->notFound('Resource object not found!'); - } - - $resource = $resource->getDerivedClassInstance(); - - if (!$resource->userHasPermission(\User::findCurrent(), 'autor')) { - $this->halt(403); - return; - } - - $name = $this->data['name']; - $description = $this->data['description']; - $parent_id = $this->data['parent_id']; - $properties = $this->data['properties']; - - if ($name) { - $resource->name = $name; - } - if ($description) { - $resource->description = $description; - } - if ($parent_id) { - if (!\Resource::exists($parent_id)) { - $this->halt( - 400, - 'No resource exists with the ID \'' . $parent_id . '\'!' - ); - } - $resource->parent_id = $parent_id; - } - if ($properties) { - foreach ($properties as $name => $value) { - try { - $resource->setProperty($name, $value, $GLOBALS['user']->id); - } catch (\AccessDeniedException $e) { - $this->halt( - 403, - $e->getMessage() - ); - } catch (\Exception $e) { - $this->halt( - 500, - $e->getMessage() - ); - } - } - } - - if ($resource->isDirty()) { - if ($resource->store()) { - return $resource->toRawArray(); - } else { - $this->halt( - 500, - 'Error while saving the resource object!' - ); - } - } - return $resource->toRawArray(); - } - - - /** - * Deletes a resource object. - * - * @delete /resources/resource/:resource_id - */ - public function deleteResource($resource_id) - { - $resource = \Resource::find($resource_id); - if (!$resource) { - $this->notFound('Resource object not found!'); - } - - $resource = $resource->getDerivedClassInstance(); - - if (!$resource->userHasPermission(\User::findCurrent(), 'admin')) { - $this->halt(403); - return; - } - - if (\Request::submitted('derived_classes')) { - $resource = $resource->getDerivedClassInstance(); - } - - if ($resource->delete()) { - return 'OK'; - } else { - $this->halt( - 500, - 'Error while deleting the resource object!' - ); - } - } - - - /** - * Returns the child resources of a resource object, if they exist. - * - * @get /resources/resource/:resource_id/children - */ - public function getResourceChildren($resource_id) - { - $resource = \Resource::find($resource_id); - if (!$resource) { - $this->notFound('Resource object not found!'); - } - - $resource = $resource->getDerivedClassInstance(); - - if (!$resource->userHasPermission(\User::findCurrent(), 'user')) { - throw new \AccessDeniedException(); - } - - $use_derived_classes = (bool) \Request::submitted('derived_classes'); - - $result = []; - - $children = \Resource::findBySql( - 'parent_id = :resource_id - ORDER BY name ASC', - [ - 'resource_id' => $resource->id - ] - ); - if ($children) { - foreach ($children as $child) { - if ($use_derived_classes) { - $child = $child->getDerivedClassInstance(); - } - $result[] = $child->toRawArray(); - } - } - return $result; - } - - - /** - * Returns the parent resource of a resource object, if it exists. - * - * @get /resources/resource/:resource_id/parent - */ - public function getResourceParent($resource_id) - { - $resource = \Resource::find($resource_id); - if (!$resource) { - $this->notFound('Resource object not found!'); - } - - $resource = $resource->getDerivedClassInstance(); - - if (!$resource->userHasPermission(\User::findCurrent(), 'user')) { - throw new \AccessDeniedException(); - } - - if (!$resource->parent) { - $this->notFound('This resource has no parent!'); - } - - $use_derived_classes = (bool) \Request::submitted('derived_classes'); - - if ($use_derived_classes) { - $parent = $resource->parent->getDerivedClassInstance(); - return $parent->toRawArray(); - } - - return $resource->parent->toRawArray(); - } - - - /** - * Get all property objects of a resource. - * - * @get /resources/resource/:resource_id/properties - */ - public function getResourceProperties($resource_id) - { - $resource = \Resource::find($resource_id); - if (!$resource) { - $this->notFound('Resource object not found!'); - } - - $resource = $resource->getDerivedClassInstance(); - - if (!$resource->userHasPermission(\User::findCurrent(), 'user')) { - throw new \AccessDeniedException(); - } - - $result = []; - $properties = \ResourceProperty::findBySql( - 'INNER JOIN resource_property_definitions rpd - ON resource_properties.property_id = rpd.property_id - WHERE - resource_properties.resource_id = :resource_id - ORDER BY rpd.name ASC', - [ - 'resource_id' => $resource->id - ] - ); - - if ($properties) { - foreach ($properties as $property) { - $data = $property->toRawArray(); - $data['name'] = $property->definition->name; - $data['type'] = $property->definition->type; - if ($data['type'] == 'position') { - //position properties also get the map-URL: - $data['map_url'] = \ResourceManager::getMapUrlForResourcePosition( - $property - ); - } - $result[] = $data; - } - } - - return $result; - } - - - /** - * Returns the booking plan of a resource for a week specified - * by the parameters begin and end. - * - * @param begin: The begin timestamp of the time range for the booking plan. - * @param end: The end timestamp of the time range for the booking plan. - * - * @allow_nobody - * - * @get /resources/resource/:resource_id/booking_plan - */ - public function getResourceBookingPlan($resource_id) - { - $resource = \Resource::find($resource_id); - if (!$resource) { - $this->notFound('Resource object not found!'); - } - - $resource = $resource->getDerivedClassInstance(); - - $current_user = \User::findCurrent(); - $nobody_access = true; - - if ($current_user instanceof \User) { - $nobody_access = false; - if (!$resource->bookingPlanVisibleForUser($current_user)) { - throw new \AccessDeniedException(); - } - } elseif ($resource instanceof \Room) { - if (!$resource->bookingPlanVisibleForUser($current_user)) { - throw new \AccessDeniedException(); - } - } - $user_is_resource_user = false; - if ($current_user instanceof \User) { - $user_is_resource_user = $resource->userHasPermission( - $current_user, - 'user' - ); - } - - $display_requests = false; - if ($current_user instanceof \User) { - $display_requests = \Request::get('display_requests'); - } - $display_all_requests = \Request::get('display_all_requests'); - - if ($display_all_requests && !$user_is_resource_user) { - //The user is not allowed to see all requests. - throw new \AccessDeniedException(); - } - - $begin_date = \Request::get('start'); - $end_date = \Request::get('end'); - if (!$begin_date || !$end_date) { - //No time range specified. - $this->halt(400, 'The parameters "start" and "end" are missing!'); - return; - } - - //Try the ISO format first: YYYY-MM-DDTHH:MM:SS±ZZ:ZZ - $begin = \DateTime::createFromFormat(\DateTime::RFC3339, $begin_date); - $end = \DateTime::createFromFormat(\DateTime::RFC3339, $end_date); - - if (!($begin instanceof \DateTime) || !($end instanceof \DateTime)) { - $begin = new \DateTime(); - $end = new \DateTime(); - //Assume the local timezone and use the Y-m-d format: - $date_regex = '/[0-9]{4}-(0[1-9]|1[0-2])-([0-2][0-9]|3[0-1])/'; - if (preg_match($date_regex, $begin_date)) { - //$begin is specified in the date formay YYYY-MM-DD: - $begin_str = explode('-', $begin_date); - $begin->setDate( - intval($begin_str[0]), - intval($begin_str[1]), - intval($begin_str[2]) - ); - $begin->setTime(0,0,0); - } else { - $begin->setTimestamp($begin_date); - } - //Now we do the same for $end_timestamp: - if (preg_match($date_regex, $end_date)) { - //$begin is specified in the date formay YYYY-MM-DD: - $end_str = explode('-', $end_date); - $end->setDate( - intval($end_str[0]), - intval($end_str[1]), - intval($end_str[2]) - ); - $end->setTime(23,59,59); - } else { - $end->setTimestamp($end_date); - } - } - - //Get parameters: - $booking_types = []; - if (!$nobody_access) { - $booking_types = explode(',', \Request::get('booking_types')); - } - - $begin_timestamp = $begin->getTimestamp(); - $end_timestamp = $end->getTimestamp(); - - //Get the event data sources: - $bookings = \ResourceBooking::findByResourceAndTimeRanges( - $resource, - [ - [ - 'begin' => $begin_timestamp, - 'end' => $end_timestamp - ] - ], - $booking_types - ); - $requests = []; - if ($display_all_requests) { - $requests = \ResourceRequest::findByResourceAndTimeRanges( - $resource, - [ - [ - 'begin' => $begin_timestamp, - 'end' => $end_timestamp - ] - ], - 0 - ); - } elseif ($display_requests) { - //Get the users own request only: - $requests = \ResourceRequest::findByResourceAndTimeRanges( - $resource, - [ - [ - 'begin' => $begin_timestamp, - 'end' => $end_timestamp - ] - ], - 0, - [], - 'user_id = :user_id', - ['user_id' => $current_user->id] - ); - } - - $objects = array_merge($bookings, $requests); - $event_data = \Studip\Fullcalendar::createData($objects, $begin_timestamp, $end_timestamp); - - if ($nobody_access) { - //For nobody users, the code stops here since - //nobody users are not allowed to include additional objects. - return $event_data; - } - - //Check if there are additional objects to be displayed: - $additional_objects = \Request::getArray('additional_objects'); - $additional_object_colours = \Request::getArray('additional_object_colours'); - if ($additional_objects) { - foreach ($additional_objects as $object_class => $object_ids) { - if (!is_a($object_class, '\SimpleORMap', true)) { - continue; - } - if (!is_a($object_class, '\Studip\Calendar\EventSource', true)) { - continue; - } - - $special_colours = []; - if ($additional_object_colours[$object_class]) { - $special_colours = $additional_object_colours[$object_class]; - } - - $additional_objects = $object_class::findMany($object_ids); - foreach ($additional_objects as $additional_object) { - $event_data = $additional_object->getFilteredEventData( - $current_user->id, - null, - null, - $begin, - $end - ); - - if ($special_colours) { - foreach ($event_data as $data) { - $data->text_colour = $special_colours['fg']; - $data->background_colour = $special_colours['bg']; - $data->editable = false; - $event_data[] = $data->toFullcalendarEvent(); - } - } - } - } - } - return $event_data; - } - - - /** - * Returns the booking plan of a resource for a selected semester. - * - * @param semester_id: The ID of the semester. Defaults to the current - * semester, if not set. - * - * @get /resources/resource/:resource_id/semester_plan - */ - public function getResourceSemesterBookingPlan($resource_id) - { - $resource = \Resource::find($resource_id); - if (!$resource) { - $this->notFound('Resource object not found!'); - } - - $resource = $resource->getDerivedClassInstance(); - - $current_user = \User::findCurrent(); - - if (!$resource->bookingPlanVisibleForUser($current_user)) { - throw new \AccessDeniedException(); - } - - $user_is_resource_user = $resource->userHasPermission( - $current_user, - 'user' - ); - - $display_requests = \Request::get('display_requests'); - $display_all_requests = \Request::get('display_all_requests'); - - $begin = new \DateTime(); - $end = new \DateTime(); - - $semester_id = \Request::get('semester_id'); - $semester = null; - - if ($semester_id) { - $semester = \Semester::find($semester_id); - if (!$semester) { - $this->halt(404, 'Specified semester not found!'); - } - } else { - $semester = \Semester::findCurrent(); - if (!$semester) { - $this->halt(500, 'Current semester not available!'); - } - } - - if (\Request::get('semester_timerange') != 'fullsem') { - $begin->setTimestamp($semester->vorles_beginn); - $end->setTimestamp($semester->vorles_ende); - } else { - $begin->setTimestamp($semester->beginn); - $end->setTimestamp($semester->ende); - } - - //Get parameters: - $booking_types = \Request::getArray('booking_types'); - - $begin_timestamp = $begin->getTimestamp(); - $end_timestamp = $end->getTimestamp(); - - //Get the event data sources: - $bookings = \ResourceBooking::findByResourceAndTimeRanges( - $resource, - [ - [ - 'begin' => $begin_timestamp, - 'end' => $end_timestamp - ] - ], - $booking_types - ); - - $requests = []; - if ($display_all_requests || $display_requests) { - $requests_sql = "INNER JOIN seminar_cycle_dates scd - USING (metadate_id) - WHERE - resource_id = :resource_id - AND - closed = '0' "; - $requests_sql_params = [ - 'begin' => $begin_timestamp, - 'end' => $end_timestamp, - 'resource_id' => $resource->id - ]; - if (!$display_all_requests) { - $requests_sql .= "AND user_id = :user_id "; - $requests_sql_params['user_id'] = $current_user->id; - } - - $requests = \ResourceRequest::findBySql( - $requests_sql, - $requests_sql_params - ); - } - - $merged_objects = []; - $metadates = []; - - foreach ($bookings as $booking) { - $booking->resource = $resource; - $irrelevant_booking = false; - if ($booking->getRepetitionType() != 'weekly') { - if (!\Request::get('display_single_bookings')) { - $irrelevant_booking = true; - } else if ($booking->end < strtotime('today')) { - $irrelevant_booking = true; - } - } - if ($booking->getAssignedUserType() === 'course' && in_array($booking->assigned_course_date->metadate_id, $metadates)) { - $irrelevant_booking = true; - }; - if (!$irrelevant_booking) { - //It is an booking with repetitions that has to be included - //in the semester plan. - if (in_array($booking->getRepetitionType(), ['single','weekly'])) { - $event_list = $booking->convertToEventData([\ResourceBookingInterval::build(['interval_id' => md5(uniqid()), 'begin' => $booking->begin - $booking->preparation_time, 'end' => $booking->end])], $current_user); - } else { - $event_list = $booking->getFilteredEventData(null,null,null,strtotime('today'), $end_timestamp); - } - foreach ($event_list as $event_data) { - if ($booking->getAssignedUserType() === 'course' && $booking->assigned_course_date->metadate_id) { - $index = sprintf( - '%1$s_%2$s_%3$s', - $booking->assigned_course_date->metadate_id, - $event_data->begin->format('NHis'), - $event_data->end->format('NHis') - ); - $metadates[] = $booking->assigned_course_date->metadate_id; - } else { - $index = sprintf( - '%1$s_%2$s_%3$s', - $booking->id, - $event_data->begin->format('NHis'), - $event_data->end->format('NHis') - ); - } - - //Strip some data that cannot be used effectively in here: - $event_data->api_urls = []; - $event_data->editable = false; - - $merged_objects[$index] = $event_data; - } - } - } - - foreach ($requests as $request) { - if ($request->cycle instanceof \SeminarCycleDate) { - $cycle_dates = $request->cycle->getAllDates(); - foreach ($cycle_dates as $cycle_date) { - $relevant_request = $semester->beginn <= $cycle_date->date - && $semester->ende >= $cycle_date->date; - if ($relevant_request) { - //We have found a date for the current semester - //that makes the request relevant. - break; - } - } - if (!$relevant_request) { - continue; - } - $event_data_list = $request->getFilteredEventData( - $current_user->id - ); - - foreach ($event_data_list as $event_data) { - $index = sprintf( - '%1$s_%2$s_%3$s', - $request->metadate_id, - $event_data->begin->format('NHis'), - $event_data->end->format('NHis') - ); - - //Strip some data that cannot be used effectively in here: - $event_data->view_urls = []; - $event_data->api_urls = []; - - $merged_objects[$index] = $event_data; - } - } - } - - //Convert the merged events to Fullcalendar events: - $data = []; - foreach ($merged_objects as $obj) { - $data[] = $obj->toFullCalendarEvent(); - } - - return $data; - } - - - /** - * Gets request of a resource. At your option the requests can be - * limited to a specific time range, specified by the parameters - * begin and end. Furthermore the requests can be filtered by user-ID. - * - * @param begin: A timestamp specifying the begin of the time range. - * @param end: A timestamp specifying the end of the time range. - * @param user_id: This parameter limits the result set to requests - * of the user specified by the user-ID provided in this parameter. - * - * @get /resources/resource/:resource_id/requests - */ - public function getResourceRequests($resource_id) - { - $resource = \Resource::find($resource_id); - if (!$resource) { - $this->notFound('Resource object not found!'); - } - - $resource = $resource->getDerivedClassInstance(); - - if (!$resource->userHasPermission(\User::findCurrent(), 'user')) { - throw new \AccessDeniedException(); - } - - $begin = $this->data['begin']; - $end = $this->data['end']; - $user_id = $this->data['user_id']; - - $sql = 'resource_id = :resource_id '; - $sql_array = [ - 'resource_id' => $resource->id - ]; - - if ($begin and $end) { - $sql .= 'AND ((begin >= :begin AND begin <= :end) - OR - (end >= :begin AND end <= :end)) '; - $sql_array['begin'] = $begin; - $sql_array['end'] = $end; - } - - if ($user_id) { - $sql .= 'AND user_id = :user_id '; - $sql_array['user_id'] = $user_id; - } - - $sql .= 'ORDER BY mkdate ASC'; - - $requests = \ResourceRequest::findBySql($sql, $sql_array); - - $result = []; - foreach ($requests as $request) { - $result[] = $request->toRawArray(); - } - - return $result; - } - - - /** - * - * @param begin: A timestamp specifying the begin of the time range. - * @param end: A timestamp specifying the end of the time range. - * @param user_id: This parameter limits the result set to bookings - * of the user specified by the user-ID provided in this parameter. - * @param types: Limits the result to booking types specified in this - * parameter. The allowed types are comma separated like this: "1,2,3". - * The defined types are: - * 0 = normal booking, 1 = reservation, 2 = lock. - * - * @get /resources/resource/:resource_id/bookings - */ - public function getResourceBookings($resource_id) - { - $resource = \Resource::find($resource_id); - if (!$resource) { - $this->notFound('Resource object not found!'); - } - - $resource = $resource->getDerivedClassInstance(); - - if (!$resource->userHasPermission(\User::findCurrent(), 'user')) { - throw new \AccessDeniedException(); - } - - $begin = \Request::get('begin'); - $end = \Request::get('end'); - $user_id = \Request::get('user_id'); - $types = []; - $types_str = \Request::get('types'); - if ($types_str) { - $types = explode(',', $types_str); - } - - $sql = 'resource_id = :resource_id '; - $sql_array = [ - 'resource_id' => $resource->id - ]; - - if ($begin and $end) { - $sql .= 'AND ((begin >= :begin AND begin <= :end) - OR - (end >= :begin AND end <= :end)) '; - $sql_array['begin'] = $begin; - $sql_array['end'] = $end; - } - - if ($user_id) { - $sql .= 'AND user_id = :user_id '; - $sql_array['user_id'] = $user_id; - } - if ($types) { - $sql .= 'AND booking_type IN ( :types ) '; - $sql_array['types'] = $types; - } - - $sql .= 'ORDER BY mkdate ASC'; - - $bookings = \ResourceBooking::findBySql($sql, $sql_array); - - $result = []; - if ($bookings) { - foreach ($bookings as $booking) { - $result[] = $booking->toRawArray(); - } - } - - return $result; - } - - - /** - * Creates a booking/reservation/lock for a resource. - * - * @param begin: The begin timestamp for the booking. - * @param end: The end timestamp for the booking. - * @param preparation_time: The amount of seconds for preparation time - * before the begin timestamp. - * @param internal_comment: A comment that is only visible for some - * parts of the staff. - * @param booking_type: The booking type: - * 0 = normal booking - * 1 = reservation - * 2 = lock - * - * @post /resources/resource/:resource_id/assign - */ - public function createResourceBooking($resource_id) - { - $resource = \Resource::find($resource_id); - if (!$resource) { - $this->notFound('Resource object not found!'); - } - - $resource = $resource->getDerivedClassInstance(); - - if (!$resource->userHasPermission(\User::findCurrent(), 'user')) { - throw new \AccessDeniedException(); - } - - $begin_str = \Request::get('begin'); - $end_str = \Request::get('end'); - $preparation_time = \Request::int('preparation_time'); - $internal_comment = \Request::get('internal_comment'); - $booking_type = \Request::int('booking_type'); - - $begin = new \DateTime(); - $begin->setTimestamp($begin_str); - $end = new \DateTime(); - $end->setTimestamp($end_str); - - try { - $booking = $resource->createSimpleBooking( - \User::findCurrent(), - $begin, - $end, - $preparation_time, - $internal_comment, - $booking_type - ); - return $booking; - } catch (\Exception $e) { - $this->halt( - 400, - $e->getMessage() - ); - } - } - - - /** - * Creates a resource request. - * - * @post /resources/resource/:resource_id/request_simple - */ - public function createSimpleResourceRequest($resource_id) - { - $resource = \Resource::find($resource_id); - if (!$resource) { - $this->notFound('Resource object not found!'); - } - - $resource = $resource->getDerivedClassInstance(); - - $user = \User::findCurrent(); - if (!$resource->userHasPermission($user, 'user')) { - throw new \AccessDeniedException(); - } - - $begin_str = \Request::get('begin'); - $end_str = \Request::get('end'); - $comment = \Request::get('comment'); - - $begin = new \DateTime(); - $begin->setTimestamp($begin_str); - $end = new \DateTime(); - $end->setTimestamp($end_str); - - try { - $request = $resource->createSimpleRequest( - $user, - $begin, - $end, - $comment - ); - return $request; - } catch (\Exception $e) { - $this->halt( - 400, - $e->getMessage() - ); - } - } - - - /** - * Change the status of a resource booking interval: - * @post /resources/booking_interval/:interval_id/toggle_takes_place - */ - public function toggleResourceBookingIntervalTakesPlaceField($interval_id) - { - $interval = \ResourceBookingInterval::find($interval_id); - if (!$interval) { - $this->notFound('ResourceBookingInterval object not found!'); - } - - //Get the resource and check the permissions of the user: - $resource = $interval->resource; - if (!$resource) { - $this->halt(500, 'ResourceBookingInterval not linked with a resource!'); - } - - $resource = $resource->getDerivedClassInstance(); - - if (!$resource->userHasPermission(\User::findCurrent(), 'autor', [$interval->begin, $interval->end])) { - $this->halt(403, 'You do not have sufficient permissions to modify the interval!'); - } - - if ( - !$interval->takes_place - && $resource->isAssigned(new \DateTime('@' . $interval->begin), new \DateTime('@' . $interval->end)) - ) { - $this->halt(409, 'Already booked'); - } - //Switch the takes_place field: - $interval->takes_place = $interval->takes_place ? '0' : '1'; - - if ($interval->store()) { - return [ - 'takes_place' => $interval->takes_place - ]; - } else { - $this->halt(500, 'Error while storing the interval!'); - } - } -} diff --git a/app/routes/RoomClipboard.php b/app/routes/RoomClipboard.php deleted file mode 100644 index ffcafe6b23ab8d880aeb6041c7c8f372231398ad..0000000000000000000000000000000000000000 --- a/app/routes/RoomClipboard.php +++ /dev/null @@ -1,322 +0,0 @@ -<?php -namespace RESTAPI\Routes; - -/** - * This file contains the REST class for room clipboards - * (clipboards containing room resources). - * - * @author Moritz Strohm <strohm@data-quest.de> - * @copyright 2017-2019 - * @license http://www.gnu.org/licenses/gpl-2.0.html GPL version 2 - * @since 4.5 - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - */ -class RoomClipboard extends \RESTAPI\RouteMap -{ - //Room clipboard routes: - - /** - * Returns the request/booking plan for a room clipboard. - * - * @get /room_clipboard/:clipboard_id/booking_plan - */ - public function getPlan($clipboard_id = null) - { - if (!$clipboard_id) { - $this->notFound('ID of clipboard has not been provided!'); - } - - $clipboard = \Clipboard::find($clipboard_id); - if (!$clipboard) { - $this->notFound('Clipboard object not found!'); - } - - $current_user = \User::findCurrent(); - - //Permission check: - if ($clipboard->user_id !== $current_user->id) { - throw new \AccessDeniedException(); - } - - $display_requests = \Request::bool('display_requests'); - $display_all_requests = \Request::bool('display_all_requests'); - - $begin_date = \Request::get('start'); - $end_date = \Request::get('end'); - if (!$begin_date || !$end_date) { - //No time range specified. - $this->halt(400, 'The parameters "start" and "end" are missing!'); - return; - } - - //Try the ISO format first: YYYY-MM-DDTHH:MM:SS±ZZ:ZZ - $begin = \DateTime::createFromFormat(\DateTime::RFC3339, $begin_date); - $end = \DateTime::createFromFormat(\DateTime::RFC3339, $end_date); - - if (!($begin instanceof \DateTime) || !($end instanceof \DateTime)) { - $begin = new \DateTime(); - $end = new \DateTime(); - //Assume the local timezone and use the Y-m-d format: - $date_regex = '/[0-9]{4}-(0[1-9]|1[0-2])-([0-2][0-9]|3[0-1])/'; - if (preg_match($date_regex, $begin_date)) { - //$begin is specified in the date formay YYYY-MM-DD: - $begin_str = explode('-', $begin_date); - $begin->setDate( - intval($begin_str[0]), - intval($begin_str[1]), - intval($begin_str[2]) - ); - $begin->setTime(0,0,0); - } else { - $begin->setTimestamp($begin_date); - } - //Now we do the same for $end_timestamp: - if (preg_match($date_regex, $end_date)) { - //$begin is specified in the date formay YYYY-MM-DD: - $end_str = explode('-', $end_date); - $end->setDate( - intval($end_str[0]), - intval($end_str[1]), - intval($end_str[2]) - ); - $end->setTime(23,59,59); - } else { - $end->setTimestamp($end_date); - } - } - - //Check if a clipboard is selected: - $selected_clipboard_id = $_SESSION['selected_clipboard_id']; - - $rooms = []; - if ($clipboard_id) { - $clipboard = \Clipboard::find($clipboard_id); - } elseif ($selected_clipboard_id) { - $clipboard = \Clipboard::find($selected_clipboard_id); - } else { - $this->halt(400, 'No clipboard selected!'); - } - if ($clipboard) { - $rooms = \Room::findMany($clipboard->getAllRangeIds('Room')); - } else { - $this->halt(404, 'Clipboard not found!'); - } - - $booking_types = \Request::getArray('booking_types'); - - //Room permission check: - $plan_objects = []; - foreach ($rooms as $room) { - if ($room->bookingPlanVisibleForuser($current_user)) { - $plan_objects = array_merge( - $plan_objects, - \ResourceManager::getBookingPlanObjects( - $room, - [ - [ - 'begin' => $begin->getTimestamp(), - 'end' => $end->getTimestamp() - ] - ], - $booking_types, - $display_all_requests ? 'all' : $display_requests - ) - ); - } - } - - $data = \Studip\Fullcalendar::createData($plan_objects, $begin, $end); - - return $data; - } - - - /** - * Returns the semester plan for a room clipboard. - * - * @get /room_clipboard/:clipboard_id/semester_plan - */ - public function getSemeterPlan($clipboard_id = null) - { - if (!$clipboard_id) { - $this->notFound('ID of clipboard has not been provided!'); - } - - $clipboard = \Clipboard::find($clipboard_id); - if (!$clipboard) { - $this->notFound('Clipboard object not found!'); - } - - $current_user = \User::findCurrent(); - - //Permission check: - if ($clipboard->user_id !== $current_user->id) { - throw new \AccessDeniedException(); - } - - $display_requests = \Request::bool('display_requests'); - $display_all_requests = \Request::bool('display_all_requests'); - - $begin = new \DateTime(); - $end = new \DateTime(); - - $semester_id = \Request::get('semester_id'); - $semester = null; - - if ($semester_id) { - $semester = \Semester::find($semester_id); - if (!$semester) { - $this->halt(404, 'Specified semester not found!'); - } - } else { - $semester = \Semester::findCurrent(); - if (!$semester) { - $this->halt(500, 'Current semester not available!'); - } - } - - if (\Request::get('semester_timerange') == 'vorles') { - $begin->setTimestamp($semester->vorles_beginn); - $end->setTimestamp($semester->vorles_ende); - } else { - $begin->setTimestamp($semester->beginn); - $end->setTimestamp($semester->ende); - } - - //Check if a clipboard is selected: - $selected_clipboard_id = $_SESSION['selected_clipboard_id']; - - $rooms = []; - if ($clipboard_id) { - $clipboard = \Clipboard::find($clipboard_id); - } elseif ($selected_clipboard_id) { - $clipboard = \Clipboard::find($selected_clipboard_id); - } else { - $this->halt(400, 'No clipboard selected!'); - } - if ($clipboard) { - $rooms = \Room::findMany($clipboard->getAllRangeIds('Room')); - } else { - $this->halt(404, 'Clipboard not found!'); - } - - //Get parameters: - $booking_types = \Request::getArray('booking_types'); - - //Get the event data sources: - $plan_objects = []; - - foreach ($rooms as $room) { - if ($room->bookingPlanVisibleForuser($current_user)) { - $plan_objects = array_merge( - $plan_objects, - \ResourceManager::getBookingPlanObjects( - $room, - [ - [ - 'begin' => $begin->getTimestamp(), - 'end' => $end->getTimestamp() - ] - ], - $booking_types, - $display_all_requests ? 'all' : $display_requests - ) - ); - } - } - - $merged_objects = []; - $metadates = []; - foreach ($plan_objects as $plan_object) { - if ($plan_object instanceof \ResourceBooking) { - $irrelevant_booking = - $plan_object->getRepetitionType() != 'weekly' || - ($plan_object->getAssignedUserType() === 'course' && in_array($plan_object->assigned_course_date->metadate_id, $metadates)); - if ($irrelevant_booking) { - continue; - } - - //It is a booking with repetitions that has to be included - //in the semester plan. - - $real_begin = $plan_object->begin; - if ($plan_object->preparation_time > 0) { - $real_begin -= $plan_object->preparation_time; - } - $event_data = $plan_object->convertToEventData([\ResourceBookingInterval::build(['interval_id' => md5(uniqid()), 'begin' => $real_begin, 'end' => $plan_object->end])], $current_user); - - //Merge event data from the same booking that have the - //same weekday and begin and end time into one event. - //If no repetition interval is set and the booking belongs - //to a course date, use the corresponding metadate ID or the - //course date ID in the index. Otherwise use the booking's - //ID (specified by event_data->object_id). - foreach ($event_data as $event) { - if ($plan_object->getAssignedUserType() === 'course') { - $index = sprintf( - '%1$s_%2$s_%3$s', - $plan_object->assigned_course_date->metadate_id, - $event->begin->format('NHis'), - $event->end->format('NHis') - ); - $metadates[] = $plan_object->assigned_course_date->metadate_id; - } else { - $index = sprintf( - '%1$s_%2$s_%3$s', - $plan_object->id, - $event->begin->format('NHis'), - $event->end->format('NHis') - ); - } - - //Strip some data that cannot be used effectively in here: - $event->api_urls = []; - - $merged_objects[$index] = $event; - } - } elseif ($plan_object instanceof \ResourceRequest) { - if ($plan_object->cycle instanceof \SeminarCycleDate) { - $cycle_dates = $plan_object->cycle->getAllDates(); - foreach ($cycle_dates as $cycle_date) { - $relevant_request = $semester->beginn <= $cycle_date->date - && $semester->ende >= $cycle_date->date; - if ($relevant_request) { - //We have found a date for the current semester - //that makes the request relevant. - break; - } - } - if (!$relevant_request) { - continue; - } - $event_data_list = $plan_object->getFilteredEventData( - $current_user->id - ); - - foreach ($event_data_list as $event_data) { - $index = sprintf( - '%1$s_%2$s_%3$s', - $plan_object->metadate_id, - $event_data->begin->format('NHis'), - $event_data->end->format('NHis') - ); - - //Strip some data that cannot be used effectively in here: - $event_data->view_urls = []; - $event_data->api_urls = []; - - $merged_objects[$index] = $event_data; - } - } - } - } - - //Convert the merged events to Fullcalendar events: - $data = []; - foreach ($merged_objects as $obj) { - $data[] = $obj->toFullCalendarEvent(); - } - - return $data; - } -} diff --git a/app/routes/Schedule.php b/app/routes/Schedule.php deleted file mode 100644 index 2341f7384806ab5501c1a764a8691dd2c6301e6e..0000000000000000000000000000000000000000 --- a/app/routes/Schedule.php +++ /dev/null @@ -1,71 +0,0 @@ -<?php -namespace RESTAPI\Routes; - -/** - * @author André Klaßen <andre.klassen@elan-ev.de> - * @author <mlunzena@uos.de> - * @license GPL 2 or later - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - * - * @condition user_id ^[a-f0-9]{1,32}$ - * @condition semester_id ^[a-f0-9]{1,32}$ - */ -class Schedule extends \RESTAPI\RouteMap -{ - /** - * returns schedule for a given user and semester - * - * @get /user/:user_id/schedule/:semester_id - * @get /user/:user_id/schedule - */ - public function getSchedule($user_id, $semester_id = null) - { - if ($user_id !== $GLOBALS['user']->id) { - $this->error(401); - } - - $current_semester = isset($semester_id) - ? \Semester::find($semester_id) - : \Semester::findCurrent(); - - if (!$current_semester) { - $this->notFound('No such semester.'); - } - - $schedule_settings = \UserConfig::get($user_id)->SCHEDULE_SETTINGS; - $days = \CalendarScheduleModel::getDisplayedDays($schedule_settings['glb_days']); - - $entries = \CalendarScheduleModel::getEntries( - $user_id, $current_semester, - $schedule_settings['glb_start_time'], $schedule_settings['glb_end_time'], - $days, - $visible = false - ); - - $json = []; - foreach ($entries as $number_of_day => $schedule_of_day) { - $entries = []; - foreach ($schedule_of_day->entries as $entry) { - $entries[$entry['id']] = self::entryToJson($entry); - } - $json[$number_of_day] = $entries; - } - - $this->etag(md5(serialize($json))); - - return array_reverse($json, true); - } - - - private static function entryToJson($entry) - { - $json = []; - foreach (['start', 'end', 'content', 'title', 'color', 'type'] as $key) { - $json[$key] = in_array($key, ['start', 'end']) - ? (int) $entry[$key] - : $entry[$key]; - } - - return $json; - } -} diff --git a/app/routes/Semester.php b/app/routes/Semester.php deleted file mode 100644 index bdb1ee7cb149ff8b74cf95e4749fe251293e2d4c..0000000000000000000000000000000000000000 --- a/app/routes/Semester.php +++ /dev/null @@ -1,115 +0,0 @@ -<?php -namespace RESTAPI\Routes; - -/** - * @author Jan-Hendrik Willms <tleilax+studip@gmail.com> - * @author <mlunzena@uos.de> - * @license GPL 2 or later - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - * - * @condition semester_id ^[0-9a-f]{1,32}$ - */ -class Semester extends \RESTAPI\RouteMap -{ - public function __construct() - { - parent::__construct(); - if (!\Request::int('limit')) { - $this->limit = count(\Semester::getAll()); - } - } - - /** - * Returns a list of all semesters. - * - * @get /semesters - * @allow_nobody - */ - public function getSemesters() - { - $semesters = \Semester::getAll(); - - // paginate - $total = count($semesters); - $semesters = array_slice($semesters, $this->offset, $this->limit); - - $json = []; - foreach ($semesters as $semester) { - $url = $this->urlf('/semester/%s', $semester['semester_id']); - $json[$url] = $this->semesterToJSON($semester); - } - - return $this->paginated($json, $total); - } - - /** - * Returns the semester week as string for a given string - * - * @get /semester/:timestamp/week - * @allow_nobody - */ - public function getSemesterWeek(int $timestamp) - { - $semester = \Semester::findByTimestamp($timestamp); - if (!$semester) { - return null; - } - $timestamp = strtotime('today', $timestamp); - $week_begin_timestamp = strtotime('monday this week', $semester->vorles_beginn); - $end_date = $semester->vorles_ende; - - $i = 0; - $result = [ - 'semester_name' => (string)$semester->name, - 'week_number' => sprintf(_('KW %u'), date('W', $timestamp)), - 'current_day' => strftime('%x', $timestamp) - ]; - while ($week_begin_timestamp < $end_date) { - $next_week_timestamp = strtotime('+1 week', $week_begin_timestamp); - if ($week_begin_timestamp <= $timestamp && $timestamp < $next_week_timestamp) { - $result['sem_week'] = sprintf( - _('%u. Vorlesungswoche (ab %s)'), - $i + 1, - strftime('%x', $week_begin_timestamp)); - break; - } - $i += 1; - - $week_begin_timestamp = $next_week_timestamp; - } - - return $result; - } - - /** - * Returns a single semester. - * - * @get /semester/:semester_id - */ - public function getSemester($id) - { - $semester = \Semester::find($id); - if (!$semester) { - $this->notFound(); - } - - $semester_json = $this->semesterToJSON($semester); - $this->etag(md5(serialize($semester_json))); - - return $semester_json; - } - - private function semesterToJSON($semester) - { - return [ - 'id' => $semester['semester_id'], - 'title' => (string) $semester['name'], - 'token' => (string) $semester['semester_token'], - 'begin' => (int) $semester['beginn'], - 'end' => (int) $semester['ende'], - 'seminars_begin' => (int) $semester['vorles_beginn'], - 'seminars_end' => (int) $semester['vorles_ende'], - 'visible' => (int) $semester['visible'], - ]; - } -} diff --git a/app/routes/Studip.php b/app/routes/Studip.php deleted file mode 100644 index 749a53adc495ccdd8370c68fdd0509ee441d60cb..0000000000000000000000000000000000000000 --- a/app/routes/Studip.php +++ /dev/null @@ -1,65 +0,0 @@ -<?php -namespace RESTAPI\Routes; - -use Config; -use SemClass; -use SemType; - -/** - * @author Jan-Hendrik Willms <tleilax+studip@gmail.com> - * @author <mlunzena@uos.de> - * @license GPL 2 or later - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - */ -class Studip extends \RESTAPI\RouteMap -{ - /** - * Grundlegende Systemeinstellungen - * - * @get /studip/settings - */ - public function getSettings() - { - $sem_types = array_map(function ($item) { - return [ - 'name' => $item['name'], - 'class' => $item['class'], - ]; - }, SemType::getTypes()); - - $sem_classes = array_map(function ($item) { - $item = (array) $item; - return reset($item); - }, SemClass::getClasses()); - - return [ - 'ALLOW_CHANGE_USERNAME' => Config::get()->ALLOW_CHANGE_USERNAME, - 'ALLOW_CHANGE_EMAIL' => Config::get()->ALLOW_CHANGE_EMAIL, - 'ALLOW_CHANGE_NAME' => Config::get()->ALLOW_CHANGE_NAME, - 'ALLOW_CHANGE_TITLE' => Config::get()->ALLOW_CHANGE_TITLE, - 'INST_TYPE' => $GLOBALS['INST_TYPE'], - 'SEM_TYPE' => $sem_types, - 'SEM_CLASS' => $sem_classes, - 'TERMIN_TYP' => $GLOBALS['TERMIN_TYP'], - 'PERS_TERMIN_KAT' => $GLOBALS['PERS_TERMIN_KAT'], - 'SUPPORT_EMAIL' => $GLOBALS['UNI_CONTACT'], - 'TITLES' => $GLOBALS['DEFAULT_TITLE_FOR_STATUS'], - 'UNI_NAME_CLEAN' => Config::get()->UNI_NAME_CLEAN, - ]; - } - - /** - * Farbeinstellungen - * - * @get /studip/colors - */ - public function getColors() - { - // TODO: Move these definitions somewhere else (but where!?) - return [ - 'background' => '#e1e4e9', - 'dark' => '#34578c', - 'light' => '#899ab9', - ]; - } -} diff --git a/app/routes/User.php b/app/routes/User.php deleted file mode 100644 index d3cce266c2014558739f1568dda015b1b43ef008..0000000000000000000000000000000000000000 --- a/app/routes/User.php +++ /dev/null @@ -1,300 +0,0 @@ -<?php -namespace RESTAPI\Routes; - -/** - * @author André Klaßen <andre.klassen@elan-ev.de> - * @author <mlunzena@uos.de> - * @license GPL 2 or later - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - * - * @condition user_id ^[0-9a-f]{1,32}$ - */ -class User extends \RESTAPI\RouteMap -{ - /**************************************************/ - /* PUBLIC STATIC HELPER METHODS */ - /**************************************************/ - - public static function getMiniUser($routemap, $user) - { - $avatar = \Avatar::getAvatar($user->id); - - return [ - 'id' => $user->id, - 'href' => $routemap->urlf('/user/%s', [htmlReady($user->id)]), - 'name' => self::getNamesOfUser($user), - 'avatar_small' => $avatar->getURL(\Avatar::SMALL), - 'avatar_medium' => $avatar->getURL(\Avatar::MEDIUM), - 'avatar_normal' => $avatar->getURL(\Avatar::NORMAL), - 'avatar_original' => $avatar->getURL(\Avatar::NORMAL) - ]; - } - - public static function getNamesOfUser($user) - { - $name = [ - 'username' => $user->username, - 'formatted' => $user->getFullName(), - 'family' => $user->nachname, - 'given' => $user->vorname, - 'prefix' => $user->title_front, - 'suffix' => $user->title_rear - ]; - return $name; - } - - - /**************************************************/ - /* ROUTES */ - /**************************************************/ - - /** - * Searches for users by a given keyword. - * - * @get /users - */ - public function searchUsers() - { - $needle = \Request::get('q') ?? \Request::get('needle'); - if (!$needle) { - $this->halt(400, 'Missing search paramter ?q='); - } - - $query = \GlobalSearchUsers::getSQL($needle, [], $this->offset + $this->limit); - $result = \DBManager::get()->fetchAll($query); - $total = (int) \DBManager::get()->fetchColumn('SELECT FOUND_ROWS() as found_rows'); - - $user_ids = array_column($result, 'user_id'); - $users = \User::findMany($user_ids); - - return $this->paginated( - array_map(function ($user) { - return self::getMiniUser($this, $user); - }, $users), - $total - ); - } - - - /** - * getUser - retrieves data of a user - * - * @get /user/:user_id - * @get /user - */ - public function getUser($user_id = '') - { - $user_id = $user_id ?: $GLOBALS['user']->id; - - $user = \User::findFull($user_id); - if (!$user) { - $this->halt(404, sprintf('User %s not found', $user_id)); - } - - $visibilities = get_local_visibility_by_id($user_id, 'homepage'); - if (is_array(json_decode($visibilities, true))) { - $visibilities = json_decode($visibilities, true); - } else { - $visibilities = []; - } - - $get_field = function ($field, $visibility) use ($user_id, $user, $visibilities) { - if (!$user[$field] - || !is_element_visible_for_user($GLOBALS['user']->id, $user_id, $visibilities[$visibility])) - { - return ''; - } - return $user[$field]; - }; - - $avatar = \Avatar::getAvatar($user_id); - - $user = [ - 'user_id' => $user_id, - 'username' => $user['username'], - 'name' => self::getNamesOfUser($user), - 'perms' => $user['perms'], - 'email' => get_visible_email($user_id), - 'avatar_small' => $avatar->getURL(\Avatar::SMALL), - 'avatar_medium' => $avatar->getURL(\Avatar::MEDIUM), - 'avatar_normal' => $avatar->getURL(\Avatar::NORMAL), - 'avatar_original' => $avatar->getURL(\Avatar::NORMAL), - 'phone' => $get_field('privatnr', 'private_phone'), - 'homepage' => $get_field('Home', 'homepage'), - 'privadr' => strip_tags($get_field('privadr', 'privadr')), - ]; - - // Data fields - $datafields = []; - foreach (\DataFieldEntry::getDataFieldEntries($user_id, 'user') as $entry) { - if (!$entry->isVisible()) { - continue; - } - if (!\Visibility::verify($entry->getID(), $user_id)) { - continue; - } - $datafields[] = [ - 'type' => $entry->getType(), - 'id' => $entry->getId(), - 'name' => (string) $entry->getName(), - 'value' => $entry->getValue(), - ]; - } - $user['datafields'] = $datafields; - - $this->etag(md5(serialize($user))); - - return $user; - - } - - - /** - * deleteUser - deletes a user - * - * @delete /user/:user_id - */ - public function deleteUser($user_id) - { - if (!$GLOBALS['perm']->have_perm('root')) { - $this->error(401); - } - - if (!$GLOBALS['user']->id === $user_id) { - $this->error(400, 'Must not delete yourself'); - } - - $user = \User::find($user_id); - $user->delete(); - - $this->status(204); - } - - - /** - * returns institutes for a given user - * - * @get /user/:user_id/institutes - */ - public function getInstitutes($user_id) - { - $user = \User::find($user_id); - if (!$user) { - $this->notFound(sprintf('User %s not found', $user_id)); - } - - $query = "SELECT i0.Institut_id AS institute_id, i0.Name AS name, - inst_perms AS perms, sprechzeiten AS consultation, - raum AS room, ui.telefon AS phone, ui.fax, - i0.Strasse AS street, i0.Plz AS city, - i1.Name AS faculty_name, i1.Strasse AS faculty_street, - i1.Plz AS faculty_city - FROM user_inst AS ui - JOIN Institute AS i0 USING (Institut_id) - LEFT JOIN Institute AS i1 ON (i0.fakultaets_id = i1.Institut_id) - WHERE visible = 1 AND user_id = :user_id - ORDER BY priority ASC"; - $statement = \DBManager::get()->prepare($query); - $statement->bindValue(':user_id', $user_id); - $statement->execute(); - - $institutes = [ - 'work' => [], - 'study' => [], - ]; - - foreach ($statement->fetchAll(\PDO::FETCH_ASSOC) as $row) { - if ($row['perms'] === 'user') { - $institutes['study'][] = $row; - } else { - $institutes['work'][] = $row; - } - } - - $this->etag(md5(serialize($institutes))); - - $result = array_slice($institutes, $this->offset, $this->limit); - return $this->paginated( - $result, - count($institutes['study']) + count($institutes['work']), - compact('user_id') - ); - } - - - /** - * Get the root file folder of a user's file area. - * - * @get /user/:user_id/top_folder - */ - public function getTopFolder($user_id) - { - $user = \User::find($user_id); - if (!$user) { - $this->notFound("User with id {$user_id} not found!"); - } - - if ($user->id !== \User::findCurrent()->id) { - $this->error(403, 'You are not allowed to see another user\'s personal file area!'); - } - - $top_folder = \Folder::findTopFolder($user->id, 'user'); - - if (!$top_folder) { - $this->notFound("No folder found for user with id {$user_id}!"); - } - - return (new FileSystem())->getFolder($top_folder->id); - } - - /** - * Patches the course member data of a user and course. Pass data to be - * patched via a valid json object in the body. Fields that my be patched: - * - * - group - the associated group in the overview of the users's courses - * - visibility - visible state of the course - * - * @patch /user/:user_id/courses/:course_id - * - * @todo more patchable fields? - */ - public function patchCourseGroup($user_id, $course_id) - { - $user = \User::find($user_id); - if (!$user) { - $this->notFound('User not found'); - } - - if ($user->id !== $GLOBALS['user']->id) { - $this->halt(403, "You may not alter this user's data"); - } - - $member = \CourseMember::find([$course_id, $user->id]); - if (!$member) { - $this->notFound('You are not a member of the course'); - } - - if (isset($this->data['group'])) { - if (!is_numeric($this->data['group']) || $this->data['group'] < 0 || $this->data['group'] > 8) { - $this->halt(400, 'Given group is not inside the valid range 0..8'); - } - $member->gruppe = $this->data['group']; - } - - if (isset($this->data['visibility'])) { - if (in_array($member->status, ['tutor', 'dozent'])) { - $this->halt(400, 'You may not change the visibility status for this course since you are a teacher.'); - } - if (!in_array($this->data['visibility'], ['yes', 'no'])) { - $this->halt(400, 'Visibility may only be "yes" or "no".'); - } - $member->visible = $this->data['visibility']; - } - - if ($member->isDirty()) { - $member->store(); - } - - $this->halt(204); - } -} diff --git a/app/routes/UserConfig.php b/app/routes/UserConfig.php deleted file mode 100644 index ba015388f25300587a8636afcf55d987c882ff50..0000000000000000000000000000000000000000 --- a/app/routes/UserConfig.php +++ /dev/null @@ -1,99 +0,0 @@ -<?php -namespace RESTAPI\Routes; - -use RESTAPI\RouteMap; -use RESTAPI\Router; - -/** - * API routes for accessing user config values. - * - * @author Jan-Hendrik Willms <tleilax+studip@gmail.com> - * @license GPL2 or any later version - * @since Stud.IP 3.4 - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - * - * @condition user_id ^[0-9a-f]{1,32}$ - * - * @status 404 if user does not exist - * @status 403 if user may access the request config item - */ -class UserConfig extends RouteMap -{ - // Stores the user's config instance - private $config; - - /** - * Performs checks if the user exists and may actually access the - * requested config. - * - * @param Router $router Instance of the api router - * @param array $handler Detected handler router - * @param array $parameters Parameters of the called route - */ - public function before(Router $router, array $handler, array $parameters) - { - // Check whether user exist - if (\User::find($parameters['user_id']) === null) { - $this->error(404, sprintf('User %s not found', $parameters['user_id'])); - } - - // Check whether user accesses own config or user is root - if ($parameters['user_id'] !== $GLOBALS['user']->id && $GLOBALS['user']->perms !== 'root') { - $this->error(403, 'User may only access own config'); - } - - $this->config = \UserConfig::get($parameters['user_id']); - } - - /** - * Returns the value of a specific config entry for a given user - * - * @get /user/:user_id/config/:field - * - * @return mixed Value for the request config item - * @status 404 if config item does not exist - */ - public function getConfig($user_id, $field) - { - // Check whether key exists in config - if (!isset($this->config[$field])) { - $this->error(404, sprintf('No config item for field %s and user %s', - $field, $user_id)); - } - - return $this->config[$field]; - } - - /** - * Stored the value of a specific config entry for a given user - * - * @put /user/:user_id/config/:field - * - * @status 204 on success - * @status 400 if no value is given - */ - public function setConfig($user_id, $field) - { - if (!isset($this->data['value'])) { - $this->error(400, 'No value given in request'); - } - - $this->config->store($field, $this->data['value']); - - $this->status(204); - } - - /** - * Removes a specific config entry for a given user - * - * @delete /user/:user_id/config/:field - * - * @status 204 on success - */ - public function deleteConfig($user_id, $field) - { - $this->config->delete($field); - - $this->status(204); - } -} diff --git a/app/routes/Wiki.php b/app/routes/Wiki.php deleted file mode 100644 index 7f54628ad19b8deaf6bea6e3bffabf015f5affff..0000000000000000000000000000000000000000 --- a/app/routes/Wiki.php +++ /dev/null @@ -1,148 +0,0 @@ -<?php -namespace RESTAPI\Routes; - -/** - * @author <mlunzena@uos.de> - * @license GPL 2 or later - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - * - * @condition range_id ^[0-9a-f]{1,32}$ - */ -class Wiki extends \RESTAPI\RouteMap -{ - public function before() - { - require_once 'User.php'; - } - - /** - * Wikiseitenindex einer Veranstaltung - * - * @get /course/:range_id/wiki - */ - public function getCourseWiki($range_id) - { - $pages = \WikiPage::findBySQL("`range_id` = ? ORDER BY `name` ASC", [$range_id]); - - if (!$pages[0]->isReadable()) { - $this->error(401); - } - - $total = sizeof($pages); - $pages = $pages->limit($this->offset, $this->limit); - - $linked_pages = []; - foreach ($pages as $page) { - $url = $this->urlf('/course/%s/wiki/%s', [$range_id, htmlReady($page['keyword'])]); - $linked_pages[$url] = $this->wikiPageToJson($page, ["content"]); - } - - $this->etag(md5(serialize($linked_pages))); - - return $this->paginated($linked_pages, $total, compact('range_id')); - } - - /** - * Wikiseite auslesen - * - * @get /course/:range_id/wiki/:keyword - * @get /course/:range_id/wiki/:keyword/:version - */ - public function getCourseWikiKeyword($range_id, $keyword, $version = null) - { - $page = $this->requirePage($range_id, $keyword, $version); - $wiki_json = $this->wikiPageToJson($page); - $this->etag(md5(serialize($wiki_json))); - $this->lastmodified($page->chdate); - return $wiki_json; - } - - /** - * Wikiseite ändern/hinzufügen - * - * @put /course/:range_id/wiki/:keyword - */ - public function putCourseWikiKeyword($range_id, $keyword) - { - if (!isset($this->data['content'])) { - $this->error(400, 'No content provided'); - } - - $page =\WikiPage::findOneBySQL("`range_id` = ? AND `name` = ?", [$range_id, $keyword]); - if (!$page) { - $page = new \WikiPage(); - $page->range_id = $range_id; - $page->name = $keyword; - } - - if (!$page->isEditable()) { - $this->error(401); - } - - $page->content = $this->data['content']; - $page->store(); - - $url = sprintf('course/%s/wiki/%s/%d', htmlReady($range_id), htmlReady($keyword), count($page->versions) + 1); - $this->redirect($url, 201, 'ok'); - } - - /**************************************************/ - /* PRIVATE HELPER METHODS */ - /**************************************************/ - - private function requirePage($range_id, $keyword, $version = null) - { - $page = \WikiPage::findOneBySQL("`range_id` = ? AND `name` = ?", [$range_id, $keyword]); - - if (!$page) { - $this->notFound(); - } - - if (!$page->isReadable($GLOBALS['user']->id)) { - $this->error(401); - } - if ($version !== null && $version !== count($page->versions) + 1) { - return $page->versions[count($page->versions) - 1 - $version]; - } else { - return $page; - } - } - - private function wikiPageToJson($page, $without = []) - { - $json = [ - 'range_id' => $page->range_id, - 'keyword' => $page->name, - 'chdate' => $page->chdate, - 'version' => 1 - ]; - - // (pre-rendered) content - if (!in_array('content', $without)) { - $json['content'] = $page->content; - $json['content_html'] = wikiReady($page->content, true, $page->range_id, $page->id); - } - if (!in_array('user', $without)) { - if ($page->author) { - $json['user'] = User::getMiniUser($this, $page->user_id); - } - } - - foreach ($without as $key) { - if (isset($json[$key])) { - unset($json[$key]); - } - } - - // string to int conversions as SORM does not know about ints - foreach (['chdate', 'mkdate', 'filesize', 'downloads'] as $key) { - if (isset($json[$key])) { - $json[$key] = (int) $json[$key]; - } - } - - return $json; - } - - -} diff --git a/app/views/admin/api/config.php b/app/views/admin/api/config.php deleted file mode 100644 index 83d2ae540dec182d62231aae9fda2c061ca6a6c7..0000000000000000000000000000000000000000 --- a/app/views/admin/api/config.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php -/** - * @var Admin_ApiController $controller - * @var array $config - */ -use Studip\Button, Studip\LinkButton; -?> - -<form class="default" action="<?= $controller->url_for('admin/api/config') ?>" method="post"> - <fieldset> - <legend><?= _('Konfiguration') ?></legend> - - <input type="hidden" name="active" value="0"> - <label> - <input type="checkbox" name="active" value="1" <? if ($config['API_ENABLED']) echo 'checked'; ?>> - <?= _('REST-API aktiviert') ?> - </label> - - - <label class="caption" for="auth"> - <?= _('Standard-Authentifizierung beim Login') ?> - <select name="auth" id="auth"> - <? foreach ($GLOBALS['STUDIP_AUTH_PLUGIN'] as $plugin): ?> - <option <? if ($config['API_OAUTH_AUTH_PLUGIN'] === $plugin) echo 'selected'; ?>> - <?= $plugin ?> - </option> - <? endforeach; ?> - </select> - </label> - </fieldset> - <footer> - <?= Button::createAccept(_('Speichern')) ?> - <?= LinkButton::createCancel(_('Abbrechen'), $controller->url_for('admin/api')) ?> - </footer> -</form> diff --git a/app/views/admin/api/edit.php b/app/views/admin/api/edit.php deleted file mode 100644 index f1c7e03f0067fb90ce28e2a6fcad785effc2c1ce..0000000000000000000000000000000000000000 --- a/app/views/admin/api/edit.php +++ /dev/null @@ -1,136 +0,0 @@ -<?php -/** - * @var Admin_ApiController $controller - * @var RESTAPI\Consumer\Base $consumer - * @var array $types - */ -use Studip\Button, Studip\LinkButton; -?> - -<? if ($consumer->id): ?> - <h1> - <?= sprintf( - _('Registrierte Applikation "%s" bearbeiten'), - htmlReady($consumer->title) - ) ?> - </h1> -<? else: ?> - <h1 class="hide-in-dialog"> - <?= _('Neue Applikation registrieren') ?> - </h1> -<? endif; ?> - -<form class="settings default" - action="<?= $controller->url_for('admin/api/edit', $consumer->id) ?>" method="post"> - <?= CSRFProtection::tokenTag() ?> - - <fieldset> - <legend><?= _('Grundeinstellungen') ?></legend> - - <label for="active"> - <input type="checkbox" class="switch" id="active" name="active" value="1" - <?= $consumer->active ? 'checked' : '' ?>> - <?= _('Aktiviert') ?> - </label> - - - <label for="title"> - <?= _('Titel') ?> - <input required type="text" id="title" name="title" - placeholder="<?= _('Beispiel-Applikation') ?>" - value="<?= htmlReady($consumer->title) ?>" - maxlength="128"> - </label> - - <label for="contact"> - <?= _('Kontaktperson') ?> - <input required type="text" id="contact" name="contact" - placeholder="John Doe" - value="<?= htmlReady($consumer->contact) ?>" - maxlength="255"> - </label> - - <label for="email"> - <?= _('Kontaktadresse') ?> - <input required type="text" id="email" name="email" - placeholder="support@appsite.tld" - value="<?= htmlReady($consumer->email) ?>" - maxlength="255"> - </label> - - <label for="callback"> - <?= _('Callback URL') ?> - <input required type="text" id="callback" name="callback" - placeholder="http://appsite.tld/auth" - value="<?= htmlReady($consumer->callback) ?>" - maxlength="255"> - </label> - - <? if ($consumer->id): ?> - <label for="consumer_key"> - <?= _('Consumer Key') ?> - <input readonly type="text" id="consumer_key" - value="<?= htmlReady($consumer->auth_key) ?>"> - </label> - - <label for="consumer_secret"> - <?= _('Consumer Secret') ?> - <input readonly type="text" id="consumer_secret" - value="<?= htmlReady($consumer->auth_secret) ?>"> - </label> - - <div class="centered"> - <?= strftime(_('Erstellt am %d.%m.%Y %H:%M:%S'), $consumer->mkdate) ?><br> - <? if ($consumer->mkdate != $consumer->chdate): ?> - <?= strftime(_('Zuletzt geändert am %d.%m.%Y %H:%M:%S'), $consumer->chdate) ?> - <? endif; ?> - </div> - <? endif; ?> - </fieldset> - - <fieldset> - <legend><?= _('Applikation-Details') ?></legend> - - <label for="commercial"> - <input type="checkbox" class="switch" id="commercial" name="commercial" value="1" - <?= $consumer->commercial ? 'checked' : '' ?>> - <?= _('Kommerziell') ?> - </label> - - <label for="description"> - <?= _('Beschreibung') ?> - <textarea id="description" name="description" maxlength="65535"><?= htmlReady($consumer->description) ?></textarea> - </label> - - <label for="url"> - <?= _('URL') ?> - <input type="text" id="url" name="url" - placeholder="http://appsite.tld" - value="<?= htmlReady($consumer->url) ?>" - maxlength="255"> - </label> - - <label for="type"> - <?= _('Typ') ?> - <select name="type" id="type"> - <option value="">- <?= _('Keine Angabe') ?> -</option> - <? foreach ($types as $type => $label): ?> - <option value="<?= $type ?>" <?= $consumer->type == $type ? 'selected' : '' ?>> - <?= $label ?> - </option> - <? endforeach; ?> - </select> - </label> - - - <label for="notes"> - <?= _('Notizen') ?> - <textarea id="notes" name="notes" maxlength="65535"><?= htmlReady($consumer->notes) ?></textarea> - </label> - </fieldset> - - <footer data-dialog-button> - <?= Button::createAccept(_('Speichern'), 'store') ?> - <?= LinkButton::createCancel(_('Abbrechen'), $controller->url_for('admin/api')) ?> - </footer> -</form> diff --git a/app/views/admin/api/index.php b/app/views/admin/api/index.php deleted file mode 100644 index 132deacb04ad0cd3093ac89fe9b1b3c2d23213db..0000000000000000000000000000000000000000 --- a/app/views/admin/api/index.php +++ /dev/null @@ -1,77 +0,0 @@ -<?php -/** - * @var Admin_ApiController $controller - * @var RESTAPI\Consumer\Base[] $consumers - * @var array $types - */ -?> -<? if (!empty($consumers)): ?> -<form action="#" method="post" class="default"> -<table class="default"> - <caption><?= _('Registrierte Applikationen') ?></caption> - <thead> - <tr> - <th><?= ('Aktiv') ?></th> - <th><?= _('Name') ?></th> - <th><?= _('Typ') ?></th> - <th><?= _('Kontakt') ?></th> - <th><?= _('Kommerziell') ?></th> - <th> </th> - </tr> - </thead> - <tbody> -<? foreach ($consumers as $consumer): ?> - <tr> - <td id="<?= $consumer->id ?>"> - <a href="<?= $controller->url_for('admin/api/toggle', $consumer->id, $consumer->active ? 'off' : 'on') ?>"> - <?= Icon::create('checkbox-' . ($consumer->active ? '' : 'un') . 'checked', 'clickable')->asImg() ?> - </a> - </td> - <td> - <? if ($consumer->url): ?> - <a href="<?= htmlReady($consumer->url) ?>" target="_blank" rel="noopener noreferrer"> - <?= htmlReady($consumer->title) ?> - </a> - <? else: ?> - <?= htmlReady($consumer->title) ?> - <? endif; ?> - </td> - <td><?= $types[$consumer->type] ?? ' ' ?></td> - <td> - <a href="mailto:<?= htmlReady($consumer->email) ?>"> - <?= htmlReady($consumer->contact) ?> - </a> - </td> - - <td><?= Icon::create('checkbox-' . ($consumer->commercial ? '' : 'un') . 'checked', 'clickable')->asImg() ?></td> - <td class="actions"> - <a href="<?= $controller->url_for('admin/api/keys', $consumer->id) ?>" - data-dialog="size=auto" - title="<?= htmlReady(sprintf(_('Schlüssel anzeigen für Applikation "%s"'), $consumer->title)) ?>"> - <?= Icon::create('info-circle', 'clickable')->asImg() ?> - </a> - <a href="<?= $controller->url_for('admin/api/edit', $consumer->id) ?>" title="<?= _('Applikation bearbeiten') ?>" data-dialog> - <?= Icon::create('edit', 'clickable')->asImg() ?> - </a> - <a href="<?= $controller->url_for('admin/api/permissions', $consumer->id) ?>" title="<?= _('Zugriffsberechtigungen verwalten') ?>"> - <?= Icon::create('admin', 'clickable')->asImg() ?> - </a> - <?= Icon::create('trash')->asInput([ - 'formaction' => $controller->url_for('admin/api/delete/', $consumer->id), - 'title' => sprintf(_('Applikation "%s" entfernen'), $consumer->title), - 'data-confirm' => '', - 'style' => 'vertical-align: middle' - ]) ?> - </td> - </tr> -<? endforeach; ?> - </tbody> -</table> -</form> - -<? else: ?> -<p> - <?= MessageBox::info(_('Es wurde noch keine Applikation registriert.'), - [sprintf(_('Klicken Sie <a href="%s">hier</a>, um eine Applikation zu registrieren.'), $controller->url_for('admin/api/edit'))]) ?> -</p> -<? endif; ?> diff --git a/app/views/admin/api/permissions.php b/app/views/admin/api/permissions.php deleted file mode 100644 index 9eb48e36e1fb94cabb754888b6de26a6e78b47b4..0000000000000000000000000000000000000000 --- a/app/views/admin/api/permissions.php +++ /dev/null @@ -1,62 +0,0 @@ -<?php -/** - * @var Admin_ApiController $controller - * @var RESTAPI\ConsumerPermissions $permissions - * @var string $consumer_id - * @var array $routes - * @var bool $global - */ -?> -<form action="<?= $controller->url_for('admin/api/permissions', $consumer_id) ?>" method="post" class="default"> -<table class="default"> - <thead> - <tr> - <th><?= _('Zugriff') ?></th> - <th><?= _('Route') ?></th> - <th><?= _('Methoden') ?></th> - <th><?= _('Zugriff auf') ?></th> - <th><?= _('Quelle') ?></th> - </tr> - </thead> -<? foreach ($routes as $route => $methods): ?> - <tbody> - - <? $i = 0; ?> - <? foreach ($methods as $method => $info): ?> - <tr style="vertical-align: top;"> - <td> - <input type="hidden" name="permission[<?= urlencode($route) ?>][<?= urlencode($method) ?>]" value="0"> - <input type="checkbox" name="permission[<?= urlencode($route) ?>][<?= urlencode($method) ?>]" - <? if (!$global || $global->check($route, $method)): ?> - <? if ($permissions->check($route, $method)) echo 'checked'; ?> - <? else: ?> - disabled - <? endif; ?> - value="1"> - </td> - <? if ($i++): ?> - <td> </td> - <? else: ?> - <td><?= htmlReady($route) ?></td> - <? endif; ?> - <td><?= htmlReady($method) ?></td> - <td><?= htmlReady($info['description']) ?></td> - <td><?= $info['source'] ?></td> - </tr> - <? endforeach; ?> - </tbody> -<? endforeach; ?> - <tfoot> - <tr> - <td> - <label> - <input type="checkbox" data-proxyfor="[name^=permission]:checkbox"> <?= _('Alle') ?> - </label> - </td> - <td colspan="4"> - <?= Studip\Button::createAccept(_('Speichern'), 'store') ?> - </td> - </tr> - </tfoot> -</table> -</form> diff --git a/app/views/api/authorizations/index.php b/app/views/api/authorizations/index.php deleted file mode 100644 index 95645f4622019cab582de9f234dec8e50c6d52b9..0000000000000000000000000000000000000000 --- a/app/views/api/authorizations/index.php +++ /dev/null @@ -1,44 +0,0 @@ -<? use Studip\Button, Studip\LinkButton; ?> - -<? if (empty($consumers)): ?> -<?= MessageBox::info(_('Sie haben noch keinen Apps Zugriff auf Ihren Account gewährt.')) ?> -<? else: ?> -<table class="oauth-apps default"> - <caption><?= _('Applikationen') ?></caption> - <thead> - <tr> - <th><?= _('Name') ?></th> - <th> </th> - </thead> - <tbody> - <? foreach ($consumers as $consumer): ?> - <tr> - <td> - <h3> - <? if ($consumer->url): ?> - <a href="<?= htmlReady($consumer->url) ?>" target="_blank" rel="noopener noreferrer"> - <?= htmlReady($consumer->title) ?> - </a> - <? else: ?> - <?= htmlReady($consumer->title) ?> - <? endif; ?> - <? if (isset($types[$consumer->type])): ?> - <small>(<?= htmlReady($types[$consumer->type]) ?>)</small> - <? endif; ?> - </h3> - <? if ($consumer->description): ?> - <p><?= htmlReady($consumer->description) ?></p> - <? endif; ?> - </td> - <td class="actions"> - <?= LinkButton::createCancel( - _('App entfernen'), - $controller->url_for('api/authorizations/revoke', $consumer->id), - ['data-confirm' => _('Wollen Sie der App wirklich den Zugriff auf Ihre Daten untersagen?')] - ) ?> - </td> - </tr> -<? endforeach; ?> - </tbody> -</table> -<? endif; ?> diff --git a/app/views/api/oauth/authorize.php b/app/views/api/oauth/authorize.php deleted file mode 100644 index 6c665328ad29675331b8dab3bdaa39aad8e96693..0000000000000000000000000000000000000000 --- a/app/views/api/oauth/authorize.php +++ /dev/null @@ -1,34 +0,0 @@ -<section class="oauth authorize"> - <p> - <?= sprintf( - _('Die Applikation <strong>%s</strong> möchte auf Ihre Daten zugreifen.'), - htmlReady($consumer->title) - ) ?> - </p> - - <form action="<?= $controller->url_for('api/oauth/authorize?oauth_token=' . $token) ?>" method="post"> - <input type="hidden" name="oauth_callback" value="<?= htmlReady($oauth_callback) ?>"> - <p> - <?= Studip\Button::createAccept(_('Erlauben'), 'allow') ?> - <?= Studip\LinkButton::createCancel(_('Verweigern'), $consumer->callback) ?> - </p> - </form> - - <p> - <?= Avatar::getAvatar($GLOBALS['user']->id)->getImageTag(Avatar::SMALL) ?> - - <?= sprintf( - _('Angemeldet als <strong>%s</strong> (%s)'), - htmlReady($GLOBALS['user']->getFullName()), - htmlReady($GLOBALS['user']->username) - ) ?><br> - <small> - <a href="<?= URLHelper::getLink('logout.php') ?>"> - <?= sprintf( - _('Sind sie nicht <strong>%s</strong>, so melden Sie sich bitte ab und versuchen es erneut.'), - htmlReady($GLOBALS['user']->getFullName()) - ) ?> - </a> - </small> - </p> -</section> diff --git a/app/views/api/oauth/authorized.php b/app/views/api/oauth/authorized.php deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/composer.json b/composer.json index 70989653eddc178268bfd4a92fad8291476a07c9..dfb4fe19fd9fcafe80fbd816c016f658a023f508 100644 --- a/composer.json +++ b/composer.json @@ -112,7 +112,6 @@ "league/oauth2-server": "8.5.4", "willdurand/negotiation": "^3.1", "monolog/monolog": "^2.8", - "phpowermove/docblock": "^2.0", "ksubileau/color-thief-php": "^2.0", "symfony/polyfill-php82": "1.29.0", "symfony/polyfill-php83": "1.29.0", diff --git a/composer.lock b/composer.lock index e4b114b35fa404ada6ff6065639e60342ee7029f..b41c34411577edb477d9cb2fa7073cb890e41616 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d524d0543302bb6f60235cbdecb3f811", + "content-hash": "ffcafdbc6269da0a1c7581f0129d6f1b", "packages": [ { "name": "algo26-matthias/idna-convert", @@ -2278,109 +2278,6 @@ }, "time": "2020-10-15T08:29:30+00:00" }, - { - "name": "phootwork/collection", - "version": "v2.1.3", - "source": { - "type": "git", - "url": "https://github.com/phootwork/collection.git", - "reference": "d58a0d7186074b601b016b9878b6fb65f6c23648" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phootwork/collection/zipball/d58a0d7186074b601b016b9878b6fb65f6c23648", - "reference": "d58a0d7186074b601b016b9878b6fb65f6c23648", - "shasum": "" - }, - "require": { - "phootwork/lang": "^2.0", - "php": ">=7.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "phootwork\\collection\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Thomas Gossmann", - "homepage": "http://gos.si" - } - ], - "description": "The phootwork library fills gaps in the php language and provides better solutions than the existing ones php offers.", - "homepage": "https://phootwork.github.io/collection/", - "keywords": [ - "Array object", - "Text object", - "collection", - "collections", - "json", - "list", - "map", - "queue", - "set", - "stack", - "xml" - ], - "support": { - "issues": "https://github.com/phootwork/phootwork/issues", - "source": "https://github.com/phootwork/collection/tree/v2.1.3" - }, - "time": "2020-09-17T16:04:53+00:00" - }, - { - "name": "phootwork/lang", - "version": "v2.1.3", - "source": { - "type": "git", - "url": "https://github.com/phootwork/lang.git", - "reference": "77402690535452da745cf11df33adc51a4ad89a1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phootwork/lang/zipball/77402690535452da745cf11df33adc51a4ad89a1", - "reference": "77402690535452da745cf11df33adc51a4ad89a1", - "shasum": "" - }, - "require": { - "php": ">=7.2", - "symfony/polyfill-mbstring": "^1.12" - }, - "type": "library", - "autoload": { - "psr-4": { - "phootwork\\lang\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Thomas Gossmann", - "homepage": "http://gos.si" - } - ], - "description": "Missing PHP language constructs", - "homepage": "https://phootwork.github.io/lang/", - "keywords": [ - "array", - "comparator", - "comparison", - "string" - ], - "support": { - "issues": "https://github.com/phootwork/phootwork/issues", - "source": "https://github.com/phootwork/lang/tree/v2.1.3" - }, - "time": "2021-02-15T17:24:43+00:00" - }, { "name": "php-di/invoker", "version": "2.3.4", @@ -2688,58 +2585,6 @@ ], "time": "2023-11-12T21:59:55+00:00" }, - { - "name": "phpowermove/docblock", - "version": "v2.0.1", - "source": { - "type": "git", - "url": "https://github.com/phpowermove/docblock.git", - "reference": "b96e2c9a14a6014fd8d932643c95b4d20638756a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpowermove/docblock/zipball/b96e2c9a14a6014fd8d932643c95b4d20638756a", - "reference": "b96e2c9a14a6014fd8d932643c95b4d20638756a", - "shasum": "" - }, - "require": { - "phootwork/collection": "^2.0", - "phootwork/lang": "^2.0", - "php": ">=7.2" - }, - "require-dev": { - "phootwork/php-cs-fixer-config": "^0.2.2", - "phpunit/phpunit": "^8.0", - "psalm/phar": "^4.3" - }, - "type": "library", - "autoload": { - "psr-4": { - "gossi\\docblock\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Thomas Gossmann", - "homepage": "http://gos.si" - } - ], - "description": "PHP Docblock parser and generator. An API to read and write Docblocks.", - "keywords": [ - "docblock", - "generator", - "parser" - ], - "support": { - "issues": "https://github.com/gossi/docblock/issues", - "source": "https://github.com/phpowermove/docblock/tree/v2.0.1" - }, - "time": "2021-02-17T11:36:51+00:00" - }, { "name": "phpseclib/phpseclib", "version": "3.0.37", diff --git a/db/migrations/1.127_setup_api.php b/db/migrations/1.127_setup_api.php index 7cae3f96d33d479dcf58ce41e5869b0270cf61c6..73b36f61b953b7ecc50e55fd7d37d5d936b2de63 100644 --- a/db/migrations/1.127_setup_api.php +++ b/db/migrations/1.127_setup_api.php @@ -1,12 +1,46 @@ <?php class SetupApi extends Migration { - function description() + public function description() { return 'Creates api tables in database and according config entries'; } - function up() + public function up() + { + $this->createTables(); + + // Add config entries + $query = "INSERT IGNORE INTO `config` + (`config_id`, `field`, `value`, `is_default`, `type`, `range`, `section`, + `mkdate`, `chdate`, `description`) + VALUES (MD5(:field), :field, :value, 1, :type, 'global', 'global', + UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), :description)"; + $statement = DBManager::get()->prepare($query); + + $statement->execute([ + ':field' => 'API_ENABLED', + ':value' => (int)false, + ':type' => 'boolean', + ':description' => 'Schaltet die REST-API an', + ]); + + $statement->execute([ + ':field' => 'API_OAUTH_AUTH_PLUGIN', + ':value' => 'Standard', + ':type' => 'string', + ':description' => 'Definiert das für OAuth verwendete Authentifizierungsverfahren', + ]); + } + + public function down() + { + DBManager::get()->exec("DELETE FROM config WHERE field IN ('API_ENABLED', 'API_OAUTH_AUTH_PLUGIN')"); + + $this->dropTables(); + } + + public function createTables(): void { // Add vendor tables $query = "CREATE TABLE IF NOT EXISTS `oauth_consumer_registry` ( @@ -29,7 +63,7 @@ class SetupApi extends Migration KEY `ocr_usa_id_ref` (`ocr_usa_id_ref`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8"; DBManager::get()->exec($query); - + $query = "CREATE TABLE IF NOT EXISTS `oauth_consumer_token` ( `oct_id` int(11) NOT NULL AUTO_INCREMENT, `oct_ocr_id_ref` int(11) NOT NULL, @@ -47,7 +81,7 @@ class SetupApi extends Migration CONSTRAINT `oauth_consumer_token_ibfk_1` FOREIGN KEY (`oct_ocr_id_ref`) REFERENCES `oauth_consumer_registry` (`ocr_id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=MyISAM DEFAULT CHARSET=utf8"; DBManager::get()->exec($query); - + $query = "CREATE TABLE IF NOT EXISTS `oauth_log` ( `olg_id` int(11) NOT NULL AUTO_INCREMENT, `olg_osr_consumer_key` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL, @@ -80,7 +114,7 @@ class SetupApi extends Migration UNIQUE KEY `osn_consumer_key` (`osn_consumer_key`,`osn_token`,`osn_timestamp`,`osn_nonce`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8"; DBManager::get()->exec($query); - + $query = "CREATE TABLE IF NOT EXISTS `oauth_server_registry` ( `osr_id` int(11) NOT NULL AUTO_INCREMENT, `osr_usa_id_ref` int(11) DEFAULT NULL, @@ -176,39 +210,16 @@ class SetupApi extends Migration PRIMARY KEY (`user_id`,`consumer_id`) ) ENGINE=MyISAM"; DBManager::get()->exec($query); - - // Add config entries - $query = "INSERT IGNORE INTO `config` - (`config_id`, `field`, `value`, `is_default`, `type`, `range`, `section`, - `mkdate`, `chdate`, `description`) - VALUES (MD5(:field), :field, :value, 1, :type, 'global', 'global', - UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), :description)"; - $statement = DBManager::get()->prepare($query); - - $statement->execute([ - ':field' => 'API_ENABLED', - ':value' => (int)false, - ':type' => 'boolean', - ':description' => 'Schaltet die REST-API an', - ]); - - $statement->execute([ - ':field' => 'API_OAUTH_AUTH_PLUGIN', - ':value' => 'Standard', - ':type' => 'string', - ':description' => 'Definiert das für OAuth verwendete Authentifizierungsverfahren', - ]); } - function down() + public function dropTables(): void { - DBManager::get()->exec("DELETE FROM config WHERE field IN ('API_ENABLED', 'API_OAUTH_AUTH_PLUGIN')"); DBManager::get()->exec("DROP TABLE IF EXISTS `oauth_consumer_registry`, `oauth_consumer_token`, `oauth_log`, `oauth_server_nonce`, `oauth_server_registry`, - `oauth_server_token` + `oauth_server_token`, `api_consumer_permissions`, `api_consumers`, `api_oauth_user_mapping`, diff --git a/db/migrations/5.1.34_activate_semester_routes.php b/db/migrations/5.1.34_activate_semester_routes.php index 082a5db829a7d73f7d7b706b27bb78b12d8f8f22..21cbb647a7774121594105a1f84dcf6262ee0c63 100644 --- a/db/migrations/5.1.34_activate_semester_routes.php +++ b/db/migrations/5.1.34_activate_semester_routes.php @@ -8,7 +8,9 @@ class ActivateSemesterRoutes extends Migration public function up() { - require_once 'app/routes/Semester.php'; - RESTAPI\ConsumerPermissions::get()->activateRouteMap(new RESTAPI\Routes\Semester()); + // Deactivated since the restapi was removed in Stud.IP 6.0 + + # require_once 'app/routes/Semester.php'; + # RESTAPI\ConsumerPermissions::get()->activateRouteMap(new RESTAPI\Routes\Semester()); } } diff --git a/db/migrations/6.0.10_remove_restapi.php b/db/migrations/6.0.10_remove_restapi.php new file mode 100644 index 0000000000000000000000000000000000000000..50629162073b6bd13873e2e9a9257d81da0e77f7 --- /dev/null +++ b/db/migrations/6.0.10_remove_restapi.php @@ -0,0 +1,63 @@ +<?php +final class RemoveRestapi extends Migration +{ + private Migration $other_migration; + + public function __construct($verbose = false) + { + parent::__construct($verbose); + + require_once __DIR__ . '/1.127_setup_api.php'; + $this->other_migration = new SetupApi($verbose); + } + + public function description() + { + return 'Removes the deprecated REST API (essentially reverts migration 1.127)'; + } + + protected function up() + { + $this->other_migration->dropTables(); + + // Delete config + $query = "DELETE `config`, `config_values` + FROM `config` + LEFT JOIN `config_values` USING(`field`) + WHERE `field` IN ('API_ENABLED', 'API_OAUTH_AUTH_PLUGIN')"; + DBManager::get()->exec($query); + + // Disable all RESTAPI-Plugins + $query = "UPDATE `plugins` + SET `enabled` = 'no' + WHERE FIND_IN_SET('RESTAPIPlugin', `plugintype`)"; + DBManager::get()->exec($query); + } + + protected function down() + { + // Add config entries + $query = "INSERT IGNORE INTO `config` + (`field`, `value`, `type`, `range`, `section`, + `mkdate`, `chdate`, `description`) + VALUES (:field, :value, :type, 'global', 'global', + UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), :description)"; + $statement = DBManager::get()->prepare($query); + + $statement->execute([ + ':field' => 'API_ENABLED', + ':value' => 0, + ':type' => 'boolean', + ':description' => 'Schaltet die REST-API an', + ]); + + $statement->execute([ + ':field' => 'API_OAUTH_AUTH_PLUGIN', + ':value' => 'Standard', + ':type' => 'string', + ':description' => 'Definiert das für OAuth verwendete Authentifizierungsverfahren', + ]); + + $this->other_migration->createTables(); + } +} diff --git a/lib/activities/DocumentsProvider.php b/lib/activities/DocumentsProvider.php index 0a770deea5924297e4b2ee9f3fb98c9bfc5fc177..fae5df297dc351a11fc1122f4d8d8654a69fdbc7 100644 --- a/lib/activities/DocumentsProvider.php +++ b/lib/activities/DocumentsProvider.php @@ -29,7 +29,6 @@ class DocumentsProvider implements ActivityProvider if ($activity->context == "course") { $url = \URLHelper::getUrl("dispatch.php/course/files/flat?cid={$activity->context_id}"); - $route = \URLHelper::getURL('api.php/file/' . $activity->object_id, NULL, true); $activity->object_url = [ $url => _('Zum Dateibereich der Veranstaltung') @@ -43,8 +42,6 @@ class DocumentsProvider implements ActivityProvider ]; } - $activity->object_route = $route; - return true; } diff --git a/lib/activities/ForumProvider.php b/lib/activities/ForumProvider.php index f5439470d81907487ae16239bdf2ce0baa0378ee..6a958eb534cd6bd05c384c093758ae92319b8f27 100644 --- a/lib/activities/ForumProvider.php +++ b/lib/activities/ForumProvider.php @@ -30,14 +30,10 @@ class ForumProvider implements ActivityProvider .'?cid='. $post['seminar_id'] .'&highlight_topic='. $post['topic_id'] .'#'. $post['topic_id']); - $route = \URLHelper::getURL('api.php/forum_entry/' . $post['topic_id'], NULL, true); - $activity->object_url = [ $url => _('Zum Forum der Veranstaltung') ]; - $activity->object_route = $route; - return true; } diff --git a/lib/activities/MessageProvider.php b/lib/activities/MessageProvider.php index 9d1683176e0dd886b958ba333edae0f2d91f38c9..0db2ad85ba834402772c30adc1a2cb4ce14d4fd4 100644 --- a/lib/activities/MessageProvider.php +++ b/lib/activities/MessageProvider.php @@ -30,14 +30,10 @@ class MessageProvider implements ActivityProvider $url = \URLHelper::getUrl("dispatch.php/messages/read/{$message->id}", ['cid' => null]); - $route = \URLHelper::getURL('api.php/message/' . $message->id, NULL, true); - $activity->object_url = [ $url => _('Zur Nachricht') ]; - $activity->object_route = $route; - return true; } diff --git a/lib/activities/NewsProvider.php b/lib/activities/NewsProvider.php index eed7fe7306f0b3192815f1c5a3bf46ba380b22db..8f1c5f46da03b67eee175bccdd8c9c5e8729eb53 100644 --- a/lib/activities/NewsProvider.php +++ b/lib/activities/NewsProvider.php @@ -116,10 +116,8 @@ class NewsProvider implements ActivityProvider .'</b><br>'. formatReady((string) $news->body); $url = self::getUrlForContext($news, $activity); - $route = \URLHelper::getURL('api.php/news/' . $news->id, NULL, true); $activity->object_url = $url; - $activity->object_route = $route; return true; } diff --git a/lib/activities/ParticipantsProvider.php b/lib/activities/ParticipantsProvider.php index 50bad461feaa7f8f5bef9cdbc6b763cedfcf5459..7dc71fdd49b982e3daa3fe314c376a9209053767 100644 --- a/lib/activities/ParticipantsProvider.php +++ b/lib/activities/ParticipantsProvider.php @@ -62,14 +62,10 @@ class ParticipantsProvider implements ActivityProvider $url = \URLHelper::getUrl("dispatch.php/course/members/index", ['cid' => $activity->context_id]); - $route = \URLHelper::getURL('api.php/course/' . $activity->context_id, NULL, true); - $activity->object_url = [ $url => _('Zur Veranstaltung') ]; - $activity->object_route = $route; - return true; } diff --git a/lib/activities/ScheduleProvider.php b/lib/activities/ScheduleProvider.php index 208b9b39e9c5cc449a389e04bbe083f0b6c167a7..73ca7f57548569eadce0d02ea4ec5738a38679f9 100644 --- a/lib/activities/ScheduleProvider.php +++ b/lib/activities/ScheduleProvider.php @@ -20,14 +20,11 @@ class ScheduleProvider implements ActivityProvider $activity->content = htmlReady($activity->content); $url = \URLHelper::getUrl("dispatch.php/course/dates?cid={$activity->context_id}"); - $route = \URLHelper::getURL('api.php/course/' . $activity->context_id . '/events', NULL, true); $activity->object_url = [ $url => _('Zum Ablaufplan der Veranstaltung') ]; - $activity->object_route = $route; - return true; } diff --git a/lib/activities/WikiProvider.php b/lib/activities/WikiProvider.php index f3a8bbffc3521b48b6c9be4ba42e988afad68359..7a5266fcb95d92fa927c1a4a4c64ae8777042342 100644 --- a/lib/activities/WikiProvider.php +++ b/lib/activities/WikiProvider.php @@ -27,23 +27,17 @@ class WikiProvider implements ActivityProvider if ($activity->context === 'course') { $url = \URLHelper::getURL('dispatch.php/course/wiki/page/' . $page->id, ['cid' => $activity->context_id]); - $route = \URLHelper::getURL("api.php/course/{$activity->context_id}/wiki/{$activity->object_id}", null, true); $activity->object_url = [ $url => _('Zum Wiki der Veranstaltung'), ]; - $activity->object_route = $route; - } elseif ($activity->context === 'institute') { $url = \URLHelper::getURL('dispatch.php/course/wiki/page/' . $page->id, ['cid' => $activity->context_id]); - $route= null; $activity->object_url = [ $url => _('Zum Wiki der Einrichtung') ]; - - $activity->object_route = $route; } return true; diff --git a/lib/bootstrap-api.php b/lib/bootstrap-api.php deleted file mode 100644 index ffa0b40d878889df02eabeea7770a68a8da23712..0000000000000000000000000000000000000000 --- a/lib/bootstrap-api.php +++ /dev/null @@ -1,40 +0,0 @@ -<?php -/** - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - */ - -namespace { - StudipAutoloader::addAutoloadPath($GLOBALS['STUDIP_BASE_PATH'] . '/vendor/oauth-php/library'); - - // Set base url for URLHelper class - URLHelper::setBaseUrl($GLOBALS['CANONICAL_RELATIVE_PATH_STUDIP']); -} - -namespace RESTAPI { - use Studip, OAuthStore; - - // Define api version - const VERSION = '2'; - - $router = Router::getInstance(); - - // Register JSON content renderer - $router->registerRenderer(new Renderer\JSONRenderer, true); - - // If in development mode, register debug content renderer - if (defined('Studip\\ENV') && Studip\ENV === 'development') { - $router->registerRenderer(new Renderer\DebugRenderer); - } - - OAuthStore::instance('PDO', [ - 'dsn' => 'mysql:host=' . $GLOBALS['DB_STUDIP_HOST'] - . ';dbname=' . $GLOBALS['DB_STUDIP_DATABASE'], - 'username' => $GLOBALS['DB_STUDIP_USER'], - 'password' => $GLOBALS['DB_STUDIP_PASSWORD'] - ]); - - // Register default consumers - Consumer\Base::addType('http', 'RESTAPI\\Consumer\\HTTP'); - Consumer\Base::addType('studip', 'RESTAPI\\Consumer\\Studip'); - Consumer\Base::addType('oauth', 'RESTAPI\\Consumer\\OAuth'); -} diff --git a/lib/classes/restapi/ConsumerPermissions.php b/lib/classes/restapi/ConsumerPermissions.php deleted file mode 100644 index 8fc225263bca09614a6a6946968c50b96c8c29e7..0000000000000000000000000000000000000000 --- a/lib/classes/restapi/ConsumerPermissions.php +++ /dev/null @@ -1,212 +0,0 @@ -<?php -namespace RESTAPI; -use DBManager, PDO; - -/** - * REST API routing permissions - * - * @author Jan-Hendrik Willms <tleilax+studip@gmail.com> - * @license GPL 2 or later - * @since Stud.IP 3.0 - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - */ -class ConsumerPermissions -{ - /** - * Create a permission object (for a certain consumer). - * Permissions object will be cached for each consumer. - * - * @param mixed $consumer_id Id of consumer (optional, defaults to global) - * @return ConsumerPermissions Returns permissions object - */ - public static function get($consumer_id = null) - { - static $cache = []; - if (!isset($cache[$consumer_id])) { - $cache[$consumer_id] = new self($consumer_id); - } - - return $cache[$consumer_id]; - } - - private $consumer_id; - private $permissions = []; - - /** - * Creates the actual permission object (for a certain consumer). - * - * @param mixed $consumer_id Id of consumer (optional, defaults to global) - */ - private function __construct($consumer_id = null) - { - $this->consumer_id = $consumer_id; - - // Init with global permissions - $this->loadPermissions('global', true); - - // Specific consumers permissions? - if ($consumer_id) { - $this->loadPermissions($consumer_id, false); - } - } - - /** - * Defines whether access if allowed for the current consumer to the - * passed route via the passed method. - * - * @param String $route_id Route template (hash) - * @param String $method HTTP method - * @param mixed $granted Granted state (PHP'ish boolean) - * @param bool $overwrite May values be overwritten - * @return bool Indicates if value could be changed. - */ - public function set($route_id, $method, $granted, $overwrite = false) - { - // If route_id is not an md5 hash, convert it - if (!preg_match('/^[0-9a-f]{32}$/', $route_id)) { - $route_id = md5($route_id); - } - - if (!isset($this->permissions[$route_id])) { - // Skip if not globally set and not allowed to overwrite - if (!$overwrite) { - return false; - } - $this->permissions[$route_id] = []; - } - - // overwrite only if globally allowed - if (!$overwrite && empty($this->permissions[$route_id][$method])) { - return false; - } - - $this->permissions[$route_id][$method] = (bool) $granted; - - return true; - } - - /** - * Convenience method for activating all routes in a route map. - * - * @param \RESTAPI\RouteMap $routemap RouteMap to activate - */ - public function activateRouteMap(RouteMap $routemap) - { - foreach ($routemap->getRoutes() as $method => $routes) { - foreach (array_keys($routes) as $route) { - $this->set($route, $method, true, true); - } - } - - $this->store(); - } - - /** - * Removes stored permissions for a given route and method. - * - * @param String $route_id Route template - * @param String $method HTTP method - * @return bool - */ - public function remove($route_id, $method) - { - if (!isset($this->permissions[$route_id][$method])) { - return false; - } - - unset($this->permissions[$route_id][$method]); - - if (count($this->permissions[$route_id]) === 0) { - unset($this->permissions[$route_id]); - } - - return true; - } - - /** - * Convenience method for deactivating all routes in a route map. - * - * @param \RESTAPI\RouteMap $routemap RouteMap to activate - */ - public function deactivateRouteMap(RouteMap $routemap) - { - foreach ($routemap->getRoutes() as $method => $routes) { - foreach (array_keys($routes) as $route) { - $this->remove($route, $method); - } - } - - $this->store(); - } - - /** - * Loads permissions for passed consumer. - * - * @param String $consumer_id Id of the consumer in question - * @param bool $overwrite May values be overwritten - * @return ConsumerPermissions Returns instance of self to allow chaining - */ - protected function loadPermissions($consumer_id, $overwrite = false) - { - $query = "SELECT route_id, method, granted - FROM api_consumer_permissions - WHERE consumer_id = IFNULL(:consumer_id, 'global')"; - $statement = DBManager::get()->prepare($query); - $statement->bindValue(':consumer_id', $consumer_id); - $statement->execute(); - $permissions = $statement->fetchAll(PDO::FETCH_ASSOC); - - // Init with global permissions - foreach ($permissions as $permission) { - extract($permission); - - $this->set($route_id, $method, $granted, $overwrite); - } - - return $this; - } - - /** - * Checks if access to passed route via passed method is allowed for - * the current consumer. - * - * @param String $route Route template - * @param String $method HTTP method - * @return bool Indicates whether access is allowed - */ - public function check($route, $method) - { - $route_id = md5($route); - - return isset($this->permissions[$route_id][$method]) - && $this->permissions[$route_id][$method]; - } - - /** - * Stores the set permissions. - * - * @return bool Returns true if permissions were stored successfully - */ - public function store() - { - $result = true; - - $query = "INSERT INTO api_consumer_permissions (route_id, consumer_id, method, granted) - VALUES (:route, IFNULL(:consumer_id, 'global'), :method, :granted) - ON DUPLICATE KEY UPDATE granted = VALUES(granted)"; - $statement = DBManager::get()->prepare($query); - $statement->bindValue(':consumer_id', $this->consumer_id); - - foreach ($this->permissions as $route_id => $methods) { - $statement->bindParam(':route', $route_id); - foreach ($methods as $method => $granted) { - $statement->bindParam(':method', $method); - $granted = (int) !empty($granted); - $statement->bindParam(':granted', $granted); - $result = $result && $statement->execute(); - } - } - - return $result; - } -} diff --git a/lib/classes/restapi/Response.php b/lib/classes/restapi/Response.php deleted file mode 100644 index 56d9b653407270821f26120bbc5978be6305b181..0000000000000000000000000000000000000000 --- a/lib/classes/restapi/Response.php +++ /dev/null @@ -1,148 +0,0 @@ -<?php -namespace RESTAPI; - -/** - * Response class for the rest api - * - * @author <mlunzena@uos.de> - * @license GPL 2 or later - * @since Stud.IP 3.0 - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - */ -class Response implements \ArrayAccess -{ - public $body, $status, $headers; - - /** - * Constructor, sets vital information if provided. - * - * @param String $body Body contents of the response, optional, - * defaults to empty string - * @param int $status HTTP status code, optional, defaults to 200 - * @param Array $headers HTTP headers, optional, defaults to no headers - */ - public function __construct($body = '', $status = 200, $headers = []) - { - $this->body = $body; - $this->status = (int) $status; - $this->headers = (array) $headers; - } - - /** - * Detects whether the response status is of success type (HTTP status 2xx) - * - * @return bool True if status is of success type, false otherwise - */ - public function isSuccess() - { - return 200 <= $this->status && $this->status <= 299; - } - - /** - * Finishes the response with the given response renderer. - * - * @param Renderer\DefaultRenderer $content_renderer Used response renderer, - * only applied if body is - * not a callable closure - */ - public function finish($content_renderer) - { - if (!is_callable($this->body)) { - $content_renderer->render($this); - } - } - - /** - * Sends the response. - */ - public function output() - { - if (isset($this->status)) { - if (mb_strpos(PHP_SAPI, 'cgi') === 0) { - $this->sendHeader(sprintf('Status: %d %s', $this->status, $this->reason())); - } else { - $this->sendHeader(sprintf('HTTP/1.1 %d %s', $this->status, $this->reason())); - } - } - - foreach ($this->headers as $k => $v) { - $this->sendHeader("$k: $v", false, $this->status); - } - - if (is_callable($this->body)) { - call_user_func($this->body); - } else { - echo $this->body; - } - } - - /** - * Internally used function to actually send headers - * - * @param string the HTTP header - * @param bool optional; TRUE if previously sent header should be - * replaced - FALSE otherwise (default) - * @param integer optional; the HTTP response code - * - * @return void - */ - public function sendHeader($header, $replace = FALSE, $status = NULL) { - if (isset($status)) { - header($header, $replace, $status); - } - else { - header($header, $replace); - } - } - - /** - * Returns the reason phrase of this response according to RFC2616. - * - * @return string the reason phrase for this response's status - */ - public function reason() { - $reason = [ - 100 => 'Continue', 'Switching Protocols', - 200 => 'OK', 'Created', 'Accepted', 'Non-Authoritative Information', - 'No Content', 'Reset Content', 'Partial Content', - 300 => 'Multiple Choices', 'Moved Permanently', 'Found', 'See Other', - 'Not Modified', 'Use Proxy', '(Unused)', 'Temporary Redirect', - 400 => 'Bad Request', 'Unauthorized', 'Payment Required','Forbidden', - 'Not Found', 'Method Not Allowed', 'Not Acceptable', - 'Proxy Authentication Required', 'Request Timeout', 'Conflict', - 'Gone', 'Length Required', 'Precondition Failed', - 'Request Entity Too Large', 'Request-URI Too Long', - 'Unsupported Media Type', 'Requested Range Not Satisfiable', - 'Expectation Failed', - 500 => 'Internal Server Error', 'Not Implemented', 'Bad Gateway', - 'Service Unavailable', 'Gateway Timeout', - 'HTTP Version Not Supported']; - - return isset($reason[$this->status]) ? $reason[$this->status] : ''; - } - - // array access methods for headers - - public function offsetExists($offset): bool - { - return isset($this->headers[$offset]); - } - - /** - * @param $offset - */ - public function offsetGet($offset): mixed - { - return @$this->headers[$offset]; - } - - public function offsetSet($offset, $value): void - { - $this->headers[$offset] = $value; - } - - public function offsetUnset($offset): void - { - unset($this->headers[$offset]); - } -} diff --git a/lib/classes/restapi/RouteMap.php b/lib/classes/restapi/RouteMap.php deleted file mode 100644 index b8ad2f4df566d5e73c987400e259f7d024af9dbf..0000000000000000000000000000000000000000 --- a/lib/classes/restapi/RouteMap.php +++ /dev/null @@ -1,1060 +0,0 @@ -<?php -namespace RESTAPI; - -use Config; -use Request; -use gossi\docblock\Docblock; - -/** - * RouteMaps define and group routes to resources. - * - * Instances of RouteMaps are registered with the RESTAPI\Router to - * participate in the routing business. - * - * A RouteMap defines at least one handler method which has to be - * annotated with one of these annotations correlating to HTTP request - * methods: - * - * @code - * / * * - * * An example handler method - * * - * * @get /foo - * * @post /bar/:id - * * @put /baz/:id/:other_id - * * @delete / - * * / - * public function anyMethodName($id, $other_id = null) {} - * @endcode - * - * By default, all API routes are unaccessible for nobody users. - * To explicitly allow access for nobody users, add the allow_nobody - * tag to the handler method's doc block. Example: - * - * @code - * / * * - * * Another example handler method - * * - * * @get /foo - * * - * * @allow_nobody - * * / - * @endcode - * - * As soon as the Router matches a HTTP request to a handler defined - * in a RouteMap, it calls RouteMap::init to initialize it and - * especially the instance field `$this->response` of type - * RESTAPI\Response. You do not call RouteMap::init on your own. - * - * After the router has initialized this RouteMap, the router tries to - * call a method `before` of this signature: - * - * @code - * public function before(Router $router, Array $handler, Array $parameters); - * @endcode - * - * The parameter `$handler` is a callable (as in function is_callable) - * consisting of the instance of this RouteMap and the name of a - * method of this instance. You may change the values of this array to - * redirect to another handler. - * - * The parameter `$parameters` is an associative array whose keys - * correlate to the placeholders in the matched URI template. The - * values are the actual values of that placeholders in regard to the - * HTTP request. - * - * - * After calling RouteMap::before control is transfered to the actual - * handler method. The values of the placeholders in the URI template - * of the annotation are send as arguments to the handler. - * - * Example: We have got this handler method defined: - * - * @code - * / * * - * * @get /foo/:id/bar/:other_id - * * / - * public function fooHandler($id, $other_id) { - * } - * @endcode - * - * The router receives a request like this: `http://[..]/foo/1/bar/2` - * and matches it to our `fooHandler` which is then called something - * like that: - * - * @code - * $result = $routeMap->fooHandler(1, 2); - * @endcode - * - * In your handler methods you have to process the input and return - * some output data, which is then rendered in an appropriate way - * after negotiating the content format in the Router. - * - * Thus the return value of your handler method becomes the body of - * the HTTP response. - * - * - * The RouteMap class defines several methods to ease up your work - * with the HTTP specifica. - * - * The methods RouteMap::status, RouteMap::headers and RouteMap::body - * correlate to the components of a HTTP response. - * - * There are helpers for returning paginated collections, see - * RouteMap::paginated. - * - * If you encounter an error or have to stop further processing, see - * methods RouteMap::halt, RouteMap::error and RouteMap::notFound. - * - * These methods are \a DISRUPTIVE as they immediately stop the control - * flow in your handler: - * - * @code - * public function fooHandler($id) - * { - * // do something - * - * $this->halt(); - * - * // this line will never be reached - * } - * @endcode - * - * If you want to simply send a redirection response (HTTP status code - * of 302 or 303), you may find calling RouteMap::redirect helpful. - * - * To generate a URL to a handler, use RouteMap::url - * - * When you find the need to return the content of a file, please see - * RouteMap::sendFile which will help you with streaming it to the - * client. For custom streaming just return a Closure from your - * handler method. - * - * There are several other methods which you may find useful each - * matching a HTTP header: - * - * - RouteMap::contentType - * - RouteMap::etag - * - RouteMap::expires - * - RouteMap::cacheControl - * - RouteMap::lastModified - * - * You can access the data sent in the body of the current HTTP - * request using the `$this->data` instance variable. - * - * - If the request was of Content-Type `application/json`, the - * body of the request is decoded using `json_decode`. - * - If the request was of Content-Type - * `application/x-www-form-urlencoded`, the body of the request is - * decoded using `parse_str`. - * - Otherwise the request will not be parsed and `$this->data` will - * just contain the raw string. - * - * NOTE: The result of the described parsing will always contain - * strings encoded in windows-1252. If the original body - * was UTF-8 encoded, it is automatically re-encoded to windows-1252. - * - * @author Jan-Hendrik Willms <tleilax+studip@gmail.com> - * @author <mlunzena@uos.de> - * @license GPL 2 or later - * @since Stud.IP 3.0 - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - */ -abstract class RouteMap -{ - protected $router; - protected $route; - protected $data = null; - protected $response; - - /** - * Internal property which is used by RouteMap::paginated and - * contains everything about a paginated collection. - */ - protected $pagination = false; - - /** - * The offset into a RouteMap::paginated collection as requested - * by the client. - */ - protected $offset; - - /** - * The limit of a RouteMap::paginated collection as requested - * by the client. - */ - protected $limit; - - /** - * Constructor of the route map. Initializes neccessary offset and limit - * parameters for pagination. - */ - public function __construct() - { - $this->offset = Request::int('offset', 0); - $this->limit = Request::int('limit', Config::get()->ENTRIES_PER_PAGE); - } - - /** - * Initializes the route map by binding it to a router and passing in - * the current route. - * - * @param Router $router Router to bind this route map to - * @param array $route The matched route out of Router::matchRoute; - * an array with keys 'handler', 'conditions' and - * 'source' - */ - public function init($router, $route) - { - $this->router = $router; - $this->route = $route; - $this->response = new Response(); - - if ($mediaType = $this->getRequestMediaType()) { - $this->data = $this->parseRequestBody($mediaType); - } - } - - /** - * Marks this chunk of data as a slice of a larger data set with - * a sum of "total" entries. - * - * @param mixed $data Chunk of data (should be sliced according - * to current offset and limit parameters). - * @param int $total The total number of data entries in the - * according set. - * @param array $uri_params Neccessary parameters when generating uris - * for the current route. - * @param array $query_params Optional query parameters. - */ - public function paginated($data, $total, $uri_params = [], $query_params = []) - { - $uri = $this->url($this->route['uri_template']->inject($uri_params), $query_params); - - $this->paginate($uri, $total); - return $this->collect($data); - } - - - /** - * Low level method for paginating collections. You better use - * RouteMap::paginated instead of this. - * - * Set the pagination data used by the RouteMap::collect. - * - * @param String $uri_format - * @param int $total - * @param mixed $offset - * @param mixed $limit - * - * @return Routemap Returns instance of self to allow chaining - */ - public function paginate($uri_format, $total, $offset = null, $limit = null) - { - $total = (int)$total; - $offset = (int)($offset ?: $this->offset ?: 0); - $limit = (int)($limit ?: $this->limit); - - $this->pagination = compact('uri_format', 'total', 'offset', 'limit'); - - return $this; - } - - /** - * Low level method for paginating collections. You better use - * RouteMap::paginated instead of this. - * - * Adjusts the result set to return a collection. A collection consists - * of the passed data array and the associated pagination information - * if available. - * - * Be aware that the passed data has to be already sliced according to - * the pagination information. - * - * @param array $data Actual dataset - * @return array Collection "object" - */ - public function collect($data) - { - $collection = [ - 'collection' => $data - ]; - if (is_array($this->pagination)) { - extract($this->pagination); - - $offset = $offset - $offset % $limit; - $max = ($total % $limit) - ? $total - $total % $limit - : $total - $limit; - - $pagination = compact('total', 'offset', 'limit'); - if ($total > $limit) { - $links = []; - - foreach ([ - 'first' => 0, - 'previous' => max(0, $offset - $limit), - 'next' => min($max, $offset + $limit), - 'last' => $max] - as $key => $offset) - { - $links[$key] = \URLHelper::getURL($uri_format, compact('offset', 'limit')); - } - - $pagination['links'] = $links; - } - $collection['pagination'] = $pagination; - } - return $collection; - } - - /************************/ - /* REQUEST BODY METHODS */ - /************************/ - - // find the requested media type - private function getRequestMediaType() - { - if (!empty($_SERVER['CONTENT_TYPE'])) { - $contentTypeParts = preg_split('/\s*[;,]\s*/', $_SERVER['CONTENT_TYPE']); - return mb_strtolower($contentTypeParts[0]); - } - } - - // media-types that we know how to process - private static $mediaTypes = [ - 'application/json' => 'parseJson', - 'application/x-www-form-urlencoded' => 'parseFormEncoded', - 'multipart/form-data' => 'parseMultipartFormdata' - ]; - - // cache the request body - private static $_request_body; - - // reads the HTTP request body - private function parseRequestBody($mediaType) - { - // read it only once - if (!isset(self::$_request_body)) { - self::$_request_body = file_get_contents('php://input'); - } - - if (isset(self::$mediaTypes[$mediaType])) { - $result = call_user_func([__CLASS__, self::$mediaTypes[$mediaType]], self::$_request_body); - if ($result) { - return $result; - } - } - return self::$_request_body; - } - - // strategy to decode JSON strings - private static function parseJson($input) - { - return json_decode($input, true); - } - - // strategy to decode form encoded strings - private static function parseFormEncoded($input) - { - parse_str($input, $result); - return $result; - } - - // strategy to decode a multipart message. Used for file-uploads. - private static function parseMultipartFormdata($input) - { - - $data = []; - if (Request::isPost()) { - foreach ($_POST as $key => $value) { - $data[$key] = $value; - } - $data['_FILES'] = $_FILES; - return $data; - } - $boundary = self::getMultipartBoundary(); - if (!$boundary) { - return $data; - } - $input = explode("--".$boundary, $input); - - array_pop($input); - array_shift($input); - - foreach ($input as $part) { - $part = ltrim($part, "\r\n"); - [$head, $body] = explode("\r\n\r\n", $part, 2); - - $tmpheaders = $headers = []; - foreach (explode("\r\n", $head) as $headline) { - if (preg_match('/^[^\s]/', $headline)) { - $lineIsHeader = preg_match('/([^:]+):\s*(.*)$/', $headline, $matches); - if ($lineIsHeader) { - $tmpheaders[] = ['index' => mb_strtolower(trim($matches[1])), 'value' => trim($matches[2])]; - } - } else { - //noch zur letzten Zeile hinzuzählen - end($tmpheaders); - $lastkey = key($tmpheaders); - $tmpheaders[$lastkey]['value'] .= " ".mb_substr($headline, 1); - } - } - foreach ($tmpheaders as $header) { - $headers[$header['index']] = $header['value']; - } - - $contentType = ""; - if (isset($headers['content-type'])) { - preg_match("/^([^;\s]*)/", $headers['content-type'], $matches); - $contentType = mb_strtolower($matches[1]); - } - switch ($headers["transfer-encoding"]) { - case "quoted-printable": - $body = quoted_printable_decode($body); - break; - case "base64": - $body = base64_decode(preg_replace("/(\r?\n|\r)/", "", trim($body))); - break; - case "7bit": - case "8bit": - default: - //nothing to do - } - $matches = []; - preg_match("/name=([^;\s]*)/i", $headers['content-disposition'], $matches); - $name = str_replace(["'", '"'], '', $matches[1]); - if (!$contentType) { - $data[$name] = mb_substr($body, 0, mb_strlen($body) - 2); - } else { - switch ($contentType) { - case 'application/json': - $data = array_merge($data, self::parseJson($body)); - break; - case 'application/x-www-form-urlencoded': - $data = array_merge($data, self::parseFormEncoded($body)); - break; - default: - $matches = []; - preg_match("/filename=([^;\s]*)/i", $headers['content-disposition'], $matches); - if (!$matches[1]) { - preg_match('/filename=([^;\s]*)/i', $headers['content-type'], $matches); - } - $filename = str_replace(["'", '"'], '', $matches[1]); - $tmp_name = $GLOBALS['TMP_PATH']."/uploadfile_".md5(uniqid()); - $handle = fopen($tmp_name, 'wb'); - $filesize = fwrite($handle, $body, (mb_strlen($body) - 2)); - fclose($handle); - $data['_FILES'][$name] = [ - 'name' => $filename, - 'type' => $contentType, - 'tmp_name' => $tmp_name, - 'size' => $filesize - ]; - } - } - } - return $data; - } - - private static function getMultipartBoundary() - { - if ($contentType = $_SERVER['CONTENT_TYPE']) { - foreach (preg_split('/\s*[;,]\s*/', $contentType) as $part) { - if (mb_strtolower(mb_substr($part, 0, 8)) === "boundary") { - $part = explode("=", $part); - return $part[1]; - } - } - } - return null; - } - - - /** - * Set the HTTP status of the current response. - * - * @param integer $status the HTTP status of the response - */ - public function status($status) - { - $this->response->status = $status; - } - - /** - * Set multiple response headers of the current response by - * merging them with already set ones. - * - * @code - * $routemap->headers(array('X-example' => "yep")); - * @endcode - * - * @param array $headers the headers to set - * - * @return array the headers of the current response - */ - public function headers($headers = []) - { - if (sizeof($headers)) { - $this->response->headers = array_merge($this->response->headers, $headers); - } - return $this->response->headers; - } - - /** - * Set the HTTP body of the current response. - * - * @param string $body the body to send back - */ - public function body($body) - { - $this->response->body = $body; - } - - - /** - * Set the Content-Type of the HTTP response given a mime type and - * optionally further parameters as discusses in RFC 2616 14.17. - * - * If no charset is given, it defaults to Stud.IP's 'windows-1252'. - * - * Examples: - * - * @code - * // results in "Content-Type: image/gif" - * $this->contentType('image/gif); - * - * // results in "Content-Type: text/html;charset=ISO-8859-4" - * $this->contentType('text/html;charset=ISO-8859-4'); - * - * // results in "Content-Type: text/html;charset=ISO-8859-4" - * $this->contentType('text/html', array('charset' => 'ISO-8859-4')); - * - * // results in "Content-type: multipart/byteranges; boundary=THIS_STRING_SEPARATES" - * $this->contentType('multipart/byteranges', array('boundary' => 'THIS_STRING_SEPARATES')); - * - * @endcode - * - * @param string $mime_type a string describing a MIME type like 'application/json' - * @param array $params optional parameters as described above - */ - public function contentType($mime_type, $params = []) - { - if (!isset($params['charset'])) { - $params['charset'] = 'utf-8'; - } - - if (mb_strpos($mime_type, 'charset') !== FALSE) { - unset($params['charset']); - } - - if (sizeof($params)) { - $mime_type .= mb_strpos($mime_type, ';') !== FALSE ? ', ' : ';'; - $ps = []; - foreach ($params as $k => $v) { - $ps[] = $k . '=' . $v; - } - $mime_type .= join(', ', $ps); - } - - $this->response['Content-Type'] = $mime_type; - } - - /** - * (Nice) sugar for calling RouteMap::halt and therefore - * as \a DISRUPTIVE. Code after calling RouteMap::error will not - * be evaluated. - * - * @see RouteMap::halt - * - * @param integer $status a number indicating the HTTP status - * code; probably something 4xx or 5xx-ish - * @param string $body optional; the body of the HTTP response - * - */ - public function error($status, $body = null) - { - $this->halt($status, [], $body); - } - - - /** - * Sets the HTTP response's Etag header and halts, if the incoming - * HTTP request was a matching conditional GET using an - * 'If-None-Match' header. Thus it is a possibly \a DISRUPTIVE - * method as it will stop evaluation in that case and send a '304 - * Not Modified'. - * - * Detail: If the request contains an If-Match or If-None-Match - * header set to `*`, a RouteMap assumes a match on safe - * (e.g. GET) and idempotent (e.g. PUT) requests. (In those cases - * it thinks that the resource already exists and therefore - * matches a wildcard.). This can be changed by passing an - * appropriate value for the `$new_resource` parameter. - - * Details of this can be found in RFC 2616 14.24 and 14.26 - * - * @param string $value an identifier uniquely identifying the - * current state of a resource - * @param bool $strong_etag optional; indicates whether the etag - * is a weak or strong (which is the - * default) cache validator. Have a look - * at the RFC for details. - * @param bool $new_resource optional; a way to tell the RouteMap - * that this is a new or existing - * resource. See above. - */ - - public function etag($value, $strong_etag = true, $new_resource = null) - { - // Before touching this code, please double check RFC 2616 - // 14.24 and 14.26. - - if (!isset($new_resource)) { - $new_resource = Request::isPost(); - } - - $value = '"' . $value . '"'; - if (!$strong_etag) { - $value = 'W/' . $value; - } - $this->response['ETag'] = $value; - - if ($this->response->isSuccess() || $this->response->status === 304) { - if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && $this->etagMatches($_SERVER['HTTP_IF_NONE_MATCH'], $new_resource)) { - $this->halt($this->isRequestSafe() ? 304 : 412); - } - if (isset($_SERVER['HTTP_IF_MATCH']) - && !$this->etagMatches($_SERVER['HTTP_IF_MATCH'], $new_resource)) { - $this->halt(412); - } - } - } - - // Helper method checking if a ETag value list includes the current ETag. - private function etagMatches($list, $new_resource) - { - if ($list === '*') { - return !$new_resource; - } - - return in_array($this->response['ETag'], - preg_split('/\s*,\s*/', $list)); - } - - // Helper method checking if the request is safe - private function isRequestSafe() - { - $method = Request::method(); - return $method === 'GET' or $method === 'HEAD' or $method === 'OPTIONS' or $method === 'TRACE'; - } - - /** - * This sets the `Expires` header and the `Cache-Control` - * directive `max-age`. - * - * Amount is an integer number of seconds in the future indicating - * when the response should be considered "stale". The - * `$cache_control` parameter is passed to RouteMap#cacheControl - * along with the automatically generated `max_age` directive. - * - * @param int $amount an integer specifying the number of seconds - * this resource will go stale. - * @param array $cache_control optional; more directives for - * RouteMap::cacheControl which is always - * automatically called using the computed max_age - */ - public function expires($amount, $cache_control = []) - { - $time = time() + $amount; - $max_age = $amount; - - $cache_control[] = "max-age=$max_age"; - $this->cacheControl($cache_control); - - $this->response['Expires'] = $this->httpDate($time); - } - - /** - * This sets the Cache-Control header of the HTTP response. - * - * Example: - * - * @code - * $this->cacheControl(array('public', 'must-revalidate')); - * @endcode - * - * @param array $values an array containing Cache-Control - * directives. - */ - public function cacheControl($values) - { - if (is_array($values) && sizeof($values)) { - $this->response['Cache-Control'] = join(', ', $values); - } - } - - /** - * This very important method stops further execution of your - * code. You may specify a status code, headers and the body of - * the resulting response. As the name implies, this method is \a - * DISRUPTIVE and will not return. - * - * @code - * // stops any further code of a route - * $this->halt(); - * - * // you may specify an HTTP status - * $this->halt(409): - * - * // you may specify the HTTP response's body - * $this->halt('my ethereal body') - * - * // or even both - * $this->halt(100, 'Yes, pleazze!') - * - * // giving headers - * $this->halt(417, array('Content-Type' => 'x-not-a-cat'), 'Cats only!') - * @endcode - * - * This method is called by every single \a DISRUPTIVE method. - * - * @param integer $status optional; the response's status code - * @param array $headers optional; (additional) header lines - * which get merged with already set headers - * @param string $body optional; the response's body - */ - public function halt(/* [status], [headers], [body] */) - { - $args = func_get_args(); - $result = []; - - $constraints = [ - 'status' => 'is_int', - 'headers' => 'is_array', - 'body' => function ($i) { return isset($i); } // #existy - ]; - foreach ($constraints as $state => $constraint) { - if ($constraint(current($args))) { - call_user_func([$this, $state], array_shift($args)); - } - } - - throw new RouterHalt($this->response); - } - - /** - * This method sets the Last-Modified header of the HTTP response - * and halts on matching conditional GET requests. Thus this - * method is \a DISRUPTIVE in certain circumstances. - * - * You have to give an integer typed timestamp (in seconds since - * epoch) to specify the data of the last modification to the - * requested resource. - * - * If the current HTTP request contains an `If-Modified-Since` - * header, its value is compared to the specified `$time` - * parameter. Unless the header's value is sooner than the given - * `$time`, further execution is precluded and the RouteMap - * returns with a '304 Not Modified'. - * - * @param integer $time a timestamp described in seconds since epoch - */ - public function lastModified($time) - { - - $this->response['Last-Modified'] = $this->httpDate($time); - - if (isset($_SERVER['HTTP_IF_NONE_MATCH'])) { - return; - } - - if ($this->response->status === 200 - && isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) { - // compare based on seconds since epoch - $since = $this->httpdate($_SERVER['HTTP_IF_MODIFIED_SINCE']); - if ($since >= (int) $time) { - $this->halt(304); - } - } - - if (($this->response->isSuccess() || $this->response->status === 412) - && isset($_SERVER['HTTP_IF_UNMODIFIED_SINCE'])) { - - // compare based on seconds since epoch - $since = $this->httpdate($_SERVER['HTTP_IF_UNMODIFIED_SINCE']); - - if ($since < (int) $time) { - $this->halt(412); - } - } - } - - private function httpDate($timestamp) - { - return gmdate('D, d M Y H:i:s \G\M\T', (int) $timestamp); - } - - /** - * Halts execution and returns a '404 Not Found' response. - * - * Sugar for calling RouteMap::error(404) and therefore - * \a DISRUPTIVE. Code after calling RouteMap::notFound will - * not be evaluated. - * - * @see RouteMap::error - * @see RouteMap::halt - * - * @param string $body optional; the body of the HTTP response - */ - public function notFound($body = null) - { - $this->halt(404, $body); - } - - /** - * Stops your code and redirects to the URL provided. This method - * is \a DISRUPTIVE like RouteMap#halt - * - * In addition to the URL you may provide the status code, - * (additional) headers and a request body as you would when - * calling RouteMap#halt. - * - * @code - * $this->redirect('/foo', 201, array('X-Some-Header' => 1234), 'and even a body'); - * @endcode - * - * @see RouteMap::halt - * - * @param string $url the URL to redirect to; it will be filtered - * using RouteMap#url, so you may call it with - * those nice and small strings used in the - * annotations - * @param mixed $args optional; any combinations of the three - * parameters as in RouteMap::halt - */ - public function redirect($url, $args = null) - { - $this->status($_SERVER["SERVER_PROTOCOL"] === 'HTTP/1.1' && !Request::isGet() ? 303 : 302); - $this->response['Location'] = $this->url($url); - - $args = array_slice(func_get_args(), 1); - call_user_func_array([$this, 'halt'], $args); - } - - - /** - * Stops execution of your code and starts sending the specified - * file. This method is \a DISRUPTIVE. - * - * Using the `$opts` parameter you may specify the file's mime - * content type, sending an appropriate 'Content-Type' header, and - * you may specify the 'Content-Disposition' of the file transfer. - * - * Example: - * - * @code - * $this->sendFile('/tmp/c29tZSB0ZXh0', array( - * 'type' => 'image/png', - * 'disposition' => 'inline', - * 'filename' => 'cutecats.png')); - * @endcode - * - * @param string $_path the filesystem path to the file to send - * @param array $opts optional; specify the content type, - * disposition and filename - */ - public function sendFile($_path, $opts = []) - { - $path = realpath($_path); - - if (!file_exists($path)) { - $this->notFound('File to send does not exist'); - } - - if (isset($opts['type'])) { - $this->contentType($opts['type']); - } else if (!isset($this->response['Content-Type'])) { - $this->contentType(get_mime_type($path)); - } - - if ($opts['disposition'] === 'attachment' || isset($opts['filename'])) { - $this->response['Content-Disposition'] = 'attachment; '; - $filename = $opts['filename'] ?: $path; - $this->response['Content-Disposition'] .= encode_header_parameter('filename', basename($filename)); - } - - elseif ($opts['disposition'] === 'inline') { - $this->response['Content-Disposition'] = 'inline'; - } - - // TODO add HTTP 'Range' support - - $size = filesize($path); - $this->response['Content-Length'] = $size; - - // End all potential output buffers - while (ob_get_level() > 0) { - ob_end_clean(); - } - - // Send file - $this->halt(200, $this->response->headers, function () use ($path) { - readfile($path); - }); - } - - - /** - * Generate a URL to a given handler using a URL fragment and URL - * parameters. - * - * Example: - * @code - * // result in something like "/some/path/api.php/course/123/members?status=student" - * $this->url('course/123/members', array('status' => 'student')); - * @endcode - * - * @param string $addr a URL fragment to a handler - * @param array $url_params optional; URL parameters to add to - * the generated URL - * - * @return string the resulting URL - */ - public function url($addr, $url_params = null) - { - $addr = ltrim($addr, '/'); - return \URLHelper::getURL("api.php/$addr", $url_params, true); - } - - /** - * A `vsprintf` like variant to the RouteMap::url method. - * - * Example: - * @code - * // results in "[...]/api.php/foo/some_id?status=student" - * $this->urlf("foo/%s", array("some_id"), array('status' => 'student')); - * @endcode - * - * @param string $addr_f a URL fragment to a handler - * containing sprintf-ish format sequences - * @param array $format_params values to fill into the format markers - * @param array $url_params optional; URL parameters to add to - * the generated URL - * - * @return string the resulting URL - */ - - public function urlf($addr_f, $format_params, $url_params = null) - { - if (!is_array($format_params)) { - $format_params = [$format_params]; - } - return $this->url(vsprintf($addr_f, $format_params), $url_params); - } - - /** - * Returns a list of all the routes this routemap provides. - * - * @param string $http_method Return only the routes for this specific - * http method (optional) - * - * @return array of all routes grouped by method - */ - public function getRoutes($http_method = null) - { - $ref = new \ReflectionClass($this); - - if ($ref->getDocComment()) { - $docblock = new Docblock($ref); - $class_conditions = $this->extractConditions($docblock); - } else { - $class_conditions = []; - } - - - // Create result array by creating an associative array from all - // supported methods as keys - $routes = array_fill_keys(Router::getSupportedMethods(), []); - - // Restrict routes to given http method (if given) - if ($http_method !== null) { - $routes = [$http_method => []]; - } - - // Iterate through all methods of the routemap - foreach ($ref->getMethods( \ReflectionMethod::IS_PUBLIC) as $ref_method) { - // No docblock? Not an api route! - if (!$ref_method->getDocComment()) { - continue; - } - - // Parse docblock - $docblock = new Docblock($ref_method); - - // No docblock tags? Not an api route! - if ($docblock->getTags()->isEmpty()) { - continue; - } - - // Any specific condition to consider? - $conditions = $this->extractConditions($docblock, $class_conditions); - - // Iterate through all possible methods in order to identify - // any according docblock tags - $allow_nobody = $docblock->hasTag('allow_nobody'); - foreach (array_keys($routes) as $http_method) { - if (!$docblock->hasTag($http_method)) { - //The tag for the current HTTP method cannot be found - //in the route's DocBlock tags. - continue; - } - - // Route all defined method and uri template combinations to - // the according methods of the object. - foreach ($docblock->getTags($http_method) as $tag) { - $uri_template = trim($tag->getDescription()); - $routes[$http_method][$uri_template] = [ - 'handler' => [$this, $ref_method->name], - 'conditions' => $conditions, - 'description' => trim($docblock->getShortDescription()) ?: false, - 'allow_nobody' => $allow_nobody - ]; - } - } - } - - // Return all routes grouped or just the routes for the wanted method - return func_num_args() === 1 - ? reset($routes) - : $routes; - } - - /** - * Extracts defined conditions from a given docblock. - * - * @param Docblock $docblock DocBlock to examine - * @param array $conditions Optional array of already defined - * conditions to extend - * @return array of all extracted conditions with the variable name - * as key and pattern to match as value - */ - protected function extractConditions($docblock, $conditions = []) - { - foreach ($docblock->getTags('condition') as $condition) { - [$var, $pattern] = explode(' ', $condition->getDescription(), 2); - $conditions[$var] = $pattern; - } - - return $conditions; - } - - /** - * Returns the response object - * @return Response - */ - public function getResponse(): Response - { - return $this->response; - } -} diff --git a/lib/classes/restapi/Router.php b/lib/classes/restapi/Router.php deleted file mode 100644 index df7a6b92d4238aa5af52621744d9c24e0433158b..0000000000000000000000000000000000000000 --- a/lib/classes/restapi/Router.php +++ /dev/null @@ -1,665 +0,0 @@ -<?php -/** @namespace RESTAPI - * - * Im Namensraum RESTAPI sind alle Klassen und Funktionen versammelt, - * die für die RESTful Web Services von Stud.IP benötigt werden. - */ -namespace RESTAPI; -use RESTAPI\Renderer\DefaultRenderer; - -/** - * Die Aufgabe des Routers ist das Anlegen und Auswerten eines - * Mappings von sogenannten Routen (Tupel aus HTTP-Methode und Pfad) - * auf Code. - * - * Dazu werden zunächst Routen mittels der Funktion - * Router::registerRoutes registriert. - * - * Wenn dann ein HTTP-Request eingeht, kann mithilfe von - * Router::dispatch und HTTP-Methode bzw. Pfad der zugehörige Code - * gefunden und ausgeführt werden. Der Router bildet aus dem - * Rückgabewert des Codes ein Response-Objekt, das er als Ergebnis - * zurück meldet. - * - * @code - * $router = Router::getInstance(); - * - * // register a sample Route - * $router->registerRoutes(new ExampleRoute); - * - * // dispatch to therein defined Routes - * $response = $router->dispatch('/example', 'GET'); - * - * // render response - * $response->output(); - * - * @endcode - * - * @author Jan-Hendrik Willms <tleilax+studip@gmail.com> - * @author <mlunzena@uos.de> - * @license GPL 2 or later - * @see Inspired by http://blog.sosedoff.com/2009/07/04/simpe-php-url-routing-controller/ - * @since Stud.IP 3.0 - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - */ -class Router -{ - // instances are cached here - protected static $instances = []; - - /** - * Holds the user object of the user that is accessing the API. - * This is null for nobody users. - */ - protected $user = null; - - /** - * Returns (and if neccessary, initializes) a (cached) router object for an - * optional consumer id. - * - * @param mixed $consumer_id ID of the consumer (defaults to 'global') - * - * @return Router returns the Router instance associated to the - * consumer ID (or to the 'global' ID) - */ - public static function getInstance($consumer_id = null) - { - $consumer_id = $consumer_id ?: 'global'; - - if (!isset(self::$instances[$consumer_id])) { - self::$instances[$consumer_id] = new self($consumer_id); - } - return self::$instances[$consumer_id]; - } - - // All supported method need to be defined here - protected static $supported_methods = [ - 'get', 'post', 'put', 'delete', 'patch', 'options', 'head' - ]; - - /** - * Returns a list of all supported methods. - * - * @return array of methods as strings - */ - public static function getSupportedMethods() - { - return self::$supported_methods; - } - - // registered routes by method and uri template - protected $routes = []; - - // registered content renderers - protected $renderers = []; - - // identified or forced content renderer - protected $content_renderer = false; - - // default renderer - protected $default_renderer = false; - - // registered conditions - protected $conditions = []; - - // registered descriptions - protected $descriptions = []; - - // registered consumers - protected $consumers = []; - - // associated permissions - protected $permissions = false; - - /** - * Constructs the router. - * - * @param mixed $consumer_id the ID of the consumer this router - * should associate to - */ - protected function __construct($consumer_id) - { - $this->permissions = ConsumerPermissions::get($consumer_id); - $this->registerRenderer(new Renderer\DefaultRenderer); - } - - /** - * Registers a handler for a specific combination of request method - * and uri template. - * - * @param String $request_method expected HTTP request method - * @param String $uri_template expected URI template, for - * example: \code "/user/:user_id/events" \endcode - * @param Array $handler request handler array: - * \code array($object, "methodName") \endcode - * @param Array $conditions (optional) an associative - * array using the name of - * parameters as keys and regexps - * as value - * @param string $source (optional) this denotes the - * origin of a route. Usually - * either 'core' or 'plugin', but - * defaults to 'unknown'. - * @param bool $allow_nobody Whether the route can be accessed - * as nobody user (true) or not (false). - * Defaults to false. - * - * @return Router returns itself to allow chaining - * @throws \Exception if passed HTTP request method is not supported - */ - public function register($request_method, $uri_template, $handler, $conditions = [], $source = 'unknown', $allow_nobody = false) - { - // Normalize method and test whether it's supported - $request_method = mb_strtolower($request_method); - if (!in_array($request_method, self::$supported_methods)) { - throw new \Exception('Method "' . $request_method . '" is not supported.'); - } - - // Initialize routes storage for this method if neccessary - if (!isset($this->routes[$request_method])) { - $this->routes[$request_method] = []; - } - - // Normalize uri template (always starts with a slash) - if ($uri_template[0] !== '/') { - $uri_template = '/' . $uri_template; - } - - // Sanitize conditions - foreach ($conditions as $var => $pattern) { - if ($pattern[0] !== $pattern[mb_strlen($pattern) - 1] || ctype_alnum($pattern[0])) { - $conditions[$var] = '/' . $pattern . '/'; - } - } - - $this->routes[$request_method][$uri_template] = compact( - 'handler', 'conditions', 'source', 'allow_nobody' - ); - - // Return instance to allow chaining - return $this; - } - - /** - * Registers the routes defined in a RouteMap instance using - * docblock annotations (like @get) of its methods. - * - * \code - * $router = \RESTAPI\Router::getInstance(); - * - * $router->registerRoutes(new ExampleRouteMap()); - * \endcode - * - * @param RouteMap $map the RouteMap instance to register - * - * @return Router returns itself to allow chaining - */ - public function registerRoutes(RouteMap $map) - { - // Investigate object, define whether it's located in the core system - // or a plugin, respect any defined class conditions and iterate - // through it's methods to find any defined route - $ref = new \ReflectionClass($map); - $filename = $ref->getFilename(); - $source = mb_strpos($filename, 'plugins_packages') !== false - ? 'plugin' - : 'core'; - - foreach (self::$supported_methods as $http_method) { - foreach ($map->getRoutes($http_method) as $uri_template => $data) { - // Register (and describe) route - $this->register( - $http_method, $uri_template, - $data['handler'], $data['conditions'], - $source, - $data['allow_nobody'] - ); - if ($data['description']) { - $this->describe( - $uri_template, - $data['description'], - $http_method - ); - } - } - } - - return $this; - } - - /** - * Describe one or more routes. - * - * \code - * $router = \RESTAPI\Router::getInstance(); - * - * // describe a single route - * $router->describe('/foo', 'returns everything about foo', 'get'); - * - * // describe several routes that use the same path - * $router->describe('/foo', array( - * 'get' => 'returns everything about foo', - * 'put' => 'updates all of foo', - * 'delete' => 'empty up foo' - * )); - * - * // describe several routes - * $router->describe(array( - * '/foo' => array( - * 'get' => 'returns everything about foo', - * 'put' => 'updates all of foo', - * 'delete' => 'empty up foo'), - * '/bar' => array(...), - * )); - * \endcode - * - * @param String|Array $uri_template URI template to describe or pass an - * array to describe multiple routes. - * @param String|null $description description of the route - * @param String $method method to describe. - * - * @return Router returns instance of itself to allow chaining - */ - public function describe($uri_template, $description = null, $method = 'get') - { - // describe multiple routes at once - if (func_num_args() === 1 && is_array($uri_template)) { - foreach ($uri_template as $template => $description) { - $this->describe($template, $description); - } - } - - // describe routes that use the same URI template - elseif (func_num_args() === 2 && is_array($description)) { - foreach ($description as $method => $desc) { - $this->describe($uri_template, $desc, $method); - } - } - - // describe a single route - else { - if (!isset($this->descriptions[$uri_template])) { - $this->descriptions[$uri_template] = []; - } - if (isset($this->routes[$method][$uri_template])) { - $this->descriptions[$uri_template][$method] = $description; - } else { - // Try to find route with different method - foreach ($this->routes as $m => $templates) { - if (isset($templates[$uri_template])) { - $this->descriptions[$uri_template][$m] = $description; - break; - } - } - } - } - return $this; - } - - /** - * Get list of registered routes - optionally with their descriptions. - * - * @param bool $describe (optional) include descriptions, - * defaults to `false` - * @param bool $check_access (optional) only show methods this router's - * consumer is authorized to, - * defaults to `true` - * - * @return array list of registered routes - */ - public function getRoutes($describe = false, $check_access = true) - { - $this->setupRoutes(); - - $result = []; - foreach ($this->routes as $method => $routes) { - foreach ($routes as $uri => $route) { - if ($check_access && !$this->permissions->check($uri, $method)) { - continue; - } - if (!isset($result[$uri])) { - $result[$uri] = []; - } - if ($describe) { - $result[$uri][$method] = [ - 'description' => $this->descriptions[$uri][$method] ?? null, - 'source' => $route['source'] ?? 'unknown', - ]; - } else { - $result[$uri][] = $method; - } - } - } - ksort($result); - if ($describe) { - $result = array_map(function ($item) { - ksort($item); - return $item; - }, $result); - } - return $result; - } - - /** - * Dispatches an URI across the defined routes and produces a - * Response object which may then be send back (using #output). - * - * @param mixed $uri URI to dispatch (defaults to `$_SERVER['PATH_INFO']`) - * @param String $method Request method (defaults to the method - * of the actual HTTP request or "GET") - * - * @return Response a Response object containing status, headers - * and body - * @throws RouterException may throw such an exception if there - * is no matching route (404) or if there - * is one, but the consumer is not - * authorized to it (403) - */ - public function dispatch($uri = null, $method = null) - { - $this->setupRoutes(); - - $uri = $this->normalizeDispatchURI($uri); - $method = $this->normalizeRequestMethod($method); - - $content_renderer = $this->negotiateContent($uri); - - $match_result = $this->matchRoute($uri, $method, $content_renderer); - $route = $match_result[0]; - $parameters = $match_result[1]; - $allow_nobody = $match_result[2] ?? false; - if (!$route) { - //No route found for the combination of URI and method. - //We return the allowed methods for the route in the HTTP header: - $methods = $this->getMethodsForUri($uri); - if (count($methods) > 0) { - header('Allow: ' . implode(', ', $methods)); - throw new RouterException(405); - } else { - //Route not found. - throw new RouterException(404); - } - } - //At this point, a route is found. - //We need to check if it can be used as nobody user or not. - if (!$route['allow_nobody'] && !$this->user) { - //Nobody users aren't allowed for this route. - throw new RouterException(401, 'Unauthorized (no consumer)'); - } - - try { - $response = $this->execute($route, $parameters); - } catch (RouterHalt $halt) { - $response = $halt->response; - } - - $response->finish($content_renderer); - - return $response; - } - - /** - * Searches and registers available routes. - */ - private function setupRoutes() - { - // A bit ugly, I confess - static $was_setup = false; - if ($was_setup) { - return; - } - $was_setup = true; - - // Register default routes - $routes = [ - 'Activity', - 'Blubber', - 'Clipboard', - 'Contacts', - 'Course', - 'Discovery', - 'Events', - 'Feedback', - 'FileSystem', - 'Forum', - 'Messages', - 'News', - 'ResourceBooking', - 'Resources', - 'ResourceCategories', - 'ResourcePermissions', - 'ResourceProperties', - 'ResourceRequest', - 'RoomClipboard', - 'Schedule', - 'Semester', - 'Studip', - 'User', - 'UserConfig', - 'Wiki' - ]; - - foreach ($routes as $route) { - require_once "app/routes/$route.php"; - $class = "\\RESTAPI\\Routes\\$route"; - $this->registerRoutes(new $class); - } - - // Register plugin routes - $router = $this; - $routes = array_flatten(\PluginEngine::sendMessage('RESTAPIPlugin', 'getRouteMaps')); - array_walk( - $routes, - function ($route) use ($router) { - $router->registerRoutes($route); - } - ); - } - - /** - * Takes a route and the parameters out of the requested path and - * executes the handler of the route. - * - * @param array $route the matched route out of - * Router::matchRoute; an array with keys - * 'handler', 'conditions' and 'source' - * @param array $parameters the matched parameters out of - * Router::matchRoute; something like: - * `array('user_id' => '23a21d...e78f')` - * @return Response the resulting Response object which is then - * polished in Router::dispatch - */ - protected function execute($route, $parameters) - { - $handler = $route['handler']; - - if (!is_object($handler[0])) { - throw new \RuntimeException("Handler is not a method."); - } - - $handler[0]->init($this, $route); - - if (method_exists($handler[0], 'before')) { - $handler[0]->before($this, $handler, $parameters); - } - - $result = call_user_func_array($handler, $parameters); - - if (is_object($result) && method_exists($result, 'toArray')) { - $result = $result->toArray(); - } - - // $result is stronger than $response->body - if (isset($result)) { - $handler[0]->body($result); - } - - if (method_exists($handler[0], 'after')) { - $handler[0]->after($this, $parameters); - } - - return $handler[0]->getResponse(); - } - - /** - * Registers a content renderer. - * - * @param DefaultRenderer $renderer instance of a content renderer - * @param boolean $is_default (optional) set this - * renderer as default?; - * defaults to `false` - * - * @return Router returns itself to allow chaining - */ - public function registerRenderer($renderer, $is_default = false) - { - $this->renderers[$renderer->extension()] = $renderer; - if ($is_default) { - $this->default_renderer = $renderer; - } - - return $this; - } - - private function normalizeDispatchURI($uri) - { - return $uri ?? \Request::pathInfo(); - } - - private function normalizeRequestMethod($method) - { - return mb_strtolower($method ?: \Request::method() ?: 'get'); - } - - /** - * Negotiate content using the registered content renderers. The - * first ContentRenderer that returns `true` when calling - * ContentRenderer::shouldRespondTo gets the job. - * - * @param String $uri the URI to which the content renderers may respond - * - * @return ContentRenderer either a ContentRenderer that responds - * to the URI or the default - * ContentRenderer of this router. - */ - protected function negotiateContent($uri) - { - $content_renderer = null; - foreach ($this->renderers as $renderer) { - if ($renderer->shouldRespondTo($uri)) { - $content_renderer = $renderer; - break; - } - } - if (!$content_renderer) { - $content_renderer = $this->default_renderer ?: reset($this->renderers); - } - return $content_renderer; - } - - /** - * Tries to match a route given a URI and a HTTP request method. - * - * @param String $uri the URI to match - * @param String $method the HTTP request method to match - * @param DefaultRenderer $content_renderer the used - * ContentRenderer which - * is needed to remove - * a file extension - * - * @return array an array containing the matched route and the - * found parameters - */ - protected function matchRoute($uri, $method, $content_renderer) - { - $matched = null; - $parameters = []; - if (isset($this->routes[$method])) { - if ($content_renderer->extension() && mb_strpos($uri, $content_renderer->extension()) !== false) { - $uri = mb_substr($uri, 0, -mb_strlen($content_renderer->extension())); - } - - foreach ($this->routes[$method] as $uri_template => $route) { - if (!isset($route['uri_template'])) { - $route['uri_template'] = new UriTemplate($uri_template, $route['conditions']); - } - - $prmtrs = null; // Will be filled by a successful match() - if ($route['uri_template']->match($uri, $prmtrs)) { - if (!$this->permissions->check($uri_template, $method)) { - throw new RouterException(403, "Route not activated"); - } - $matched = $route; - $parameters = $prmtrs; - break; - } - } - } - return [$matched, $parameters]; - } - - /** - * Returns all methods the given uri responds to. - * - * @param String $uri the URI to match - * - * @return array of all of responding methods - */ - protected function getMethodsForUri($uri) - { - $methods = []; - - foreach ($this->routes as $method => $templates) { - foreach ($templates as $uri_template => $route) { - if (!isset($route['uri_template'])) { - $route['uri_template'] = new UriTemplate($uri_template, $route['conditions']); - } - - if ($route['uri_template']->match($uri) - && $this->permissions->check($uri_template, $method)) - { - $methods[] = $method; - } - } - } - - return array_map('strtoupper', $methods); - } - - - /** - * Sets up the authentication for the router. - */ - public function setupAuth() - { - // Detect consumer - $consumer = Consumer\Base::detectConsumer(); - if (!$consumer) { - return null; - } - - $this->user = $consumer->getUser(); - - // Set authentication if present - if ($this->user) { - // Skip fake authentication if user is already logged in - if ($GLOBALS['user']->id !== $this->user->id) { - - $GLOBALS['auth'] = new \Seminar_Auth(); - $GLOBALS['auth']->auth = [ - 'uid' => $this->user->user_id, - 'uname' => $this->user->username, - 'perm' => $this->user->perms, - ]; - - $GLOBALS['user'] = new \Seminar_User($this->user); - - $GLOBALS['perm'] = new \Seminar_Perm(); - $GLOBALS['MAIL_VALIDATE_BOX'] = false; - } - setTempLanguage($GLOBALS['user']->id); - } - - return $this->user; - } -} diff --git a/lib/classes/restapi/RouterException.php b/lib/classes/restapi/RouterException.php deleted file mode 100644 index 1ce2afc35e70bb0d1b85b5e69d6593bbae3db456..0000000000000000000000000000000000000000 --- a/lib/classes/restapi/RouterException.php +++ /dev/null @@ -1,31 +0,0 @@ -<?php -namespace RESTAPI; -use \Exception; - -/** - * Router exception. - * - * @author Jan-Hendrik Willms <tleilax+studip@gmail.com> - * @author <mlunzena@uos.de> - * @license GPL 2 or later - * @since Stud.IP 3.0 - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - */ -class RouterException extends Exception -{ - protected static $error_messages = [ - 400 => 'Bad Request', - 401 => 'Unauthorized', - 403 => 'Forbidden', - 404 => 'Not Found', - 405 => 'Method Not Allowed', - 500 => 'Internal Server Error', - 501 => 'Not implemented', - ]; - - public function __construct($code = 500, $message = '', $previous = null) - { - $message = $message ?: self::$error_messages[$code] ?: ''; - parent::__construct($message, $code, $previous); - } -} diff --git a/lib/classes/restapi/RouterHalt.php b/lib/classes/restapi/RouterHalt.php deleted file mode 100644 index 55a2ca1fbfddce659dba84cb175d045b6769ce58..0000000000000000000000000000000000000000 --- a/lib/classes/restapi/RouterHalt.php +++ /dev/null @@ -1,19 +0,0 @@ -<?php -namespace RESTAPI; - -/** - * @author <mlunzena@uos.de> - * @license GPL 2 or later - * @since Stud.IP 3.0 - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - */ -class RouterHalt extends \Exception -{ - public $response; - - public function __construct($response) - { - parent::__construct(); - $this->response = $response; - } -} diff --git a/lib/classes/restapi/UriTemplate.php b/lib/classes/restapi/UriTemplate.php deleted file mode 100644 index 67161deb9692584b000b780974282bd45e2a12c8..0000000000000000000000000000000000000000 --- a/lib/classes/restapi/UriTemplate.php +++ /dev/null @@ -1,115 +0,0 @@ -<?php -namespace RESTAPI; - -/** - * @author Jan-Hendrik Willms <tleilax+studip@gmail.com> - * @author <mlunzena@uos.de> - * @license GPL 2 or later - * @since Stud.IP 3.0 - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - */ -class UriTemplate -{ - public $uri_template; - public $conditions; - - public function __construct($uri_template, $conditions = []) - { - $this->uri_template = $uri_template; - $this->conditions = $conditions; - } - - /** - * Tests whether an uri matches a template. - * - * The template may contain placeholders by prefixing an appropriate, - * unique placeholder name with a colon (:). - * - * <code>$template = '/hello/:name';</code> - * - * If the uri matches the template, all evaluated placeholders will - * be stored in the parameters array. - * - * @param String $uri The uri to test - * @param array $parameters Stores evaluated parameters on match (optional) - * - * @return bool Returns true if the uri matches the template - */ - public function match($uri, &$parameters = null) - { - // Initialize parameters array - $parameters = []; - - // Split and normalize uri and template - $given = array_filter(explode('/', $uri), 'mb_strlen'); - $rules = array_filter(explode('/', $this->uri_template)); - - // Leave if uri and template do not contain the same number of - // elements - if (count($given) !== count($rules)) { - return false; - } - - // Combine uri and template element-wise (simplifies iteration) - $combined = array_combine($rules, $given); - - // Iterate over uri and template and compare element by element - foreach ($combined as $rule => $actual) { - if ($rule[0] === ':') { - // Rule is a placeholder - $parameter_name = mb_substr($rule, 1); - - if (isset($this->conditions[$parameter_name]) - && !preg_match($this->conditions[$parameter_name], $actual)) { - return false; - } - - $parameters[$parameter_name] = $actual; - - } elseif ($actual !== $rule) { - // Elements do not match - $parameters = []; - return false; - } - } - - return true; - } - - - public function inject($params) - { - // Initialize parameters array - $parameters = []; - - // Split and normalize template - $rules = array_filter(explode('/', $this->uri_template)); - - foreach ($rules as &$rule) { - - // Rule is a placeholder - if ($rule[0] === ':') { - $parameter_name = mb_substr($rule, 1); - - if (!isset($params[$parameter_name])) { - $reason = sprintf('UriTemplate parameter :%s missing.', - htmlReady($parameter_name)); - throw new \RuntimeException($reason); - } - - $actual = $params[$parameter_name]; - - if (isset($this->conditions[$parameter_name]) - && !preg_match($this->conditions[$parameter_name], $actual)) { - $reason = sprintf('UriTemplate parameter :%s did not satisfy its condition.', - htmlReady($parameter_name)); - throw new \RuntimeException($reason); - } - - $rule = htmlReady($actual); - } - } - - return join('/', $rules); - } -} diff --git a/lib/classes/restapi/UserPermissions.php b/lib/classes/restapi/UserPermissions.php deleted file mode 100644 index dcf16019f01d793ef5fced2999537a42835c4250..0000000000000000000000000000000000000000 --- a/lib/classes/restapi/UserPermissions.php +++ /dev/null @@ -1,144 +0,0 @@ -<?php -namespace RESTAPI; -use DBManager, PDO; - -/** - * REST API routing permissions - * - * @author Jan-Hendrik Willms <tleilax+studip@gmail.com> - * @license GPL 2 or later - * @since Stud.IP 2.6 - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - */ -class UserPermissions -{ - /** - * Create a permission object (for a certain user). - * Permissions object will be cached for each user. - * - * @param mixed $user_id Id of user (optional, defaults to global) - * @return UserPermissions Returns permissions object - */ - public static function get($user_id = null) - { - $user_id = $user_id ?: $GLOBALS['user']->id; - - static $cache = []; - if (!isset($cache[$user_id])) { - $cache[$user_id] = new self($user_id); - } - - return $cache[$user_id]; - } - - private $user_id; - private $permissions = []; - - /** - * Creates the actual permission object (for a certain user). - * - * @param mixed $user_id Id of user (optional, defaults to global) - */ - private function __construct($user_id = null) - { - $this->user_id = $user_id; - - // Init with global permissions - $this->loadPermissions(); - } - - /** - * Defines whether access is allowed for the current user to the - * passed route via the passed method. - * - * @param String $user_id Id of the user - * @param mixed $granted Granted state (PHP'ish boolean) - * @return UserPermissions Returns instance of self to allow chaining - */ - public function set($user_id, $granted = true) - { - $this->permissions[$user_id] = (bool)$granted; - - return $this; - } - - /** - * Loads permissions for passed user. - * - * @return UserPermissions Returns instance of self to allow chaining - */ - protected function loadPermissions() - { - $query = "SELECT consumer_id, granted - FROM api_user_permissions - WHERE user_id = :user_id"; - $statement = DBManager::get()->prepare($query); - $statement->bindValue(':user_id', $this->user_id); - $statement->execute(); - $permissions = $statement->fetchAll(PDO::FETCH_ASSOC); - - // Init with global permissions - foreach ($permissions as $permission) { - extract($permission); - - $this->set($permission['consumer_id'], $permission['granted']); - } - - return $this; - } - - /** - * Checks if access to consumer is allowed for the current user. - * - * @param String $consumer_id Id of the consumer - * @return bool Indicates whether access is allowed - */ - public function check($consumer_id) - { - return isset($this->permissions[$consumer_id]) - && $this->permissions[$consumer_id]; - } - - /** - * Stores the set permissions. - * - * @return bool Returns true if permissions were stored successfully - */ - public function store() - { - $result = true; - - $query = "INSERT INTO api_user_permissions (user_id, consumer_id, granted, mkdate, chdate) - VALUES (:user_id, :consumer_id, :granted, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()) - ON DUPLICATE KEY UPDATE granted = VALUES(granted), - chdate = UNIX_TIMESTAMP()"; - $statement = DBManager::get()->prepare($query); - $statement->bindValue(':user_id', $this->user_id); - - foreach ($this->permissions as $consumer_id => $granted) { - $statement->bindValue(':consumer_id', $consumer_id); - $statement->bindValue(':granted', (int) !empty($granted)); - - $result = $result && $statement->execute(); - } - - return $result; - } - - /** - * Get a list of all consumer the user has granted acces to. - * - * @return array List of consumer objects - */ - public function getConsumers() - { - $result = []; - foreach ($this->permissions as $consumer_id => $granted) { - if (!$granted) { - continue; - } - $result[$consumer_id] = Consumer\Base::find($consumer_id); - } - return $result; - } -} diff --git a/lib/classes/restapi/consumer/Base.php b/lib/classes/restapi/consumer/Base.php deleted file mode 100644 index 50f31501e5f3522e6730d9d1240e58ab452a7fc4..0000000000000000000000000000000000000000 --- a/lib/classes/restapi/consumer/Base.php +++ /dev/null @@ -1,226 +0,0 @@ -<?php -namespace RESTAPI\Consumer; - -use AuthUserMd5; -use DBManager; -use DBManagerException; -use PDO; - -/** - * Base consumer class for the rest api - * - * Consumers provide means for authenticating a user and the access - * permissions for routes are bound to specific consumers. - * - * @author Jan-Hendrik Willms <tleilax+studip@gmail.com> - * @license GPL 2 or later - * @since Stud.IP 3.0 - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - */ -abstract class Base extends \SimpleORMap -{ - /** - * Each consumer type has to implement a detect feature which - * should extract crucial information from the request and return - * an instance of itself if the consumer detects a valid signature - * it can respond to. - * - * @param mixed $request_type Type of request (optional; defaults to any) - * @return mixed Detected consumer object or false - */ - abstract public static function detect($request_type = null); - - /* Concrete */ - - /** - * Configures the model. - * - * @param array $config Configuration array - */ - protected static function configure($config = []) - { - $config['db_table'] = 'api_consumers'; - - parent::configure($config); - } - - /** - * Stores all known consumer types - */ - protected static $known_types = []; - - /** - * Add a consumer type to the list of consumer types - * - * @param String $type Name of the type - * @param String $class Associated consumer class - */ - public static function addType($type, $class) - { - self::$known_types[$type] = $class; - } - - /** - * Removes a consumer type from the list of consumer types - * - * @param String $type Name of the type - */ - public static function removeType($type) - { - unset(self::$known_types[$type]); - } - - /** - * Overloaded find method. Will return a concrete specialized consumer - * object of the associated type. - * - * @param String $id Id of the consumer - * @return \RESTAPI\Consumer\Base Associated consumer object (derived - * from consumer base type) - * @throws \Exception if either consumer id or consumer type is invalid - */ - public static function find($id) - { - $query = "SELECT consumer_type - FROM api_consumers - WHERE consumer_id = :id"; - $statement = DBManager::get()->prepare($query); - $statement->bindValue(':id', $id); - $statement->execute(); - $type = $statement->fetchColumn(); - - if (!isset(self::$known_types[$type])) { - throw new \Exception('Consumer #' . $id . ' is of unknown type "' . $type . '"'); - } - - return new self::$known_types[$type]($id); - } - - /** - * Returns a list of all known consumers. - * - * @return array List of all known consumers (as specialized consumer - * objects) - */ - public static function findAll() - { - $query = "SELECT consumer_id FROM api_consumers"; - $statement = DBManager::get()->query($query); - $ids = $statement->fetchAll(PDO::FETCH_COLUMN); - - return array_map([self::class, 'find'], $ids); - } - - /** - * Creates a new consumer of the given type. - * - * @param String $type Name of the type - * @return \RESTAPI\Consumer\Base Consumer object of the given (derived - * from consumer base type) - * @throws \Exception if type is invalid - */ - public static function create($type) - { - if (!isset(self::$known_types[$type])) { - throw new \Exception('Consumer is of unknown type "' . $type . '"'); - } - - return new self::$known_types[$type]; - } - - /** - * This method is used to detect a consumer (of a specific type) by - * executing the detect method on all known consumer types. - * - * @param mixed $type Name of the type (optional; defaults to all types) - * @param mixed $request_type Type of request (optional; defaults to any) - * @return mixed Either the detected consumer or false if no consumer - * was detected - * @throws \Exception if type is invalid - */ - public static function detectConsumer($type = null, $request_type = null) - { - $needles = $type === null - ? array_keys(self::$known_types) - : [$type]; - foreach ($needles as $needle) { - if (!isset(self::$known_types)) { - throw new \Exception('Trying to detect consumer of unkown type "' . $needle . '"'); - } - $consumer_class = self::$known_types[$needle]; - if ($consumer = $consumer_class::detect($request_type)) { - return $consumer; - } - } - return false; - } - - /** - * Contains user information - */ - protected $user = null; - - /** - * Extended SimpleORMap constructor. A certain user can be injected upon - * creation. - * - * @param mixed $id Id of the consumer or null to create a new one - * @param mixed $user Either a user object or id to inject to the consumer - * or null if no user should be injected - */ - public function __construct($id = null, $user = null) - { - parent::__construct($id); - - if ($user !== null) { - $this->setUser($user); - } - } - - /** - * Retrieve the api permissions associated with this consumer. - * - * @return \RESTAPI\ConsumerPermissions Permission object for this consumer - */ - public function getPermissions() - { - return \RESTAPI\ConsumerPermissions::get($this->id); - } - - /** - * Inject a user to this consumer. Injecting in this context refers to - * "having a user authenticated by this consumer". - * - * @param mixed $user Either a user object or a user id - * @return \RESTAPI\Consumer\Base Returns instance of self to allow - * chaining - */ - public function setUser($user) - { - if (!is_object($user)) { - $user = \User::findFull($user); - } - $this->user = $user; - return $this; - } - - /** - * Returns whether the consumer has an injected user or not. - * - * @return bool True if a valid user is found, false otherwise - */ - public function hasUser() - { - return $this->user !== null && $this->user->id && $this->user->id !== 'nobody'; - } - - /** - * Return the injected user. - * - * @param mixed User object or false if no user was injected - */ - public function getUser() - { - return $this->user; - } -} diff --git a/lib/classes/restapi/consumer/HTTP.php b/lib/classes/restapi/consumer/HTTP.php deleted file mode 100644 index 97b0657ac880edede29364b7841bdb5f9e155cab..0000000000000000000000000000000000000000 --- a/lib/classes/restapi/consumer/HTTP.php +++ /dev/null @@ -1,50 +0,0 @@ -<?php -namespace RESTAPI\Consumer; -use StudipAuthAbstract, RESTAPI\RouterException; - -/** - * Basic HTTP Authentication consumer for the rest api - * - * @author Jan-Hendrik Willms <tleilax+studip@gmail.com> - * @license GPL 2 or later - * @since Stud.IP 3.0 - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - */ -class HTTP extends Base -{ - /** - * Detects if a user is authenticated via basic http authentication. - * The only supported authentication for now is via the url: - * - * http://username:password@host/path?query - * - * @param mixed $request_type Type of request (optional; defaults to any) - * @return mixed Instance of self if authentication was detected, false - * otherwise - * @throws RouterException if authentication fails - * @todo Integrate and test HTTP_AUTHORIZATION header authentication - */ - public static function detect($request_type = null) - { - if ( - isset($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) - || isset($_SERVER['HTTP_AUTHORIZATION']) - ) { - $user_id = false; - - if (isset($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'])) { - $username = $_SERVER['PHP_AUTH_USER']; - $password = $_SERVER['PHP_AUTH_PW']; - } elseif (isset($_SERVER['HTTP_AUTHORIZATION'])) { - list($username, $password) = explode(':', base64_decode(mb_substr($_SERVER['HTTP_AUTHORIZATION'], 6))); - } - - $check = StudipAuthAbstract::CheckAuthentication($username, $password); - if ($check['uid'] && $check['uid'] !== 'nobody') { - return new self(null, $check['uid']); - } - - } - return false; - } -} diff --git a/lib/classes/restapi/consumer/OAuth.php b/lib/classes/restapi/consumer/OAuth.php deleted file mode 100644 index caf51c2156e9d41fa82fae3822f862fe9045dba8..0000000000000000000000000000000000000000 --- a/lib/classes/restapi/consumer/OAuth.php +++ /dev/null @@ -1,231 +0,0 @@ -<?php -namespace RESTAPI\Consumer; -use StudipAutoloader, DBManager, OAuthRequestVerifier, OAuthStore, OAuthServer, Exception; -use \RESTAPI\UserPermissions; - -StudipAutoloader::addAutoloadPath($GLOBALS['STUDIP_BASE_PATH'] . DIRECTORY_SEPARATOR . 'vendor/oauth-php/library/'); - -/** - * OAuth consumer for the rest api - * - * @author Jan-Hendrik Willms <tleilax+studip@gmail.com> - * @license GPL 2 or later - * @since Stud.IP 3.0 - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - */ -class OAuth extends Base -{ - /** - * Configures the model. - * - * @param array $config Configuration array - */ - protected static function configure($config = []) - { - $config['default_values']['consumer_type'] = 'oauth'; - - $config['registered_callbacks']['before_store'][] = 'before_store'; - - parent::configure($config); - } - - /** - * Detects whether the request is authenticated via OAuth. - * - * @param mixed $request_type Type of request (optional; defaults to any) - * @return mixed Instance of self if authentication was detected, false - * otherwise - */ - public static function detect($request_type = null) - { - if (OAuthRequestVerifier::requestIsSigned() && $request_type !== 'request') { - $user_id = false; - - $parameters = (in_array($_SERVER['REQUEST_METHOD'], ['GET', 'POST'])) - ? null - : $GLOBALS['_' . $_SERVER['REQUEST_METHOD']]; - - $req = new OAuthRequestVerifier(null, null, $parameters); - - // Check oauth timestamp and deny access if timestamp is outdated - if ($req->getParam('oauth_timestamp') < strtotime('-6 hours')) { - return false; - } - $result = $req->verifyExtended('access'); - - // @todo - # self::$consumer_key = $result['consumer_key']; - - $query = "SELECT user_id FROM api_oauth_user_mapping WHERE oauth_id = :oauth_id"; - $statement = DBManager::get()->prepare($query); - $statement->bindValue(':oauth_id', $result['user_id']); - $statement->execute(); - $user_id = $statement->fetchColumn(); - - if (!$user_id) { - return false; - } - - $consumer = reset(self::findByAuth_Key($result['consumer_key'])); - $consumer->setUser($user_id); - return $consumer; - } else { - try { - // Check if there is a valid request token in the current request - // Returns an array with the consumer key, consumer secret, token, token secret and token type. - $rs = self::getServer()->authorizeVerify(); - - $query = "SELECT consumer_id - FROM api_consumers - WHERE auth_key = :key"; - $statement = DBManager::get()->prepare($query); - $statement->bindValue(':key', $rs['consumer_key']); - $statement->execute(); - $id = $statement->fetchColumn(); - - if ($id) { - return new self($id); - } - } catch (Exception $e) { - } - } - return false; - } - - /** - * Returns a singleton instance of the oauth server. - * - * @return OAuthServer The server object - */ - public static function getServer() - { - static $server = null; - if ($server === null) { - $server = new OAuthServer(null, null, null, 'SESSION', [], [ - 'allowed_uri_schemes' => [] - ]); - } - return $server; - } - - /** - * "Before store" trigger. Creates a clone of the consumer in the - * tables for the vendor oauth library. - */ - protected function before_store() - { - static $mapping = [ - 'auth_key' => 'consumer_key', - 'auth_secret' => 'consumer_secret', - 'active' => 'enabled', - 'contact' => 'requester_name', - 'email' => 'requester_email', - 'callback' => 'callback_uri', - 'url' => 'application_uri', - 'title' => 'application_title', - 'description' => 'application_descr', - 'notes' => 'application_notes', - 'type' => 'application_type', - 'commercial' => 'application_commercial', - ]; - - $consumer = []; - foreach ($mapping as $from => $to) { - $consumer[$to] = $this->$from; - } - - $query = "SELECT osr_id - FROM oauth_server_registry - WHERE osr_consumer_key = :key AND osr_consumer_secret = :secret"; - $statement = DBManager::get()->prepare($query); - $statement->bindValue(':key', $this->auth_key); - $statement->bindValue(':secret', $this->auth_secret); - $statement->execute(); - $consumer['id'] = $statement->fetchColumn(); - - $consumer_key = OAuthStore::instance('PDO')->updateConsumer($consumer, null, true); - - if ($this->isNew()) { - $consumer = OAuthStore::instance('PDO')->getConsumer($consumer_key, null, true); - $this->auth_key = $consumer['consumer_key']; - $this->auth_secret = $consumer['consumer_secret']; - } - } - - /** - * Grant oauth access for a user. - * - * @param mixed $user_id Specific user id or null to default to the - * injected user - * @throws Exception If no valid user is present - */ - public function grantAccess($user_id = null) - { - if ($user_id === null && $this->hasUser()) { - $user_id = $this->user->id; - } - if (!$user_id) { - throw new Exception('Can not grant access to unknown user'); - } - - UserPermissions::get($GLOBALS['user']->id)->set($this->id, true)->store(); - return self::getServer()->authorizeFinish(true, self::getOAuthId($user_id)); - } - - /** - * Revoke oauth access from a user. - * - * @param mixed $user_id Specific user id or null to default to the - * injected user - * @throws Exception If no valid user is present - */ - public function revokeAccess($user_id = null) - { - if ($user_id === null && $this->hasUser()) { - $user_id = $this->user->id; - } - if (!$user_id) { - throw new Exception('Can not revoke access from unknown user'); - } - - $query = "DELETE oauth_server_token - FROM oauth_server_token - JOIN oauth_server_registry - WHERE ost_usa_id_ref = :id AND osr_consumer_key = :key AND osr_consumer_secret = :secret"; - $statement = DBManager::get()->prepare($query); - $statement->bindValue(':id', self::getOAuthId($user_id)); - $statement->bindValue(':key', $this->auth_key); - $statement->bindValue(':secret', $this->auth_secret); - $statement->execute(); - - UserPermissions::get($GLOBALS['user']->id)->set($this->id, false)->store(); - return self::getServer()->authorizeFinish(false, self::getOAuthId($user_id)); - } - - /** - * Maps a user to an oauth id. This is neccessary due to the fact that - * the oauth lib works with different ids than Stud.IP. - * - * @param String $user_id Id of the user to get an oauth id for - * @return String The mapped oauth id - */ - public static function getOAuthId($user_id) - { - $query = "SELECT oauth_id FROM api_oauth_user_mapping WHERE user_id = :id"; - $statement = DBManager::get()->prepare($query); - $statement->bindValue(':id', $user_id); - $statement->execute(); - $oauth_id = $statement->fetchColumn(); - - if (!$oauth_id) { - $query = "INSERT INTO api_oauth_user_mapping (user_id, mkdate) - VALUES (:id, UNIX_TIMESTAMP())"; - $statement = DBManager::get()->prepare($query); - $statement->bindValue(':id', $user_id); - $statement->execute(); - $oauth_id = DBManager::get()->lastInsertId(); - } - - return $oauth_id; - } -} diff --git a/lib/classes/restapi/consumer/Studip.php b/lib/classes/restapi/consumer/Studip.php deleted file mode 100644 index 738dd75735d94728d3c9a74a69afd0672d5b085c..0000000000000000000000000000000000000000 --- a/lib/classes/restapi/consumer/Studip.php +++ /dev/null @@ -1,36 +0,0 @@ -<?php -namespace RESTAPI\Consumer; - -/** - * Stud.IP Session Consumer for the rest api - * - * @author Jan-Hendrik Willms <tleilax+studip@gmail.com> - * @license GPL 2 or later - * @since Stud.IP 3.0 - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - */ -class Studip extends Base -{ - /** - * Detects a user via the Stud.IP session. If a session is present and - * valid, the auth and user object have already been set up by stud.ip - * functions, so we just need to check if these are present. - * - * @param mixed $request_type Type of request (optional; defaults to any) - * @return mixed Instance of self if authentication was detected, false - * otherwise - */ - public static function detect($request_type = null) - { - if ( - !isset($GLOBALS['auth']) - || !$GLOBALS['auth']->is_authenticated() - || $GLOBALS['user']->id === 'nobody' - || !\CSRFProtection::verifyRequest() - ) { - return false; - } - - return new self(null, $GLOBALS['user']->id); - } -} diff --git a/lib/classes/restapi/renderer/DebugRenderer.php b/lib/classes/restapi/renderer/DebugRenderer.php deleted file mode 100644 index afd56f62b29564155a97ed48a20f252b8d7374c1..0000000000000000000000000000000000000000 --- a/lib/classes/restapi/renderer/DebugRenderer.php +++ /dev/null @@ -1,57 +0,0 @@ -<?php -namespace RESTAPI\Renderer; - -/** - * Debug content renderer. - * - * @author Jan-Hendrik Willms <tleilax+studip@gmail.com> - * @author <mlunzena@uos.de> - * @license GPL 2 or later - * @since Stud.IP 3.0 - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - */ -class DebugRenderer extends DefaultRenderer -{ - /** - * Returns an associated content type. - */ - public function contentType() - { - return 'text/plain'; - } - - /** - * Returns an associated extension. - */ - public function extension() - { - return '.debug'; - } - - /** - * Response transformation function. - * - * @param \RESTAPI\Response $response the response to transform - */ - public function render($response) - { - if (!isset($response['Content-Type'])) { - $response['Content-Type'] = $this->contentType() . ';charset=utf-8'; - } - - $debug = function ($label, $data) { - echo str_pad('', 78, '=') . PHP_EOL; - echo str_pad('- ' . $label, 77, ' ') . '-' . PHP_EOL; - echo str_pad('', 78, '=') . PHP_EOL; - var_export($data); - echo PHP_EOL; - }; - - ob_start(); - $debug('Response Status', $response->status); - $debug('Response Header', $response->headers); - $debug('Response Body', $response->body); - $debug('Request', $GLOBALS['_' . $_SERVER['REQUEST_METHOD']]); - $response->body = ob_get_clean(); - } -} diff --git a/lib/classes/restapi/renderer/DefaultRenderer.php b/lib/classes/restapi/renderer/DefaultRenderer.php deleted file mode 100644 index 836ba36b2cbd9bd897c33e1cb93fde2f8b8248db..0000000000000000000000000000000000000000 --- a/lib/classes/restapi/renderer/DefaultRenderer.php +++ /dev/null @@ -1,74 +0,0 @@ -<?php -namespace RESTAPI\Renderer; - -/** - * Default base content renderer class (outputs text/plain). - * - * Content renderers are output filters that can reshape data before it - * is sent to the client. - * Each content renderer is associated with a certain content type and a - * certain file extension. This is neccessary for content negotiation. - * - * @author Jan-Hendrik Willms <tleilax+studip@gmail.com> - * @author <mlunzena@uos.de> - * @license GPL 2 or later - * @since Stud.IP 3.0 - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - */ -class DefaultRenderer -{ - /** - * Returns an associated content type. - * - * @return String Content/mime type for this renderer - */ - public function contentType() - { - return 'text/plain'; - } - - /** - * Returns an associated extension. - * - * @return String Associated extension for this renderer. - */ - public function extension() - { - return ''; - } - - /** - * Response transformation function. - * - * @param \RESTAPI\Response $response the response to transform - */ - public function render($response) - { - if (!isset($response['Content-Type'])) { - $response['Content-Type'] = $this->contentType() . ';charset=utf-8'; - } - } - - /** - * Detects whether the renderer should respond to either a certain - * filename (tests by extension) or to a certain media range. - * - * @param String $filename Filename to test against - * @param mixed $media_range Media range to test against (optional, - * defaults to request's accept header if set) - * @return bool Returns whether the renderer should respond - */ - public function shouldRespondTo($filename, $media_range = null) - { - // If no media range is passed, evalute http header "Accept" - if ($media_range === null && isset($_SERVER['ACCEPT'])) { - $media_ranges = explode(';', $_SERVER['ACCEPT']); - $media_range = reset($media_ranges); - } - - // Test if either the filename has the appropriate extension or - // if the client accepts the content type - return ($this->extension() && fnmatch('*' . $this->extension(), $filename)) - || ($media_range && fnmatch($media_range, $this->contentType())); - } -} diff --git a/lib/classes/restapi/renderer/JSONRenderer.php b/lib/classes/restapi/renderer/JSONRenderer.php deleted file mode 100644 index 9c6e449e5e603dbeef29bf4fc02281cd56817c45..0000000000000000000000000000000000000000 --- a/lib/classes/restapi/renderer/JSONRenderer.php +++ /dev/null @@ -1,35 +0,0 @@ -<?php -namespace RESTAPI\Renderer; - -/** - * Content renderer for json content. - * - * @author Jan-Hendrik Willms <tleilax+studip@gmail.com> - * @author <mlunzena@uos.de> - * @license GPL 2 or later - * @since Stud.IP 3.0 - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - */ -class JSONRenderer extends DefaultRenderer -{ - public function contentType() - { - return 'application/json'; - } - - public function extension() - { - return '.json'; - } - - public function render($response) - { - if (!isset($response['Content-Type'])) { - $response['Content-Type'] = $this->contentType() . ';charset=utf-8'; - } - - if (isset($response->body)) { - $response->body = json_encode($response->body); - } - } -} diff --git a/lib/models/resources/ResourceBooking.php b/lib/models/resources/ResourceBooking.php index fadf92fd9429e8fcbd82b14dc5d0a05b3f106fa7..89507139d21f52a251b948f644ff01cd62a4f6fc 100644 --- a/lib/models/resources/ResourceBooking.php +++ b/lib/models/resources/ResourceBooking.php @@ -1755,18 +1755,16 @@ class ResourceBooking extends SimpleORMap implements PrivacyObject, Studip\Calen //(lib/resources.js, method dropEventInRoomGroupBookingPlan) $interval_api_urls = [ 'resize' => \URLHelper::getURL( - 'api.php/resources/booking/' - . $this->id . '/move', + 'dispatch.php/resources/ajax/move_booking/' . $this->id, [ - 'quiet' => '1', + 'quiet' => true, 'interval_id' => $interval->id ] ), 'move' => \URLHelper::getURL( - 'api.php/resources/booking/' - . $this->id . '/move', + 'dispatch.php/resources/ajax/move_booking/' . $this->id, [ - 'quiet' => '1', + 'quiet' => true, 'interval_id' => $interval->id ] ) @@ -1784,11 +1782,11 @@ class ResourceBooking extends SimpleORMap implements PrivacyObject, Studip\Calen $text_colour, $colour, $booking_is_editable, - 'ResourceBookingInterval', + ResourceBookingInterval::class, $interval->id, - 'ResourceBooking', + ResourceBooking::class, $this->id, - 'Resource', + Resource::class, $this->resource_id, $booking_view_urls, $interval_api_urls, diff --git a/lib/models/resources/ResourceRequest.php b/lib/models/resources/ResourceRequest.php index 9cad900a4c95fa1e622f2258db08b84fbfb800b3..b2f5524f02abd5e0ef97ced4a13f0433191e20f7 100644 --- a/lib/models/resources/ResourceRequest.php +++ b/lib/models/resources/ResourceRequest.php @@ -2244,24 +2244,19 @@ class ResourceRequest extends SimpleORMap implements PrivacyObject, Studip\Calen protected function convertToEventData(array $time_intervals, User $user) { - $booking_plan_request_bg = - ColourValue::find('Resources.BookingPlan.Request.Bg'); - $booking_plan_request_fg = - ColourValue::find('Resources.BookingPlan.Request.Fg'); - $booking_plan_preparation_bg = - ColourValue::find('Resources.BookingPlan.PreparationTime.Bg'); - $booking_plan_preparation_fg = - ColourValue::find('Resources.BookingPlan.PreparationTime.Fg'); + $booking_plan_request_bg = ColourValue::find('Resources.BookingPlan.Request.Bg'); + $booking_plan_request_fg = ColourValue::find('Resources.BookingPlan.Request.Fg'); + $booking_plan_preparation_bg = ColourValue::find('Resources.BookingPlan.PreparationTime.Bg'); + $booking_plan_preparation_fg = ColourValue::find('Resources.BookingPlan.PreparationTime.Fg'); $user_is_resource_autor = false; - if ($this->resource_id && ($this->resource instanceof Resource)) { + if ($this->resource_id && $this->resource instanceof Resource) { $user_is_resource_autor = $this->resource->userHasPermission( $user, 'autor' ); } - $request_is_editable = - $user_is_resource_autor || ($user->id == $this->user_id); + $request_is_editable = $user_is_resource_autor || ($user->id == $this->user_id); $request_api_urls = []; $request_view_urls = []; @@ -2269,18 +2264,12 @@ class ResourceRequest extends SimpleORMap implements PrivacyObject, Studip\Calen if ($request_is_editable) { $request_api_urls = [ 'resize' => URLHelper::getURL( - 'api.php/resources/request/' - . $this->id . '/move', - [ - 'quiet' => '1' - ] + 'dispatch.php/resources/ajax/move_request/'. $this->id, + ['quiet' => true] ), - 'move' => URLHelper::getURL( - 'api.php/resources/request/' - . $this->id . '/move', - [ - 'quiet' => '1' - ] + 'move' => URLHelper::getURL( + 'dispatch.php/resources/ajax/move_request/'. $this->id, + ['quiet' => true] ) ]; @@ -2290,13 +2279,14 @@ class ResourceRequest extends SimpleORMap implements PrivacyObject, Studip\Calen . $this->id ) ]; - if ($this->resource_id && ($this->resource instanceof Resource)) { - if ($this->resource->userHasBookingRights($user)) { - $request_view_urls['edit'] = URLHelper::getURL( - 'dispatch.php/resources/room_request/resolve/' - . $this->id - ); - } + if ( + $this->resource_id + && $this->resource instanceof Resource + && $this->resource->userHasBookingRights($user) + ) { + $request_view_urls['edit'] = URLHelper::getURL( + 'dispatch.php/resources/room_request/resolve/'. $this->id + ); } } @@ -2306,7 +2296,7 @@ class ResourceRequest extends SimpleORMap implements PrivacyObject, Studip\Calen $real_begin = $interval['begin']; if ($this->preparation_time) { $real_begin += (int)$this->preparation_time; - $begin = new DateTime(); + $begin = new DateTime(); $begin->setTimestamp($interval['begin']); $end = new DateTime(); $end->setTimestamp($real_begin); @@ -2320,9 +2310,9 @@ class ResourceRequest extends SimpleORMap implements PrivacyObject, Studip\Calen $request_is_editable, '', '', - 'ResourceRequest', + ResourceRequest::class, $this->id, - 'Resource', + Resource::class, $this->resource_id, $request_view_urls, $request_api_urls @@ -2342,11 +2332,11 @@ class ResourceRequest extends SimpleORMap implements PrivacyObject, Studip\Calen $booking_plan_request_fg->__toString(), $booking_plan_request_bg->__toString(), $request_is_editable, - 'ResourceRequest', + ResourceRequest::class, $this->id, - 'Resource', + Resource::class, $this->resource_id, - 'Resource', + Resource::class, $this->resource_id, $request_view_urls, $request_api_urls diff --git a/lib/modules/ActivityFeed.php b/lib/modules/ActivityFeed.php index 62762b6b3cd2ccfb860dc6cf6f9e87bf83f13879..667c4f9efe917958c2ee6b9d05d4c4a03b73a3ea 100644 --- a/lib/modules/ActivityFeed.php +++ b/lib/modules/ActivityFeed.php @@ -50,28 +50,4 @@ class ActivityFeed extends CorePlugin implements PortalPlugin return $template; } - - public static function onEnable($pluginId) - { - $errors = []; - if (!Config::get()->API_ENABLED) { - $errors[] = sprintf( - _('Die REST-API ist nicht aktiviert (%s "API_ENABLED")'), - formatReady(sprintf('[%s]%s', - _('Konfiguration'), - URLHelper::getLink('dispatch.php/admin/configuration/configuration') - )) - ); - } elseif (!RESTAPI\ConsumerPermissions::get('global')->check('/user/:user_id/activitystream', 'get')) { - $errors[] = sprintf( - _('Die REST-API-Route ist nicht aktiviert (%s "/user/:user_id/activitystream"")'), - formatReady(sprintf('[%s]%s', - _('Konfiguration'), - URLHelper::getLink('dispatch.php/admin/api/permissions') - )) - ); - } - - return count($errors) === 0; - } } diff --git a/lib/navigation/AdminNavigation.php b/lib/navigation/AdminNavigation.php index a72508228c1d4fa66bd6eda787ed6b1452f41c84..3e6387666197e5f1ed87c36939813276b9d21283 100644 --- a/lib/navigation/AdminNavigation.php +++ b/lib/navigation/AdminNavigation.php @@ -206,10 +206,6 @@ class AdminNavigation extends Navigation $navigation->addSubNavigation('admissionrules', new Navigation(_('Anmelderegeln'), 'dispatch.php/admission/ruleadministration')); - if (Config::get()->API_ENABLED) { - $navigation->addSubNavigation('api', new Navigation(_('API'), 'dispatch.php/admin/api')); - } - $navigation->addSubNavigation('oauth2', new Navigation(_('OAuth2'), 'dispatch.php/admin/oauth2/index')); $navigation->addSubNavigation('globalsearch', new Navigation(_('Globale Suche'), 'dispatch.php/globalsearch/settings')); diff --git a/lib/navigation/ProfileNavigation.php b/lib/navigation/ProfileNavigation.php index 4827fe4db356aa50ac7e476a011ca5ba432dba0c..307cd986e54ae9180aec379a65ad29b9b39e0d4b 100644 --- a/lib/navigation/ProfileNavigation.php +++ b/lib/navigation/ProfileNavigation.php @@ -114,10 +114,6 @@ class ProfileNavigation extends Navigation $navigation->addSubNavigation('deputies', new Navigation(_('Standardvertretung'), 'dispatch.php/settings/deputies')); } - if (Config::Get()->API_ENABLED) { - $navigation->addSubNavigation('api', new Navigation(_('API-Berechtigungen'), 'dispatch.php/api/authorizations')); - } - if (TwoFactorAuth::isEnabledForUser()) { $navigation->addSubNavigation('tfa', new Navigation(_('Zwei-Faktor-Authentifizierung'), 'dispatch.php/tfa')); } diff --git a/lib/plugins/core/RESTAPIPlugin.php b/lib/plugins/core/RESTAPIPlugin.php deleted file mode 100644 index f69344c58ed471fef38bb0109055698266f7dba5..0000000000000000000000000000000000000000 --- a/lib/plugins/core/RESTAPIPlugin.php +++ /dev/null @@ -1,26 +0,0 @@ -<?php -/* - * REST-API Plugins add maps to the REST-API router. - * - * Copyright (c) 2014 - Marcus Lunzenauer <mlunzena@uos.de> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of - * the License, or (at your option) any later version. - */ - -/** - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - */ -interface RESTAPIPlugin -{ - /** - * Returns one or more instances of RESTAPI\RouteMap to register - * to the Router. - * - * @return RouteMap|Array either a single instance of class - * RouteMap or an array of them - */ - public function getRouteMaps(); -} diff --git a/public/api.php b/public/api.php deleted file mode 100644 index 9f7863c60ed09a8579169979e10649cc529a57f2..0000000000000000000000000000000000000000 --- a/public/api.php +++ /dev/null @@ -1,103 +0,0 @@ -<?php - -/** @file - * - * Diese Datei stellt den Ausgangspunkt für alle Zugriffe auf die - * RESTful Web Services von Stud.IP dar. - * Grob betrachtet läuft das Routings so ab: - * - * Ein HTTP-Request geht ein. Falls dort eine inkompatible Version der - * REST-API verlangt wird, bricht das Skript ab. Die Authentifizierung - * wird durchgeführt. Bei Erfolg wird die PATH_INFO und die HTTP - * Methode im Router verwendet, um die passende Funktion zu - * finden. Der Router liefert in jedem Fall ein Response-Objekt - * zurück, dass dann anschließende ausgegeben wird, d.h. die Header - * werden gesendet und dann das Ergebnis ausgegeben oder gestreamt. - * - * @deprecated Since Stud.IP 5.0. Will be removed in Stud.IP 6.0. - */ - - -namespace { - require_once '../lib/bootstrap.php'; - - page_open([ - 'sess' => 'Seminar_Session', - 'auth' => 'Seminar_Default_Auth', - 'perm' => 'Seminar_Perm', - 'user' => 'Seminar_User', - ]); -} - -namespace RESTAPI { - - use Config; - - // A potential api exception will lead to an according response with the - // exception code and name as the http status. - try { - if (!Config::get()->API_ENABLED) { - throw new RouterException(503, 'REST API is not available'); - } - - require 'lib/bootstrap-api.php'; - - // Initialize RESTAPI plugins - \PluginEngine::getPlugins(RESTAPIPlugin::class); - - $uri = \Request::pathInfo(); - - // Check version - if (defined('RESTAPI\\VERSION') && preg_match('~^/v(\d+)~i', $uri, $match)) { - $version = $match[1]; - if ($version != VERSION) { - throw new RouterException(400, 'Version not supported'); - } - - $uri = mb_substr($uri, mb_strlen($match[0])); - header('X-API-Version: ' . VERSION); - } - - // Get router instance - $router = Router::getInstance(); - - $api_user = $router->setupAuth(); - - // Actual dispatch - $response = $router->dispatch($uri); - - // Tear down - if ($api_user) { - restoreLanguage(); - } - - // Send output - $response->output(); - - } catch (RouterException $e) { - $status = sprintf('%s %u %s', - $_SERVER['SERVER_PROTOCOL'] ?: 'HTTP/1.1', - $e->getCode(), - $e->getMessage()); - $status = trim($status); - if (!headers_sent()) { - if ($e->getCode() === 401) { - header('WWW-Authenticate: Basic realm="' . Config::get()->STUDIP_INSTALLATION_ID . '"'); - } - header($status, true, $e->getCode()); - echo $status; - } else { - echo $status; - } - } catch (\Exception $e) { - error_log("Caught {$e}"); - - $message = explode("\n", $e->getMessage())[0]; - header('Content-Type: application/json; charset=UTF-8'); - header("{$_SERVER['SERVER_PROTOCOL']} 500 {$message}"); - echo $GLOBALS['template_factory']->render('json_exception', [ - 'exception' => $e, - 'status' => 500, - ]); - } -} diff --git a/resources/assets/javascripts/bootstrap/resources.js b/resources/assets/javascripts/bootstrap/resources.js index 8c89b7f2e10475b238fef2613711c24440670c92..7eb6a68e1172234e1cca9818cce13b73ca9afa70 100644 --- a/resources/assets/javascripts/bootstrap/resources.js +++ b/resources/assets/javascripts/bootstrap/resources.js @@ -416,7 +416,7 @@ STUDIP.ready(function () { $("#BookingEndDateInput").prop('defaultValue', $(this).val()); $("#BookingEndDateInput").val($(this).val()).trigger('change'); } - updateRepeatEndSemesterByTimestamp(Math.floor(d / 1000)); + updateRepeatEndSemesterByTimestamp(d); } else if ($(this).attr('id') == 'BookingEndDateInput') { $("#end_date-weekdays span").addClass('invisible'); $("#end_date-weekdays #" + day_numer).removeClass('invisible'); @@ -545,38 +545,41 @@ STUDIP.ready(function () { } ); - function updateRepeatEndSemesterByTimestamp(timestamp, api_url = 'api.php/semesters') { - var semester = null; - jQuery.ajax( - STUDIP.URLHelper.getURL(api_url), - { - method: 'get', - dataType: 'json', - success: function (data) { - if (data) { - Object.values(data.collection).forEach(item => { - if (timestamp >= item.begin && timestamp < item.end) { - semester = item; - } - }); - if (semester) { - $("#semester_course_name").text(semester.title); - $(".semester-time-option").prop('disabled', false); - } else { - if (data.pagination && data.pagination.links.next != api_url) { - semester = updateRepeatEndSemesterByTimestamp(timestamp, data.pagination.links.next); - } else { - $("#semester_course_name").text('außerhalb definierter Zeiten'); - $(".semester-time-option").prop('checked', false); - $(".semester-time-option").prop('disabled', true); - $(".manual-time-option").prop('checked', true); - $(".manual-time-option").trigger('change'); - } - } - } - } + function updateRepeatEndSemesterByTimestamp(timestamp) { + (new Promise((resolve, reject) => { + const cache = STUDIP.Cache.getInstance('jsonapi'); + if (cache.has('semesters')) { + resolve(cache.get('semesters')); + } else { + STUDIP.jsonapi.GET('semesters', { data: { page: { limit: 100000 }}}) + .done(({data}) => { + cache.set('semesters', data); + resolve(data) + }) + .fail(() => { + reject(new Error('Could not load semesters')); + }); + } + })).then(semesters => { + const semester = semesters.find(({attributes}) => { + return new Date(attributes.start) <= timestamp + && timestamp <= new Date(attributes.end); + }); + + if (semester) { + $('#semester_course_name').text(semester.attributes.title); + $('.semester-time-option').prop('disabled', false); + } else { + $('#semester_course_name').text('außerhalb definierter Zeiten'); + $('.semester-time-option').prop({ + checked: false, + disabled: true + }); + $('.manual-time-option') + .prop('checked', true) + .trigger('change'); } - ); + }); } function updateViewURL(defaultView) { diff --git a/resources/assets/javascripts/init.js b/resources/assets/javascripts/init.js index 36a72a5f3aea2b44f74b726767df2562c8a3ad54..1d7d5ac2ee21e5da0949c2aa09c86aed75b00aa6 100644 --- a/resources/assets/javascripts/init.js +++ b/resources/assets/javascripts/init.js @@ -64,7 +64,6 @@ import register from './lib/register.js'; import Report from './lib/report.js'; import Resources from './lib/resources.js'; import Responsive from './lib/responsive.js'; -import RESTAPI, { api } from './lib/restapi.js'; import Schedule from './lib/schedule.js'; import Screenreader from './lib/screenreader.js'; import Scroll from './lib/scroll.js'; @@ -92,7 +91,6 @@ window.STUDIP = _.assign(window.STUDIP || {}, { admin_sem_class, AdminCourses, Admission, - api, Arbeitsgruppen, Archive, Avatar, @@ -151,7 +149,6 @@ window.STUDIP = _.assign(window.STUDIP || {}, { register, Report, Responsive, - RESTAPI, Schedule, Scroll, Screenreader, diff --git a/resources/assets/javascripts/lib/activityfeed.js b/resources/assets/javascripts/lib/activityfeed.js index 74c27f9f2606ff316d6328d7ef6bbe42f0e7cc85..12f0bace0c8568a4679942a66a01acc300f650f2 100644 --- a/resources/assets/javascripts/lib/activityfeed.js +++ b/resources/assets/javascripts/lib/activityfeed.js @@ -6,13 +6,13 @@ const ActivityFeed = { maxheight: null, filter: null, - init: function() { + init() { STUDIP.ActivityFeed.maxheight = parseInt($('#stream-container').css('max-height').replace(/[^-\d.]/g, '')); STUDIP.ActivityFeed.loadFeed(STUDIP.ActivityFeed.filter); - $('#stream-container').scroll(function () { - var scrollBottom = $('#stream-container').scrollTop() + $('#stream-container').height() + 250; + $('#stream-container').scroll(() => { + const scrollBottom = $('#stream-container').scrollTop() + $('#stream-container').height() + 250; if ($('#stream-container').prop('scrollHeight') < scrollBottom) { STUDIP.ActivityFeed.loadFeed(STUDIP.ActivityFeed.filter); @@ -23,7 +23,7 @@ const ActivityFeed = { $(document).on('click', '.provider_circle', function () { $(this).parent().parent().children('.activity-content').toggle(); }).on('click', '#toggle-all-activities,#toggle-user-activities', function () { - var toggled = $(this).is(':not(.toggled)'); + const toggled = $(this).is(':not(.toggled)'); $(this).toggleClass('toggled', toggled); STUDIP.ActivityFeed.setToggleStatus(); @@ -32,11 +32,11 @@ const ActivityFeed = { }); }, - getTemplate: _.memoize(function(name) { - return _.template($("script." + name).html()); + getTemplate: _.memoize(name => { + return _.template($(`script.${name}`).html()); }), - loadFeed: function(filtertype) { + loadFeed(filtertype) { if (STUDIP.ActivityFeed.user_id === null) { console.log('Could not retrieve activities, no valid user id found!'); return false; @@ -48,17 +48,18 @@ const ActivityFeed = { STUDIP.ActivityFeed.polling = true; - STUDIP.api.GET(['user', STUDIP.ActivityFeed.user_id, 'activitystream'], { - data: { - filtertype: JSON.stringify(filtertype), - scrollfrom: STUDIP.ActivityFeed.scrolledfrom - } - }).done(function (activities) { - var stream = STUDIP.ActivityFeed.getTemplate('activity_stream'); - var activity = STUDIP.ActivityFeed.getTemplate('activity'); - var activity_urls = STUDIP.ActivityFeed.getTemplate('activity-urls'); - var num_entries = Object.keys(activities).length; - var lastelem = $(activities).last(); + const url = STUDIP.URLHelper.getURL('dispatch.php/activityfeed/load', { + filtertype: JSON.stringify(filtertype), + scrollfrom: STUDIP.ActivityFeed.scrolledfrom, + }); + fetch(url).then( + response => response.json(), + ).then(activities => { + const stream = STUDIP.ActivityFeed.getTemplate('activity_stream'); + const activity = STUDIP.ActivityFeed.getTemplate('activity'); + const activity_urls = STUDIP.ActivityFeed.getTemplate('activity-urls'); + const num_entries = Object.keys(activities).length; + const lastelem = $(activities).last(); if (lastelem[0]) { STUDIP.ActivityFeed.scrolledfrom = lastelem[0].mkdate; @@ -79,15 +80,15 @@ const ActivityFeed = { if ($('#stream-container').height() < STUDIP.ActivityFeed.maxheight) { STUDIP.ActivityFeed.loadFeed(''); } - }).fail(function () { - var template = STUDIP.ActivityFeed.getTemplate('activity-load-error'); + }).catch(() => { + const template = STUDIP.ActivityFeed.getTemplate('activity-load-error'); STUDIP.ActivityFeed.writeToStream(template()); - }).always(function () { + }).finally(() => { STUDIP.ActivityFeed.polling = false; }); }, - writeToStream: function (html) { + writeToStream(html) { if (STUDIP.ActivityFeed.initial) { // replace data in DOM $('#stream-container').html(''); @@ -98,9 +99,9 @@ const ActivityFeed = { $('#stream-container').append(html); }, - setToggleStatus: function() { - var show_details = $('#toggle-all-activities').is('.toggled'), - show_own = $('#toggle-user-activities').is('.toggled'); + setToggleStatus() { + const show_details = $('#toggle-all-activities').is('.toggled'); + const show_own = $('#toggle-user-activities').is('.toggled'); // update toggle status fir activity contents $('.activity-content').toggle(show_details); @@ -109,7 +110,7 @@ const ActivityFeed = { $('.activity:has(.provider_circle.right)').toggle(show_own); }, - updateFilter: function(filter) { + updateFilter(filter) { STUDIP.ActivityFeed.filter = filter; STUDIP.ActivityFeed.initial = true; STUDIP.ActivityFeed.scrolledfrom = Math.floor(Date.now() / 1000); diff --git a/resources/assets/javascripts/lib/fullcalendar.js b/resources/assets/javascripts/lib/fullcalendar.js index 3b8fa11050da3577fa30ac52f5bc3907fe3c811d..5b7d03259e0fe5f59ea0e076b3bda9aa6af1b1d6 100644 --- a/resources/assets/javascripts/lib/fullcalendar.js +++ b/resources/assets/javascripts/lib/fullcalendar.js @@ -622,8 +622,13 @@ class Fullcalendar $('.fc-slats tr:odd .fc-widget-content:not(.fc-axis)').remove(); } - STUDIP.api.GET(`semester/${timestamp}/week`).done((data) => { + if (document.getElementById('booking-plan-header-semname') === null) { + return; + } + $.getJSON( + STUDIP.URLHelper.getURL(`dispatch.php/resources/ajax/semester_week/${timestamp}`) + ).done((data) => { if (data) { $('#booking-plan-header-semname').text(data.semester_name); if (data.sem_week) { @@ -640,7 +645,7 @@ class Fullcalendar $('#booking-plan-header-semrow').hide(); $('#booking-plan-header-semweek-part').hide(); } - }) + }); }, resourceRender (renderInfo) { if ($(renderInfo.view.context.calendar.el).hasClass('room-group-booking-plan')) { diff --git a/resources/assets/javascripts/lib/resources.js b/resources/assets/javascripts/lib/resources.js index 3287b42d6af4d01ec84ec74f901237c71b728bb4..6ff41561518e25273e953470c81c08cbb711a914 100644 --- a/resources/assets/javascripts/lib/resources.js +++ b/resources/assets/javascripts/lib/resources.js @@ -50,7 +50,7 @@ class Resources jQuery(row_tds[user_td_index]).children('input').removeAttr('disabled'); if (username) { - jQuery(row_tds[user_td_index]).append(username); + jQuery('<span>').text(username).appendTo(row_tds[user_td_index]); } else { jQuery(row_tds[user_td_index]).append('ID ' + user_id); } @@ -60,8 +60,6 @@ class Resources } jQuery(user_id_input).val(user_id); - var perm_select = jQuery(row_tds[user_td_index + 1]).children()[0]; - if (temp_perms_row) { //Set the time input fields to useful values: @@ -134,22 +132,19 @@ class Resources jQuery(table_element).trigger('update'); }; - STUDIP.api.GET( - `user/${user_id}` - ).done(function (data) { - var username = data.name.family - + ', ' - + data.name.given; - if (data.name.prefix) { - username += ', ' + data.name.prefix; + STUDIP.jsonapi.GET(`users/${user_id}`).done(data => { + const attributes = data.data.attributes; + + let username = `${attributes['family-name']}, ${attributes['given-name']}`; + if (attributes['name-prefix']) { + username += `, ${attributes['name-prefix']}`; } - if (data.name.suffix) { - username += ' ' + data.name.suffix; + if (attributes['name-suffix']) { + username += ` ${attributes['name-suffix']}`; } - username += ' (' + data.name.username + ')' - + ' (' + data.perms + ')'; + username += ` (${attributes.username}) (${attributes.permission})`; insert_function(user_id, username); - }).fail(function () { + }).fail(() => { insert_function(user_id); }); } @@ -160,23 +155,13 @@ class Resources return; } - STUDIP.api.GET( - `course/${course_id}/members`, - { - data: { - //The limit '0' results in a division by zero. - //Hopefully, the limit is set to a value high enough: - limit: 1000000 - } - } - ).done(function (data) { - for (var attribute in data.collection) { - var user_id = data.collection[attribute].member.id; + STUDIP.jsonapi.GET(`courses/${course_id}/memberships`, {data: {page: {limit: 1000000}}}).done(data => { + data.data.forEach(membership => { STUDIP.Resources.addUserToPermissionList( - user_id, + membership.relationships.user.data.id, table_element ); - } + }); }); } diff --git a/resources/assets/javascripts/lib/restapi.js b/resources/assets/javascripts/lib/restapi.js deleted file mode 100644 index b6e31dff997fea3150ec26a6325acd7cae0e8403..0000000000000000000000000000000000000000 --- a/resources/assets/javascripts/lib/restapi.js +++ /dev/null @@ -1,12 +0,0 @@ -import AbstractAPI from './abstract-api.js'; - -// Actual RESTAPI object -class RESTAPI extends AbstractAPI -{ - constructor() { - super('api.php'); - } -} - -export default RESTAPI; -export const api = new RESTAPI(); diff --git a/vendor/oauth-php/LICENSE b/vendor/oauth-php/LICENSE deleted file mode 100644 index fbdcc373b22926c60a1cae7439339a0bee92f2fb..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License - -Copyright (c) 2007-2009 Mediamatic Lab -Copyright (c) 2010 Corollarium Technologies - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/vendor/oauth-php/README b/vendor/oauth-php/README deleted file mode 100644 index ecd68156383a37218ac3a611d8c24b787ca1dab1..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/README +++ /dev/null @@ -1 +0,0 @@ -Please see http://code.google.com/p/oauth-php/ for documentation and help. diff --git a/vendor/oauth-php/example/client/googledocs.php b/vendor/oauth-php/example/client/googledocs.php deleted file mode 100644 index 45d66ccc1517dfe8874a6a8cc61e9398770734fb..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/example/client/googledocs.php +++ /dev/null @@ -1,109 +0,0 @@ -<?php - -/** - * oauth-php: Example OAuth client for accessing Google Docs - * - * @author BBG - * - * - * The MIT License - * - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - - -include_once "../../library/OAuthStore.php"; -include_once "../../library/OAuthRequester.php"; - -define("GOOGLE_CONSUMER_KEY", "FILL THIS"); // -define("GOOGLE_CONSUMER_SECRET", "FILL THIS"); // - -define("GOOGLE_OAUTH_HOST", "https://www.google.com"); -define("GOOGLE_REQUEST_TOKEN_URL", GOOGLE_OAUTH_HOST . "/accounts/OAuthGetRequestToken"); -define("GOOGLE_AUTHORIZE_URL", GOOGLE_OAUTH_HOST . "/accounts/OAuthAuthorizeToken"); -define("GOOGLE_ACCESS_TOKEN_URL", GOOGLE_OAUTH_HOST . "/accounts/OAuthGetAccessToken"); - -define('OAUTH_TMP_DIR', function_exists('sys_get_temp_dir') ? sys_get_temp_dir() : realpath($_ENV["TMP"])); - -// Init the OAuthStore -$options = array( - 'consumer_key' => GOOGLE_CONSUMER_KEY, - 'consumer_secret' => GOOGLE_CONSUMER_SECRET, - 'server_uri' => GOOGLE_OAUTH_HOST, - 'request_token_uri' => GOOGLE_REQUEST_TOKEN_URL, - 'authorize_uri' => GOOGLE_AUTHORIZE_URL, - 'access_token_uri' => GOOGLE_ACCESS_TOKEN_URL -); -// Note: do not use "Session" storage in production. Prefer a database -// storage, such as MySQL. -OAuthStore::instance("Session", $options); - -try -{ - // STEP 1: If we do not have an OAuth token yet, go get one - if (empty($_GET["oauth_token"])) - { - $getAuthTokenParams = array('scope' => - 'http://docs.google.com/feeds/', - 'xoauth_displayname' => 'Oauth test', - 'oauth_callback' => 'XXXXXXXXXXX'); - - // get a request token - $tokenResultParams = OAuthRequester::requestRequestToken(GOOGLE_CONSUMER_KEY, 0, $getAuthTokenParams); - - // redirect to the google authorization page, they will redirect back - header("Location: " . GOOGLE_AUTHORIZE_URL . "?btmpl=mobile&oauth_token=" . $tokenResultParams['token']); - } - else { - // STEP 2: Get an access token - $oauthToken = $_GET["oauth_token"]; - - // echo "oauth_verifier = '" . $oauthVerifier . "'<br/>"; - $tokenResultParams = $_GET; - - try { - OAuthRequester::requestAccessToken(GOOGLE_CONSUMER_KEY, $oauthToken, 0, 'POST', $_GET); - } - catch (OAuthException2 $e) - { - var_dump($e); - // Something wrong with the oauth_token. - // Could be: - // 1. Was already ok - // 2. We were not authorized - return; - } - - // make the docs requestrequest. - $request = new OAuthRequester("http://docs.google.com/feeds/documents/private/full", 'GET', $tokenResultParams); - $result = $request->doRequest(0); - if ($result['code'] == 200) { - var_dump($result['body']); - } - else { - echo 'Error'; - } - } -} -catch(OAuthException2 $e) { - echo "OAuthException: " . $e->getMessage(); - var_dump($e); -} -?> \ No newline at end of file diff --git a/vendor/oauth-php/example/client/opera.php b/vendor/oauth-php/example/client/opera.php deleted file mode 100644 index d881c98ec7dcfa9e9a4905c6b683ad34d0ca9087..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/example/client/opera.php +++ /dev/null @@ -1,125 +0,0 @@ -<?php - -/** - * oauth-php: Example OAuth client for accessing my opera - * - * @author Ryan - * - * - * The MIT License - * - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * Request your consumer key/secret here: - * http://auth.opera.com/service/oauth/applications/ - * Make sure to set the Application callback URL - * - * To make this example work change the following files - * - * OAuthRequestSigner.php // Opera oAuth doesn't accept twice encoded signature - * $this->setParam('oauth_signature', $signature, true); - * to: - * $this->setParam('oauth_signature', urldecode($signature), true); - */ - -include_once "../../library/OAuthStore.php"; -include_once "../../library/OAuthRequester.php"; - -define("OPERA_CONSUMER_KEY", "---"); -define("OPERA_CONSUMER_SECRET", "---"); - -define("OPERA_REQUEST_TOKEN_URL", "https://auth.opera.com/service/oauth/request_token"); -define("OPERA_AUTHORIZE_URL", "https://auth.opera.com/service/oauth/authorize"); -define("OPERA_ACCESS_TOKEN_URL", "https://auth.opera.com/service/oauth/access_token"); - -define('OAUTH_TMP_DIR', function_exists('sys_get_temp_dir') ? sys_get_temp_dir() : realpath($_ENV["TMP"])); - -// Start the session -session_start(); - -// Init the OAuthStore -$options = array( - 'consumer_key' => OPERA_CONSUMER_KEY, - 'consumer_secret' => OPERA_CONSUMER_SECRET, - 'server_uri' => 'http://my.opera.com/community/api/', - 'request_token_uri' => OPERA_REQUEST_TOKEN_URL, - 'authorize_uri' => OPERA_AUTHORIZE_URL, - 'access_token_uri' => OPERA_ACCESS_TOKEN_URL -); -// Note: do not use "Session" storage in production. Prefer a database -// storage, such as MySQL. -OAuthStore::instance("Session", $options); - -try -{ - // STEP 1: If we do not have an OAuth token yet, go get one - if (empty($_GET["oauth_verifier"])) - { - $getAuthTokenParams = array( - 'oauth_callback'=>'oob' - ); - $options = array ( - 'oauth_as_header' => false - ); - - // get a request token - $tokenResultParams = OAuthRequester::requestRequestToken(OPERA_CONSUMER_KEY, 0, $getAuthTokenParams, 'POST', $options); - $_SESSION['oauth_token'] = $tokenResultParams['token']; - - // redirect to the opera authorization page, they will redirect back - header("Location: " . OPERA_AUTHORIZE_URL . "?oauth_token=" . $tokenResultParams['token']); - } - else { - // STEP 2: Get an access token - try { - OAuthRequester::requestAccessToken(OPERA_CONSUMER_KEY, $_SESSION['oauth_token'], 0, 'POST', $options=array( - 'oauth_verifier'=>$_GET['oauth_verifier'] - )); - } - catch (OAuthException2 $e) - { - var_dump($e); - // Something wrong with the oauth_token. - // Could be: - // 1. Was already ok - // 2. We were not authorized - return; - } - - // make the docs requestrequest. - $request = new OAuthRequester("http://my.opera.com/community/api/users/status.pl", 'GET'); - $result = $request->doRequest(0,array( - CURLOPT_HTTPHEADER=>array( - 'Accept: application/json', - ), - )); - if ($result['code'] == 200) { - var_dump($result['body']); - } - else { - echo 'Error'; - } - } -} -catch(OAuthException2 $e) { - echo "OAuthException: " . $e->getMessage(); - var_dump($e); -} -?> diff --git a/vendor/oauth-php/example/client/twolegged.php b/vendor/oauth-php/example/client/twolegged.php deleted file mode 100644 index a22c4fdae148563e1ea513c522ff602323896006..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/example/client/twolegged.php +++ /dev/null @@ -1,67 +0,0 @@ -<?php - -/** - * oauth-php: Example OAuth client - * - * Performs simple 2-legged authentication - * - * @author Ben Hesketh - * - * - * The MIT License - * - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - - -include_once "../../library/OAuthStore.php"; -include_once "../../library/OAuthRequester.php"; - -// Test of the OAuthStore2Leg - -$key = '???????'; // fill with your public key -$secret = '????????'; // fill with your secret key -$url = "?????????"; // fill with the url for the oauth service - -$options = array('consumer_key' => $key, 'consumer_secret' => $secret); -OAuthStore::instance("2Leg", $options); - -$method = "GET"; -$params = null; - -try -{ - // Obtain a request object for the request we want to make - $request = new OAuthRequester($url, $method, $params); - - // Sign the request, perform a curl request and return the results, - // throws OAuthException2 exception on an error - // $result is an array of the form: array ('code'=>int, 'headers'=>array(), 'body'=>string) - $result = $request->doRequest(); - - $response = $result['body']; - var_dump($response); -} -catch(OAuthException2 $e) -{ - echo "Exception"; -} - -?> diff --git a/vendor/oauth-php/example/client/twoleggedtest.php b/vendor/oauth-php/example/client/twoleggedtest.php deleted file mode 100644 index 0fc866b07d3d46eb87026ff641994ddb968b2490..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/example/client/twoleggedtest.php +++ /dev/null @@ -1,78 +0,0 @@ -<?php - -/** - * oauth-php: Example OAuth client - * - * Performs simple 2-legged authentication - * - * @author Ben Hesketh - * - * - * The MIT License - * - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - - -include_once "../../library/OAuthStore.php"; -include_once "../../library/OAuthRequester.php"; - -// Test of the OAuthStore2Leg -// uses http://term.ie/oauth/example/ - -$key = 'key'; // fill with your public key -$secret = 'secret'; // fill with your secret key -$url = "http://term.ie/oauth/example/request_token.php"; // fill with the url for the oauth service - -$options = array('consumer_key' => $key, 'consumer_secret' => $secret); -OAuthStore::instance("2Leg", $options); - -$method = "GET"; -$params = null; - -try -{ - // Obtain a request object for the request we want to make - $request = new OAuthRequester($url, $method, $params); - - // Sign the request, perform a curl request and return the results, - // throws OAuthException2 exception on an error - // $result is an array of the form: array ('code'=>int, 'headers'=>array(), 'body'=>string) - $result = $request->doRequest(); - - $response = $result['body']; - - if ($response != 'oauth_token=requestkey&oauth_token_secret=requestsecret') - { - echo 'Error! $response ' . $response; - } - else - { - } - - - var_dump($response); -} -catch(OAuthException2 $e) -{ - echo "Exception" . $e->getMessage(); -} - -?> diff --git a/vendor/oauth-php/example/client/twoleggedtwitter.php b/vendor/oauth-php/example/client/twoleggedtwitter.php deleted file mode 100644 index 871c2a4cdeb1c12823ede18e37163a925f9db333..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/example/client/twoleggedtwitter.php +++ /dev/null @@ -1,67 +0,0 @@ -<?php - -/** - * oauth-php: Example OAuth client - * - * Performs simple 2-legged authentication - * - * The MIT License - * - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - - -include_once "../../library/OAuthStore.php"; -include_once "../../library/OAuthRequester.php"; - -// register at http://twitter.com/oauth_clients and fill these two -define("TWITTER_CONSUMER_KEY", "FILL THIS"); -define("TWITTER_CONSUMER_SECRET", "FILL THIS"); - -define("TWITTER_OAUTH_HOST","https://twitter.com"); -define("TWITTER_REQUEST_TOKEN_URL", TWITTER_OAUTH_HOST . "/oauth/request_token"); -define("TWITTER_AUTHORIZE_URL", TWITTER_OAUTH_HOST . "/oauth/authorize"); -define("TWITTER_ACCESS_TOKEN_URL", TWITTER_OAUTH_HOST . "/oauth/access_token"); -define("TWITTER_PUBLIC_TIMELINE_API", TWITTER_OAUTH_HOST . "/statuses/public_timeline.json"); -define("TWITTER_UPDATE_STATUS_API", TWITTER_OAUTH_HOST . "/statuses/update.json"); - -define('OAUTH_TMP_DIR', function_exists('sys_get_temp_dir') ? sys_get_temp_dir() : realpath($_ENV["TMP"])); - -// Twitter test -$options = array('consumer_key' => TWITTER_CONSUMER_KEY, 'consumer_secret' => TWITTER_CONSUMER_SECRET); -OAuthStore::instance("2Leg", $options); - -try -{ - // Obtain a request object for the request we want to make - $request = new OAuthRequester(TWITTER_REQUEST_TOKEN_URL, "POST"); - $result = $request->doRequest(0); - parse_str($result['body'], $params); - - // now make the request. - $request = new OAuthRequester(TWITTER_PUBLIC_TIMELINE_API, 'GET', $params); - $result = $request->doRequest(); -} -catch(OAuthException2 $e) -{ - echo "Exception" . $e->getMessage(); -} - -?> \ No newline at end of file diff --git a/vendor/oauth-php/example/server/INSTALL b/vendor/oauth-php/example/server/INSTALL deleted file mode 100644 index 249c85e9dad5e0b3d0994c2c508bb47b2c1df21c..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/example/server/INSTALL +++ /dev/null @@ -1,53 +0,0 @@ -In this example I assume that oauth-php lives in /home/john/src/oauth-php - - -1) Create a virtual host and set the DB_DSN VARIABLE to the DSN of your (mysql) database. - -Example -<VirtualHost *> - ServerAdmin admin@localhost - ServerName hello.local - DocumentRoot /home/john/src/oauth-php/example/server/www - - UseCanonicalName Off - ServerSignature On - - SetEnv DB_DSN mysql://foo:bar@localhost/oauth_example_server_db - - <Directory "home/john/src/oauth-php/example/server/www"> - Options Indexes FollowSymLinks MultiViews - AllowOverride None - Order allow,deny - Allow from all - - <IfModule mod_php5.c> - php_value magic_quotes_gpc 0 - php_value register_globals 0 - php_value session.auto_start 0 - </IfModule> - - </Directory> -</VirtualHost> - - -2) Create the database structure for the server: - -# mysql -u foo -p bar -h localhost < /home/john/src/oauth-php/library/store/mysql/mysql.sql - - - -3) Download and install smarty into the smarty/core/smarty directory: - -# cd /home/john/src/oauth-php/example/server/core -# wget 'http://www.smarty.net/do_download.php?download_file=Smarty-2.6.19.tar.gz' -# tar zxf Smarty-2.6.19.tar.gz -# mv Smarty-2.6.19 smarty - - -4) That's it! Point your browser to - - http://hello.local/ - -To get started. - -Arjan Scherpenisse <arjan@mediamatic.nl>, July 2008 diff --git a/vendor/oauth-php/example/server/core/init.php b/vendor/oauth-php/example/server/core/init.php deleted file mode 100644 index 82c65db04c3332f9ac4ed0dfc23b05108ba6c7d6..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/example/server/core/init.php +++ /dev/null @@ -1,128 +0,0 @@ -<?php - -/** - * oauth-php: Example OAuth server - * - * Global initialization file for the server, defines some helper - * functions, required includes, and starts the session. - * - * @author Arjan Scherpenisse <arjan@scherpenisse.net> - * - * - * The MIT License - * - * Copyright (c) 2007-2008 Mediamatic Lab - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - - -/* - * Simple 'user management' - */ -define ('USERNAME', 'sysadmin'); -define ('PASSWORD', 'sysadmin'); - - -/* - * Always announce XRDS OAuth discovery - */ -header('X-XRDS-Location: http://' . $_SERVER['SERVER_NAME'] . '/services.xrds'); - - -/* - * Initialize the database connection - */ -$info = parse_url(getenv('DB_DSN')); -($GLOBALS['db_conn'] = mysql_connect($info['host'], $info['user'], $info['pass'])) || die(mysql_error()); -mysql_select_db(basename($info['path']), $GLOBALS['db_conn']) || die(mysql_error()); -unset($info); - - -require_once '../../../library/OAuthServer.php'; - -/* - * Initialize OAuth store - */ -require_once '../../../library/OAuthStore.php'; -OAuthStore::instance('MySQL', array('conn' => $GLOBALS['db_conn'])); - - -/* - * Session - */ -session_start(); - - -/* - * Template handling - */ -require_once 'smarty/libs/Smarty.class.php'; -function session_smarty() -{ - if (!isset($GLOBALS['smarty'])) - { - $GLOBALS['smarty'] = new Smarty; - $GLOBALS['smarty']->template_dir = dirname(__FILE__) . '/templates/'; - $GLOBALS['smarty']->compile_dir = dirname(__FILE__) . '/../cache/templates_c'; - } - - return $GLOBALS['smarty']; -} - -function assert_logged_in() -{ - if (empty($_SESSION['authorized'])) - { - $uri = $_SERVER['REQUEST_URI']; - header('Location: /logon?goto=' . urlencode($uri)); - exit(); - } -} - -function assert_request_vars() -{ - foreach(func_get_args() as $a) - { - if (!isset($_REQUEST[$a])) - { - header('HTTP/1.1 400 Bad Request'); - echo 'Bad request.'; - exit; - } - } -} - -function assert_request_vars_all() -{ - foreach($_REQUEST as $row) - { - foreach(func_get_args() as $a) - { - if (!isset($row[$a])) - { - header('HTTP/1.1 400 Bad Request'); - echo 'Bad request.'; - exit; - } - } - } -} - -?> \ No newline at end of file diff --git a/vendor/oauth-php/example/server/core/templates/inc/footer.tpl b/vendor/oauth-php/example/server/core/templates/inc/footer.tpl deleted file mode 100644 index 308b1d01b6ca1e7ab1b1fa896e6a8497bbcd1a37..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/example/server/core/templates/inc/footer.tpl +++ /dev/null @@ -1,2 +0,0 @@ -</body> -</html> diff --git a/vendor/oauth-php/example/server/core/templates/inc/header.tpl b/vendor/oauth-php/example/server/core/templates/inc/header.tpl deleted file mode 100644 index 5046f54b0e8c5dd0cb435d6894368a4417ecac2d..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/example/server/core/templates/inc/header.tpl +++ /dev/null @@ -1,2 +0,0 @@ -<html> - <body> diff --git a/vendor/oauth-php/example/server/core/templates/index.tpl b/vendor/oauth-php/example/server/core/templates/index.tpl deleted file mode 100644 index 7b065537db41017d45a3bb76de61a559596e5ebb..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/example/server/core/templates/index.tpl +++ /dev/null @@ -1,13 +0,0 @@ -{include file='inc/header.tpl'} - -<h1>OAuth server</h1> -Go to: - -<ul> - <li><a href="/logon">Logon</a></li> - <li><a href="/register">Register your consumer</a></li> -</ul> - -Afterwards, make an OAuth test request to <strong>http://{$smarty.server.name}/hello</strong> to test your connection.</p> - -{include file='inc/footer.tpl'} diff --git a/vendor/oauth-php/example/server/core/templates/logon.tpl b/vendor/oauth-php/example/server/core/templates/logon.tpl deleted file mode 100644 index 5ccd432b56f56f3e67a0c3418ab5b3a65a267bfd..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/example/server/core/templates/logon.tpl +++ /dev/null @@ -1,21 +0,0 @@ -{include file='inc/header.tpl'} - -<h1>Login</h1> - -<form method="post"> - <input type="hidden" name="goto" value="{$smarty.request.goto}" /> - - <label for="username">User name</label><br /> - <input type="text" name="username" id="username" /> - - <br /><br /> - - <label for="password">Password</label><br /> - <input type="text" name="password" id="password" /> - - <br /><br /> - - <input type="submit" value="Login" /> -</form> - -{include file='inc/footer.tpl'} diff --git a/vendor/oauth-php/example/server/core/templates/register.tpl b/vendor/oauth-php/example/server/core/templates/register.tpl deleted file mode 100644 index 0e28c15841c85dc46784d44ff494d9b69e0201c7..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/example/server/core/templates/register.tpl +++ /dev/null @@ -1,41 +0,0 @@ -{include file='inc/header.tpl'} - -<h1>Register server</h1> - -<p>Register a server which is gonna act as an identity client.</p> - -<form method="post"> - - <fieldset> - <legend>About You</legend> - - <p> - <label for="requester_name">Your name</label><br/> - <input class="text" id="requester_name" name="requester_name" type="text" value="{$consumer.requester_name|default:$smarty.request.requester_name|escape}" /> - </p> - - <p> - <label for="requester_email">Your email address</label><br/> - <input class="text" id="requester_email" name="requester_email" type="text" value="{$consumer.requester_email|default:$smarty.request.requester_email|escape}" /> - </p> - </fieldset> - - <fieldset> - <legend>Location Of Your Application Or Site</legend> - - <p> - <label for="application_uri">URL of your application or site</label><br/> - <input id="application_uri" class="text" name="application_uri" type="text" value="{$consumer.application_uri|default:$smarty.request.application_uri|escape}" /> - </p> - - <p> - <label for="callback_uri">Callback URL</label><br/> - <input id="callback_uri" class="text" name="callback_uri" type="text" value="{$consumer.callback_uri|default:$smarty.request.callback_uri|escape}" /> - </p> - </fieldset> - - <br /> - <input type="submit" value="Register server" /> -</form> - -{include file='inc/footer.tpl'} diff --git a/vendor/oauth-php/example/server/www/hello.php b/vendor/oauth-php/example/server/www/hello.php deleted file mode 100644 index 12526a92c2dea084af686263a6705100e3e58280..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/example/server/www/hello.php +++ /dev/null @@ -1,65 +0,0 @@ -<?php - -/** - * oauth-php: Example OAuth server - * - * An example service, http://hostname/hello. You will only get the - * 'Hello, world!' string back if you have signed your request with - * oauth. - * - * @author Arjan Scherpenisse <arjan@scherpenisse.net> - * - * - * The MIT License - * - * Copyright (c) 2007-2008 Mediamatic Lab - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -require_once '../core/init.php'; - -$authorized = false; -$server = new OAuthServer(); -try -{ - if ($server->verifyIfSigned()) - { - $authorized = true; - } -} -catch (OAuthException2 $e) -{ -} - -if (!$authorized) -{ - header('HTTP/1.1 401 Unauthorized'); - header('Content-Type: text/plain'); - - echo "OAuth Verification Failed: " . $e->getMessage(); - die; -} - -// From here on we are authenticated with OAuth. - -header('Content-type: text/plain'); -echo 'Hello, world!'; - -?> \ No newline at end of file diff --git a/vendor/oauth-php/example/server/www/index.php b/vendor/oauth-php/example/server/www/index.php deleted file mode 100644 index f5cadbe61f13399fadff7b643d0600ee28b6c0c0..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/example/server/www/index.php +++ /dev/null @@ -1,37 +0,0 @@ -<?php - -/** - * oauth-php: Example OAuth server - * - * @author Arjan Scherpenisse <arjan@scherpenisse.net> - * - * - * The MIT License - * - * Copyright (c) 2007-2008 Mediamatic Lab - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -require '../core/init.php'; - -$smarty = session_smarty(); -$smarty->display('index.tpl'); - -?> diff --git a/vendor/oauth-php/example/server/www/logon.php b/vendor/oauth-php/example/server/www/logon.php deleted file mode 100644 index 5c937b719bc8acebc47a82737b75b73745fcf07f..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/example/server/www/logon.php +++ /dev/null @@ -1,55 +0,0 @@ -<?php - -/** - * oauth-php: Example OAuth server - * - * Simple logon for consumer registration at this server. - * - * @author Arjan Scherpenisse <arjan@scherpenisse.net> - * - * - * The MIT License - * - * Copyright (c) 2007-2008 Mediamatic Lab - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -require_once '../core/init.php'; - -if (isset($_POST['username']) && isset($_POST['password'])) -{ - if ($_POST['username'] == USERNAME && $_POST['password'] == PASSWORD) - { - $_SESSION['authorized'] = true; - if (!empty($_REQUEST['goto'])) - { - header('Location: ' . $_REQUEST['goto']); - die; - } - - echo "Logon succesfull."; - die; - } -} - -$smarty = session_smarty(); -$smarty->display('logon.tpl'); - -?> \ No newline at end of file diff --git a/vendor/oauth-php/example/server/www/oauth.php b/vendor/oauth-php/example/server/www/oauth.php deleted file mode 100644 index 6dafd61bd008fa867e000511214d3c14fe692783..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/example/server/www/oauth.php +++ /dev/null @@ -1,77 +0,0 @@ -<?php - -/** - * oauth-php: Example OAuth server - * - * This file implements the OAuth server endpoints. The most basic - * implementation of an OAuth server. - * - * Call with: /oauth/request_token, /oauth/authorize, /oauth/access_token - * - * @author Arjan Scherpenisse <arjan@scherpenisse.net> - * - * - * The MIT License - * - * Copyright (c) 2007-2008 Mediamatic Lab - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -require_once '../core/init.php'; - -$server = new OAuthServer(); - -switch($_SERVER['PATH_INFO']) -{ -case '/request_token': - $server->requestToken(); - exit; - -case '/access_token': - $server->accessToken(); - exit; - -case '/authorize': - # logon - - assert_logged_in(); - - try - { - $server->authorizeVerify(); - $server->authorizeFinish(true, 1); - } - catch (OAuthException2 $e) - { - header('HTTP/1.1 400 Bad Request'); - header('Content-Type: text/plain'); - - echo "Failed OAuth Request: " . $e->getMessage(); - } - exit; - - -default: - header('HTTP/1.1 500 Internal Server Error'); - header('Content-Type: text/plain'); - echo "Unknown request"; -} - -?> \ No newline at end of file diff --git a/vendor/oauth-php/example/server/www/register.php b/vendor/oauth-php/example/server/www/register.php deleted file mode 100644 index 0a74297b204530ac055d3c97da7107d0f5b01382..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/example/server/www/register.php +++ /dev/null @@ -1,29 +0,0 @@ -<?php - -require_once '../core/init.php'; - -assert_logged_in(); - -if ($_SERVER['REQUEST_METHOD'] == 'POST') -{ - try - { - $store = OAuthStore::instance(); - $user_id = 1; // this should not be hardcoded, of course - $key = $store->updateConsumer($_POST, $user_id, true); - - $c = $store->getConsumer($key, $user_id); - echo 'Your consumer key is: <strong>' . $c['consumer_key'] . '</strong><br />'; - echo 'Your consumer secret is: <strong>' . $c['consumer_secret'] . '</strong><br />'; - } - catch (OAuthException2 $e) - { - echo '<strong>Error: ' . $e->getMessage() . '</strong><br />'; - } -} - - -$smarty = session_smarty(); -$smarty->display('register.tpl'); - -?> \ No newline at end of file diff --git a/vendor/oauth-php/example/server/www/services.xrds.php b/vendor/oauth-php/example/server/www/services.xrds.php deleted file mode 100644 index 0f4bbac797765f201347b8024545b98fc481dbed..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/example/server/www/services.xrds.php +++ /dev/null @@ -1,71 +0,0 @@ -<?php - -/** - * oauth-php: Example OAuth server - * - * XRDS discovery for OAuth. This file helps the consumer program to - * discover where the OAuth endpoints for this server are. - * - * @author Arjan Scherpenisse <arjan@scherpenisse.net> - * - * - * The MIT License - * - * Copyright (c) 2007-2008 Mediamatic Lab - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -header('Content-Type: application/xrds+xml'); - -$server = $_SERVER['SERVER_NAME']; - -echo '<?xml version="1.0" encoding="utf-8"?>' . "\n"; - -?> -<XRDS xmlns="xri://$xrds"> - <XRD xmlns:simple="http://xrds-simple.net/core/1.0" xmlns="xri://$XRD*($v*2.0)" xmlns:openid="http://openid.net/xmlns/1.0" version="2.0" xml:id="main"> - <Type>xri://$xrds*simple</Type> - <Service> - <Type>http://oauth.net/discovery/1.0</Type> - <URI>#main</URI> - </Service> - <Service> - <Type>http://oauth.net/core/1.0/endpoint/request</Type> - <Type>http://oauth.net/core/1.0/parameters/auth-header</Type> - <Type>http://oauth.net/core/1.0/parameters/uri-query</Type> - <Type>http://oauth.net/core/1.0/signature/HMAC-SHA1</Type> - <Type>http://oauth.net/core/1.0/signature/PLAINTEXT</Type> - <URI>http://<?php echo $server; ?>/oauth/request_token</URI> - </Service> - <Service> - <Type>http://oauth.net/core/1.0/endpoint/authorize</Type> - <Type>http://oauth.net/core/1.0/parameters/uri-query</Type> - <URI>http://<?php echo $server; ?>/oauth/authorize</URI> - </Service> - <Service> - <Type>http://oauth.net/core/1.0/endpoint/access</Type> - <Type>http://oauth.net/core/1.0/parameters/auth-header</Type> - <Type>http://oauth.net/core/1.0/parameters/uri-query</Type> - <Type>http://oauth.net/core/1.0/signature/HMAC-SHA1</Type> - <Type>http://oauth.net/core/1.0/signature/PLAINTEXT</Type> - <URI>http://<?php echo $server; ?>/oauth/access_token</URI> - </Service> - </XRD> -</XRDS> diff --git a/vendor/oauth-php/library/OAuthDiscovery.php b/vendor/oauth-php/library/OAuthDiscovery.php deleted file mode 100644 index 8eee11877b11be0d2b29aeb055337aebd6fc2ced..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/OAuthDiscovery.php +++ /dev/null @@ -1,227 +0,0 @@ -<?php - -/** - * Handle the discovery of OAuth service provider endpoints and static consumer identity. - * - * @version $Id$ - * @author Marc Worrell <marcw@pobox.com> - * @date Sep 4, 2008 5:05:19 PM - * - * The MIT License - * - * Copyright (c) 2007-2008 Mediamatic Lab - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -require_once dirname(__FILE__).'/discovery/xrds_parse.php'; - -require_once dirname(__FILE__).'/OAuthException2.php'; -require_once dirname(__FILE__).'/OAuthRequestLogger.php'; - - -class OAuthDiscovery -{ - /** - * Return a description how we can do a consumer allocation. Prefers static allocation if - * possible. If static allocation is possible - * - * See also: http://oauth.net/discovery/#consumer_identity_types - * - * @param string uri - * @return array provider description - */ - static function discover ( $uri ) - { - // See what kind of consumer allocations are available - $xrds_file = self::discoverXRDS($uri); - if (!empty($xrds_file)) - { - $xrds = xrds_parse($xrds_file); - if (empty($xrds)) - { - throw new OAuthException2('Could not discover OAuth information for '.$uri); - } - } - else - { - throw new OAuthException2('Could not discover XRDS file at '.$uri); - } - - // Fill an OAuthServer record for the uri found - $ps = parse_url($uri); - $host = isset($ps['host']) ? $ps['host'] : 'localhost'; - $server_uri = $ps['scheme'].'://'.$host.'/'; - - $p = array( - 'user_id' => null, - 'consumer_key' => '', - 'consumer_secret' => '', - 'signature_methods' => '', - 'server_uri' => $server_uri, - 'request_token_uri' => '', - 'authorize_uri' => '', - 'access_token_uri' => '' - ); - - - // Consumer identity (out of bounds or static) - if (isset($xrds['consumer_identity'])) - { - // Try to find a static consumer allocation, we like those :) - foreach ($xrds['consumer_identity'] as $ci) - { - if ($ci['method'] == 'static' && !empty($ci['consumer_key'])) - { - $p['consumer_key'] = $ci['consumer_key']; - $p['consumer_secret'] = ''; - } - else if ($ci['method'] == 'oob' && !empty($ci['uri'])) - { - // TODO: Keep this uri somewhere for the user? - $p['consumer_oob_uri'] = $ci['uri']; - } - } - } - - // The token uris - if (isset($xrds['request'][0]['uri'])) - { - $p['request_token_uri'] = $xrds['request'][0]['uri']; - if (!empty($xrds['request'][0]['signature_method'])) - { - $p['signature_methods'] = $xrds['request'][0]['signature_method']; - } - } - if (isset($xrds['authorize'][0]['uri'])) - { - $p['authorize_uri'] = $xrds['authorize'][0]['uri']; - if (!empty($xrds['authorize'][0]['signature_method'])) - { - $p['signature_methods'] = $xrds['authorize'][0]['signature_method']; - } - } - if (isset($xrds['access'][0]['uri'])) - { - $p['access_token_uri'] = $xrds['access'][0]['uri']; - if (!empty($xrds['access'][0]['signature_method'])) - { - $p['signature_methods'] = $xrds['access'][0]['signature_method']; - } - } - return $p; - } - - - /** - * Discover the XRDS file at the uri. This is a bit primitive, you should overrule - * this function so that the XRDS file can be cached for later referral. - * - * @param string uri - * @return string false when no XRDS file found - */ - static protected function discoverXRDS ( $uri, $recur = 0 ) - { - // Bail out when we are following redirects - if ($recur > 10) - { - return false; - } - - $data = self::curl($uri); - - // Check what we got back, could be: - // 1. The XRDS discovery file itself (check content-type) - // 2. The X-XRDS-Location header - - if (is_string($data) && !empty($data)) - { - list($head,$body) = explode("\r\n\r\n", $data); - $body = trim($body); - $m = false; - - // See if we got the XRDS file itself or we have to follow a location header - if ( preg_match('/^Content-Type:\s*application\/xrds+xml/im', $head) - || preg_match('/^<\?xml[^>]*\?>\s*<xrds\s/i', $body) - || preg_match('/^<xrds\s/i', $body) - ) - { - $xrds = $body; - } - else if ( preg_match('/^X-XRDS-Location:\s*([^\r\n]*)/im', $head, $m) - || preg_match('/^Location:\s*([^\r\n]*)/im', $head, $m)) - { - // Recurse to the given location - if ($uri != $m[1]) - { - $xrds = self::discoverXRDS($m[1], $recur+1); - } - else - { - // Referring to the same uri, bail out - $xrds = false; - } - } - else - { - // Not an XRDS file an nowhere else to check - $xrds = false; - } - } - else - { - $xrds = false; - } - return $xrds; - } - - - /** - * Try to fetch an XRDS file at the given location. Sends an accept header preferring the xrds file. - * - * @param string uri - * @return array (head,body), false on an error - */ - static protected function curl ( $uri ) - { - $ch = curl_init(); - - curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/xrds+xml, */*;q=0.1')); - curl_setopt($ch, CURLOPT_USERAGENT, 'anyMeta/OAuth 1.0 - (OAuth Discovery $LastChangedRevision: 45 $)'); - curl_setopt($ch, CURLOPT_URL, $uri); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_HEADER, true); - curl_setopt($ch, CURLOPT_TIMEOUT, 30); - - $txt = curl_exec($ch); - curl_close($ch); - - // Tell the logger what we requested and what we received back - $data = "GET $uri"; - OAuthRequestLogger::setSent($data, ""); - OAuthRequestLogger::setReceived($txt); - - return $txt; - } -} - - -/* vi:set ts=4 sts=4 sw=4 binary noeol: */ - -?> \ No newline at end of file diff --git a/vendor/oauth-php/library/OAuthException2.php b/vendor/oauth-php/library/OAuthException2.php deleted file mode 100644 index 30fc80e8fb92c17b9f39adb322266d885681a694..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/OAuthException2.php +++ /dev/null @@ -1,50 +0,0 @@ -<?php - -/** - * Simple exception wrapper for OAuth - * - * @version $Id: OAuthException2.php 67 2010-01-12 18:42:04Z brunobg@corollarium.com $ - * @author Marc Worrell <marcw@pobox.com> - * @date Nov 29, 2007 5:33:54 PM - * - * The MIT License - * - * Copyright (c) 2007-2008 Mediamatic Lab - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -// TODO: something with the HTTP return code matching to the problem - -require_once dirname(__FILE__) . '/OAuthRequestLogger.php'; - -class OAuthException2 extends Exception -{ - function __construct ( $message ) - { - Exception::__construct($message); - OAuthRequestLogger::addNote('OAuthException2: '.$message); - } - -} - - -/* vi:set ts=4 sts=4 sw=4 binary noeol: */ - -?> \ No newline at end of file diff --git a/vendor/oauth-php/library/OAuthRequest.php b/vendor/oauth-php/library/OAuthRequest.php deleted file mode 100644 index 41448a35dff36ed271f3607292490e90bd910b93..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/OAuthRequest.php +++ /dev/null @@ -1,854 +0,0 @@ -<?php - -/** - * Request wrapper class. Prepares a request for consumption by the OAuth routines - * - * @version $Id: OAuthRequest.php 186 2011-02-18 15:46:18Z scherpenisse $ - * @author Marc Worrell <marcw@pobox.com> - * @date Nov 16, 2007 12:20:31 PM - * - * The MIT License - * - * Copyright (c) 2007-2008 Mediamatic Lab - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - - -require_once dirname(__FILE__) . '/OAuthException2.php'; - -/** - * Object to parse an incoming OAuth request or prepare an outgoing OAuth request - */ -class OAuthRequest -{ - /* the realm for this request */ - protected $realm; - - /* all the parameters, RFC3986 encoded name/value pairs */ - protected $param = array(); - - /* the parsed request uri */ - protected $uri_parts; - - /* the raw request uri */ - protected $uri; - - /* the request headers */ - protected $headers; - - /* the request method */ - protected $method; - - /* the body of the OAuth request */ - protected $body; - - - /** - * Construct from the current request. Useful for checking the signature of a request. - * When not supplied with any parameters this will use the current request. - * - * @param string uri might include parameters - * @param string method GET, PUT, POST etc. - * @param string parameters additional post parameters, urlencoded (RFC1738) - * @param array headers headers for request - * @param string body optional body of the OAuth request (POST or PUT) - */ - function __construct ( $uri = null, $method = null, $parameters = '', $headers = array(), $body = null ) - { - if (is_object($_SERVER)) - { - // Tainted arrays - the normal stuff in anyMeta - if (!$method) { - $method = $_SERVER->REQUEST_METHOD->getRawUnsafe(); - } - if (empty($uri)) { - $uri = $_SERVER->REQUEST_URI->getRawUnsafe(); - $proto = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https' : 'http'; - if (strpos($uri, "://") === false) { - $uri = sprintf('%s://%s%s', $proto, $_SERVER->HTTP_HOST->getRawUnsafe(), $uri); - } - } - } - else - { - // non anyMeta systems - if (!$method) { - if (isset($_SERVER['REQUEST_METHOD'])) { - $method = $_SERVER['REQUEST_METHOD']; - } - else { - $method = 'GET'; - } - } - $proto = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https' : 'http'; - if (empty($uri)) { - if (strpos($_SERVER['REQUEST_URI'], "://") !== false) { - $uri = $_SERVER['REQUEST_URI']; - } - else { - $uri = sprintf('%s://%s%s', $proto, $_SERVER['HTTP_HOST'], $_SERVER['REQUEST_URI']); - } - } - } - $headers = OAuthRequestLogger::getAllHeaders(); - $this->method = strtoupper($method); - - // If this is a post then also check the posted variables - if (strcasecmp($method, 'POST') == 0) - { - // TODO: what to do with 'multipart/form-data'? - if ($this->getRequestContentType() == 'multipart/form-data') - { - // Get the posted body (when available) - if (!isset($headers['X-OAuth-Test'])) - { - $parameters .= $this->getRequestBodyOfMultipart(); - } - } - if ($this->getRequestContentType() == 'application/x-www-form-urlencoded') - { - // Get the posted body (when available) - if (!isset($headers['X-OAuth-Test'])) - { - $parameters .= $this->getRequestBody(); - } - } - else - { - $body = $this->getRequestBody(); - } - } - else if (strcasecmp($method, 'PUT') == 0) - { - $body = $this->getRequestBody(); - } - - $this->method = strtoupper($method); - $this->headers = $headers; - // Store the values, prepare for oauth - $this->uri = $uri; - $this->body = $body; - $this->parseUri($parameters); - $this->parseHeaders(); - $this->transcodeParams(); - } - - - /** - * Return the signature base string. - * Note that we can't use rawurlencode due to specified use of RFC3986. - * - * @return string - */ - function signatureBaseString () - { - $sig = array(); - $sig[] = $this->method; - $sig[] = $this->getRequestUrl(); - $sig[] = $this->getNormalizedParams(); - - return implode('&', array_map(array($this, 'urlencode'), $sig)); - } - - - /** - * Calculate the signature of the request, using the method in oauth_signature_method. - * The signature is returned encoded in the form as used in the url. So the base64 and - * urlencoding has been done. - * - * @param string consumer_secret - * @param string token_secret - * @param string token_type - * @exception when not all parts available - * @return string - */ - function calculateSignature ( $consumer_secret, $token_secret, $token_type = 'access' ) - { - $required = array( - 'oauth_consumer_key', - 'oauth_signature_method', - 'oauth_timestamp', - 'oauth_nonce' - ); - - if ($token_type != 'requestToken') - { - $required[] = 'oauth_token'; - } - - foreach ($required as $req) - { - if (!isset($this->param[$req])) - { - throw new OAuthException2('Can\'t sign request, missing parameter "'.$req.'"'); - } - } - - $this->checks(); - - $base = $this->signatureBaseString(); - $signature = $this->calculateDataSignature($base, $consumer_secret, $token_secret, $this->param['oauth_signature_method']); - return $signature; - } - - - /** - * Calculate the signature of a string. - * Uses the signature method from the current parameters. - * - * @param string data - * @param string consumer_secret - * @param string token_secret - * @param string signature_method - * @exception OAuthException2 thrown when the signature method is unknown - * @return string signature - */ - function calculateDataSignature ( $data, $consumer_secret, $token_secret, $signature_method ) - { - if (is_null($data)) - { - $data = ''; - } - - $sig = $this->getSignatureMethod($signature_method); - return $sig->signature($this, $data, $consumer_secret, $token_secret); - } - - - /** - * Select a signature method from the list of available methods. - * We try to check the most secure methods first. - * - * @todo Let the signature method tell us how secure it is - * @param array methods - * @exception OAuthException2 when we don't support any method in the list - * @return string - */ - public function selectSignatureMethod ( $methods ) - { - if (in_array('HMAC-SHA1', $methods)) - { - $method = 'HMAC-SHA1'; - } - else if (in_array('MD5', $methods)) - { - $method = 'MD5'; - } - else - { - $method = false; - foreach ($methods as $m) - { - $m = strtoupper($m); - $m2 = preg_replace('/[^A-Z0-9]/', '_', $m); - if (file_exists(dirname(__FILE__).'/signature_method/OAuthSignatureMethod_'.$m2.'.php')) - { - $method = $m; - break; - } - } - - if (empty($method)) - { - throw new OAuthException2('None of the signing methods is supported.'); - } - } - return $method; - } - - - /** - * Fetch the signature object used for calculating and checking the signature base string - * - * @param string method - * @return OAuthSignatureMethod object - */ - function getSignatureMethod ( $method ) - { - $m = strtoupper($method); - $m = preg_replace('/[^A-Z0-9]/', '_', $m); - $class = 'OAuthSignatureMethod_'.$m; - - if (file_exists(dirname(__FILE__).'/signature_method/'.$class.'.php')) - { - require_once dirname(__FILE__).'/signature_method/'.$class.'.php'; - $sig = new $class(); - } - else - { - throw new OAuthException2('Unsupported signature method "'.$m.'".'); - } - return $sig; - } - - - /** - * Perform some sanity checks. - * - * @exception OAuthException2 thrown when sanity checks failed - */ - function checks () - { - if (isset($this->param['oauth_version'])) - { - $version = $this->urldecode($this->param['oauth_version']); - if ($version != '1.0') - { - throw new OAuthException2('Expected OAuth version 1.0, got "'.$this->param['oauth_version'].'"'); - } - } - } - - - /** - * Return the request method - * - * @return string - */ - function getMethod () - { - return $this->method; - } - - /** - * Return the complete parameter string for the signature check. - * All parameters are correctly urlencoded and sorted on name and value - * - * @return string - */ - function getNormalizedParams () - { - /* - // sort by name, then by value - // (needed when we start allowing multiple values with the same name) - $keys = array_keys($this->param); - $values = array_values($this->param); - array_multisort($keys, SORT_ASC, $values, SORT_ASC); - */ - $params = $this->param; - $normalized = array(); - - ksort($params); - foreach ($params as $key => $value) - { - // all names and values are already urlencoded, exclude the oauth signature - if ($key != 'oauth_signature') - { - if (is_array($value)) - { - $value_sort = $value; - sort($value_sort); - foreach ($value_sort as $v) - { - $normalized[] = $key.'='.$v; - } - } - else - { - $normalized[] = $key.'='.$value; - } - } - } - return implode('&', $normalized); - } - - - /** - * Return the normalised url for signature checks - */ - function getRequestUrl () - { - $url = $this->uri_parts['scheme'] . '://' - . $this->uri_parts['user'] . (!empty($this->uri_parts['pass']) ? ':' : '') - . $this->uri_parts['pass'] . (!empty($this->uri_parts['user']) ? '@' : '') - . $this->uri_parts['host']; - - if ( $this->uri_parts['port'] - && $this->uri_parts['port'] != $this->defaultPortForScheme($this->uri_parts['scheme'])) - { - $url .= ':'.$this->uri_parts['port']; - } - if (!empty($this->uri_parts['path'])) - { - $url .= $this->uri_parts['path']; - } - return $url; - } - - - /** - * Get a parameter, value is always urlencoded - * - * @param string name - * @param boolean urldecode set to true to decode the value upon return - * @return string value false when not found - */ - function getParam ( $name, $urldecode = false ) - { - if (isset($this->param[$name])) - { - $s = $this->param[$name]; - } - else if (isset($this->param[$this->urlencode($name)])) - { - $s = $this->param[$this->urlencode($name)]; - } - else - { - $s = false; - } - if (!empty($s) && $urldecode) - { - if (is_array($s)) - { - $s = array_map(array($this,'urldecode'), $s); - } - else - { - $s = $this->urldecode($s); - } - } - return $s; - } - - /** - * Set a parameter - * - * @param string name - * @param string value - * @param boolean encoded set to true when the values are already encoded - */ - function setParam ( $name, $value, $encoded = false ) - { - if (!$encoded) - { - $name_encoded = $this->urlencode($name); - if (is_array($value)) - { - foreach ($value as $v) - { - $this->param[$name_encoded][] = $this->urlencode($v); - } - } - else - { - $this->param[$name_encoded] = $this->urlencode($value); - } - } - else - { - $this->param[$name] = $value; - } - } - - - /** - * Re-encode all parameters so that they are encoded using RFC3986. - * Updates the $this->param attribute. - */ - protected function transcodeParams () - { - $params = $this->param; - $this->param = array(); - - foreach ($params as $name=>$value) - { - if (is_array($value)) - { - $this->param[$this->urltranscode($name)] = array_map(array($this,'urltranscode'), $value); - } - else - { - $this->param[$this->urltranscode($name)] = $this->urltranscode($value); - } - } - } - - - - /** - * Return the body of the OAuth request. - * - * @return string null when no body - */ - function getBody () - { - return $this->body; - } - - - /** - * Return the body of the OAuth request. - * - * @return string null when no body - */ - function setBody ( $body ) - { - $this->body = $body; - } - - - /** - * Parse the uri into its parts. Fill in the missing parts. - * - * @param string $parameters optional extra parameters (from eg the http post) - */ - protected function parseUri ( $parameters ) - { - $ps = @parse_url($this->uri); - - // Get the current/requested method - $ps['scheme'] = strtolower($ps['scheme']); - - // Get the current/requested host - if (function_exists('mb_strtolower')) - $ps['host'] = mb_strtolower($ps['host']); - else - $ps['host'] = strtolower($ps['host']); - - if (!preg_match('/^[a-z0-9\.\-]+$/', $ps['host'])) - { - throw new OAuthException2('Unsupported characters in host name'); - } - - // Get the port we are talking on - if (empty($ps['port'])) - { - $ps['port'] = $this->defaultPortForScheme($ps['scheme']); - } - - if (empty($ps['user'])) - { - $ps['user'] = ''; - } - if (empty($ps['pass'])) - { - $ps['pass'] = ''; - } - if (empty($ps['path'])) - { - $ps['path'] = '/'; - } - if (empty($ps['query'])) - { - $ps['query'] = ''; - } - if (empty($ps['fragment'])) - { - $ps['fragment'] = ''; - } - - // Now all is complete - parse all parameters - foreach (array($ps['query'], $parameters) as $params) - { - if (strlen($params) > 0) - { - $params = explode('&', $params); - foreach ($params as $p) - { - @list($name, $value) = explode('=', $p, 2); - if (!strlen($name)) - { - continue; - } - - if (array_key_exists($name, $this->param)) - { - if (is_array($this->param[$name])) - $this->param[$name][] = $value; - else - $this->param[$name] = array($this->param[$name], $value); - } - else - { - $this->param[$name] = $value; - } - } - } - } - $this->uri_parts = $ps; - } - - - /** - * Return the default port for a scheme - * - * @param string scheme - * @return int - */ - protected function defaultPortForScheme ( $scheme ) - { - switch ($scheme) - { - case 'http': return 80; - case 'https': return 443; - default: - throw new OAuthException2('Unsupported scheme type, expected http or https, got "'.$scheme.'"'); - break; - } - } - - - /** - * Encode a string according to the RFC3986 - * - * @param string s - * @return string - */ - function urlencode ( $s ) - { - if ($s === false) - { - return $s; - } - else - { - return str_replace('%7E', '~', rawurlencode($s)); - } - } - - /** - * Decode a string according to RFC3986. - * Also correctly decodes RFC1738 urls. - * - * @param string s - * @return string - */ - function urldecode ( $s ) - { - if ($s === false) - { - return $s; - } - else - { - return rawurldecode($s); - } - } - - /** - * urltranscode - make sure that a value is encoded using RFC3986. - * We use a basic urldecode() function so that any use of '+' as the - * encoding of the space character is correctly handled. - * - * @param string s - * @return string - */ - function urltranscode ( $s ) - { - if ($s === false) - { - return $s; - } - else - { - //return $this->urlencode(rawurldecode($s)); - return $this->urlencode(urldecode($s)); - } - } - - - /** - * Parse the oauth parameters from the request headers - * Looks for something like: - * - * Authorization: OAuth realm="http://photos.example.net/authorize", - * oauth_consumer_key="dpf43f3p2l4k3l03", - * oauth_token="nnch734d00sl2jdk", - * oauth_signature_method="HMAC-SHA1", - * oauth_signature="tR3%2BTy81lMeYAr%2FFid0kMTYa%2FWM%3D", - * oauth_timestamp="1191242096", - * oauth_nonce="kllo9940pd9333jh", - * oauth_version="1.0" - */ - private function parseHeaders () - { -/* - $this->headers['Authorization'] = 'OAuth realm="http://photos.example.net/authorize", - oauth_consumer_key="dpf43f3p2l4k3l03", - oauth_token="nnch734d00sl2jdk", - oauth_signature_method="HMAC-SHA1", - oauth_signature="tR3%2BTy81lMeYAr%2FFid0kMTYa%2FWM%3D", - oauth_timestamp="1191242096", - oauth_nonce="kllo9940pd9333jh", - oauth_version="1.0"'; -*/ - if (isset($this->headers['Authorization'])) - { - $auth = trim($this->headers['Authorization']); - if (strncasecmp($auth, 'OAuth', 4) == 0) - { - $vs = explode(',', substr($auth, 6)); - foreach ($vs as $v) - { - if (strpos($v, '=')) - { - $v = trim($v); - list($name,$value) = explode('=', $v, 2); - if (!empty($value) && $value[0] == '"' && substr($value, -1) == '"') - { - $value = substr(substr($value, 1), 0, -1); - } - - if (strcasecmp($name, 'realm') == 0) - { - $this->realm = $value; - } - else - { - $this->param[$name] = $value; - } - } - } - } - } - } - - - /** - * Fetch the content type of the current request - * - * @return string - */ - private function getRequestContentType () - { - $content_type = 'application/octet-stream'; - if (!empty($_SERVER) && array_key_exists('CONTENT_TYPE', $_SERVER)) - { - list($content_type) = explode(';', $_SERVER['CONTENT_TYPE']); - } - return trim($content_type); - } - - - /** - * Get the body of a POST or PUT. - * - * Used for fetching the post parameters and to calculate the body signature. - * - * @return string null when no body present (or wrong content type for body) - */ - private function getRequestBody () - { - $body = null; - if ($this->method == 'POST' || $this->method == 'PUT') - { - $body = ''; - $fh = @fopen('php://input', 'r'); - if ($fh) - { - while (!feof($fh)) - { - $s = fread($fh, 1024); - if (is_string($s)) - { - $body .= $s; - } - } - fclose($fh); - } - } - return $body; - } - - /** - * Get the body of a POST with multipart/form-data by Edison tsai on 16:52 2010/09/16 - * - * Used for fetching the post parameters and to calculate the body signature. - * - * @return string null when no body present (or wrong content type for body) - */ - private function getRequestBodyOfMultipart() - { - $body = null; - if ($this->method == 'POST') - { - $body = ''; - if (is_array($_POST) && count($_POST) > 1) - { - foreach ($_POST AS $k => $v) { - $body .= $k . '=' . $this->urlencode($v) . '&'; - } #end foreach - if(substr($body,-1) == '&') - { - $body = substr($body, 0, strlen($body)-1); - } #end if - } #end if - } #end if - - return $body; - } - - - /** - * Simple function to perform a redirect (GET). - * Redirects the User-Agent, does not return. - * - * @param string uri - * @param array params parameters, urlencoded - * @param bool skip protocol check - * @exception OAuthException2 when redirect uri is illegal - */ - public function redirect ( $uri, $params, $skip_protocol_check = false ) - { - if (!empty($params)) - { - $q = array(); - foreach ($params as $name=>$value) - { - $q[] = $name.'='.$value; - } - $q_s = implode('&', $q); - - if (strpos($uri, '?')) - { - $uri .= '&'.$q_s; - } - else - { - $uri .= '?'.$q_s; - } - } - - // simple security - multiline location headers can inject all kinds of extras - $uri = preg_replace('/\s/', '%20', $uri); - - if (!$skip_protocol_check) { - if (strncasecmp($uri, 'http://', 7) && strncasecmp($uri, 'https://', 8)) - { - if (strpos($uri, '://')) - { - throw new OAuthException2('Illegal protocol in redirect uri '.$uri); - } - $uri = 'http://'.$uri; - } - } - - header('HTTP/1.1 302 Found'); - header('Location: '.$uri); - echo ''; - exit(); - } -} - - -/* vi:set ts=4 sts=4 sw=4 binary noeol: */ - -?> diff --git a/vendor/oauth-php/library/OAuthRequestLogger.php b/vendor/oauth-php/library/OAuthRequestLogger.php deleted file mode 100644 index 24cd8ba6a80f6a31f638503ed95132d111c3fa48..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/OAuthRequestLogger.php +++ /dev/null @@ -1,314 +0,0 @@ -<?php - -/** - * Log OAuth requests - * - * @version $Id: OAuthRequestLogger.php 185 2011-02-08 16:11:20Z brunobg@corollarium.com $ - * @author Marc Worrell <marcw@pobox.com> - * @date Dec 7, 2007 12:22:43 PM - * - * - * The MIT License - * - * Copyright (c) 2007-2008 Mediamatic Lab - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -class OAuthRequestLogger -{ - static private $logging = 0; - static private $enable_logging = null; - static private $store_log = null; - static private $note = ''; - static private $user_id = null; - static private $request_object = null; - static private $sent = null; - static private $received = null; - static private $log = array(); - - /** - * Start any logging, checks the system configuration if logging is needed. - * - * @param OAuthRequest $request_object - */ - static function start ( $request_object = null ) - { - if (defined('OAUTH_LOG_REQUEST')) - { - if (is_null(OAuthRequestLogger::$enable_logging)) - { - OAuthRequestLogger::$enable_logging = true; - } - if (is_null(OAuthRequestLogger::$store_log)) - { - OAuthRequestLogger::$store_log = true; - } - } - - if (OAuthRequestLogger::$enable_logging && !OAuthRequestLogger::$logging) - { - OAuthRequestLogger::$logging = true; - OAuthRequestLogger::$request_object = $request_object; - ob_start(); - - // Make sure we flush our log entry when we stop the request (eg on an exception) - register_shutdown_function(array('OAuthRequestLogger','flush')); - } - } - - - /** - * Force logging, needed for performing test connects independent from the debugging setting. - * - * @param boolean store_log (optional) true to store the log in the db - */ - static function enableLogging ( $store_log = null ) - { - OAuthRequestLogger::$enable_logging = true; - if (!is_null($store_log)) - { - OAuthRequestLogger::$store_log = $store_log; - } - } - - - /** - * Logs the request to the database, sends any cached output. - * Also called on shutdown, to make sure we always log the request being handled. - */ - static function flush () - { - if (OAuthRequestLogger::$logging) - { - OAuthRequestLogger::$logging = false; - - if (is_null(OAuthRequestLogger::$sent)) - { - // What has been sent to the user-agent? - $data = ob_get_contents(); - if (strlen($data) > 0) - { - ob_end_flush(); - } - elseif (ob_get_level()) - { - ob_end_clean(); - } - $hs = headers_list(); - $sent = implode("\n", $hs) . "\n\n" . $data; - } - else - { - // The request we sent - $sent = OAuthRequestLogger::$sent; - } - - if (is_null(OAuthRequestLogger::$received)) - { - // Build the request we received - $hs0 = self::getAllHeaders(); - $hs = array(); - foreach ($hs0 as $h => $v) - { - $hs[] = "$h: $v"; - } - - $data = ''; - $fh = @fopen('php://input', 'r'); - if ($fh) - { - while (!feof($fh)) - { - $s = fread($fh, 1024); - if (is_string($s)) - { - $data .= $s; - } - } - fclose($fh); - } - $received = implode("\n", $hs) . "\n\n" . $data; - } - else - { - // The answer we received - $received = OAuthRequestLogger::$received; - } - - // The request base string - if (OAuthRequestLogger::$request_object) - { - $base_string = OAuthRequestLogger::$request_object->signatureBaseString(); - } - else - { - $base_string = ''; - } - - // Figure out to what keys we want to log this request - $keys = array(); - if (OAuthRequestLogger::$request_object) - { - $consumer_key = OAuthRequestLogger::$request_object->getParam('oauth_consumer_key', true); - $token = OAuthRequestLogger::$request_object->getParam('oauth_token', true); - - switch (get_class(OAuthRequestLogger::$request_object)) - { - // tokens are access/request tokens by a consumer - case 'OAuthServer': - case 'OAuthRequestVerifier': - $keys['ocr_consumer_key'] = $consumer_key; - $keys['oct_token'] = $token; - break; - - // tokens are access/request tokens to a server - case 'OAuthRequester': - case 'OAuthRequestSigner': - $keys['osr_consumer_key'] = $consumer_key; - $keys['ost_token'] = $token; - break; - } - } - - // Log the request - if (OAuthRequestLogger::$store_log) - { - $store = OAuthStore::instance(); - $store->addLog($keys, $received, $sent, $base_string, OAuthRequestLogger::$note, OAuthRequestLogger::$user_id); - } - - OAuthRequestLogger::$log[] = array( - 'keys' => $keys, - 'received' => $received, - 'sent' => $sent, - 'base_string' => $base_string, - 'note' => OAuthRequestLogger::$note - ); - } - } - - - /** - * Add a note, used by the OAuthException2 to log all exceptions. - * - * @param string note - */ - static function addNote ( $note ) - { - OAuthRequestLogger::$note .= $note . "\n\n"; - } - - /** - * Set the OAuth request object being used - * - * @param OAuthRequest request_object - */ - static function setRequestObject ( $request_object ) - { - OAuthRequestLogger::$request_object = $request_object; - } - - - /** - * Set the relevant user (defaults to the current user) - * - * @param int user_id - */ - static function setUser ( $user_id ) - { - OAuthRequestLogger::$user_id = $user_id; - } - - - /** - * Set the request we sent - * - * @param string request - */ - static function setSent ( $request ) - { - OAuthRequestLogger::$sent = $request; - } - - /** - * Set the reply we received - * - * @param string request - */ - static function setReceived ( $reply ) - { - OAuthRequestLogger::$received = $reply; - } - - - /** - * Get the the log till now - * - * @return array - */ - static function getLog () - { - return OAuthRequestLogger::$log; - } - - - /** - * helper to try to sort out headers for people who aren't running apache, - * or people who are running PHP as FastCGI. - * - * @return array of request headers as associative array. - */ - public static function getAllHeaders() { - $retarr = array(); - $headers = array(); - - if (function_exists('apache_request_headers')) { - $headers = apache_request_headers(); - } else { - $headers = array_merge($_ENV, $_SERVER); - - foreach ($headers as $key => $val) { - //we need this header - if (strpos(strtolower($key), 'content-type') !== FALSE) - continue; - if (strtoupper(substr($key, 0, 5)) != "HTTP_") - unset($headers[$key]); - } - } - - //Normalize this array to Cased-Like-This structure. - foreach ($headers AS $key => $value) { - $key = preg_replace('/^HTTP_/i', '', $key); - $key = str_replace( - " ", - "-", - ucwords(strtolower(str_replace(array("-", "_"), " ", $key))) - ); - $retarr[$key] = $value; - } - ksort($retarr); - - return $retarr; - } -} - -/* vi:set ts=4 sts=4 sw=4 binary noeol: */ - -?> \ No newline at end of file diff --git a/vendor/oauth-php/library/OAuthRequestSigner.php b/vendor/oauth-php/library/OAuthRequestSigner.php deleted file mode 100644 index 15c0fd88ccb50aae7d81ea941531b11c0602ef12..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/OAuthRequestSigner.php +++ /dev/null @@ -1,215 +0,0 @@ -<?php - -/** - * Sign requests before performing the request. - * - * @version $Id: OAuthRequestSigner.php 174 2010-11-24 15:15:41Z brunobg@corollarium.com $ - * @author Marc Worrell <marcw@pobox.com> - * @date Nov 16, 2007 4:02:49 PM - * - * - * The MIT License - * - * Copyright (c) 2007-2008 Mediamatic Lab - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - - -require_once dirname(__FILE__) . '/OAuthStore.php'; -require_once dirname(__FILE__) . '/OAuthRequest.php'; - - -class OAuthRequestSigner extends OAuthRequest -{ - protected $request; - protected $store; - protected $usr_id = 0; - private $signed = false; - - - /** - * Construct the request to be signed. Parses or appends the parameters in the params url. - * When you supply an params array, then the params should not be urlencoded. - * When you supply a string, then it is assumed it is of the type application/x-www-form-urlencoded - * - * @param string request url - * @param string method PUT, GET, POST etc. - * @param mixed params string (for urlencoded data, or array with name/value pairs) - * @param string body optional body for PUT and/or POST requests - */ - function __construct ( $request, $method = null, $params = null, $body = null ) - { - $this->store = OAuthStore::instance(); - - if (is_string($params)) - { - parent::__construct($request, $method, $params); - } - else - { - parent::__construct($request, $method); - if (is_array($params)) - { - foreach ($params as $name => $value) - { - $this->setParam($name, $value); - } - } - } - - // With put/ post we might have a body (not for application/x-www-form-urlencoded requests) - if (strcasecmp($method, 'PUT') == 0 || strcasecmp($method, 'POST') == 0) - { - $this->setBody($body); - } - } - - - /** - * Reset the 'signed' flag, so that any changes in the parameters force a recalculation - * of the signature. - */ - function setUnsigned () - { - $this->signed = false; - } - - - /** - * Sign our message in the way the server understands. - * Set the needed oauth_xxxx parameters. - * - * @param int usr_id (optional) user that wants to sign this request - * @param array secrets secrets used for signing, when empty then secrets will be fetched from the token registry - * @param string name name of the token to be used for signing - * @exception OAuthException2 when there is no oauth relation with the server - * @exception OAuthException2 when we don't support the signing methods of the server - */ - function sign ( $usr_id = 0, $secrets = null, $name = '', $token_type = null) - { - $url = $this->getRequestUrl(); - if (empty($secrets)) - { - // get the access tokens for the site (on an user by user basis) - $secrets = $this->store->getSecretsForSignature($url, $usr_id, $name); - } - if (empty($secrets)) - { - throw new OAuthException2('No OAuth relation with the server for at "'.$url.'"'); - } - - $signature_method = $this->selectSignatureMethod($secrets['signature_methods']); - - $token = isset($secrets['token']) ? $secrets['token'] : ''; - $token_secret = isset($secrets['token_secret']) ? $secrets['token_secret'] : ''; - - if (!$token) { - $token = $this->getParam('oauth_token'); - } - - $this->setParam('oauth_signature_method',$signature_method); - $this->setParam('oauth_signature', ''); - $this->setParam('oauth_nonce', !empty($secrets['nonce']) ? $secrets['nonce'] : uniqid('')); - $this->setParam('oauth_timestamp', !empty($secrets['timestamp']) ? $secrets['timestamp'] : time()); - if ($token_type != 'requestToken') - $this->setParam('oauth_token', $token); - $this->setParam('oauth_consumer_key', $secrets['consumer_key']); - $this->setParam('oauth_version', '1.0'); - - $body = $this->getBody(); - if (!is_null($body)) - { - // We also need to sign the body, use the default signature method - $body_signature = $this->calculateDataSignature($body, $secrets['consumer_secret'], $token_secret, $signature_method); - $this->setParam('xoauth_body_signature', $body_signature, true); - } - - $signature = $this->calculateSignature($secrets['consumer_secret'], $token_secret, $token_type); - $this->setParam('oauth_signature', $signature, true); - // $this->setParam('oauth_signature', urldecode($signature), true); - - $this->signed = true; - $this->usr_id = $usr_id; - } - - - /** - * Builds the Authorization header for the request. - * Adds all oauth_ and xoauth_ parameters to the Authorization header. - * - * @return string - */ - function getAuthorizationHeader () - { - if (!$this->signed) - { - $this->sign($this->usr_id); - } - $h = array(); - $h[] = 'Authorization: OAuth realm=""'; - foreach ($this->param as $name => $value) - { - if (strncmp($name, 'oauth_', 6) == 0 || strncmp($name, 'xoauth_', 7) == 0) - { - $h[] = $name.'="'.$value.'"'; - } - } - $hs = implode(', ', $h); - return $hs; - } - - - /** - * Builds the application/x-www-form-urlencoded parameter string. Can be appended as - * the query part to a GET or inside the request body for a POST. - * - * @param boolean oauth_as_header (optional) set to false to include oauth parameters - * @return string - */ - function getQueryString ( $oauth_as_header = true ) - { - $parms = array(); - foreach ($this->param as $name => $value) - { - if ( !$oauth_as_header - || (strncmp($name, 'oauth_', 6) != 0 && strncmp($name, 'xoauth_', 7) != 0)) - { - if (is_array($value)) - { - foreach ($value as $v) - { - $parms[] = $name.'='.$v; - } - } - else - { - $parms[] = $name.'='.$value; - } - } - } - return implode('&', $parms); - } - -} - - -/* vi:set ts=4 sts=4 sw=4 binary noeol: */ - -?> \ No newline at end of file diff --git a/vendor/oauth-php/library/OAuthRequestVerifier.php b/vendor/oauth-php/library/OAuthRequestVerifier.php deleted file mode 100644 index a5def757c6951ac24317f128f8242b3fd1a87a4e..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/OAuthRequestVerifier.php +++ /dev/null @@ -1,306 +0,0 @@ -<?php - -/** - * Verify the current request. Checks if signed and if the signature is correct. - * When correct then also figures out on behalf of which user this request is being made. - * - * @version $Id: OAuthRequestVerifier.php 155 2010-09-10 18:38:33Z brunobg@corollarium.com $ - * @author Marc Worrell <marcw@pobox.com> - * @date Nov 16, 2007 4:35:03 PM - * - * - * The MIT License - * - * Copyright (c) 2007-2008 Mediamatic Lab - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -require_once dirname(__FILE__) . '/OAuthStore.php'; -require_once dirname(__FILE__) . '/OAuthRequest.php'; - - -class OAuthRequestVerifier extends OAuthRequest -{ - private $request; - private $store; - private $accepted_signatures = null; - - /** - * Construct the request to be verified - * - * @param string request - * @param string method - * @param array params The request parameters - */ - function __construct ( $uri = null, $method = null, $params = null ) - { - if ($params) { - $encodedParams = array(); - foreach ($params as $key => $value) { - if (preg_match("/^oauth_/", $key)) { - continue; - } - $encodedParams[rawurlencode($key)] = rawurlencode($value); - } - $this->param = array_merge($this->param, $encodedParams); - } - - $this->store = OAuthStore::instance(); - parent::__construct($uri, $method); - - OAuthRequestLogger::start($this); - } - - - /** - * See if the current request is signed with OAuth - * - * @return boolean - */ - static public function requestIsSigned () - { - if (isset($_REQUEST['oauth_signature'])) - { - $signed = true; - } - else - { - $hs = OAuthRequestLogger::getAllHeaders(); - if (isset($hs['Authorization']) && strpos($hs['Authorization'], 'oauth_signature') !== false) - { - $signed = true; - } - else - { - $signed = false; - } - } - return $signed; - } - - - /** - * Verify the request if it seemed to be signed. - * - * @param string token_type the kind of token needed, defaults to 'access' - * @exception OAuthException2 thrown when the request did not verify - * @return boolean true when signed, false when not signed - */ - public function verifyIfSigned ( $token_type = 'access' ) - { - if ($this->getParam('oauth_consumer_key')) - { - OAuthRequestLogger::start($this); - $this->verify($token_type); - $signed = true; - OAuthRequestLogger::flush(); - } - else - { - $signed = false; - } - return $signed; - } - - - - /** - * Verify the request - * - * @param string token_type the kind of token needed, defaults to 'access' (false, 'access', 'request') - * @exception OAuthException2 thrown when the request did not verify - * @return int user_id associated with token (false when no user associated) - */ - public function verify ( $token_type = 'access' ) - { - $retval = $this->verifyExtended($token_type); - return $retval['user_id']; - } - - - /** - * Verify the request - * - * @param string token_type the kind of token needed, defaults to 'access' (false, 'access', 'request') - * @exception OAuthException2 thrown when the request did not verify - * @return array ('user_id' => associated with token (false when no user associated), - * 'consumer_key' => the associated consumer_key) - * - */ - public function verifyExtended ( $token_type = 'access' ) - { - $consumer_key = $this->getParam('oauth_consumer_key'); - $token = $this->getParam('oauth_token'); - $user_id = false; - $secrets = array(); - - if ($consumer_key && ($token_type === false || $token)) - { - $secrets = $this->store->getSecretsForVerify( $this->urldecode($consumer_key), - $this->urldecode($token), - $token_type); - - $this->store->checkServerNonce( $this->urldecode($consumer_key), - $this->urldecode($token), - $this->getParam('oauth_timestamp', true), - $this->getParam('oauth_nonce', true)); - - $oauth_sig = $this->getParam('oauth_signature'); - if (empty($oauth_sig)) - { - throw new OAuthException2('Verification of signature failed (no oauth_signature in request).'); - } - - try - { - $this->verifySignature($secrets['consumer_secret'], $secrets['token_secret'], $token_type); - } - catch (OAuthException2 $e) - { - throw new OAuthException2('Verification of signature failed (signature base string was "'.$this->signatureBaseString().'").' - . " with " . print_r(array($secrets['consumer_secret'], $secrets['token_secret'], $token_type), true)); - } - - // Check the optional body signature - if ($this->getParam('xoauth_body_signature')) - { - $method = $this->getParam('xoauth_body_signature_method'); - if (empty($method)) - { - $method = $this->getParam('oauth_signature_method'); - } - - try - { - $this->verifyDataSignature($this->getBody(), $secrets['consumer_secret'], $secrets['token_secret'], $method, $this->getParam('xoauth_body_signature')); - } - catch (OAuthException2 $e) - { - throw new OAuthException2('Verification of body signature failed.'); - } - } - - // All ok - fetch the user associated with this request - if (isset($secrets['user_id'])) - { - $user_id = $secrets['user_id']; - } - - // Check if the consumer wants us to reset the ttl of this token - $ttl = $this->getParam('xoauth_token_ttl', true); - if (is_numeric($ttl)) - { - $this->store->setConsumerAccessTokenTtl($this->urldecode($token), $ttl); - } - } - else - { - throw new OAuthException2('Can\'t verify request, missing oauth_consumer_key or oauth_token'); - } - return array('user_id' => $user_id, 'consumer_key' => $consumer_key, 'osr_id' => $secrets['osr_id']); - } - - - - /** - * Verify the signature of the request, using the method in oauth_signature_method. - * The signature is returned encoded in the form as used in the url. So the base64 and - * urlencoding has been done. - * - * @param string consumer_secret - * @param string token_secret - * @exception OAuthException2 thrown when the signature method is unknown - * @exception OAuthException2 when not all parts available - * @exception OAuthException2 when signature does not match - */ - public function verifySignature ( $consumer_secret, $token_secret, $token_type = 'access' ) - { - $required = array( - 'oauth_consumer_key', - 'oauth_signature_method', - 'oauth_timestamp', - 'oauth_nonce', - 'oauth_signature' - ); - - if ($token_type !== false) - { - $required[] = 'oauth_token'; - } - - foreach ($required as $req) - { - if (!isset($this->param[$req])) - { - throw new OAuthException2('Can\'t verify request signature, missing parameter "'.$req.'"'); - } - } - - $this->checks(); - - $base = $this->signatureBaseString(); - $this->verifyDataSignature($base, $consumer_secret, $token_secret, $this->param['oauth_signature_method'], $this->param['oauth_signature']); - } - - - - /** - * Verify the signature of a string. - * - * @param string data - * @param string consumer_secret - * @param string token_secret - * @param string signature_method - * @param string signature - * @exception OAuthException2 thrown when the signature method is unknown - * @exception OAuthException2 when signature does not match - */ - public function verifyDataSignature ( $data, $consumer_secret, $token_secret, $signature_method, $signature ) - { - if (is_null($data)) - { - $data = ''; - } - - $sig = $this->getSignatureMethod($signature_method); - if (!$sig->verify($this, $data, $consumer_secret, $token_secret, $signature)) - { - throw new OAuthException2('Signature verification failed ('.$signature_method.')'); - } - } - - /** - * - * @param array $accepted The array of accepted signature methods, or if null is passed - * all supported methods are accepted and there is no filtering. - * - */ - public function setAcceptedSignatureMethods($accepted = null) { - if (is_array($accepted)) - $this->accepted_signatures = $accepted; - else if ($accepted == null) - $this->accepted_signatures = null; - } -} - - -/* vi:set ts=4 sts=4 sw=4 binary noeol: */ - -?> \ No newline at end of file diff --git a/vendor/oauth-php/library/OAuthRequester.php b/vendor/oauth-php/library/OAuthRequester.php deleted file mode 100644 index dde9a995a0d1a85630caeeace8b8ef86398367fe..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/OAuthRequester.php +++ /dev/null @@ -1,543 +0,0 @@ -<?php - -/** - * Perform a signed OAuth request with a GET, POST, PUT or DELETE operation. - * - * @version $Id: OAuthRequester.php 191 2011-03-23 17:50:55Z scherpenisse $ - * @author Marc Worrell <marcw@pobox.com> - * @date Nov 20, 2007 1:41:38 PM - * - * The MIT License - * - * Copyright (c) 2007-2008 Mediamatic Lab - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -require_once dirname(__FILE__) . '/OAuthRequestSigner.php'; -require_once dirname(__FILE__) . '/body/OAuthBodyContentDisposition.php'; - - -class OAuthRequester extends OAuthRequestSigner -{ - protected $files; - - /** - * Construct a new request signer. Perform the request with the doRequest() method below. - * - * A request can have either one file or a body, not both. - * - * The files array consists of arrays: - * - file the filename/path containing the data for the POST/PUT - * - data data for the file, omit when you have a file - * - mime content-type of the file - * - filename filename for content disposition header - * - * When OAuth (and PHP) can support multipart/form-data then we can handle more than one file. - * For now max one file, with all the params encoded in the query string. - * - * @param string request - * @param string method http method. GET, PUT, POST etc. Defaults to 'GET'. - * @param array params name=>value array with request parameters - * @param string body optional body to send - * @param array files optional files to send (max 1 till OAuth support multipart/form-data posts) - */ - function __construct ( $request, $method = 'GET', $params = null, $body = null, $files = null ) - { - parent::__construct($request, $method, $params, $body); - - // When there are files, then we can construct a POST with a single file - if (!empty($files)) - { - $empty = true; - foreach ($files as $f) - { - $empty = $empty && empty($f['file']) && !isset($f['data']); - } - - if (!$empty) - { - if (!is_null($body)) - { - throw new OAuthException2('When sending files, you can\'t send a body as well.'); - } - $this->files = $files; - } - } - } - - - /** - * Perform the request, returns the response code, headers and body. - * - * @param int usr_id optional user id for which we make the request - * @param array curl_options optional extra options for curl request - * @param array options options like - * - name Named tokens, unique per user/consumer key - * - token_ttl Time to live - * - server_uri The server uri - * - boolean oauth_as_header set to false to include oauth parameters in query string. Default true (includes on headers) - * @exception OAuthException2 when authentication not accepted - * @exception OAuthException2 when signing was not possible - * @return array (code=>int, headers=>array(), body=>string) - */ - function doRequest ( $usr_id = 0, $curl_options = array(), $options = array() ) - { - $name = isset($options['name']) ? $options['name'] : ''; - if (isset($options['token_ttl'])) - { - $this->setParam('xoauth_token_ttl', intval($options['token_ttl'])); - } - - if (!empty($this->files)) - { - // At the moment OAuth does not support multipart/form-data, so try to encode - // the supplied file (or data) as the request body and add a content-disposition header. - list($extra_headers, $body) = OAuthBodyContentDisposition::encodeBody($this->files); - $this->setBody($body); - $curl_options = $this->prepareCurlOptions($curl_options, $extra_headers); - } - $this->sign($usr_id, null, $name); - $text = $this->curl_raw($curl_options, (isset($options['oauth_as_header']) ? $options['oauth_as_header'] : true)); - $result = $this->curl_parse($text); - if ($result['code'] >= 400) - { - throw new OAuthException2('Request failed with code ' . $result['code'] . ': ' . $result['body']); - } - - // Record the token time to live for this server access token, immediate delete iff ttl <= 0 - // Only done on a succesful request. - $token_ttl = $this->getParam('xoauth_token_ttl', false); - if (is_numeric($token_ttl)) - { - $this->store->setServerTokenTtl($this->getParam('oauth_consumer_key',true), $this->getParam('oauth_token',true), - $token_ttl, (isset($options['server_uri']) ? $options['server_uri'] : NULL)); - } - - return $result; - } - - - /** - * Request a request token from the site belonging to consumer_key - * - * @param string consumer_key - * @param int usr_id - * @param array params (optional) extra arguments for when requesting the request token - * @param string method (optional) change the method of the request, defaults to POST (as it should be) - * @param array options (optional) options: - * - name Named tokens, unique per user/consumer key - * - token_ttl Time to live - * - server_uri The server uri - * - boolean oauth_as_header set to false to include oauth parameters in query string. Default true (includes on headers) - * @param array curl_options optional extra options for curl request - * @exception OAuthException2 when no key could be fetched - * @exception OAuthException2 when no server with consumer_key registered - * @return array (authorize_uri, token) - */ - static function requestRequestToken ( $consumer_key, $usr_id, $params = null, $method = 'POST', $options = array(), $curl_options = array() ) - { - OAuthRequestLogger::start(); - - if (isset($options['token_ttl']) && is_numeric($options['token_ttl'])) - { - $params['xoauth_token_ttl'] = intval($options['token_ttl']); - } - - $store = OAuthStore::instance(); - $r = $store->getServer($consumer_key, $usr_id); - $uri = $r['request_token_uri']; - - $oauth = new OAuthRequester($uri, $method, $params); - $oauth->sign($usr_id, $r, '', 'requestToken'); - $text = $oauth->curl_raw($curl_options, (isset($options['oauth_as_header']) ? $options['oauth_as_header'] : true)); - - if (empty($text)) - { - throw new OAuthException2('No answer from the server "'.$uri.'" while requesting a request token'); - } - $data = $oauth->curl_parse($text); - if ($data['code'] != 200) - { - throw new OAuthException2('Unexpected result from the server "'.$uri.'" ('.$data['code'].') while requesting a request token:' . $data['body']); - } - $token = array(); - $params = explode('&', $data['body']); - foreach ($params as $p) - { - @list($name, $value) = explode('=', $p, 2); - $token[$name] = $oauth->urldecode($value); - } - - if (!empty($token['oauth_token']) && !empty($token['oauth_token_secret'])) - { - $opts = array(); - if (isset($options['name'])) - { - $opts['name'] = $options['name']; - } - if (isset($token['xoauth_token_ttl'])) - { - $opts['token_ttl'] = $token['xoauth_token_ttl']; - } - if (isset($options['server_uri'])) - { - $opts['server_uri'] = $options['server_uri']; - } - $store->addServerToken($consumer_key, 'request', $token['oauth_token'], $token['oauth_token_secret'], $usr_id, $opts); - } - else - { - throw new OAuthException2('The server "'.$uri.'" did not return the oauth_token or the oauth_token_secret'); - } - - OAuthRequestLogger::flush(); - - // Now we can direct a browser to the authorize_uri - return array( - 'authorize_uri' => $r['authorize_uri'], - 'token' => $token['oauth_token'] - ); - } - - - /** - * Request an access token from the site belonging to consumer_key. - * Before this we got an request token, now we want to exchange it for - * an access token. - * - * @param string consumer_key - * @param string token - * @param int usr_id user requesting the access token - * @param string method (optional) change the method of the request, defaults to POST (as it should be) - * @param array options (optional) options: - * - name Named tokens, unique per user/consumer key - * - token_ttl Time to live - * - server_uri The server uri - * - boolean oauth_as_header set to false to include oauth parameters in query string. Default true (includes on headers) - * @param array curl_options optional extra options for curl request - * - * @exception OAuthException2 when no key could be fetched - * @exception OAuthException2 when no server with consumer_key registered - */ - static function requestAccessToken ( $consumer_key, $token, $usr_id, $method = 'POST', $options = array(), $curl_options = array()) - { - OAuthRequestLogger::start(); - - $store = OAuthStore::instance(); - $r = $store->getServerTokenSecrets($consumer_key, $token, 'request', $usr_id); - $uri = $r['access_token_uri']; - $token_name = $r['token_name']; - - // Delete the server request token, this one was for one use only - $store->deleteServerToken($consumer_key, $r['token'], 0, true); - - // Try to exchange our request token for an access token - $oauth = new OAuthRequester($uri, $method); - - if (isset($options['oauth_verifier'])) - { - $oauth->setParam('oauth_verifier', $options['oauth_verifier']); - } - if (isset($options['token_ttl']) && is_numeric($options['token_ttl'])) - { - $oauth->setParam('xoauth_token_ttl', intval($options['token_ttl'])); - } - - OAuthRequestLogger::setRequestObject($oauth); - - $oauth->sign($usr_id, $r, '', 'accessToken'); - $text = $oauth->curl_raw($curl_options, (isset($options['oauth_as_header']) ? $options['oauth_as_header'] : true)); - if (empty($text)) - { - throw new OAuthException2('No answer from the server "'.$uri.'" while requesting an access token'); - } - $data = $oauth->curl_parse($text); - - if ($data['code'] != 200) - { - throw new OAuthException2('Unexpected result from the server "'.$uri.'" ('.$data['code'].') while requesting an access token'); - } - - $token = array(); - $params = explode('&', $data['body']); - foreach ($params as $p) - { - @list($name, $value) = explode('=', $p, 2); - $token[$oauth->urldecode($name)] = $oauth->urldecode($value); - } - - if (!empty($token['oauth_token']) && !empty($token['oauth_token_secret'])) - { - $opts = array(); - $opts['name'] = $token_name; - if (isset($token['xoauth_token_ttl'])) - { - $opts['token_ttl'] = $token['xoauth_token_ttl']; - } - if (isset($options['server_uri'])) - { - $opts['server_uri'] = $options['server_uri']; - } - $store->addServerToken($consumer_key, 'access', $token['oauth_token'], $token['oauth_token_secret'], $usr_id, $opts); - } - else - { - throw new OAuthException2('The server "'.$uri.'" did not return the oauth_token or the oauth_token_secret'); - } - - OAuthRequestLogger::flush(); - } - - - - /** - * Open and close a curl session passing all the options to the curl libs - * - * @param array opts the curl options. - * @param boolean oauth_as_header (optional) set to false to include oauth parameters in query string - * @exception OAuthException2 when temporary file for PUT operation could not be created - * @return string the result of the curl action - */ - protected function curl_raw ( $opts = array(), $oauth_as_header = true ) - { - if (isset($opts[CURLOPT_HTTPHEADER])) - { - $header = $opts[CURLOPT_HTTPHEADER]; - } - else - { - $header = array(); - } - - $ch = curl_init(); - $method = $this->getMethod(); - $url = $this->getRequestUrl(); - $header[] = $this->getAuthorizationHeader(); - $query = $this->getQueryString($oauth_as_header); - $body = $this->getBody(); - - $has_content_type = false; - foreach ($header as $h) - { - if (strncasecmp($h, 'Content-Type:', 13) == 0) - { - $has_content_type = true; - } - } - - if (!is_null($body)) - { - if ($method == 'TRACE') - { - throw new OAuthException2('A body can not be sent with a TRACE operation'); - } - - // PUT and POST allow a request body - if (!empty($query)) - { - $url .= '?'.$query; - } - - // Make sure that the content type of the request is ok - if (!$has_content_type) - { - $header[] = 'Content-Type: application/octet-stream'; - $has_content_type = true; - } - - // When PUTting, we need to use an intermediate file (because of the curl implementation) - if ($method == 'PUT') - { - /* - if (version_compare(phpversion(), '5.2.0') >= 0) - { - // Use the data wrapper to create the file expected by the put method - $put_file = fopen('data://application/octet-stream;base64,'.base64_encode($body)); - } - */ - - $put_file = @tmpfile(); - if (!$put_file) - { - throw new OAuthException2('Could not create tmpfile for PUT operation'); - } - fwrite($put_file, $body); - fseek($put_file, 0); - - curl_setopt($ch, CURLOPT_PUT, true); - curl_setopt($ch, CURLOPT_INFILE, $put_file); - curl_setopt($ch, CURLOPT_INFILESIZE, strlen($body)); - } - else - { - curl_setopt($ch, CURLOPT_POST, true); - curl_setopt($ch, CURLOPT_POSTFIELDS, $body); - } - } - else - { - // a 'normal' request, no body to be send - if ($method == 'POST') - { - if (!$has_content_type) - { - $header[] = 'Content-Type: application/x-www-form-urlencoded'; - $has_content_type = true; - } - - curl_setopt($ch, CURLOPT_POST, true); - curl_setopt($ch, CURLOPT_POSTFIELDS, $query); - } - else - { - if (!empty($query)) - { - $url .= '?'.$query; - } - if ($method != 'GET') - { - curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); - } - } - } - - curl_setopt($ch, CURLOPT_HTTPHEADER, $header); - curl_setopt($ch, CURLOPT_USERAGENT, 'anyMeta/OAuth 1.0 - ($LastChangedRevision: 191 $)'); - curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_HEADER, true); - curl_setopt($ch, CURLOPT_TIMEOUT, 30); - - foreach ($opts as $k => $v) - { - if ($k != CURLOPT_HTTPHEADER) - { - curl_setopt($ch, $k, $v); - } - } - - $txt = curl_exec($ch); - if ($txt === false) { - $error = curl_error($ch); - curl_close($ch); - throw new OAuthException2('CURL error: ' . $error); - } - curl_close($ch); - - if (!empty($put_file)) - { - fclose($put_file); - } - - // Tell the logger what we requested and what we received back - $data = $method . " $url\n".implode("\n",$header); - if (is_string($body)) - { - $data .= "\n\n".$body; - } - else if ($method == 'POST') - { - $data .= "\n\n".$query; - } - - OAuthRequestLogger::setSent($data, $body); - OAuthRequestLogger::setReceived($txt); - - return $txt; - } - - - /** - * Parse an http response - * - * @param string response the http text to parse - * @return array (code=>http-code, headers=>http-headers, body=>body) - */ - protected function curl_parse ( $response ) - { - if (empty($response)) - { - return array(); - } - - @list($headers,$body) = explode("\r\n\r\n",$response,2); - $lines = explode("\r\n",$headers); - - if (preg_match('@^HTTP/[0-9]\.[0-9] +100@', $lines[0])) - { - /* HTTP/1.x 100 Continue - * the real data is on the next line - */ - @list($headers,$body) = explode("\r\n\r\n",$body,2); - $lines = explode("\r\n",$headers); - } - - // first line of headers is the HTTP response code - $http_line = array_shift($lines); - if (preg_match('@^HTTP/[0-9]\.[0-9] +([0-9]{3})@', $http_line, $matches)) - { - $code = $matches[1]; - } - - // put the rest of the headers in an array - $headers = array(); - foreach ($lines as $l) - { - list($k, $v) = explode(': ', $l, 2); - $headers[strtolower($k)] = $v; - } - - return array( 'code' => $code, 'headers' => $headers, 'body' => $body); - } - - - /** - * Mix the given headers into the headers that were given to curl - * - * @param array curl_options - * @param array extra_headers - * @return array new curl options - */ - protected function prepareCurlOptions ( $curl_options, $extra_headers ) - { - $hs = array(); - if (!empty($curl_options[CURLOPT_HTTPHEADER]) && is_array($curl_options[CURLOPT_HTTPHEADER])) - { - foreach ($curl_options[CURLOPT_HTTPHEADER] as $h) - { - list($opt, $val) = explode(':', $h, 2); - $opt = str_replace(' ', '-', ucwords(str_replace('-', ' ', $opt))); - $hs[$opt] = $val; - } - } - - $curl_options[CURLOPT_HTTPHEADER] = array(); - $hs = array_merge($hs, $extra_headers); - foreach ($hs as $h => $v) - { - $curl_options[CURLOPT_HTTPHEADER][] = "$h: $v"; - } - return $curl_options; - } -} - -/* vi:set ts=4 sts=4 sw=4 binary noeol: */ - -?> \ No newline at end of file diff --git a/vendor/oauth-php/library/OAuthServer.php b/vendor/oauth-php/library/OAuthServer.php deleted file mode 100644 index 878796add1ba9345a507893a52d0dacd0a999636..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/OAuthServer.php +++ /dev/null @@ -1,333 +0,0 @@ -<?php - -/** - * Server layer over the OAuthRequest handler - * - * @version $Id: OAuthServer.php 154 2010-08-31 18:04:41Z brunobg@corollarium.com $ - * @author Marc Worrell <marcw@pobox.com> - * @date Nov 27, 2007 12:36:38 PM - * - * - * The MIT License - * - * Copyright (c) 2007-2008 Mediamatic Lab - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -require_once 'OAuthRequestVerifier.php'; -require_once 'OAuthSession.php'; - -class OAuthServer extends OAuthRequestVerifier -{ - protected $session; - - protected $allowed_uri_schemes = array( - 'http', - 'https' - ); - - protected $disallowed_uri_schemes = array( - 'file', - 'callto', - 'mailto' - ); - - /** - * Construct the request to be verified - * - * @param string request - * @param string method - * @param array params The request parameters - * @param string store The session storage class. - * @param array store_options The session storage class parameters. - * @param array options Extra options: - * - allowed_uri_schemes: list of allowed uri schemes. - * - disallowed_uri_schemes: list of unallowed uri schemes. - * - * e.g. Allow only http and https - * $options = array( - * 'allowed_uri_schemes' => array('http', 'https'), - * 'disallowed_uri_schemes' => array() - * ); - * - * e.g. Disallow callto, mailto and file, allow everything else - * $options = array( - * 'allowed_uri_schemes' => array(), - * 'disallowed_uri_schemes' => array('callto', 'mailto', 'file') - * ); - * - * e.g. Allow everything - * $options = array( - * 'allowed_uri_schemes' => array(), - * 'disallowed_uri_schemes' => array() - * ); - * - */ - function __construct ( $uri = null, $method = null, $params = null, $store = 'SESSION', - $store_options = array(), $options = array() ) - { - parent::__construct($uri, $method, $params); - $this->session = OAuthSession::instance($store, $store_options); - - if (array_key_exists('allowed_uri_schemes', $options) && is_array($options['allowed_uri_schemes'])) { - $this->allowed_uri_schemes = $options['allowed_uri_schemes']; - } - if (array_key_exists('disallowed_uri_schemes', $options) && is_array($options['disallowed_uri_schemes'])) { - $this->disallowed_uri_schemes = $options['disallowed_uri_schemes']; - } - } - - /** - * Handle the request_token request. - * Returns the new request token and request token secret. - * - * TODO: add correct result code to exception - * - * @return string returned request token, false on an error - */ - public function requestToken () - { - OAuthRequestLogger::start($this); - try - { - $this->verify(false); - - $options = array(); - $ttl = $this->getParam('xoauth_token_ttl', false); - if ($ttl) - { - $options['token_ttl'] = $ttl; - } - - // 1.0a Compatibility : associate callback url to the request token - $cbUrl = $this->getParam('oauth_callback', true); - if ($cbUrl) { - $options['oauth_callback'] = $cbUrl; - } - - // Create a request token - $store = OAuthStore::instance(); - $token = $store->addConsumerRequestToken($this->getParam('oauth_consumer_key', true), $options); - $result = 'oauth_callback_confirmed=1&oauth_token='.$this->urlencode($token['token']) - .'&oauth_token_secret='.$this->urlencode($token['token_secret']); - - if (!empty($token['token_ttl'])) - { - $result .= '&xoauth_token_ttl='.$this->urlencode($token['token_ttl']); - } - - $request_token = $token['token']; - - header('HTTP/1.1 200 OK'); - header('Content-Length: '.strlen($result)); - header('Content-Type: application/x-www-form-urlencoded'); - - echo $result; - } - catch (OAuthException2 $e) - { - $request_token = false; - - header('HTTP/1.1 401 Unauthorized'); - header('Content-Type: text/plain'); - - echo "OAuth Verification Failed: " . $e->getMessage(); - } - - OAuthRequestLogger::flush(); - return $request_token; - } - - - /** - * Verify the start of an authorization request. Verifies if the request token is valid. - * Next step is the method authorizeFinish() - * - * Nota bene: this stores the current token, consumer key and callback in the _SESSION - * - * @exception OAuthException2 thrown when not a valid request - * @return array token description - */ - public function authorizeVerify () - { - OAuthRequestLogger::start($this); - - $store = OAuthStore::instance(); - $token = $this->getParam('oauth_token', true); - $rs = $store->getConsumerRequestToken($token); - if (empty($rs)) - { - throw new OAuthException2('Unknown request token "'.$token.'"'); - } - - // We need to remember the callback - $verify_oauth_token = $this->session->get('verify_oauth_token'); - if ( empty($verify_oauth_token) - || strcmp($verify_oauth_token, $rs['token'])) - { - $this->session->set('verify_oauth_token', $rs['token']); - $this->session->set('verify_oauth_consumer_key', $rs['consumer_key']); - $cb = $this->getParam('oauth_callback', true); - if ($cb) - $this->session->set('verify_oauth_callback', $cb); - else - $this->session->set('verify_oauth_callback', $rs['callback_url']); - } - OAuthRequestLogger::flush(); - return $rs; - } - - - /** - * Overrule this method when you want to display a nice page when - * the authorization is finished. This function does not know if the authorization was - * succesfull, you need to check the token in the database. - * - * @param boolean authorized if the current token (oauth_token param) is authorized or not - * @param int user_id user for which the token was authorized (or denied) - * @return string verifier For 1.0a Compatibility - */ - public function authorizeFinish ( $authorized, $user_id ) - { - OAuthRequestLogger::start($this); - - $token = $this->getParam('oauth_token', true); - $verifier = null; - if ($this->session->get('verify_oauth_token') == $token) - { - // Flag the token as authorized, or remove the token when not authorized - $store = OAuthStore::instance(); - - // Fetch the referrer host from the oauth callback parameter - $referrer_host = ''; - $oauth_callback = false; - $verify_oauth_callback = $this->session->get('verify_oauth_callback'); - if (!empty($verify_oauth_callback) && $verify_oauth_callback != 'oob') // OUT OF BAND - { - $oauth_callback = $this->session->get('verify_oauth_callback'); - $ps = parse_url($oauth_callback); - if (isset($ps['host'])) - { - $referrer_host = $ps['host']; - } - } - - if ($authorized) - { - OAuthRequestLogger::addNote('Authorized token "'.$token.'" for user '.$user_id.' with referrer "'.$referrer_host.'"'); - // 1.0a Compatibility : create a verifier code - $verifier = $store->authorizeConsumerRequestToken($token, $user_id, $referrer_host); - } - else - { - OAuthRequestLogger::addNote('Authorization rejected for token "'.$token.'" for user '.$user_id."\nToken has been deleted"); - $store->deleteConsumerRequestToken($token); - } - - if (!empty($oauth_callback)) - { - $params = array('oauth_token' => rawurlencode($token)); - // 1.0a Compatibility : if verifier code has been generated, add it to the URL - if ($verifier) { - $params['oauth_verifier'] = $verifier; - } - - $uri = preg_replace('/\s/', '%20', $oauth_callback); - if (!empty($this->allowed_uri_schemes)) - { - if (!in_array(substr($uri, 0, strpos($uri, '://')), $this->allowed_uri_schemes)) - { - throw new OAuthException2('Illegal protocol in redirect uri '.$uri); - } - } - else if (!empty($this->disallowed_uri_schemes)) - { - if (in_array(substr($uri, 0, strpos($uri, '://')), $this->disallowed_uri_schemes)) - { - throw new OAuthException2('Illegal protocol in redirect uri '.$uri); - } - } - - $this->redirect($oauth_callback, $params, true); - } - } - OAuthRequestLogger::flush(); - return $verifier; - } - - - /** - * Exchange a request token for an access token. - * The exchange is only succesful iff the request token has been authorized. - * - * Never returns, calls exit() when token is exchanged or when error is returned. - */ - public function accessToken () - { - OAuthRequestLogger::start($this); - - try - { - $this->verify('request'); - - $options = array(); - $ttl = $this->getParam('xoauth_token_ttl', false); - if ($ttl) - { - $options['token_ttl'] = $ttl; - } - - $verifier = $this->getParam('oauth_verifier', false); - if ($verifier) { - $options['verifier'] = $verifier; - } - - $store = OAuthStore::instance(); - $token = $store->exchangeConsumerRequestForAccessToken($this->getParam('oauth_token', true), $options); - $result = 'oauth_token='.$this->urlencode($token['token']) - .'&oauth_token_secret='.$this->urlencode($token['token_secret']); - - if (!empty($token['token_ttl'])) - { - $result .= '&xoauth_token_ttl='.$this->urlencode($token['token_ttl']); - } - - header('HTTP/1.1 200 OK'); - header('Content-Length: '.strlen($result)); - header('Content-Type: application/x-www-form-urlencoded'); - - echo $result; - } - catch (OAuthException2 $e) - { - header('HTTP/1.1 401 Access Denied'); - header('Content-Type: text/plain'); - - echo "OAuth Verification Failed: " . $e->getMessage(); - } - - OAuthRequestLogger::flush(); - exit(); - } -} - -/* vi:set ts=4 sts=4 sw=4 binary noeol: */ - -?> diff --git a/vendor/oauth-php/library/OAuthSession.php b/vendor/oauth-php/library/OAuthSession.php deleted file mode 100644 index 80ceeb734621e1ac5713ca93a24bb68a81d5d8f8..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/OAuthSession.php +++ /dev/null @@ -1,86 +0,0 @@ -<?php - -/** - * Storage container for the oauth credentials, both server and consumer side. - * This is the factory to select the store you want to use - * - * @version $Id: OAuthSession.php 67 2010-01-12 18:42:04Z brunobg@corollarium.com $ - * @author brunobg@corollarium.com - * - * - * The MIT License - * - * Copyright (c) 2007-2008 Mediamatic Lab - * Copyright (c) 2010 Corollarium Technologies - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -require_once dirname(__FILE__) . '/OAuthException2.php'; - -class OAuthSession -{ - static private $instance = false; - - /** - * Request an instance of the OAuthSession - */ - public static function instance ( $store = 'SESSION', $options = array() ) - { - if (!OAuthSession::$instance) - { - // Select the store you want to use - if (strpos($store, '/') === false) - { - $class = 'OAuthSession'.$store; - $file = dirname(__FILE__) . '/session/'.$class.'.php'; - } - else - { - $file = $store; - $store = basename($file, '.php'); - $class = $store; - } - - if (is_file($file)) - { - require_once $file; - - if (class_exists($class)) - { - OAuthSession::$instance = new $class($options); - } - else - { - throw new OAuthException2('Could not find class '.$class.' in file '.$file); - } - } - else - { - throw new OAuthException2('No OAuthSession for '.$store.' (file '.$file.')'); - } - } - return OAuthSession::$instance; - } -} - - -/* vi:set ts=4 sts=4 sw=4 binary noeol: */ - -?> \ No newline at end of file diff --git a/vendor/oauth-php/library/OAuthStore.php b/vendor/oauth-php/library/OAuthStore.php deleted file mode 100644 index ff6db0f15ab43b565b81b01b74bfce2b25a92979..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/OAuthStore.php +++ /dev/null @@ -1,91 +0,0 @@ -<?php - -/** - * Storage container for the oauth credentials, both server and consumer side. - * This is the factory to select the store you want to use - * - * @version $Id: OAuthStore.php 182 2011-01-12 14:57:29Z brunobg@corollarium.com $ - * @author Marc Worrell <marcw@pobox.com> - * @date Nov 16, 2007 4:03:30 PM - * - * - * The MIT License - * - * Copyright (c) 2007-2008 Mediamatic Lab - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -require_once dirname(__FILE__) . '/OAuthException2.php'; - -class OAuthStore -{ - static private $instance = false; - - /** - * Request an instance of the OAuthStore - * - * @param string $store The storage system - * @param array $options To pass to the storage system - * @param boolean $forceNewInstance If true, forces the instantiation of a new store. - * @throws OAuthException2 - */ - public static function instance ( $store = 'MySQL', $options = array(), $forceNewInstance = false ) - { - if (!OAuthStore::$instance or $forceNewInstance) - { - // Select the store you want to use - if (strpos($store, '/') === false) - { - $class = 'OAuthStore'.$store; - $file = dirname(__FILE__) . '/store/'.$class.'.php'; - } - else - { - $file = $store; - $store = basename($file, '.php'); - $class = $store; - } - - if (is_file($file)) - { - require_once $file; - - if (class_exists($class)) - { - OAuthStore::$instance = new $class($options); - } - else - { - throw new OAuthException2('Could not find class '.$class.' in file '.$file); - } - } - else - { - throw new OAuthException2('No OAuthStore for '.$store.' (file '.$file.')'); - } - } - return OAuthStore::$instance; - } -} - - -/* vi:set ts=4 sts=4 sw=4 binary noeol: */ - -?> \ No newline at end of file diff --git a/vendor/oauth-php/library/body/OAuthBodyContentDisposition.php b/vendor/oauth-php/library/body/OAuthBodyContentDisposition.php deleted file mode 100644 index 02b1e427793d1eca97b649f518ec3f52619dcb36..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/body/OAuthBodyContentDisposition.php +++ /dev/null @@ -1,129 +0,0 @@ -<?php - -/** - * Add the extra headers for a PUT or POST request with a file. - * - * @version $Id$ - * @author Marc Worrell <marcw@pobox.com> - * - * The MIT License - * - * Copyright (c) 2007-2008 Mediamatic Lab - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -class OAuthBodyContentDisposition -{ - /** - * Builds the request string. - * - * The files array can be a combination of the following (either data or file): - * - * file => "path/to/file", filename=, mime=, data= - * - * @param array files (name => filedesc) (not urlencoded) - * @return array (headers, body) - */ - static function encodeBody ( $files ) - { - $headers = array(); - $body = null; - - // 1. Add all the files to the post - if (!empty($files)) - { - foreach ($files as $name => $f) - { - $data = false; - $filename = false; - - if (isset($f['filename'])) - { - $filename = $f['filename']; - } - - if (!empty($f['file'])) - { - $data = @file_get_contents($f['file']); - if ($data === false) - { - throw new OAuthException2(sprintf('Could not read the file "%s" for request body', $f['file'])); - } - if (empty($filename)) - { - $filename = basename($f['file']); - } - } - else if (isset($f['data'])) - { - $data = $f['data']; - } - - // When there is data, add it as a request body, otherwise silently skip the upload - if ($data !== false) - { - if (isset($headers['Content-Disposition'])) - { - throw new OAuthException2('Only a single file (or data) allowed in a signed PUT/POST request body.'); - } - - if (empty($filename)) - { - $filename = 'untitled'; - } - $mime = !empty($f['mime']) ? $f['mime'] : 'application/octet-stream'; - - $headers['Content-Disposition'] = 'attachment; filename="'.OAuthBodyContentDisposition::encodeParameterName($filename).'"'; - $headers['Content-Type'] = $mime; - - $body = $data; - } - - } - - // When we have a body, add the content-length - if (!is_null($body)) - { - $headers['Content-Length'] = strlen($body); - } - } - return array($headers, $body); - } - - - /** - * Encode a parameter's name for use in a multipart header. - * For now we do a simple filter that removes some unwanted characters. - * We might want to implement RFC1522 here. See http://tools.ietf.org/html/rfc1522 - * - * @param string name - * @return string - */ - static function encodeParameterName ( $name ) - { - return preg_replace('/[^\x20-\x7f]|"/', '-', $name); - } -} - - -/* vi:set ts=4 sts=4 sw=4 binary noeol: */ - - -?> \ No newline at end of file diff --git a/vendor/oauth-php/library/body/OAuthBodyMultipartFormdata.php b/vendor/oauth-php/library/body/OAuthBodyMultipartFormdata.php deleted file mode 100644 index a869e1e6d762c2bc95402354fa22ab2f930f9dda..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/body/OAuthBodyMultipartFormdata.php +++ /dev/null @@ -1,143 +0,0 @@ -<?php - -/** - * Create the body for a multipart/form-data message. - * - * @version $Id: OAuthMultipartFormdata.php 6 2008-02-13 12:35:09Z marcw@pobox.com $ - * @author Marc Worrell <marcw@pobox.com> - * @date Jan 31, 2008 12:50:05 PM - * - * The MIT License - * - * Copyright (c) 2007-2008 Mediamatic Lab - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - - -class OAuthBodyMultipartFormdata -{ - /** - * Builds the request string. - * - * The files array can be a combination of the following (either data or file): - * - * file => "path/to/file", filename=, mime=, data= - * - * @param array params (name => value) (all names and values should be urlencoded) - * @param array files (name => filedesc) (not urlencoded) - * @return array (headers, body) - */ - static function encodeBody ( $params, $files ) - { - $headers = array(); - $body = ''; - $boundary = 'OAuthRequester_'.md5(uniqid('multipart') . microtime()); - $headers['Content-Type'] = 'multipart/form-data; boundary=' . $boundary; - - - // 1. Add the parameters to the post - if (!empty($params)) - { - foreach ($params as $name => $value) - { - $body .= '--'.$boundary."\r\n"; - $body .= 'Content-Disposition: form-data; name="'.OAuthBodyMultipartFormdata::encodeParameterName(rawurldecode($name)).'"'; - $body .= "\r\n\r\n"; - $body .= urldecode($value); - $body .= "\r\n"; - } - } - - // 2. Add all the files to the post - if (!empty($files)) - { - $untitled = 1; - - foreach ($files as $name => $f) - { - $data = false; - $filename = false; - - if (isset($f['filename'])) - { - $filename = $f['filename']; - } - - if (!empty($f['file'])) - { - $data = @file_get_contents($f['file']); - if ($data === false) - { - throw new OAuthException2(sprintf('Could not read the file "%s" for form-data part', $f['file'])); - } - if (empty($filename)) - { - $filename = basename($f['file']); - } - } - else if (isset($f['data'])) - { - $data = $f['data']; - } - - // When there is data, add it as a form-data part, otherwise silently skip the upload - if ($data !== false) - { - if (empty($filename)) - { - $filename = sprintf('untitled-%d', $untitled++); - } - $mime = !empty($f['mime']) ? $f['mime'] : 'application/octet-stream'; - $body .= '--'.$boundary."\r\n"; - $body .= 'Content-Disposition: form-data; name="'.OAuthBodyMultipartFormdata::encodeParameterName($name).'"; filename="'.OAuthBodyMultipartFormdata::encodeParameterName($filename).'"'."\r\n"; - $body .= 'Content-Type: '.$mime; - $body .= "\r\n\r\n"; - $body .= $data; - $body .= "\r\n"; - } - - } - } - $body .= '--'.$boundary."--\r\n"; - - $headers['Content-Length'] = strlen($body); - return array($headers, $body); - } - - - /** - * Encode a parameter's name for use in a multipart header. - * For now we do a simple filter that removes some unwanted characters. - * We might want to implement RFC1522 here. See http://tools.ietf.org/html/rfc1522 - * - * @param string name - * @return string - */ - static function encodeParameterName ( $name ) - { - return preg_replace('/[^\x20-\x7f]|"/', '-', $name); - } -} - - -/* vi:set ts=4 sts=4 sw=4 binary noeol: */ - - -?> \ No newline at end of file diff --git a/vendor/oauth-php/library/discovery/xrds_parse.php b/vendor/oauth-php/library/discovery/xrds_parse.php deleted file mode 100644 index 7262bd92144509dc23c996a5bbef9772304c56e6..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/discovery/xrds_parse.php +++ /dev/null @@ -1,304 +0,0 @@ -<?php - -/** - * Parse a XRDS discovery description to a simple array format. - * - * For now a simple parse of the document. Better error checking - * in a later version. - * - * @version $Id$ - * @author Marc Worrell <marcw@pobox.com> - * - * - * The MIT License - * - * Copyright (c) 2007-2008 Mediamatic Lab - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -/* example of use: - -header('content-type: text/plain'); -$file = file_get_contents('../../test/discovery/xrds-magnolia.xrds'); -$xrds = xrds_parse($file); -print_r($xrds); - - */ - -/** - * Parse the xrds file in the argument. The xrds description must have been - * fetched via curl or something else. - * - * TODO: more robust checking, support for more service documents - * TODO: support for URIs to definition instead of local xml:id - * - * @param string data contents of xrds file - * @exception Exception when the file is in an unknown format - * @return array - */ -function xrds_parse ( $data ) -{ - $oauth = array(); - $doc = @DOMDocument::loadXML($data); - if ($doc === false) - { - throw new Exception('Error in XML, can\'t load XRDS document'); - } - - $xpath = new DOMXPath($doc); - $xpath->registerNamespace('xrds', 'xri://$xrds'); - $xpath->registerNamespace('xrd', 'xri://$XRD*($v*2.0)'); - $xpath->registerNamespace('simple', 'http://xrds-simple.net/core/1.0'); - - // Yahoo! uses this namespace, with lowercase xrd in it - $xpath->registerNamespace('xrd2', 'xri://$xrd*($v*2.0)'); - - $uris = xrds_oauth_service_uris($xpath); - - foreach ($uris as $uri) - { - // TODO: support uris referring to service documents outside this one - if ($uri[0] == '#') - { - $id = substr($uri, 1); - $oauth = xrds_xrd_oauth($xpath, $id); - if (is_array($oauth) && !empty($oauth)) - { - return $oauth; - } - } - } - - return false; -} - - -/** - * Parse a XRD definition for OAuth and return the uris etc. - * - * @param XPath xpath - * @param string id - * @return array - */ -function xrds_xrd_oauth ( $xpath, $id ) -{ - $oauth = array(); - $xrd = $xpath->query('//xrds:XRDS/xrd:XRD[@xml:id="'.$id.'"]'); - if ($xrd->length == 0) - { - // Yahoo! uses another namespace - $xrd = $xpath->query('//xrds:XRDS/xrd2:XRD[@xml:id="'.$id.'"]'); - } - - if ($xrd->length >= 1) - { - $x = $xrd->item(0); - $services = array(); - foreach ($x->childNodes as $n) - { - switch ($n->nodeName) - { - case 'Type': - if ($n->nodeValue != 'xri://$xrds*simple') - { - // Not a simple XRDS document - return false; - } - break; - case 'Expires': - $oauth['expires'] = $n->nodeValue; - break; - case 'Service': - list($type,$service) = xrds_xrd_oauth_service($n); - if ($type) - { - $services[$type][xrds_priority($n)][] = $service; - } - break; - } - } - - // Flatten the services on priority - foreach ($services as $type => $service) - { - $oauth[$type] = xrds_priority_flatten($service); - } - } - else - { - $oauth = false; - } - return $oauth; -} - - -/** - * Parse a service definition for OAuth in a simple xrd element - * - * @param DOMElement n - * @return array (type, service desc) - */ -function xrds_xrd_oauth_service ( $n ) -{ - $service = array( - 'uri' => '', - 'signature_method' => array(), - 'parameters' => array() - ); - - $type = false; - foreach ($n->childNodes as $c) - { - $name = $c->nodeName; - $value = $c->nodeValue; - - if ($name == 'URI') - { - $service['uri'] = $value; - } - else if ($name == 'Type') - { - if (strncmp($value, 'http://oauth.net/core/1.0/endpoint/', 35) == 0) - { - $type = basename($value); - } - else if (strncmp($value, 'http://oauth.net/core/1.0/signature/', 36) == 0) - { - $service['signature_method'][] = basename($value); - } - else if (strncmp($value, 'http://oauth.net/core/1.0/parameters/', 37) == 0) - { - $service['parameters'][] = basename($value); - } - else if (strncmp($value, 'http://oauth.net/discovery/1.0/consumer-identity/', 49) == 0) - { - $type = 'consumer_identity'; - $service['method'] = basename($value); - unset($service['signature_method']); - unset($service['parameters']); - } - else - { - $service['unknown'][] = $value; - } - } - else if ($name == 'LocalID') - { - $service['consumer_key'] = $value; - } - else if ($name[0] != '#') - { - $service[strtolower($name)] = $value; - } - } - return array($type, $service); -} - - -/** - * Return the OAuth service uris in order of the priority. - * - * @param XPath xpath - * @return array - */ -function xrds_oauth_service_uris ( $xpath ) -{ - $uris = array(); - $xrd_oauth = $xpath->query('//xrds:XRDS/xrd:XRD/xrd:Service/xrd:Type[.=\'http://oauth.net/discovery/1.0\']'); - if ($xrd_oauth->length > 0) - { - $service = array(); - foreach ($xrd_oauth as $xo) - { - // Find the URI of the service definition - $cs = $xo->parentNode->childNodes; - foreach ($cs as $c) - { - if ($c->nodeName == 'URI') - { - $prio = xrds_priority($xo); - $service[$prio][] = $c->nodeValue; - } - } - } - $uris = xrds_priority_flatten($service); - } - return $uris; -} - - - -/** - * Flatten an array according to the priority - * - * @param array ps buckets per prio - * @return array one dimensional array - */ -function xrds_priority_flatten ( $ps ) -{ - $prio = array(); - $null = array(); - ksort($ps); - foreach ($ps as $idx => $bucket) - { - if (!empty($bucket)) - { - if ($idx == 'null') - { - $null = $bucket; - } - else - { - $prio = array_merge($prio, $bucket); - } - } - } - $prio = array_merge($prio, $bucket); - return $prio; -} - - -/** - * Fetch the priority of a element - * - * @param DOMElement elt - * @return mixed 'null' or int - */ -function xrds_priority ( $elt ) -{ - if ($elt->hasAttribute('priority')) - { - $prio = $elt->getAttribute('priority'); - if (is_numeric($prio)) - { - $prio = intval($prio); - } - } - else - { - $prio = 'null'; - } - return $prio; -} - - -/* vi:set ts=4 sts=4 sw=4 binary noeol: */ - -?> diff --git a/vendor/oauth-php/library/discovery/xrds_parse.txt b/vendor/oauth-php/library/discovery/xrds_parse.txt deleted file mode 100644 index fd867ea9fb32e9311461f96c4944d2aa0f64dbad..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/discovery/xrds_parse.txt +++ /dev/null @@ -1,101 +0,0 @@ -The xrds_parse.php script contains the function: - - function xrds_parse ( $data. ) - -$data Contains the contents of a XRDS XML file. -When the data is invalid XML then this will throw an exception. - -After parsing a XRDS definition it will return a datastructure much like the one below. - -Array -( - [expires] => 2008-04-13T07:34:58Z - [request] => Array - ( - [0] => Array - ( - [uri] => https://ma.gnolia.com/oauth/get_request_token - [signature_method] => Array - ( - [0] => HMAC-SHA1 - [1] => RSA-SHA1 - [2] => PLAINTEXT - ) - - [parameters] => Array - ( - [0] => auth-header - [1] => post-body - [2] => uri-query - ) - ) - ) - - [authorize] => Array - ( - [0] => Array - ( - [uri] => http://ma.gnolia.com/oauth/authorize - [signature_method] => Array - ( - ) - - [parameters] => Array - ( - [0] => auth-header - [1] => uri-query - ) - ) - ) - - [access] => Array - ( - [0] => Array - ( - [uri] => https://ma.gnolia.com/oauth/get_access_token - [signature_method] => Array - ( - [0] => HMAC-SHA1 - [1] => RSA-SHA1 - [2] => PLAINTEXT - ) - - [parameters] => Array - ( - [0] => auth-header - [1] => post-body - [2] => uri-query - ) - ) - ) - - [resource] => Array - ( - [0] => Array - ( - [uri] => - [signature_method] => Array - ( - [0] => HMAC-SHA1 - [1] => RSA-SHA1 - ) - - [parameters] => Array - ( - [0] => auth-header - [1] => post-body - [2] => uri-query - ) - ) - ) - - [consumer_identity] => Array - ( - [0] => Array - ( - [uri] => http://ma.gnolia.com/applications/new - [method] => oob - ) - ) -) - diff --git a/vendor/oauth-php/library/session/OAuthSessionAbstract.php b/vendor/oauth-php/library/session/OAuthSessionAbstract.php deleted file mode 100644 index dcc80c1d81508e8d77f3a1b822a0c91bb7570bef..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/session/OAuthSessionAbstract.php +++ /dev/null @@ -1,44 +0,0 @@ -<?php - -/** - * Abstract base class for OAuthStore implementations - * - * @version $Id$ - * @author Bruno Barberi Gnecco <brunobg@corollarium.com> - * - * The MIT License - * - * Copyright (c) 2010 Corollarium Technologies - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -/** - * This class is used to store Session information on the server. Most - * people will use the $_SESSION based implementation, but you may prefer - * a SQL, Memcache or other implementation. - * - */ -abstract class OAuthSessionAbstract -{ - abstract public function get ( $key ); - abstract public function set ( $key, $data ); -} - -?> \ No newline at end of file diff --git a/vendor/oauth-php/library/session/OAuthSessionSESSION.php b/vendor/oauth-php/library/session/OAuthSessionSESSION.php deleted file mode 100644 index 3201ecbe06f54e4b9274cf02d7e3111db6006c2f..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/session/OAuthSessionSESSION.php +++ /dev/null @@ -1,63 +0,0 @@ -<?php - -/** - * Abstract base class for OAuthStore implementations - * - * @version $Id$ - * @author Bruno Barberi Gnecco <brunobg@corollarium.com> - * - * The MIT License - * - * Copyright (c) 2010 Corollarium Technologies - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -require_once dirname(__FILE__) . '/OAuthSessionAbstract.class.php'; - -class OAuthSessionSESSION extends OAuthSessionAbstract -{ - public function __construct( $options = array() ) - { - } - - /** - * Gets a variable value - * - * @param string $key - * @return The value or null if not set. - */ - public function get ( $key ) - { - return @$_SESSION[$key]; - } - - /** - * Sets a variable value - * - * @param string $key The key - * @param any $data The data - */ - public function set ( $key, $data ) - { - $_SESSION[$key] = $data; - } -} - -?> \ No newline at end of file diff --git a/vendor/oauth-php/library/signature_method/OAuthSignatureMethod.php b/vendor/oauth-php/library/signature_method/OAuthSignatureMethod.php deleted file mode 100644 index 34ccb428cc576324e00dd4d1b3fbff4ae9155d2c..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/signature_method/OAuthSignatureMethod.php +++ /dev/null @@ -1,69 +0,0 @@ -<?php - -/** - * Interface for OAuth signature methods - * - * @version $Id$ - * @author Marc Worrell <marcw@pobox.com> - * @date Sep 8, 2008 12:04:35 PM - * - * The MIT License - * - * Copyright (c) 2007-2008 Mediamatic Lab - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -abstract class OAuthSignatureMethod -{ - /** - * Return the name of this signature - * - * @return string - */ - abstract public function name(); - - /** - * Return the signature for the given request - * - * @param OAuthRequest request - * @param string base_string - * @param string consumer_secret - * @param string token_secret - * @return string - */ - abstract public function signature ( $request, $base_string, $consumer_secret, $token_secret ); - - /** - * Check if the request signature corresponds to the one calculated for the request. - * - * @param OAuthRequest request - * @param string base_string data to be signed, usually the base string, can be a request body - * @param string consumer_secret - * @param string token_secret - * @param string signature from the request, still urlencoded - * @return string - */ - abstract public function verify ( $request, $base_string, $consumer_secret, $token_secret, $signature ); -} - - -/* vi:set ts=4 sts=4 sw=4 binary noeol: */ - -?> \ No newline at end of file diff --git a/vendor/oauth-php/library/signature_method/OAuthSignatureMethod_HMAC_SHA1.php b/vendor/oauth-php/library/signature_method/OAuthSignatureMethod_HMAC_SHA1.php deleted file mode 100644 index e189c9381538e4c07208da29cf5bd115b0c975a2..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/signature_method/OAuthSignatureMethod_HMAC_SHA1.php +++ /dev/null @@ -1,115 +0,0 @@ -<?php - -/** - * OAuth signature implementation using HMAC-SHA1 - * - * @version $Id$ - * @author Marc Worrell <marcw@pobox.com> - * @date Sep 8, 2008 12:21:19 PM - * - * The MIT License - * - * Copyright (c) 2007-2008 Mediamatic Lab - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - - -require_once dirname(__FILE__).'/OAuthSignatureMethod.class.php'; - - -class OAuthSignatureMethod_HMAC_SHA1 extends OAuthSignatureMethod -{ - public function name () - { - return 'HMAC-SHA1'; - } - - - /** - * Calculate the signature using HMAC-SHA1 - * This function is copyright Andy Smith, 2007. - * - * @param OAuthRequest request - * @param string base_string - * @param string consumer_secret - * @param string token_secret - * @return string - */ - function signature ( $request, $base_string, $consumer_secret, $token_secret ) - { - $key = $request->urlencode($consumer_secret).'&'.$request->urlencode($token_secret); - if (function_exists('hash_hmac')) - { - $signature = base64_encode(hash_hmac("sha1", $base_string, $key, true)); - } - else - { - $blocksize = 64; - $hashfunc = 'sha1'; - if (strlen($key) > $blocksize) - { - $key = pack('H*', $hashfunc($key)); - } - $key = str_pad($key,$blocksize,chr(0x00)); - $ipad = str_repeat(chr(0x36),$blocksize); - $opad = str_repeat(chr(0x5c),$blocksize); - $hmac = pack( - 'H*',$hashfunc( - ($key^$opad).pack( - 'H*',$hashfunc( - ($key^$ipad).$base_string - ) - ) - ) - ); - $signature = base64_encode($hmac); - } - return $request->urlencode($signature); - } - - - /** - * Check if the request signature corresponds to the one calculated for the request. - * - * @param OAuthRequest request - * @param string base_string data to be signed, usually the base string, can be a request body - * @param string consumer_secret - * @param string token_secret - * @param string signature from the request, still urlencoded - * @return string - */ - public function verify ( $request, $base_string, $consumer_secret, $token_secret, $signature ) - { - $a = $request->urldecode($signature); - $b = $request->urldecode($this->signature($request, $base_string, $consumer_secret, $token_secret)); - - // We have to compare the decoded values - $valA = base64_decode($a); - $valB = base64_decode($b); - - // Crude binary comparison - return rawurlencode($valA) == rawurlencode($valB); - } -} - - -/* vi:set ts=4 sts=4 sw=4 binary noeol: */ - -?> \ No newline at end of file diff --git a/vendor/oauth-php/library/signature_method/OAuthSignatureMethod_HMAC_SHA256.php b/vendor/oauth-php/library/signature_method/OAuthSignatureMethod_HMAC_SHA256.php deleted file mode 100644 index 2d037ddda3ce94d44d6285bc37a207ac29c9e454..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/signature_method/OAuthSignatureMethod_HMAC_SHA256.php +++ /dev/null @@ -1,81 +0,0 @@ -<?php - -/** - * OAuth signature implementation using HMAC-SHA256 - * - * @author André Noack <noack@data-quest.de> - * - * The MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - - -require_once dirname(__FILE__).'/OAuthSignatureMethod.class.php'; - - -class OAuthSignatureMethod_HMAC_SHA256 extends OAuthSignatureMethod -{ - public function name () - { - return 'HMAC-SHA256'; - } - - - /** - * Calculate the signature using HMAC-SHA1 - * This function is copyright Andy Smith, 2007. - * - * @param OAuthRequest request - * @param string base_string - * @param string consumer_secret - * @param string token_secret - * @return string - */ - function signature ( $request, $base_string, $consumer_secret, $token_secret ) - { - $key = $request->urlencode($consumer_secret).'&'.$request->urlencode($token_secret); - $signature = base64_encode(hash_hmac("sha256", $base_string, $key, true)); - return $request->urlencode($signature); - } - - - /** - * Check if the request signature corresponds to the one calculated for the request. - * - * @param OAuthRequest request - * @param string base_string data to be signed, usually the base string, can be a request body - * @param string consumer_secret - * @param string token_secret - * @param string signature from the request, still urlencoded - * @return string - */ - public function verify ( $request, $base_string, $consumer_secret, $token_secret, $signature ) - { - $a = $request->urldecode($signature); - $b = $request->urldecode($this->signature($request, $base_string, $consumer_secret, $token_secret)); - - // We have to compare the decoded values - $valA = base64_decode($a); - $valB = base64_decode($b); - - // Crude binary comparison - return rawurlencode($valA) == rawurlencode($valB); - } -} diff --git a/vendor/oauth-php/library/signature_method/OAuthSignatureMethod_MD5.php b/vendor/oauth-php/library/signature_method/OAuthSignatureMethod_MD5.php deleted file mode 100644 index a016709802cb1fbd5878248554fb140c72a04a80..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/signature_method/OAuthSignatureMethod_MD5.php +++ /dev/null @@ -1,95 +0,0 @@ -<?php - -/** - * OAuth signature implementation using MD5 - * - * @version $Id$ - * @author Marc Worrell <marcw@pobox.com> - * @date Sep 8, 2008 12:09:43 PM - * - * The MIT License - * - * Copyright (c) 2007-2008 Mediamatic Lab - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -require_once dirname(__FILE__).'/OAuthSignatureMethod.class.php'; - - -class OAuthSignatureMethod_MD5 extends OAuthSignatureMethod -{ - public function name () - { - return 'MD5'; - } - - - /** - * Calculate the signature using MD5 - * Binary md5 digest, as distinct from PHP's built-in hexdigest. - * This function is copyright Andy Smith, 2007. - * - * @param OAuthRequest request - * @param string base_string - * @param string consumer_secret - * @param string token_secret - * @return string - */ - function signature ( $request, $base_string, $consumer_secret, $token_secret ) - { - $s .= '&'.$request->urlencode($consumer_secret).'&'.$request->urlencode($token_secret); - $md5 = md5($base_string); - $bin = ''; - - for ($i = 0; $i < strlen($md5); $i += 2) - { - $bin .= chr(hexdec($md5{$i+1}) + hexdec($md5{$i}) * 16); - } - return $request->urlencode(base64_encode($bin)); - } - - - /** - * Check if the request signature corresponds to the one calculated for the request. - * - * @param OAuthRequest request - * @param string base_string data to be signed, usually the base string, can be a request body - * @param string consumer_secret - * @param string token_secret - * @param string signature from the request, still urlencoded - * @return string - */ - public function verify ( $request, $base_string, $consumer_secret, $token_secret, $signature ) - { - $a = $request->urldecode($signature); - $b = $request->urldecode($this->signature($request, $base_string, $consumer_secret, $token_secret)); - - // We have to compare the decoded values - $valA = base64_decode($a); - $valB = base64_decode($b); - - // Crude binary comparison - return rawurlencode($valA) == rawurlencode($valB); - } -} - -/* vi:set ts=4 sts=4 sw=4 binary noeol: */ - -?> \ No newline at end of file diff --git a/vendor/oauth-php/library/signature_method/OAuthSignatureMethod_PLAINTEXT.php b/vendor/oauth-php/library/signature_method/OAuthSignatureMethod_PLAINTEXT.php deleted file mode 100644 index 92ef308673ef0565d591ca4ba2d6285ce563d6e0..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/signature_method/OAuthSignatureMethod_PLAINTEXT.php +++ /dev/null @@ -1,80 +0,0 @@ -<?php - -/** - * OAuth signature implementation using PLAINTEXT - * - * @version $Id$ - * @author Marc Worrell <marcw@pobox.com> - * @date Sep 8, 2008 12:09:43 PM - * - * The MIT License - * - * Copyright (c) 2007-2008 Mediamatic Lab - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -require_once dirname(__FILE__).'/OAuthSignatureMethod.class.php'; - - -class OAuthSignatureMethod_PLAINTEXT extends OAuthSignatureMethod -{ - public function name () - { - return 'PLAINTEXT'; - } - - - /** - * Calculate the signature using PLAINTEXT - * - * @param OAuthRequest request - * @param string base_string - * @param string consumer_secret - * @param string token_secret - * @return string - */ - function signature ( $request, $base_string, $consumer_secret, $token_secret ) - { - return $request->urlencode($request->urlencode($consumer_secret).'&'.$request->urlencode($token_secret)); - } - - - /** - * Check if the request signature corresponds to the one calculated for the request. - * - * @param OAuthRequest request - * @param string base_string data to be signed, usually the base string, can be a request body - * @param string consumer_secret - * @param string token_secret - * @param string signature from the request, still urlencoded - * @return string - */ - public function verify ( $request, $base_string, $consumer_secret, $token_secret, $signature ) - { - $a = $request->urldecode($signature); - $b = $request->urldecode($this->signature($request, $base_string, $consumer_secret, $token_secret)); - - return $request->urldecode($a) == $request->urldecode($b); - } -} - -/* vi:set ts=4 sts=4 sw=4 binary noeol: */ - -?> \ No newline at end of file diff --git a/vendor/oauth-php/library/signature_method/OAuthSignatureMethod_RSA_SHA1.php b/vendor/oauth-php/library/signature_method/OAuthSignatureMethod_RSA_SHA1.php deleted file mode 100644 index 864dbfbebbbd8adc08232cdd6c05deca7fe7e3a8..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/signature_method/OAuthSignatureMethod_RSA_SHA1.php +++ /dev/null @@ -1,139 +0,0 @@ -<?php - -/** - * OAuth signature implementation using PLAINTEXT - * - * @version $Id$ - * @author Marc Worrell <marcw@pobox.com> - * @date Sep 8, 2008 12:00:14 PM - * - * The MIT License - * - * Copyright (c) 2007-2008 Mediamatic Lab - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - - -require_once dirname(__FILE__).'/OAuthSignatureMethod.class.php'; - -class OAuthSignatureMethod_RSA_SHA1 extends OAuthSignatureMethod -{ - public function name() - { - return 'RSA-SHA1'; - } - - - /** - * Fetch the public CERT key for the signature - * - * @param OAuthRequest request - * @return string public key - */ - protected function fetch_public_cert ( $request ) - { - // not implemented yet, ideas are: - // (1) do a lookup in a table of trusted certs keyed off of consumer - // (2) fetch via http using a url provided by the requester - // (3) some sort of specific discovery code based on request - // - // either way should return a string representation of the certificate - throw OAuthException2("OAuthSignatureMethod_RSA_SHA1::fetch_public_cert not implemented"); - } - - - /** - * Fetch the private CERT key for the signature - * - * @param OAuthRequest request - * @return string private key - */ - protected function fetch_private_cert ( $request ) - { - // not implemented yet, ideas are: - // (1) do a lookup in a table of trusted certs keyed off of consumer - // - // either way should return a string representation of the certificate - throw OAuthException2("OAuthSignatureMethod_RSA_SHA1::fetch_private_cert not implemented"); - } - - - /** - * Calculate the signature using RSA-SHA1 - * This function is copyright Andy Smith, 2008. - * - * @param OAuthRequest request - * @param string base_string - * @param string consumer_secret - * @param string token_secret - * @return string - */ - public function signature ( $request, $base_string, $consumer_secret, $token_secret ) - { - // Fetch the private key cert based on the request - $cert = $this->fetch_private_cert($request); - - // Pull the private key ID from the certificate - $privatekeyid = openssl_get_privatekey($cert); - - // Sign using the key - $sig = false; - $ok = openssl_sign($base_string, $sig, $privatekeyid); - - // Release the key resource - openssl_free_key($privatekeyid); - - return $request->urlencode(base64_encode($sig)); - } - - - /** - * Check if the request signature is the same as the one calculated for the request. - * - * @param OAuthRequest request - * @param string base_string - * @param string consumer_secret - * @param string token_secret - * @param string signature - * @return string - */ - public function verify ( $request, $base_string, $consumer_secret, $token_secret, $signature ) - { - $decoded_sig = base64_decode($request->urldecode($signature)); - - // Fetch the public key cert based on the request - $cert = $this->fetch_public_cert($request); - - // Pull the public key ID from the certificate - $publickeyid = openssl_get_publickey($cert); - - // Check the computed signature against the one passed in the query - $ok = openssl_verify($base_string, $decoded_sig, $publickeyid); - - // Release the key resource - openssl_free_key($publickeyid); - return $ok == 1; - } - -} - -/* vi:set ts=4 sts=4 sw=4 binary noeol: */ - -?> \ No newline at end of file diff --git a/vendor/oauth-php/library/store/OAuthStore2Leg.php b/vendor/oauth-php/library/store/OAuthStore2Leg.php deleted file mode 100644 index d86505b155b381b77c99a7f4d9fc9e941da871e0..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/OAuthStore2Leg.php +++ /dev/null @@ -1,118 +0,0 @@ -<?php - -/** - * OAuthStore implementation for 2 legged OAuth. This 'store' just saves the - * consumer_token and consumer_secret. - * - * @version $Id$ - * @author Ben Hesketh <ben.hesketh@compassengine.com> - * - * The MIT License - * - * Copyright (c) 2007-2008 Mediamatic Lab - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -require_once dirname(__FILE__) . '/OAuthStoreAbstract.class.php'; - -class OAuthStore2Leg extends OAuthStoreAbstract -{ - protected $consumer_key; - protected $consumer_secret; - protected $signature_method = array('HMAC-SHA1'); - protected $token_type = false; - - /* - * Takes two options: consumer_key and consumer_secret - */ - public function __construct( $options = array() ) - { - if(isset($options['consumer_key']) && isset($options['consumer_secret'])) - { - $this->consumer_key = $options['consumer_key']; - $this->consumer_secret = $options['consumer_secret']; - if (isset($options['token_secret'])) - { - $this->token_secret = $options['token_secret']; - } - } - else - { - throw new OAuthException2("OAuthStore2Leg needs consumer_token and consumer_secret"); - } - } - - public function getSecretsForVerify ( $consumer_key, $token, $token_type = 'access' ) { throw new OAuthException2("OAuthStore2Leg doesn't support " . __METHOD__); } - public function getSecretsForSignature ( $uri, $user_id ) - { - return array( - 'consumer_key' => $this->consumer_key, - 'consumer_secret' => $this->consumer_secret, - 'signature_methods' => $this->signature_method, - 'token' => $this->token_type, - 'token_secret' => $this->token_secret - ); - } - public function getServerTokenSecrets ( $consumer_key, $token, $token_type, $user_id, $name = '' ) { throw new OAuthException2("OAuthStore2Leg doesn't support " . __METHOD__); } - public function addServerToken ( $consumer_key, $token_type, $token, $token_secret, $user_id, $options = array() ) { throw new OAuthException2("OAuthStore2Leg doesn't support " . __METHOD__); } - - public function deleteServer ( $consumer_key, $user_id, $user_is_admin = false ) { throw new OAuthException2("OAuthStore2Leg doesn't support " . __METHOD__); } - public function getServer( $consumer_key, $user_id, $user_is_admin = false ) { throw new OAuthException2("OAuthStore2Leg doesn't support " . __METHOD__); } - public function getServerForUri ( $uri, $user_id ) { throw new OAuthException2("OAuthStore2Leg doesn't support " . __METHOD__); } - public function listServerTokens ( $user_id ) { throw new OAuthException2("OAuthStore2Leg doesn't support " . __METHOD__); } - public function countServerTokens ( $consumer_key ) { throw new OAuthException2("OAuthStore2Leg doesn't support " . __METHOD__); } - public function getServerToken ( $consumer_key, $token, $user_id ) { throw new OAuthException2("OAuthStore2Leg doesn't support " . __METHOD__); } - public function deleteServerToken ( $consumer_key, $token, $user_id, $user_is_admin = false ) { throw new OAuthException2("OAuthStore2Leg doesn't support " . __METHOD__); } - public function setServerTokenTtl ( $consumer_key, $token, $token_ttl, $server_uri = NULL ) - { - //This method just needs to exist. It doesn't have to do anything! - } - - public function listServers ( $q = '', $user_id ) { throw new OAuthException2("OAuthStore2Leg doesn't support " . __METHOD__); } - public function updateServer ( $server, $user_id, $user_is_admin = false ) { throw new OAuthException2("OAuthStore2Leg doesn't support " . __METHOD__); } - - public function updateConsumer ( $consumer, $user_id, $user_is_admin = false ) { throw new OAuthException2("OAuthStore2Leg doesn't support " . __METHOD__); } - public function deleteConsumer ( $consumer_key, $user_id, $user_is_admin = false ) { throw new OAuthException2("OAuthStore2Leg doesn't support " . __METHOD__); } - public function getConsumer ( $consumer_key, $user_id, $user_is_admin = false ) { throw new OAuthException2("OAuthStore2Leg doesn't support " . __METHOD__); } - public function getConsumerStatic () { throw new OAuthException2("OAuthStore2Leg doesn't support " . __METHOD__); } - - public function addConsumerRequestToken ( $consumer_key, $options = array() ) { throw new OAuthException2("OAuthStore2Leg doesn't support " . __METHOD__); } - public function getConsumerRequestToken ( $token ) { throw new OAuthException2("OAuthStore2Leg doesn't support " . __METHOD__); } - public function deleteConsumerRequestToken ( $token ) { throw new OAuthException2("OAuthStore2Leg doesn't support " . __METHOD__); } - public function authorizeConsumerRequestToken ( $token, $user_id, $referrer_host = '' ) { throw new OAuthException2("OAuthStore2Leg doesn't support " . __METHOD__); } - public function countConsumerAccessTokens ( $consumer_key ) { throw new OAuthException2("OAuthStore2Leg doesn't support " . __METHOD__); } - public function exchangeConsumerRequestForAccessToken ( $token, $options = array() ) { throw new OAuthException2("OAuthStore2Leg doesn't support " . __METHOD__); } - public function getConsumerAccessToken ( $token, $user_id ) { throw new OAuthException2("OAuthStore2Leg doesn't support " . __METHOD__); } - public function deleteConsumerAccessToken ( $token, $user_id, $user_is_admin = false ) { throw new OAuthException2("OAuthStore2Leg doesn't support " . __METHOD__); } - public function setConsumerAccessTokenTtl ( $token, $ttl ) { throw new OAuthException2("OAuthStore2Leg doesn't support " . __METHOD__); } - - public function listConsumers ( $user_id ) { throw new OAuthException2("OAuthStore2Leg doesn't support " . __METHOD__); } - public function listConsumerApplications( $begin = 0, $total = 25 ) { throw new OAuthException2("OAuthStore2Leg doesn't support " . __METHOD__); } - public function listConsumerTokens ( $user_id ) { throw new OAuthException2("OAuthStore2Leg doesn't support " . __METHOD__); } - - public function checkServerNonce ( $consumer_key, $token, $timestamp, $nonce ) { throw new OAuthException2("OAuthStore2Leg doesn't support " . __METHOD__); } - - public function addLog ( $keys, $received, $sent, $base_string, $notes, $user_id = null ) { throw new OAuthException2("OAuthStore2Leg doesn't support " . __METHOD__); } - public function listLog ( $options, $user_id ) { throw new OAuthException2("OAuthStore2Leg doesn't support " . __METHOD__); } - - public function install () { throw new OAuthException2("OAuthStore2Leg doesn't support " . __METHOD__); } -} - -?> \ No newline at end of file diff --git a/vendor/oauth-php/library/store/OAuthStoreAbstract.php b/vendor/oauth-php/library/store/OAuthStoreAbstract.php deleted file mode 100644 index 0b240eef325220b9622a1c14dc3f8135ce033d71..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/OAuthStoreAbstract.php +++ /dev/null @@ -1,151 +0,0 @@ -<?php - -/** - * Abstract base class for OAuthStore implementations - * - * @version $Id$ - * @author Marc Worrell <marcw@pobox.com> - * - * The MIT License - * - * Copyright (c) 2007-2008 Mediamatic Lab - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -abstract class OAuthStoreAbstract -{ - abstract public function getSecretsForVerify ( $consumer_key, $token, $token_type = 'access' ); - abstract public function getSecretsForSignature ( $uri, $user_id ); - abstract public function getServerTokenSecrets ( $consumer_key, $token, $token_type, $user_id, $name = '' ); - abstract public function addServerToken ( $consumer_key, $token_type, $token, $token_secret, $user_id, $options = array() ); - - abstract public function deleteServer ( $consumer_key, $user_id, $user_is_admin = false ); - abstract public function getServer( $consumer_key, $user_id, $user_is_admin = false ); - abstract public function getServerForUri ( $uri, $user_id ); - abstract public function listServerTokens ( $user_id ); - abstract public function countServerTokens ( $consumer_key ); - abstract public function getServerToken ( $consumer_key, $token, $user_id ); - abstract public function setServerTokenTtl ( $consumer_key, $token, $token_ttl, $server_uri = NULL ); - abstract public function deleteServerToken ( $consumer_key, $token, $user_id, $user_is_admin = false ); - abstract public function listServers ( $q = '', $user_id ); - abstract public function updateServer ( $server, $user_id, $user_is_admin = false ); - - abstract public function updateConsumer ( $consumer, $user_id, $user_is_admin = false ); - abstract public function deleteConsumer ( $consumer_key, $user_id, $user_is_admin = false ); - abstract public function getConsumer ( $consumer_key, $user_id, $user_is_admin = false ); - abstract public function getConsumerStatic (); - - abstract public function addConsumerRequestToken ( $consumer_key, $options = array() ); - abstract public function getConsumerRequestToken ( $token ); - abstract public function deleteConsumerRequestToken ( $token ); - abstract public function authorizeConsumerRequestToken ( $token, $user_id, $referrer_host = '' ); - abstract public function countConsumerAccessTokens ( $consumer_key ); - abstract public function exchangeConsumerRequestForAccessToken ( $token, $options = array() ); - abstract public function getConsumerAccessToken ( $token, $user_id ); - abstract public function deleteConsumerAccessToken ( $token, $user_id, $user_is_admin = false ); - abstract public function setConsumerAccessTokenTtl ( $token, $ttl ); - - abstract public function listConsumers ( $user_id ); - abstract public function listConsumerApplications( $begin = 0, $total = 25 ); - abstract public function listConsumerTokens ( $user_id ); - - abstract public function checkServerNonce ( $consumer_key, $token, $timestamp, $nonce ); - - abstract public function addLog ( $keys, $received, $sent, $base_string, $notes, $user_id = null ); - abstract public function listLog ( $options, $user_id ); - - abstract public function install (); - - /** - * Fetch the current static consumer key for this site, create it when it was not found. - * The consumer secret for the consumer key is always empty. - * - * @return string consumer key - */ - - - /* ** Some handy utility functions ** */ - - /** - * Generate a unique key - * - * @param boolean unique force the key to be unique - * @return string - */ - public function generateKey ( $unique = false ) - { - $key = md5(uniqid(rand(), true)); - if ($unique) - { - list($usec,$sec) = explode(' ',microtime()); - $key .= dechex($usec).dechex($sec); - } - return $key; - } - - /** - * Check to see if a string is valid utf8 - * - * @param string $s - * @return boolean - */ - protected function isUTF8 ( $s ) - { - return preg_match('%(?: - [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte - |\xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs - |[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte - |\xED[\x80-\x9F][\x80-\xBF] # excluding surrogates - |\xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3 - |[\xF1-\xF3][\x80-\xBF]{3} # planes 4-15 - |\xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 - )+%xs', $s); - } - - - /** - * Make a string utf8, replacing all non-utf8 chars with a '.' - * - * @param string - * @return string - */ - protected function makeUTF8 ( $s ) - { - if (function_exists('iconv')) - { - do - { - $ok = true; - $text = @iconv('UTF-8', 'UTF-8//TRANSLIT', $s); - if (strlen($text) != strlen($s)) - { - // Remove the offending character... - $s = $text . '.' . substr($s, strlen($text) + 1); - $ok = false; - } - } - while (!$ok); - } - return $s; - } - -} - -?> \ No newline at end of file diff --git a/vendor/oauth-php/library/store/OAuthStoreAnyMeta.php b/vendor/oauth-php/library/store/OAuthStoreAnyMeta.php deleted file mode 100644 index b619ec0367a87abcc5915544c174c072ba462ef1..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/OAuthStoreAnyMeta.php +++ /dev/null @@ -1,264 +0,0 @@ -<?php - -/** - * Storage container for the oauth credentials, both server and consumer side. - * This file can only be used in conjunction with anyMeta. - * - * @version $Id: OAuthStoreAnyMeta.php 68 2010-01-12 18:59:23Z brunobg@corollarium.com $ - * @author Marc Worrell <marcw@pobox.com> - * @date Nov 16, 2007 4:03:30 PM - * - * - * The MIT License - * - * Copyright (c) 2007-2008 Mediamatic Lab - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -require_once dirname(__FILE__) . '/OAuthStoreMySQL.php'; - - -class OAuthStoreAnymeta extends OAuthStoreMySQL -{ - /** - * Construct the OAuthStoreAnymeta - * - * @param array options - */ - function __construct ( $options = array() ) - { - parent::__construct(array('conn' => any_db_conn())); - } - - - /** - * Add an entry to the log table - * - * @param array keys (osr_consumer_key, ost_token, ocr_consumer_key, oct_token) - * @param string received - * @param string sent - * @param string base_string - * @param string notes - * @param int (optional) user_id - */ - public function addLog ( $keys, $received, $sent, $base_string, $notes, $user_id = null ) - { - if (is_null($user_id) && isset($GLOBALS['any_auth'])) - { - $user_id = $GLOBALS['any_auth']->getUserId(); - } - parent::addLog($keys, $received, $sent, $base_string, $notes, $user_id); - } - - - /** - * Get a page of entries from the log. Returns the last 100 records - * matching the options given. - * - * @param array options - * @param int user_id current user - * @return array log records - */ - public function listLog ( $options, $user_id ) - { - $where = array(); - $args = array(); - if (empty($options)) - { - $where[] = 'olg_usa_id_ref = %d'; - $args[] = $user_id; - } - else - { - foreach ($options as $option => $value) - { - if (strlen($value) > 0) - { - switch ($option) - { - case 'osr_consumer_key': - case 'ocr_consumer_key': - case 'ost_token': - case 'oct_token': - $where[] = 'olg_'.$option.' = \'%s\''; - $args[] = $value; - break; - } - } - } - - $where[] = '(olg_usa_id_ref IS NULL OR olg_usa_id_ref = %d)'; - $args[] = $user_id; - } - - $rs = any_db_query_all_assoc(' - SELECT olg_id, - olg_osr_consumer_key AS osr_consumer_key, - olg_ost_token AS ost_token, - olg_ocr_consumer_key AS ocr_consumer_key, - olg_oct_token AS oct_token, - olg_usa_id_ref AS user_id, - olg_received AS received, - olg_sent AS sent, - olg_base_string AS base_string, - olg_notes AS notes, - olg_timestamp AS timestamp, - INET_NTOA(olg_remote_ip) AS remote_ip - FROM oauth_log - WHERE '.implode(' AND ', $where).' - ORDER BY olg_id DESC - LIMIT 0,100', $args); - - return $rs; - } - - - - /** - * Initialise the database - */ - public function install () - { - parent::install(); - - any_db_query("ALTER TABLE oauth_consumer_registry MODIFY ocr_usa_id_ref int(11) unsigned"); - any_db_query("ALTER TABLE oauth_consumer_token MODIFY oct_usa_id_ref int(11) unsigned not null"); - any_db_query("ALTER TABLE oauth_server_registry MODIFY osr_usa_id_ref int(11) unsigned"); - any_db_query("ALTER TABLE oauth_server_token MODIFY ost_usa_id_ref int(11) unsigned not null"); - any_db_query("ALTER TABLE oauth_log MODIFY olg_usa_id_ref int(11) unsigned"); - - any_db_alter_add_fk('oauth_consumer_registry', 'ocr_usa_id_ref', 'any_user_auth(usa_id_ref)', 'on update cascade on delete set null'); - any_db_alter_add_fk('oauth_consumer_token', 'oct_usa_id_ref', 'any_user_auth(usa_id_ref)', 'on update cascade on delete cascade'); - any_db_alter_add_fk('oauth_server_registry', 'osr_usa_id_ref', 'any_user_auth(usa_id_ref)', 'on update cascade on delete set null'); - any_db_alter_add_fk('oauth_server_token', 'ost_usa_id_ref', 'any_user_auth(usa_id_ref)', 'on update cascade on delete cascade'); - any_db_alter_add_fk('oauth_log', 'olg_usa_id_ref', 'any_user_auth(usa_id_ref)', 'on update cascade on delete cascade'); - } - - - - /** Some simple helper functions for querying the mysql db **/ - - /** - * Perform a query, ignore the results - * - * @param string sql - * @param vararg arguments (for sprintf) - */ - protected function query ( $sql ) - { - list($sql, $args) = $this->sql_args(func_get_args()); - any_db_query($sql, $args); - } - - - /** - * Perform a query, ignore the results - * - * @param string sql - * @param vararg arguments (for sprintf) - * @return array - */ - protected function query_all_assoc ( $sql ) - { - list($sql, $args) = $this->sql_args(func_get_args()); - return any_db_query_all_assoc($sql, $args); - } - - - /** - * Perform a query, return the first row - * - * @param string sql - * @param vararg arguments (for sprintf) - * @return array - */ - protected function query_row_assoc ( $sql ) - { - list($sql, $args) = $this->sql_args(func_get_args()); - return any_db_query_row_assoc($sql, $args); - } - - - /** - * Perform a query, return the first row - * - * @param string sql - * @param vararg arguments (for sprintf) - * @return array - */ - protected function query_row ( $sql ) - { - list($sql, $args) = $this->sql_args(func_get_args()); - return any_db_query_row($sql, $args); - } - - - /** - * Perform a query, return the first column of the first row - * - * @param string sql - * @param vararg arguments (for sprintf) - * @return mixed - */ - protected function query_one ( $sql ) - { - list($sql, $args) = $this->sql_args(func_get_args()); - return any_db_query_one($sql, $args); - } - - - /** - * Return the number of rows affected in the last query - * - * @return int - */ - protected function query_affected_rows () - { - return any_db_affected_rows(); - } - - - /** - * Return the id of the last inserted row - * - * @return int - */ - protected function query_insert_id () - { - return any_db_insert_id(); - } - - - private function sql_args ( $args ) - { - $sql = array_shift($args); - if (count($args) == 1 && is_array($args[0])) - { - $args = $args[0]; - } - return array($sql, $args); - } - -} - - -/* vi:set ts=4 sts=4 sw=4 binary noeol: */ - -?> \ No newline at end of file diff --git a/vendor/oauth-php/library/store/OAuthStoreMySQL.php b/vendor/oauth-php/library/store/OAuthStoreMySQL.php deleted file mode 100644 index c568359ace821c98263ce964f796d3db5c5172d7..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/OAuthStoreMySQL.php +++ /dev/null @@ -1,245 +0,0 @@ -<?php - -/** - * Storage container for the oauth credentials, both server and consumer side. - * Based on MySQL - * - * @version $Id: OAuthStoreMySQL.php 85 2010-02-19 14:56:40Z brunobg@corollarium.com $ - * @author Marc Worrell <marcw@pobox.com> - * @date Nov 16, 2007 4:03:30 PM - * - * - * The MIT License - * - * Copyright (c) 2007-2008 Mediamatic Lab - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - - -require_once dirname(__FILE__) . '/OAuthStoreSQL.php'; - - -class OAuthStoreMySQL extends OAuthStoreSQL -{ - /** - * The MySQL connection - */ - protected $conn; - - /** - * Initialise the database - */ - public function install () - { - require_once dirname(__FILE__) . '/mysql/install.php'; - } - - - /* ** Some simple helper functions for querying the mysql db ** */ - - /** - * Perform a query, ignore the results - * - * @param string sql - * @param vararg arguments (for sprintf) - */ - protected function query ( $sql ) - { - $sql = $this->sql_printf(func_get_args()); - if (!($res = mysql_query($sql, $this->conn))) - { - $this->sql_errcheck($sql); - } - if (is_resource($res)) - { - mysql_free_result($res); - } - } - - - /** - * Perform a query, ignore the results - * - * @param string sql - * @param vararg arguments (for sprintf) - * @return array - */ - protected function query_all_assoc ( $sql ) - { - $sql = $this->sql_printf(func_get_args()); - if (!($res = mysql_query($sql, $this->conn))) - { - $this->sql_errcheck($sql); - } - $rs = array(); - while ($row = mysql_fetch_assoc($res)) - { - $rs[] = $row; - } - mysql_free_result($res); - return $rs; - } - - - /** - * Perform a query, return the first row - * - * @param string sql - * @param vararg arguments (for sprintf) - * @return array - */ - protected function query_row_assoc ( $sql ) - { - $sql = $this->sql_printf(func_get_args()); - if (!($res = mysql_query($sql, $this->conn))) - { - $this->sql_errcheck($sql); - } - if ($row = mysql_fetch_assoc($res)) - { - $rs = $row; - } - else - { - $rs = false; - } - mysql_free_result($res); - return $rs; - } - - - /** - * Perform a query, return the first row - * - * @param string sql - * @param vararg arguments (for sprintf) - * @return array - */ - protected function query_row ( $sql ) - { - $sql = $this->sql_printf(func_get_args()); - if (!($res = mysql_query($sql, $this->conn))) - { - $this->sql_errcheck($sql); - } - if ($row = mysql_fetch_array($res)) - { - $rs = $row; - } - else - { - $rs = false; - } - mysql_free_result($res); - return $rs; - } - - - /** - * Perform a query, return the first column of the first row - * - * @param string sql - * @param vararg arguments (for sprintf) - * @return mixed - */ - protected function query_one ( $sql ) - { - $sql = $this->sql_printf(func_get_args()); - if (!($res = mysql_query($sql, $this->conn))) - { - $this->sql_errcheck($sql); - } - $val = @mysql_result($res, 0, 0); - mysql_free_result($res); - return $val; - } - - - /** - * Return the number of rows affected in the last query - */ - protected function query_affected_rows () - { - return mysql_affected_rows($this->conn); - } - - - /** - * Return the id of the last inserted row - * - * @return int - */ - protected function query_insert_id () - { - return mysql_insert_id($this->conn); - } - - - protected function sql_printf ( $args ) - { - $sql = array_shift($args); - if (count($args) == 1 && is_array($args[0])) - { - $args = $args[0]; - } - $args = array_map(array($this, 'sql_escape_string'), $args); - return vsprintf($sql, $args); - } - - - protected function sql_escape_string ( $s ) - { - if (is_string($s)) - { - return mysql_real_escape_string($s, $this->conn); - } - else if (is_null($s)) - { - return NULL; - } - else if (is_bool($s)) - { - return intval($s); - } - else if (is_int($s) || is_float($s)) - { - return $s; - } - else - { - return mysql_real_escape_string(strval($s), $this->conn); - } - } - - - protected function sql_errcheck ( $sql ) - { - if (mysql_errno($this->conn)) - { - $msg = "SQL Error in OAuthStoreMySQL: ".mysql_error($this->conn)."\n\n" . $sql; - throw new OAuthException2($msg); - } - } -} - - -/* vi:set ts=4 sts=4 sw=4 binary noeol: */ - -?> \ No newline at end of file diff --git a/vendor/oauth-php/library/store/OAuthStoreMySQLi.php b/vendor/oauth-php/library/store/OAuthStoreMySQLi.php deleted file mode 100644 index 09d71bfba596b4b49cb0be64221fc24b6df38926..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/OAuthStoreMySQLi.php +++ /dev/null @@ -1,306 +0,0 @@ -<?php - -/** - * Storage container for the oauth credentials, both server and consumer side. - * Based on MySQL - * - * @version $Id: OAuthStoreMySQLi.php 64 2009-08-16 19:37:00Z marcw@pobox.com $ - * @author Bruno Barberi Gnecco <brunobg@users.sf.net> Based on code by Marc Worrell <marcw@pobox.com> - * - * - * The MIT License - * - * Copyright (c) 2007-2008 Mediamatic Lab - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -/* - * Modified from OAuthStoreMySQL to support MySQLi - */ - -require_once dirname(__FILE__) . '/OAuthStoreMySQL.php'; - - -class OAuthStoreMySQLi extends OAuthStoreMySQL -{ - - public function install() { - $sql = file_get_contents(dirname(__FILE__) . '/mysql/mysql.sql'); - $ps = explode('#--SPLIT--', $sql); - - foreach ($ps as $p) - { - $p = preg_replace('/^\s*#.*$/m', '', $p); - - $this->query($p); - $this->sql_errcheck($p); - } - } - - /** - * Construct the OAuthStoreMySQLi. - * In the options you have to supply either: - * - server, username, password and database (for a mysqli_connect) - * - conn (for the connection to be used) - * - * @param array options - */ - function __construct ( $options = array() ) - { - if (isset($options['conn'])) - { - $this->conn = $options['conn']; - } - else - { - if (isset($options['server'])) - { - $server = $options['server']; - $username = $options['username']; - - if (isset($options['password'])) - { - $this->conn = ($GLOBALS["___mysqli_ston"] = mysqli_connect($server, $username, $options['password'])); - } - else - { - $this->conn = ($GLOBALS["___mysqli_ston"] = mysqli_connect($server, $username)); - } - } - else - { - // Try the default mysql connect - $this->conn = ($GLOBALS["___mysqli_ston"] = mysqli_connect()); - } - - if ($this->conn === false) - { - throw new OAuthException2('Could not connect to MySQL database: ' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false))); - } - - if (isset($options['database'])) - { - /* TODO: security. mysqli_ doesn't seem to have an escape identifier function. - $escapeddb = mysqli_real_escape_string($options['database']); - if (!((bool)mysqli_query( $this->conn, "USE `$escapeddb`" ))) - { - $this->sql_errcheck(); - }*/ - } - $this->query('set character set utf8'); - } - } - - /** - * Perform a query, ignore the results - * - * @param string sql - * @param vararg arguments (for sprintf) - */ - protected function query ( $sql ) - { - $sql = $this->sql_printf(func_get_args()); - if (!($res = mysqli_query( $this->conn, $sql))) - { - $this->sql_errcheck($sql); - } - if (!is_bool($res)) - { - ((mysqli_free_result($res) || (is_object($res) && (get_class($res) == "mysqli_result"))) ? true : false); - } - } - - - /** - * Perform a query, ignore the results - * - * @param string sql - * @param vararg arguments (for sprintf) - * @return array - */ - protected function query_all_assoc ( $sql ) - { - $sql = $this->sql_printf(func_get_args()); - if (!($res = mysqli_query( $this->conn, $sql))) - { - $this->sql_errcheck($sql); - } - $rs = array(); - while ($row = mysqli_fetch_assoc($res)) - { - $rs[] = $row; - } - ((mysqli_free_result($res) || (is_object($res) && (get_class($res) == "mysqli_result"))) ? true : false); - return $rs; - } - - - /** - * Perform a query, return the first row - * - * @param string sql - * @param vararg arguments (for sprintf) - * @return array - */ - protected function query_row_assoc ( $sql ) - { - $sql = $this->sql_printf(func_get_args()); - if (!($res = mysqli_query( $this->conn, $sql))) - { - $this->sql_errcheck($sql); - } - if ($row = mysqli_fetch_assoc($res)) - { - $rs = $row; - } - else - { - $rs = false; - } - ((mysqli_free_result($res) || (is_object($res) && (get_class($res) == "mysqli_result"))) ? true : false); - return $rs; - } - - - /** - * Perform a query, return the first row - * - * @param string sql - * @param vararg arguments (for sprintf) - * @return array - */ - protected function query_row ( $sql ) - { - $sql = $this->sql_printf(func_get_args()); - if (!($res = mysqli_query( $this->conn, $sql))) - { - $this->sql_errcheck($sql); - } - if ($row = mysqli_fetch_array($res)) - { - $rs = $row; - } - else - { - $rs = false; - } - ((mysqli_free_result($res) || (is_object($res) && (get_class($res) == "mysqli_result"))) ? true : false); - return $rs; - } - - - /** - * Perform a query, return the first column of the first row - * - * @param string sql - * @param vararg arguments (for sprintf) - * @return mixed - */ - protected function query_one ( $sql ) - { - $sql = $this->sql_printf(func_get_args()); - if (!($res = mysqli_query( $this->conn, $sql))) - { - $this->sql_errcheck($sql); - } - if ($row = mysqli_fetch_assoc($res)) - { - $val = array_pop($row); - } - else - { - $val = false; - } - ((mysqli_free_result($res) || (is_object($res) && (get_class($res) == "mysqli_result"))) ? true : false); - return $val; - } - - - /** - * Return the number of rows affected in the last query - */ - protected function query_affected_rows () - { - return mysqli_affected_rows($this->conn); - } - - - /** - * Return the id of the last inserted row - * - * @return int - */ - protected function query_insert_id () - { - return ((is_null($___mysqli_res = mysqli_insert_id($this->conn))) ? false : $___mysqli_res); - } - - - protected function sql_printf ( $args ) - { - $sql = array_shift($args); - if (count($args) == 1 && is_array($args[0])) - { - $args = $args[0]; - } - $args = array_map(array($this, 'sql_escape_string'), $args); - return vsprintf($sql, $args); - } - - - protected function sql_escape_string ( $s ) - { - if (is_string($s)) - { - return mysqli_real_escape_string( $this->conn, $s); - } - else if (is_null($s)) - { - return NULL; - } - else if (is_bool($s)) - { - return intval($s); - } - else if (is_int($s) || is_float($s)) - { - return $s; - } - else - { - return mysqli_real_escape_string( $this->conn, strval($s)); - } - } - - - protected function sql_errcheck ( $sql ) - { - if (((is_object($this->conn)) ? mysqli_errno($this->conn) : (($___mysqli_res = mysqli_connect_errno()) ? $___mysqli_res : false))) - { - $msg = "SQL Error in OAuthStoreMySQL: ".((is_object($this->conn)) ? mysqli_error($this->conn) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false))."\n\n" . $sql; - throw new OAuthException2($msg); - } - } -} - - -/* vi:set ts=4 sts=4 sw=4 binary noeol: */ - -?> \ No newline at end of file diff --git a/vendor/oauth-php/library/store/OAuthStoreOracle.php b/vendor/oauth-php/library/store/OAuthStoreOracle.php deleted file mode 100644 index ea905a291fa302a35d19bfd3fde5c504d9615e56..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/OAuthStoreOracle.php +++ /dev/null @@ -1,1541 +0,0 @@ -<?php - -/** - * Added by Vinay Kant Sahu. - * Replaced all the MySQL queries with Oracle SPs. (ref: OAuthStoreSQL.php) - * vinaykant.sahu@gmail.com - * - * Storage container for the oauth credentials, both server and consumer side. - * Based on Oracle - * - * @author Vinay Kant Sahu <vinaykant.sahu@gmail.com> - * @date Aug 6, 2010 - * - * The MIT License - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -require_once dirname(__FILE__) . '/OAuthStoreAbstract.class.php'; - -abstract class OAuthStoreOracle extends OAuthStoreAbstract { - /** - * Maximum delta a timestamp may be off from a previous timestamp. - * Allows multiple consumers with some clock skew to work with the same token. - * Unit is seconds, default max skew is 10 minutes. - */ - protected $max_timestamp_skew = MAX_TIMESTAMP_SKEW; - - /** - * Default ttl for request tokens - */ - protected $max_request_token_ttl = MAX_REQUEST_TOKEN_TIME; - - - /** - * Construct the OAuthStoreMySQL. - * In the options you have to supply either: - * - server, username, password and database (for a mysql_connect) - * - conn (for the connection to be used) - * - * @param array options - */ - function __construct ( $options = array() ) { - if (isset($options['conn'])) { - $this->conn = $options['conn']; - } - else { - $this->conn=oci_connect(DBUSER,DBPASSWORD,DBHOST); - - if ($this->conn === false) { - throw new OAuthException2('Could not connect to database'); - } - - // $this->query('set character set utf8'); - } - } - - /** - * Find stored credentials for the consumer key and token. Used by an OAuth server - * when verifying an OAuth request. - * - * @param string consumer_key - * @param string token - * @param string token_type false, 'request' or 'access' - * @exception OAuthException2 when no secrets where found - * @return array assoc (consumer_secret, token_secret, osr_id, ost_id, user_id) - */ - public function getSecretsForVerify ($consumer_key, $token, $token_type = 'access' ) { - $sql = "BEGIN SP_GET_SECRETS_FOR_VERIFY(:P_CONSUMER_KEY, :P_TOKEN, :P_TOKEN_TYPE, :P_ROWS, :P_RESULT); END;"; - - // parse sql - $stmt = oci_parse($this->conn, $sql) or die ('Can not parse query'); - - // Bind In and Out Variables - oci_bind_by_name($stmt, ':P_CONSUMER_KEY', $consumer_key, 255); - oci_bind_by_name($stmt, ':P_TOKEN', $token, 255); - oci_bind_by_name($stmt, ':P_TOKEN_TYPE', $token_type, 255); - oci_bind_by_name($stmt, ':P_RESULT', $result, 20); - - //Bind the ref cursor - $p_row = oci_new_cursor($this->conn); - oci_bind_by_name($stmt, ':P_ROWS', $p_row, -1, OCI_B_CURSOR); - - //Execute the statement - oci_execute($stmt); - - // treat the ref cursor as a statement resource - oci_execute($p_row, OCI_DEFAULT); - oci_fetch_all($p_row, $getSecretsForVerifyList, null, null, OCI_FETCHSTATEMENT_BY_ROW); - - $rs =$getSecretsForVerifyList; - if (empty($rs)) { - throw new OAuthException2('The consumer_key "'.$consumer_key.'" token "'.$token.'" combination does not exist or is not enabled.'); - } - - return $rs[0]; - } - - - /** - * Find the server details for signing a request, always looks for an access token. - * The returned credentials depend on which local user is making the request. - * - * The consumer_key must belong to the user or be public (user id is null) - * - * For signing we need all of the following: - * - * consumer_key consumer key associated with the server - * consumer_secret consumer secret associated with this server - * token access token associated with this server - * token_secret secret for the access token - * signature_methods signing methods supported by the server (array) - * - * @todo filter on token type (we should know how and with what to sign this request, and there might be old access tokens) - * @param string uri uri of the server - * @param int user_id id of the logged on user - * @param string name (optional) name of the token (case sensitive) - * @exception OAuthException2 when no credentials found - * @return array - */ - public function getSecretsForSignature ( $uri, $user_id, $name = '' ) { - // Find a consumer key and token for the given uri - $ps = parse_url($uri); - $host = isset($ps['host']) ? $ps['host'] : 'localhost'; - $path = isset($ps['path']) ? $ps['path'] : ''; - - if (empty($path) || substr($path, -1) != '/') { - $path .= '/'; - } - // - $sql = "BEGIN SP_GET_SECRETS_FOR_SIGNATURE(:P_HOST, :P_PATH, :P_USER_ID, :P_NAME, :P_ROWS, :P_RESULT); END;"; - - // parse sql - $stmt = oci_parse($this->conn, $sql) or die ('Can not parse query'); - - // Bind In and Out Variables - oci_bind_by_name($stmt, ':P_HOST', $host, 255); - oci_bind_by_name($stmt, ':P_PATH', $path, 255); - oci_bind_by_name($stmt, ':P_USER_ID', $user_id, 20); - oci_bind_by_name($stmt, ':P_NAME', $name, 255); - oci_bind_by_name($stmt, ':P_RESULT', $result, 20); - - //Bind the ref cursor - $p_row = oci_new_cursor($this->conn); - oci_bind_by_name($stmt, ':P_ROWS', $p_row, -1, OCI_B_CURSOR); - - //Execute the statement - oci_execute($stmt); - - // treat the ref cursor as a statement resource - oci_execute($p_row, OCI_DEFAULT); - oci_fetch_all($p_row, $getSecretsForSignatureList, null, null, OCI_FETCHSTATEMENT_BY_ROW); - $secrets = $getSecretsForSignatureList[0]; - // - // The owner of the consumer_key is either the user or nobody (public consumer key) - /*$secrets = $this->query_row_assoc(' - SELECT ocr_consumer_key as consumer_key, - ocr_consumer_secret as consumer_secret, - oct_token as token, - oct_token_secret as token_secret, - ocr_signature_methods as signature_methods - FROM oauth_consumer_registry - JOIN oauth_consumer_token ON oct_ocr_id_ref = ocr_id - WHERE ocr_server_uri_host = \'%s\' - AND ocr_server_uri_path = LEFT(\'%s\', LENGTH(ocr_server_uri_path)) - AND (ocr_usa_id_ref = %s OR ocr_usa_id_ref IS NULL) - AND oct_usa_id_ref = %d - AND oct_token_type = \'access\' - AND oct_name = \'%s\' - AND oct_token_ttl >= NOW() - ORDER BY ocr_usa_id_ref DESC, ocr_consumer_secret DESC, LENGTH(ocr_server_uri_path) DESC - LIMIT 0,1 - ', $host, $path, $user_id, $user_id, $name - ); - */ - if (empty($secrets)) { - throw new OAuthException2('No server tokens available for '.$uri); - } - $secrets['signature_methods'] = explode(',', $secrets['signature_methods']); - return $secrets; - } - - - /** - * Get the token and token secret we obtained from a server. - * - * @param string consumer_key - * @param string token - * @param string token_type - * @param int user_id the user owning the token - * @param string name optional name for a named token - * @exception OAuthException2 when no credentials found - * @return array - */ - public function getServerTokenSecrets ($consumer_key,$token,$token_type,$user_id,$name = '') - { - if ($token_type != 'request' && $token_type != 'access') - { - throw new OAuthException2('Unkown token type "'.$token_type.'", must be either "request" or "access"'); - } - // - $sql = "BEGIN SP_GET_SERVER_TOKEN_SECRETS(:P_CONSUMER_KEY, :P_TOKEN, :P_TOKEN_TYPE, :P_USER_ID, :P_ROWS, :P_RESULT); END;"; - - // parse sql - $stmt = oci_parse($this->conn, $sql) or die ('Can not parse query'); - - // Bind In and Out Variables - oci_bind_by_name($stmt, ':P_CONSUMER_KEY', $consumer_key, 255); - oci_bind_by_name($stmt, ':P_TOKEN', $token, 255); - oci_bind_by_name($stmt, ':P_TOKEN_TYPE', $token_type, 20); - oci_bind_by_name($stmt, ':P_USER_ID', $user_id, 255); - oci_bind_by_name($stmt, ':P_RESULT', $result, 20); - - //Bind the ref cursor - $p_row = oci_new_cursor($this->conn); - oci_bind_by_name($stmt, ':P_ROWS', $p_row, -1, OCI_B_CURSOR); - - //Execute the statement - oci_execute($stmt); - - // treat the ref cursor as a statement resource - oci_execute($p_row, OCI_DEFAULT); - oci_fetch_all($p_row, $getServerTokenSecretsList, null, null, OCI_FETCHSTATEMENT_BY_ROW); - $r=$getServerTokenSecretsList[0]; - // - // Take the most recent token of the given type - /*$r = $this->query_row_assoc(' - SELECT ocr_consumer_key as consumer_key, - ocr_consumer_secret as consumer_secret, - oct_token as token, - oct_token_secret as token_secret, - oct_name as token_name, - ocr_signature_methods as signature_methods, - ocr_server_uri as server_uri, - ocr_request_token_uri as request_token_uri, - ocr_authorize_uri as authorize_uri, - ocr_access_token_uri as access_token_uri, - IF(oct_token_ttl >= \'9999-12-31\', NULL, UNIX_TIMESTAMP(oct_token_ttl) - UNIX_TIMESTAMP(NOW())) as token_ttl - FROM oauth_consumer_registry - JOIN oauth_consumer_token - ON oct_ocr_id_ref = ocr_id - WHERE ocr_consumer_key = \'%s\' - AND oct_token_type = \'%s\' - AND oct_token = \'%s\' - AND oct_usa_id_ref = %d - AND oct_token_ttl >= NOW() - ', $consumer_key, $token_type, $token, $user_id - );*/ - - if (empty($r)) - { - throw new OAuthException2('Could not find a "'.$token_type.'" token for consumer "'.$consumer_key.'" and user '.$user_id); - } - if (isset($r['signature_methods']) && !empty($r['signature_methods'])) - { - $r['signature_methods'] = explode(',',$r['signature_methods']); - } - else - { - $r['signature_methods'] = array(); - } - return $r; - } - - - /** - * Add a request token we obtained from a server. - * - * @todo remove old tokens for this user and this ocr_id - * @param string consumer_key key of the server in the consumer registry - * @param string token_type one of 'request' or 'access' - * @param string token - * @param string token_secret - * @param int user_id the user owning the token - * @param array options extra options, name and token_ttl - * @exception OAuthException2 when server is not known - * @exception OAuthException2 when we received a duplicate token - */ - public function addServerToken ( $consumer_key, $token_type, $token, $token_secret, $user_id, $options = array() ) - { - if ($token_type != 'request' && $token_type != 'access') - { - throw new OAuthException2('Unknown token type "'.$token_type.'", must be either "request" or "access"'); - } - - // Maximum time to live for this token - if (isset($options['token_ttl']) && is_numeric($options['token_ttl'])) - { - $ttl = intval($options['token_ttl']); - } - else if ($token_type == 'request') - { - $ttl =intval($this->max_request_token_ttl); - } - else - { - $ttl = NULL; - } - - - - // Named tokens, unique per user/consumer key - if (isset($options['name']) && $options['name'] != '') - { - $name = $options['name']; - } - else - { - $name = ''; - } - // - $sql = "BEGIN SP_ADD_SERVER_TOKEN(:P_CONSUMER_KEY, :P_USER_ID, :P_NAME, :P_TOKEN_TYPE, :P_TOKEN, :P_TOKEN_SECRET, :P_TOKEN_INTERVAL_IN_SEC, :P_RESULT); END;"; - - // parse sql - $stmt = oci_parse($this->conn, $sql) or die ('Can not parse query'); - - // Bind In and Out Variables - oci_bind_by_name($stmt, ':P_CONSUMER_KEY', $consumer_key, 255); - oci_bind_by_name($stmt, ':P_USER_ID', $user_id, 40); - oci_bind_by_name($stmt, ':P_NAME', $name, 255); - oci_bind_by_name($stmt, ':P_TOKEN_TYPE', $token_type, 20); - oci_bind_by_name($stmt, ':P_TOKEN', $token, 255); - oci_bind_by_name($stmt, ':P_TOKEN_SECRET', $token_secret, 255); - oci_bind_by_name($stmt, ':P_TOKEN_INTERVAL_IN_SEC', $ttl, 40); - oci_bind_by_name($stmt, ':P_RESULT', $result, 20); - - //Execute the statement - oci_execute($stmt); - // - - - - if (!$result) - { - throw new OAuthException2('Received duplicate token "'.$token.'" for the same consumer_key "'.$consumer_key.'"'); - } - } - - - /** - * Delete a server key. This removes access to that site. - * - * @param string consumer_key - * @param int user_id user registering this server - * @param boolean user_is_admin - */ - public function deleteServer ( $consumer_key, $user_id, $user_is_admin = false ) - { - - $sql = "BEGIN SP_DELETE_SERVER(:P_CONSUMER_KEY, :P_USER_ID, :P_USER_IS_ADMIN, :P_RESULT); END;"; - - // parse sql - $stmt = oci_parse($this->conn, $sql) or die ('Can not parse query'); - - // Bind In and Out Variables - oci_bind_by_name($stmt, ':P_CONSUMER_KEY', $consumer_key, 255); - oci_bind_by_name($stmt, ':P_USER_ID', $user_id, 40); - oci_bind_by_name($stmt, ':P_USER_IS_ADMIN', $user_is_admin, 255); - oci_bind_by_name($stmt, ':P_RESULT', $result, 20); - - //Execute the statement - oci_execute($stmt); - } - - - /** - * Get a server from the consumer registry using the consumer key - * - * @param string consumer_key - * @param int user_id - * @param boolean user_is_admin (optional) - * @exception OAuthException2 when server is not found - * @return array - */ - public function getServer ( $consumer_key, $user_id, $user_is_admin = false ) - { - - // - $sql = "BEGIN SP_GET_SERVER(:P_CONSUMER_KEY, :P_USER_ID, :P_ROWS, :P_RESULT); END;"; - - // parse sql - $stmt = oci_parse($this->conn, $sql) or die ('Can not parse query'); - - // Bind In and Out Variables - oci_bind_by_name($stmt, ':P_CONSUMER_KEY', $consumer_key, 255); - oci_bind_by_name($stmt, ':P_USER_ID', $user_id, 40); - oci_bind_by_name($stmt, ':P_RESULT', $result, 20); - - //Bind the ref cursor - $p_row = oci_new_cursor($this->conn); - oci_bind_by_name($stmt, ':P_ROWS', $p_row, -1, OCI_B_CURSOR); - - //Execute the statement - oci_execute($stmt); - - // treat the ref cursor as a statement resource - oci_execute($p_row, OCI_DEFAULT); - oci_fetch_all($p_row, $getServerList, null, null, OCI_FETCHSTATEMENT_BY_ROW); - $r = $getServerList; - // - if (empty($r)) - { - throw new OAuthException2('No server with consumer_key "'.$consumer_key.'" has been registered (for this user)'); - } - - if (isset($r['signature_methods']) && !empty($r['signature_methods'])) - { - $r['signature_methods'] = explode(',',$r['signature_methods']); - } - else - { - $r['signature_methods'] = array(); - } - return $r; - } - - - - /** - * Find the server details that might be used for a request - * - * The consumer_key must belong to the user or be public (user id is null) - * - * @param string uri uri of the server - * @param int user_id id of the logged on user - * @exception OAuthException2 when no credentials found - * @return array - */ - public function getServerForUri ( $uri, $user_id ) - { - // Find a consumer key and token for the given uri - $ps = parse_url($uri); - $host = isset($ps['host']) ? $ps['host'] : 'localhost'; - $path = isset($ps['path']) ? $ps['path'] : ''; - - if (empty($path) || substr($path, -1) != '/') - { - $path .= '/'; - } - - - // - $sql = "BEGIN SP_GET_SERVER_FOR_URI(:P_HOST, :P_PATH,:P_USER_ID, :P_ROWS, :P_RESULT); END;"; - - // parse sql - $stmt = oci_parse($this->conn, $sql) or die ('Can not parse query'); - - // Bind In and Out Variables - oci_bind_by_name($stmt, ':P_HOST', $host, 255); - oci_bind_by_name($stmt, ':P_PATH', $path, 255); - oci_bind_by_name($stmt, ':P_USER_ID', $user_id, 40); - oci_bind_by_name($stmt, ':P_RESULT', $result, 20); - - //Bind the ref cursor - $p_row = oci_new_cursor($this->conn); - oci_bind_by_name($stmt, ':P_ROWS', $p_row, -1, OCI_B_CURSOR); - - //Execute the statement - oci_execute($stmt); - - // treat the ref cursor as a statement resource - oci_execute($p_row, OCI_DEFAULT); - oci_fetch_all($p_row, $getServerForUriList, null, null, OCI_FETCHSTATEMENT_BY_ROW); - $server = $getServerForUriList; - // - if (empty($server)) - { - throw new OAuthException2('No server available for '.$uri); - } - $server['signature_methods'] = explode(',', $server['signature_methods']); - return $server; - } - - - /** - * Get a list of all server token this user has access to. - * - * @param int usr_id - * @return array - */ - public function listServerTokens ( $user_id ) - { - - $sql = "BEGIN SP_LIST_SERVER_TOKENS(:P_USER_ID, :P_ROWS, :P_RESULT); END;"; - - // parse sql - $stmt = oci_parse($this->conn, $sql) or die ('Can not parse query'); - - // Bind In and Out Variables - oci_bind_by_name($stmt, ':P_USER_ID', $user_id, 40); - oci_bind_by_name($stmt, ':P_RESULT', $result, 20); - - //Bind the ref cursor - $p_row = oci_new_cursor($this->conn); - oci_bind_by_name($stmt, ':P_ROWS', $p_row, -1, OCI_B_CURSOR); - - //Execute the statement - oci_execute($stmt); - - // treat the ref cursor as a statement resource - oci_execute($p_row, OCI_DEFAULT); - oci_fetch_all($p_row, $listServerTokensList, null, null, OCI_FETCHSTATEMENT_BY_ROW); - $ts = $listServerTokensList; - return $ts; - } - - - /** - * Count how many tokens we have for the given server - * - * @param string consumer_key - * @return int - */ - public function countServerTokens ( $consumer_key ) - { - - // - $count =0; - $sql = "BEGIN SP_COUNT_SERVICE_TOKENS(:P_CONSUMER_KEY, :P_COUNT, :P_RESULT); END;"; - - // parse sql - $stmt = oci_parse($this->conn, $sql) or die ('Can not parse query'); - - // Bind In and Out Variables - oci_bind_by_name($stmt, ':P_CONSUMER_KEY', $consumer_key, 255); - oci_bind_by_name($stmt, ':P_COUNT', $count, 40); - oci_bind_by_name($stmt, ':P_RESULT', $result, 20); - - //Execute the statement - oci_execute($stmt); - // - return $count; - } - - - /** - * Get a specific server token for the given user - * - * @param string consumer_key - * @param string token - * @param int user_id - * @exception OAuthException2 when no such token found - * @return array - */ - public function getServerToken ( $consumer_key, $token, $user_id ) - { - - $sql = "BEGIN SP_GET_SERVER_TOKEN(:P_CONSUMER_KEY, :P_USER_ID,:P_TOKEN, :P_ROWS, :P_RESULT); END;"; - - // parse sql - $stmt = oci_parse($this->conn, $sql) or die ('Can not parse query'); - - // Bind In and Out Variables - oci_bind_by_name($stmt, ':P_CONSUMER_KEY', $consumer_key, 255); - oci_bind_by_name($stmt, ':P_USER_ID', $user_id, 40); - oci_bind_by_name($stmt, ':P_TOKEN', $token, 255); - oci_bind_by_name($stmt, ':P_RESULT', $result, 20); - - //Bind the ref cursor - $p_row = oci_new_cursor($this->conn); - oci_bind_by_name($stmt, ':P_ROWS', $p_row, -1, OCI_B_CURSOR); - - //Execute the statement - oci_execute($stmt); - - // treat the ref cursor as a statement resource - oci_execute($p_row, OCI_DEFAULT); - oci_fetch_all($p_row, $getServerTokenList, null, null, OCI_FETCHSTATEMENT_BY_ROW); - $ts = $getServerTokenList; - // - - if (empty($ts)) - { - throw new OAuthException2('No such consumer key ('.$consumer_key.') and token ('.$token.') combination for user "'.$user_id.'"'); - } - return $ts; - } - - - /** - * Delete a token we obtained from a server. - * - * @param string consumer_key - * @param string token - * @param int user_id - * @param boolean user_is_admin - */ - public function deleteServerToken ( $consumer_key, $token, $user_id, $user_is_admin = false ) - { - - // - $sql = "BEGIN SP_DELETE_SERVER_TOKEN(:P_CONSUMER_KEY, :P_USER_ID,:P_TOKEN, :P_USER_IS_ADMIN, :P_RESULT); END;"; - - // parse sql - $stmt = oci_parse($this->conn, $sql) or die ('Can not parse query'); - - // Bind In and Out Variables - oci_bind_by_name($stmt, ':P_CONSUMER_KEY', $consumer_key, 255); - oci_bind_by_name($stmt, ':P_USER_ID', $user_id, 40); - oci_bind_by_name($stmt, ':P_TOKEN', $token, 255); - oci_bind_by_name($stmt, ':P_USER_IS_ADMIN', $user_is_admin, 40); - oci_bind_by_name($stmt, ':P_RESULT', $result, 20); - - //Execute the statement - oci_execute($stmt); - // - - } - - - /** - * Set the ttl of a server access token. This is done when the - * server receives a valid request with a xoauth_token_ttl parameter in it. - * - * @param string consumer_key - * @param string token - * @param int token_ttl - */ - public function setServerTokenTtl ( $consumer_key, $token, $token_ttl, $server_uri = NULL ) - { - if ($token_ttl <= 0) - { - // Immediate delete when the token is past its ttl - $this->deleteServerToken($consumer_key, $token, 0, true); - } - else if ( $server_uri ) - { - // TODO - throw new OAuthException2('server_uri not implemented in Oracle yet, sorry'); - } - else - { - // Set maximum time to live for this token - - // - $sql = "BEGIN SP_SET_SERVER_TOKEN_TTL(:P_TOKEN_TTL, :P_CONSUMER_KEY, :P_TOKEN, :P_RESULT); END;"; - - // parse sql - $stmt = oci_parse($this->conn, $sql) or die ('Can not parse query'); - - // Bind In and Out Variables - oci_bind_by_name($stmt, ':P_TOKEN_TTL', $token_ttl, 40); - oci_bind_by_name($stmt, ':P_CONSUMER_KEY', $consumer_key, 255); - oci_bind_by_name($stmt, ':P_TOKEN', $token, 255); - oci_bind_by_name($stmt, ':P_RESULT', $result, 20); - - //Execute the statement - oci_execute($stmt); -// - } - } - - - /** - * Get a list of all consumers from the consumer registry. - * The consumer keys belong to the user or are public (user id is null) - * - * @param string q query term - * @param int user_id - * @return array - */ - public function listServers ( $q = '', $user_id ) - { - $q = trim(str_replace('%', '', $q)); - $args = array(); - - - // - $sql = "BEGIN SP_LIST_SERVERS(:P_Q, :P_USER_ID, :P_ROWS, :P_RESULT); END;"; - - // parse sql - $stmt = oci_parse($this->conn, $sql) or die ('Can not parse query'); - - // Bind In and Out Variables - oci_bind_by_name($stmt, ':P_Q', $q, 255); - oci_bind_by_name($stmt, ':P_USER_ID', $user_id, 40); - oci_bind_by_name($stmt, ':P_RESULT', $result, 20); - - //Bind the ref cursor - $p_row = oci_new_cursor($this->conn); - oci_bind_by_name($stmt, ':P_ROWS', $p_row, -1, OCI_B_CURSOR); - - //Execute the statement - oci_execute($stmt); - - // treat the ref cursor as a statement resource - oci_execute($p_row, OCI_DEFAULT); - oci_fetch_all($p_row, $listServersList, null, null, OCI_FETCHSTATEMENT_BY_ROW); - $servers = $listServersList; - // - - return $servers; - } - - - /** - * Register or update a server for our site (we will be the consumer) - * - * (This is the registry at the consumers, registering servers ;-) ) - * - * @param array server - * @param int user_id user registering this server - * @param boolean user_is_admin - * @exception OAuthException2 when fields are missing or on duplicate consumer_key - * @return consumer_key - */ - public function updateServer ( $server, $user_id, $user_is_admin = false ) { - foreach (array('consumer_key', 'server_uri') as $f) { - if (empty($server[$f])) { - throw new OAuthException2('The field "'.$f.'" must be set and non empty'); - } - } - $parts = parse_url($server['server_uri']); - $host = (isset($parts['host']) ? $parts['host'] : 'localhost'); - $path = (isset($parts['path']) ? $parts['path'] : '/'); - - if (isset($server['signature_methods'])) { - if (is_array($server['signature_methods'])) { - $server['signature_methods'] = strtoupper(implode(',', $server['signature_methods'])); - } - } - else { - $server['signature_methods'] = ''; - } - // When the user is an admin, then the user can update the user_id of this record - if ($user_is_admin && array_key_exists('user_id', $server)) { - $flag=1; - } - if($flag) { - if (is_null($server['user_id'])) { - $ocr_usa_id_ref= NULL; - } - else { - $ocr_usa_id_ref = $server['user_id']; - } - } - else { - $flag=0; - $ocr_usa_id_ref=$user_id; - } - //sp - $sql = "BEGIN SP_UPDATE_SERVER(:P_CONSUMER_KEY, :P_USER_ID, :P_OCR_ID, :P_USER_IS_ADMIN, - :P_OCR_CONSUMER_SECRET, :P_OCR_SERVER_URI, :P_OCR_SERVER_URI_HOST, :P_OCR_SERVER_URI_PATH, - :P_OCR_REQUEST_TOKEN_URI, :P_OCR_AUTHORIZE_URI, :P_OCR_ACCESS_TOKEN_URI, :P_OCR_SIGNATURE_METHODS, - :P_OCR_USA_ID_REF, :P_UPDATE_P_OCR_USA_ID_REF_FLAG, :P_RESULT); END;"; - - // parse sql - $stmt = oci_parse($this->conn, $sql) or die ('Can not parse query'); - $server['request_token_uri'] = isset($server['request_token_uri']) ? $server['request_token_uri'] : ''; - $server['authorize_uri'] = isset($server['authorize_uri']) ? $server['authorize_uri'] : ''; - $server['access_token_uri'] = isset($server['access_token_uri']) ? $server['access_token_uri'] : ''; - // Bind In and Out Variables - oci_bind_by_name($stmt, ':P_CONSUMER_KEY', $server['consumer_key'], 255); - oci_bind_by_name($stmt, ':P_USER_ID', $user_id, 40); - oci_bind_by_name($stmt, ':P_OCR_ID', $server['id'], 40); - oci_bind_by_name($stmt, ':P_USER_IS_ADMIN', $user_is_admin, 40); - oci_bind_by_name($stmt, ':P_OCR_CONSUMER_SECRET', $server['consumer_secret'], 255); - oci_bind_by_name($stmt, ':P_OCR_SERVER_URI', $server['server_uri'], 255); - oci_bind_by_name($stmt, ':P_OCR_SERVER_URI_HOST', strtolower($host), 255); - oci_bind_by_name($stmt, ':P_OCR_SERVER_URI_PATH', $path, 255); - oci_bind_by_name($stmt, ':P_OCR_REQUEST_TOKEN_URI', $server['request_token_uri'], 255); - oci_bind_by_name($stmt, ':P_OCR_AUTHORIZE_URI', $server['authorize_uri'], 255); - oci_bind_by_name($stmt, ':P_OCR_ACCESS_TOKEN_URI', $server['access_token_uri'], 255); - oci_bind_by_name($stmt, ':P_OCR_SIGNATURE_METHODS', $server['signature_methods'], 255); - oci_bind_by_name($stmt, ':P_OCR_USA_ID_REF', $ocr_usa_id_ref, 40); - oci_bind_by_name($stmt, ':P_UPDATE_P_OCR_USA_ID_REF_FLAG', $flag, 40); - oci_bind_by_name($stmt, ':P_RESULT', $result, 20); - - //Execute the statement - oci_execute($stmt); - - return $server['consumer_key']; - } - - /** - * Insert/update a new consumer with this server (we will be the server) - * When this is a new consumer, then also generate the consumer key and secret. - * Never updates the consumer key and secret. - * When the id is set, then the key and secret must correspond to the entry - * being updated. - * - * (This is the registry at the server, registering consumers ;-) ) - * - * @param array consumer - * @param int user_id user registering this consumer - * @param boolean user_is_admin - * @return string consumer key - */ - public function updateConsumer ( $consumer, $user_id, $user_is_admin = false ) { - $consumer_key = $this->generateKey(true); - $consumer_secret = $this->generateKey(); - - $consumer['callback_uri'] = isset($consumer['callback_uri'])? $consumer['callback_uri']: ''; - $consumer['application_uri'] = isset($consumer['application_uri'])? $consumer['application_uri']: ''; - $consumer['application_title'] = isset($consumer['application_title'])? $consumer['application_title']: ''; - $consumer['application_descr'] = isset($consumer['application_descr'])? $consumer['application_descr']: ''; - $consumer['application_notes'] = isset($consumer['application_notes'])? $consumer['application_notes']: ''; - $consumer['application_type'] = isset($consumer['application_type'])? $consumer['application_type']: ''; - $consumer['application_commercial'] = isset($consumer['application_commercial'])?$consumer['application_commercial']:0; - - //sp - $sql = "BEGIN SP_UPDATE_CONSUMER(:P_OSR_USA_ID_REF, :P_OSR_CONSUMER_KEY, :P_OSR_CONSUMER_SECRET, :P_OSR_REQUESTER_NAME, :P_OSR_REQUESTER_EMAIL, :P_OSR_CALLBACK_URI, :P_OSR_APPLICATION_URI, :P_OSR_APPLICATION_TITLE , :P_OSR_APPLICATION_DESCR, :P_OSR_APPLICATION_NOTES, :P_OSR_APPLICATION_TYPE, :P_OSR_APPLICATION_COMMERCIAL, :P_RESULT); END;"; - - // parse sql - $stmt = oci_parse($this->conn, $sql) or die ('Can not parse query'); - - - // Bind In and Out Variables - oci_bind_by_name($stmt, ':P_OSR_USA_ID_REF', $user_id, 40); - oci_bind_by_name($stmt, ':P_OSR_CONSUMER_KEY', $consumer_key, 255); - oci_bind_by_name($stmt, ':P_OSR_CONSUMER_SECRET', $consumer_secret, 255); - oci_bind_by_name($stmt, ':P_OSR_REQUESTER_NAME', $consumer['requester_name'], 255); - oci_bind_by_name($stmt, ':P_OSR_REQUESTER_EMAIL', $consumer['requester_email'], 255); - oci_bind_by_name($stmt, ':P_OSR_CALLBACK_URI', $consumer['callback_uri'], 255); - oci_bind_by_name($stmt, ':P_OSR_APPLICATION_URI', $consumer['application_uri'], 255); - oci_bind_by_name($stmt, ':P_OSR_APPLICATION_TITLE', $consumer['application_title'], 255); - oci_bind_by_name($stmt, ':P_OSR_APPLICATION_DESCR', $consumer['application_descr'], 255); - oci_bind_by_name($stmt, ':P_OSR_APPLICATION_NOTES', $consumer['application_notes'], 255); - oci_bind_by_name($stmt, ':P_OSR_APPLICATION_TYPE', $consumer['application_type'], 255); - oci_bind_by_name($stmt, ':P_OSR_APPLICATION_COMMERCIAL', $consumer['application_commercial'], 40); - oci_bind_by_name($stmt, ':P_RESULT', $result, 20); - - //Execute the statement - oci_execute($stmt); - echo $result; - return $consumer_key; - } - - - - /** - * Delete a consumer key. This removes access to our site for all applications using this key. - * - * @param string consumer_key - * @param int user_id user registering this server - * @param boolean user_is_admin - */ - public function deleteConsumer ( $consumer_key, $user_id, $user_is_admin = false ) - { - - // - $sql = "BEGIN SP_DELETE_CONSUMER(:P_CONSUMER_KEY, :P_USER_ID, :P_USER_IS_ADMIN, :P_RESULT); END;"; - - // parse sql - $stmt = oci_parse($this->conn, $sql) or die ('Can not parse query'); - - // Bind In and Out Variables - oci_bind_by_name($stmt, ':P_CONSUMER_KEY', $consumer_key, 255); - oci_bind_by_name($stmt, ':P_USER_ID', $user_id, 40); - oci_bind_by_name($stmt, ':P_USER_IS_ADMIN', $user_is_admin, 40); - oci_bind_by_name($stmt, ':P_RESULT', $result, 20); - - //Execute the statement - oci_execute($stmt); - // - } - - - - /** - * Fetch a consumer of this server, by consumer_key. - * - * @param string consumer_key - * @param int user_id - * @param boolean user_is_admin (optional) - * @exception OAuthException2 when consumer not found - * @return array - */ - public function getConsumer ( $consumer_key, $user_id, $user_is_admin = false ) { - - $sql = "BEGIN SP_GET_CONSUMER(:P_CONSUMER_KEY, :P_ROWS, :P_RESULT); END;"; - - // parse sql - $stmt = oci_parse($this->conn, $sql) or die ('Can not parse query'); - - // Bind In and Out Variables - oci_bind_by_name($stmt, ':P_CONSUMER_KEY', $consumer_key, 255); - oci_bind_by_name($stmt, ':P_RESULT', $result, 20); - - //Bind the ref cursor - $p_row = oci_new_cursor($this->conn); - oci_bind_by_name($stmt, ':P_ROWS', $p_row, -1, OCI_B_CURSOR); - - //Execute the statement - oci_execute($stmt); - - // treat the ref cursor as a statement resource - oci_execute($p_row, OCI_DEFAULT); - oci_fetch_all($p_row, $getConsumerList, null, null, OCI_FETCHSTATEMENT_BY_ROW); - - $consumer = $getConsumerList; - - if (!is_array($consumer)) { - throw new OAuthException2('No consumer with consumer_key "'.$consumer_key.'"'); - } - - $c = array(); - foreach ($consumer as $key => $value) { - $c[substr($key, 4)] = $value; - } - $c['user_id'] = $c['usa_id_ref']; - - if (!$user_is_admin && !empty($c['user_id']) && $c['user_id'] != $user_id) { - throw new OAuthException2('No access to the consumer information for consumer_key "'.$consumer_key.'"'); - } - return $c; - } - - - /** - * Fetch the static consumer key for this provider. The user for the static consumer - * key is NULL (no user, shared key). If the key did not exist then the key is created. - * - * @return string - */ - public function getConsumerStatic () - { - - // - $sql = "BEGIN SP_GET_CONSUMER_STATIC_SELECT(:P_OSR_CONSUMER_KEY, :P_RESULT); END;"; - - // parse sql - $stmt = oci_parse($this->conn, $sql) or die ('Can not parse query'); - - // Bind In and Out Variables - oci_bind_by_name($stmt, ':P_OSR_CONSUMER_KEY', $consumer, 255); - oci_bind_by_name($stmt, ':P_RESULT', $result, 20); - - //Execute the statement - oci_execute($stmt); - - if (empty($consumer)) - { - $consumer_key = 'sc-'.$this->generateKey(true); - - $sql = "BEGIN SP_CONSUMER_STATIC_SAVE(:P_OSR_CONSUMER_KEY, :P_RESULT); END;"; - - // parse sql - $stmt = oci_parse($this->conn, $sql) or die ('Can not parse query'); - - // Bind In and Out Variables - oci_bind_by_name($stmt, ':P_OSR_CONSUMER_KEY', $consumer_key, 255); - oci_bind_by_name($stmt, ':P_RESULT', $result, 20); - - //Execute the statement - oci_execute($stmt); - - - // Just make sure that if the consumer key is truncated that we get the truncated string - $consumer = $consumer_key; - } - return $consumer; - } - - - /** - * Add an unautorized request token to our server. - * - * @param string consumer_key - * @param array options (eg. token_ttl) - * @return array (token, token_secret) - */ - public function addConsumerRequestToken ( $consumer_key, $options = array() ) - { - $token = $this->generateKey(true); - $secret = !isset($options['secret']) ? $this->generateKey() : $options['secret']; - - - if (isset($options['token_ttl']) && is_numeric($options['token_ttl'])) - { - $ttl = intval($options['token_ttl']); - } - else - { - $ttl = $this->max_request_token_ttl; - } - - if (!isset($options['oauth_callback'])) { - // 1.0a Compatibility : store callback url associated with request token - $options['oauth_callback']='oob'; - } - $options_oauth_callback =$options['oauth_callback']; - $sql = "BEGIN SP_ADD_CONSUMER_REQUEST_TOKEN(:P_TOKEN_TTL, :P_CONSUMER_KEY, :P_TOKEN, :P_TOKEN_SECRET, :P_CALLBACK_URL, :P_RESULT); END;"; - - // parse sql - $stmt = oci_parse($this->conn, $sql) or die ('Can not parse query'); - - // Bind In and Out Variables - oci_bind_by_name($stmt, ':P_TOKEN_TTL', $ttl, 20); - oci_bind_by_name($stmt, ':P_CONSUMER_KEY', $consumer_key, 255); - oci_bind_by_name($stmt, ':P_TOKEN', $token, 255); - oci_bind_by_name($stmt, ':P_TOKEN_SECRET', $secret, 255); - oci_bind_by_name($stmt, ':P_CALLBACK_URL', $options_oauth_callback, 255); - oci_bind_by_name($stmt, ':P_RESULT', $result, 20); - - //Execute the statement - oci_execute($stmt); - - - $returnArray= array('token'=>$token, 'token_secret'=>$secret, 'token_ttl'=>$ttl); - return $returnArray; - } - - - /** - * Fetch the consumer request token, by request token. - * - * @param string token - * @return array token and consumer details - */ - public function getConsumerRequestToken ( $token ) - { - - $sql = "BEGIN SP_GET_CONSUMER_REQUEST_TOKEN(:P_TOKEN, :P_ROWS, :P_RESULT); END;"; - - // parse sql - $stmt = oci_parse($this->conn, $sql) or die ('Can not parse query'); - - // Bind In and Out Variables - oci_bind_by_name($stmt, ':P_TOKEN', $token, 255); - oci_bind_by_name($stmt, ':P_RESULT', $result, 20); - - //Bind the ref cursor - $p_row = oci_new_cursor($this->conn); - oci_bind_by_name($stmt, ':P_ROWS', $p_row, -1, OCI_B_CURSOR); - - //Execute the statement - oci_execute($stmt); - - // treat the ref cursor as a statement resource - oci_execute($p_row, OCI_DEFAULT); - - oci_fetch_all($p_row, $rs, null, null, OCI_FETCHSTATEMENT_BY_ROW); - - return $rs[0]; - } - - - /** - * Delete a consumer token. The token must be a request or authorized token. - * - * @param string token - */ - public function deleteConsumerRequestToken ( $token ) - { - - $sql = "BEGIN SP_DEL_CONSUMER_REQUEST_TOKEN(:P_TOKEN, :P_RESULT); END;"; - - // parse sql - $stmt = oci_parse($this->conn, $sql) or die ('Can not parse query'); - - // Bind In and Out Variables - oci_bind_by_name($stmt, ':P_TOKEN', $token, 255); - oci_bind_by_name($stmt, ':P_RESULT', $result, 20); - - //Execute the statement - oci_execute($stmt); - } - - - /** - * Upgrade a request token to be an authorized request token. - * - * @param string token - * @param int user_id user authorizing the token - * @param string referrer_host used to set the referrer host for this token, for user feedback - */ - public function authorizeConsumerRequestToken ( $token, $user_id, $referrer_host = '' ) - { - // 1.0a Compatibility : create a token verifier - $verifier = substr(md5(rand()),0,10); - - $sql = "BEGIN SP_AUTH_CONSUMER_REQ_TOKEN(:P_USER_ID, :P_REFERRER_HOST, :P_VERIFIER, :P_TOKEN, :P_RESULT); END;"; - - // parse sql - $stmt = oci_parse($this->conn, $sql) or die ('Can not parse query'); - - // Bind In and Out Variables - oci_bind_by_name($stmt, ':P_USER_ID', $user_id, 255); - oci_bind_by_name($stmt, ':P_REFERRER_HOST', $referrer_host, 255); - oci_bind_by_name($stmt, ':P_VERIFIER', $verifier, 255); - oci_bind_by_name($stmt, ':P_TOKEN', $token, 255); - oci_bind_by_name($stmt, ':P_RESULT', $result, 20); - - - //Execute the statement - oci_execute($stmt); - - return $verifier; - } - - - /** - * Count the consumer access tokens for the given consumer. - * - * @param string consumer_key - * @return int - */ - public function countConsumerAccessTokens ( $consumer_key ) - { - /*$count = $this->query_one(' - SELECT COUNT(ost_id) - FROM oauth_server_token - JOIN oauth_server_registry - ON ost_osr_id_ref = osr_id - WHERE ost_token_type = \'access\' - AND osr_consumer_key = \'%s\' - AND ost_token_ttl >= NOW() - ', $consumer_key); - */ - $sql = "BEGIN SP_COUNT_CONSUMER_ACCESS_TOKEN(:P_CONSUMER_KEY, :P_COUNT, :P_RESULT); END;"; - - // parse sql - $stmt = oci_parse($this->conn, $sql) or die ('Can not parse query'); - - // Bind In and Out Variables - oci_bind_by_name($stmt, ':P_CONSUMER_KEY', $consumer_key, 255); - oci_bind_by_name($stmt, ':P_COUNT', $count, 20); - oci_bind_by_name($stmt, ':P_RESULT', $result, 20); - - - //Execute the statement - oci_execute($stmt); - - return $count; - } - - - /** - * Exchange an authorized request token for new access token. - * - * @param string token - * @param array options options for the token, token_ttl - * @exception OAuthException2 when token could not be exchanged - * @return array (token, token_secret) - */ - public function exchangeConsumerRequestForAccessToken ( $token, $options = array() ) - { - $new_token = $this->generateKey(true); - $new_secret = $this->generateKey(); - - $sql = "BEGIN SP_EXCH_CONS_REQ_FOR_ACC_TOKEN(:P_TOKEN_TTL, :P_NEW_TOKEN, :P_TOKEN, :P_TOKEN_SECRET, :P_VERIFIER, :P_OUT_TOKEN_TTL, :P_RESULT); END;"; - - // parse sql - $stmt = oci_parse($this->conn, $sql) or die ('Can not parse query'); - - // Bind In and Out Variables - oci_bind_by_name($stmt, ':P_TOKEN_TTL', $options['token_ttl'], 255); - oci_bind_by_name($stmt, ':P_NEW_TOKEN', $new_token, 255); - oci_bind_by_name($stmt, ':P_TOKEN', $token, 255); - oci_bind_by_name($stmt, ':P_TOKEN_SECRET', $new_secret, 255); - oci_bind_by_name($stmt, ':P_VERIFIER', $options['verifier'], 255); - oci_bind_by_name($stmt, ':P_OUT_TOKEN_TTL', $ttl, 255); - oci_bind_by_name($stmt, ':P_RESULT', $result, 20); - - - //Execute the statement - oci_execute($stmt); - - $ret = array('token' => $new_token, 'token_secret' => $new_secret); - if (is_numeric($ttl)) - { - $ret['token_ttl'] = intval($ttl); - } - return $ret; - } - - - /** - * Fetch the consumer access token, by access token. - * - * @param string token - * @param int user_id - * @exception OAuthException2 when token is not found - * @return array token and consumer details - */ - public function getConsumerAccessToken ( $token, $user_id ) - { - - $sql = "BEGIN SP_GET_CONSUMER_ACCESS_TOKEN(:P_USER_ID, :P_TOKEN, :P_ROWS :P_RESULT); END;"; - - // parse sql - $stmt = oci_parse($this->conn, $sql) or die ('Can not parse query'); - - // Bind In and Out Variables - oci_bind_by_name($stmt, ':P_USER_ID',$user_id, 255); - oci_bind_by_name($stmt, ':P_TOKEN', $token, 255); - oci_bind_by_name($stmt, ':P_RESULT', $result, 20); - - //Bind the ref cursor - $p_row = oci_new_cursor($this->conn); - oci_bind_by_name($stmt, ':P_ROWS', $p_row, -1, OCI_B_CURSOR); - - //Execute the statement - oci_execute($stmt); - - // treat the ref cursor as a statement resource - oci_execute($p_row, OCI_DEFAULT); - oci_fetch_all($p_row, $rs, null, null, OCI_FETCHSTATEMENT_BY_ROW); - if (empty($rs)) - { - throw new OAuthException2('No server_token "'.$token.'" for user "'.$user_id.'"'); - } - return $rs; - } - - - /** - * Delete a consumer access token. - * - * @param string token - * @param int user_id - * @param boolean user_is_admin - */ - public function deleteConsumerAccessToken ( $token, $user_id, $user_is_admin = false ) - { - /*if ($user_is_admin) - { - $this->query(' - DELETE FROM oauth_server_token - WHERE ost_token = \'%s\' - AND ost_token_type = \'access\' - ', $token); - } - else - { - $this->query(' - DELETE FROM oauth_server_token - WHERE ost_token = \'%s\' - AND ost_token_type = \'access\' - AND ost_usa_id_ref = %d - ', $token, $user_id); - }*/ - $sql = "BEGIN SP_DEL_CONSUMER_ACCESS_TOKEN(:P_USER_ID, :P_TOKEN, :P_USER_IS_ADMIN, :P_RESULT); END;"; - - // parse sql - $stmt = oci_parse($this->conn, $sql) or die ('Can not parse query'); - - // Bind In and Out Variables - oci_bind_by_name($stmt, ':P_USER_ID', $user_id, 255); - oci_bind_by_name($stmt, ':P_TOKEN', $token, 255); - oci_bind_by_name($stmt, ':P_USER_IS_ADMIN', $user_is_admin, 20); - oci_bind_by_name($stmt, ':P_RESULT', $result, 20); - - - //Execute the statement - oci_execute($stmt); - } - - - /** - * Set the ttl of a consumer access token. This is done when the - * server receives a valid request with a xoauth_token_ttl parameter in it. - * - * @param string token - * @param int ttl - */ - public function setConsumerAccessTokenTtl ( $token, $token_ttl ) - { - if ($token_ttl <= 0) - { - // Immediate delete when the token is past its ttl - $this->deleteConsumerAccessToken($token, 0, true); - } - else - { - // Set maximum time to live for this token - - - $sql = "BEGIN SP_SET_CONSUMER_ACC_TOKEN_TTL(:P_TOKEN, :P_TOKEN_TTL, :P_RESULT); END;"; - - // parse sql - $stmt = oci_parse($this->conn, $sql) or die ('Can not parse query'); - - // Bind In and Out Variables - oci_bind_by_name($stmt, ':P_TOKEN', $token, 255); - oci_bind_by_name($stmt, ':P_TOKEN_TTL', $token_ttl, 20); - oci_bind_by_name($stmt, ':P_RESULT', $result, 20); - - - //Execute the statement - oci_execute($stmt); - } - } - - - /** - * Fetch a list of all consumer keys, secrets etc. - * Returns the public (user_id is null) and the keys owned by the user - * - * @param int user_id - * @return array - */ - public function listConsumers ( $user_id ) - { - - $sql = "BEGIN SP_LIST_CONSUMERS(:P_USER_ID, :P_ROWS, :P_RESULT); END;"; - - // parse sql - $stmt = oci_parse($this->conn, $sql) or die ('Can not parse query'); - - // Bind In and Out Variables - oci_bind_by_name($stmt, ':P_USER_ID', $user_id, 255); - oci_bind_by_name($stmt, ':P_RESULT', $result, 20); - - //Bind the ref cursor - $p_row = oci_new_cursor($this->conn); - oci_bind_by_name($stmt, ':P_ROWS', $p_row, -1, OCI_B_CURSOR); - - //Execute the statement - oci_execute($stmt); - - // treat the ref cursor as a statement resource - oci_execute($p_row, OCI_DEFAULT); - oci_fetch_all($p_row, $rs, null, null, OCI_FETCHSTATEMENT_BY_ROW); - - return $rs; - } - - /** - * List of all registered applications. Data returned has not sensitive - * information and therefore is suitable for public displaying. - * - * @param int $begin - * @param int $total - * @return array - */ - public function listConsumerApplications($begin = 0, $total = 25) - { - // TODO - return array(); - } - - /** - * Fetch a list of all consumer tokens accessing the account of the given user. - * - * @param int user_id - * @return array - */ - public function listConsumerTokens ( $user_id ) - { - - $sql = "BEGIN SP_LIST_CONSUMER_TOKENS(:P_USER_ID, :P_ROWS, :P_RESULT); END;"; - - // parse sql - $stmt = oci_parse($this->conn, $sql) or die ('Can not parse query'); - - // Bind In and Out Variables - oci_bind_by_name($stmt, ':P_USER_ID', $user_id, 255); - oci_bind_by_name($stmt, ':P_RESULT', $result, 20); - - //Bind the ref cursor - $p_row = oci_new_cursor($this->conn); - oci_bind_by_name($stmt, ':P_ROWS', $p_row, -1, OCI_B_CURSOR); - - //Execute the statement - oci_execute($stmt); - - // treat the ref cursor as a statement resource - oci_execute($p_row, OCI_DEFAULT); - oci_fetch_all($p_row, $rs, null, null, OCI_FETCHSTATEMENT_BY_ROW); - - return $rs; - } - - - /** - * Check an nonce/timestamp combination. Clears any nonce combinations - * that are older than the one received. - * - * @param string consumer_key - * @param string token - * @param int timestamp - * @param string nonce - * @exception OAuthException2 thrown when the timestamp is not in sequence or nonce is not unique - */ - public function checkServerNonce ( $consumer_key, $token, $timestamp, $nonce ) - { - - $sql = "BEGIN SP_CHECK_SERVER_NONCE(:P_CONSUMER_KEY, :P_TOKEN, :P_TIMESTAMP, :P_MAX_TIMESTAMP_SKEW, :P_NONCE, :P_RESULT); END;"; - - // parse sql - $stmt = oci_parse($this->conn, $sql) or die ('Can not parse query'); - - // Bind In and Out Variables - oci_bind_by_name($stmt, ':P_CONSUMER_KEY', $consumer_key, 255); - oci_bind_by_name($stmt, ':P_TOKEN', $token, 255); - oci_bind_by_name($stmt, ':P_TIMESTAMP', $timestamp, 255); - oci_bind_by_name($stmt, ':P_MAX_TIMESTAMP_SKEW', $this->max_timestamp_skew, 20); - oci_bind_by_name($stmt, ':P_NONCE', $nonce, 255); - oci_bind_by_name($stmt, ':P_RESULT', $result, 20); - - - //Execute the statement - oci_execute($stmt); - - } - - - /** - * Add an entry to the log table - * - * @param array keys (osr_consumer_key, ost_token, ocr_consumer_key, oct_token) - * @param string received - * @param string sent - * @param string base_string - * @param string notes - * @param int (optional) user_id - */ - public function addLog ( $keys, $received, $sent, $base_string, $notes, $user_id = null ) - { - $args = array(); - $ps = array(); - foreach ($keys as $key => $value) - { - $args[] = $value; - $ps[] = "olg_$key = '%s'"; - } - - if (!empty($_SERVER['REMOTE_ADDR'])) - { - $remote_ip = $_SERVER['REMOTE_ADDR']; - } - else if (!empty($_SERVER['REMOTE_IP'])) - { - $remote_ip = $_SERVER['REMOTE_IP']; - } - else - { - $remote_ip = '0.0.0.0'; - } - - // Build the SQL - $olg_received = $this->makeUTF8($received); - $olg_sent = $this->makeUTF8($sent); - $olg_base_string = $base_string; - $olg_notes = $this->makeUTF8($notes); - $olg_usa_id_ref = $user_id; - $olg_remote_ip = $remote_ip; - - - - $sql = "BEGIN SP_ADD_LOG(:P_RECEIVED, :P_SENT, :P_BASE_STRING, :P_NOTES, :P_USA_ID_REF, :P_REMOTE_IP, :P_RESULT); END;"; - - // parse sql - $stmt = oci_parse($this->conn, $sql) or die ('Can not parse query'); - - // Bind In and Out Variables - oci_bind_by_name($stmt, ':P_RECEIVED', $olg_received, 255); - oci_bind_by_name($stmt, ':P_SENT', $olg_sent, 255); - oci_bind_by_name($stmt, ':P_BASE_STRING', $olg_base_string, 255); - oci_bind_by_name($stmt, ':P_NOTES', $olg_notes, 255); - oci_bind_by_name($stmt, ':P_USA_ID_REF', $olg_usa_id_ref, 255); - oci_bind_by_name($stmt, ':P_REMOTE_IP', $olg_remote_ip, 255); - oci_bind_by_name($stmt, ':P_RESULT', $result, 20); - - - //Execute the statement - oci_execute($stmt); - } - - - /** - * Get a page of entries from the log. Returns the last 100 records - * matching the options given. - * - * @param array options - * @param int user_id current user - * @return array log records - */ - public function listLog ( $options, $user_id ) - { - - if (empty($options)) - { - $optionsFlag=NULL; - - } - else - { - $optionsFlag=1; - - } - - $sql = "BEGIN SP_LIST_LOG(:P_OPTION_FLAG, :P_USA_ID, :P_OSR_CONSUMER_KEY, :P_OCR_CONSUMER_KEY, :P_OST_TOKEN, :P_OCT_TOKEN, :P_ROWS, :P_RESULT); END;"; - - // parse sql - $stmt = oci_parse($this->conn, $sql) or die ('Can not parse query'); - - // Bind In and Out Variables - oci_bind_by_name($stmt, ':P_OPTION_FLAG', $optionsFlag, 255); - oci_bind_by_name($stmt, ':P_USA_ID', $user_id, 40); - oci_bind_by_name($stmt, ':P_OSR_CONSUMER_KEY', $options['osr_consumer_key'], 255); - oci_bind_by_name($stmt, ':P_OCR_CONSUMER_KEY', $options['ocr_consumer_key'], 255); - oci_bind_by_name($stmt, ':P_OST_TOKEN', $options['ost_token'], 255); - oci_bind_by_name($stmt, ':P_OCT_TOKEN', $options['oct_token'], 255); - oci_bind_by_name($stmt, ':P_RESULT', $result, 20); - - //Bind the ref cursor - $p_row = oci_new_cursor($this->conn); - oci_bind_by_name($stmt, ':P_ROWS', $p_row, -1, OCI_B_CURSOR); - - //Execute the statement - oci_execute($stmt); - - // treat the ref cursor as a statement resource - oci_execute($p_row, OCI_DEFAULT); - oci_fetch_all($p_row, $rs, null, null, OCI_FETCHSTATEMENT_BY_ROW); - - return $rs; - } - - /** - * Initialise the database - */ - public function install () - { - require_once dirname(__FILE__) . '/oracle/install.php'; - } -} - - -/* vi:set ts=4 sts=4 sw=4 binary noeol: */ - -?> \ No newline at end of file diff --git a/vendor/oauth-php/library/store/OAuthStorePDO.php b/vendor/oauth-php/library/store/OAuthStorePDO.php deleted file mode 100644 index aa3a1b9c223cf697eadd38873574ac2f83e69a0f..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/OAuthStorePDO.php +++ /dev/null @@ -1,274 +0,0 @@ -<?php - -/** - * Storage container for the oauth credentials, both server and consumer side. - * Based on MySQL - * - * @version $Id: OAuthStorePDO.php 64 2009-08-16 19:37:00Z marcw@pobox.com $ - * @author Bruno Barberi Gnecco <brunobg@users.sf.net> Based on code by Marc Worrell <marcw@pobox.com> - * - * - * The MIT License - * - * Copyright (c) 2007-2008 Mediamatic Lab - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -require_once dirname(__FILE__) . '/OAuthStoreSQL.php'; - - -class OAuthStorePDO extends OAuthStoreSQL -{ - private $conn; // PDO connection - private $lastaffectedrows; - - /** - * Construct the OAuthStorePDO. - * In the options you have to supply either: - * - dsn, username, password and database (for a new PDO connection) - * - conn (for the connection to be used) - * - * @param array options - */ - function __construct ( $options = array() ) - { - if (isset($options['conn'])) - { - $this->conn = $options['conn']; - } - else if (isset($options['dsn'])) - { - try - { - $this->conn = new PDO($options['dsn'], $options['username'], @$options['password']); - } - catch (PDOException $e) - { - throw new OAuthException2('Could not connect to PDO database: ' . $e->getMessage()); - } - - $this->query('set character set utf8'); - } - } - - /** - * Perform a query, ignore the results - * - * @param string sql - * @param vararg arguments (for sprintf) - */ - protected function query ( $sql ) - { - $sql = $this->sql_printf(func_get_args()); - try - { - $this->lastaffectedrows = $this->conn->exec($sql); - if ($this->lastaffectedrows === FALSE) { - $this->sql_errcheck($sql); - } - } - catch (PDOException $e) - { - $this->sql_errcheck($sql); - } - } - - - /** - * Perform a query, ignore the results - * - * @param string sql - * @param vararg arguments (for sprintf) - * @return array - */ - protected function query_all_assoc ( $sql ) - { - $sql = $this->sql_printf(func_get_args()); - $result = array(); - - try - { - $stmt = $this->conn->query($sql); - - $result = $stmt->fetchAll(PDO::FETCH_ASSOC); - } - catch (PDOException $e) - { - $this->sql_errcheck($sql); - } - return $result; - } - - - /** - * Perform a query, return the first row - * - * @param string sql - * @param vararg arguments (for sprintf) - * @return array - */ - protected function query_row_assoc ( $sql ) - { - $sql = $this->sql_printf(func_get_args()); - $result = $this->query_all_assoc($sql); - $val = array_pop($result); - return $val; - } - - - /** - * Perform a query, return the first row - * - * @param string sql - * @param vararg arguments (for sprintf) - * @return array - */ - protected function query_row ( $sql ) - { - $sql = $this->sql_printf(func_get_args()); - try - { - $all = $this->conn->query($sql, PDO::FETCH_NUM); - $row = array(); - foreach ($all as $r) { - $row = $r; - break; - } - } - catch (PDOException $e) - { - $this->sql_errcheck($sql); - } - return $row; - } - - - /** - * Perform a query, return the first column of the first row - * - * @param string sql - * @param vararg arguments (for sprintf) - * @return mixed - */ - protected function query_one ( $sql ) - { - $sql = $this->sql_printf(func_get_args()); - $row = $this->query_row($sql); - $val = array_pop($row); - return $val; - } - - - /** - * Return the number of rows affected in the last query - */ - protected function query_affected_rows () - { - return $this->lastaffectedrows; - } - - - /** - * Return the id of the last inserted row - * - * @return int - */ - protected function query_insert_id () - { - return $this->conn->lastInsertId(); - } - - - protected function sql_printf ( $args ) - { - $sql = array_shift($args); - if (count($args) == 1 && is_array($args[0])) - { - $args = $args[0]; - } - $args = array_map(array($this, 'sql_escape_string'), $args); - return vsprintf($sql, $args); - } - - - protected function sql_escape_string ( $s ) - { - if (is_string($s)) - { - $s = $this->conn->quote($s); - // kludge. Quote already adds quotes, and this conflicts with OAuthStoreSQL. - // so remove the quotes - $len = strlen($s); - if ($len == 0) - return $s; - - $startcut = 0; - while (isset($s[$startcut]) && $s[$startcut] == '\'') - $startcut++; - - $endcut = $len-1; - while (isset($s[$endcut]) && $s[$endcut] == '\'') - $endcut--; - - $s = substr($s, $startcut, $endcut-$startcut+1); - return $s; - } - else if (is_null($s)) - { - return NULL; - } - else if (is_bool($s)) - { - return intval($s); - } - else if (is_int($s) || is_float($s)) - { - return $s; - } - else - { - return $this->conn->quote(strval($s)); - } - } - - - protected function sql_errcheck ( $sql ) - { - $msg = "SQL Error in OAuthStoreMySQL: ". print_r($this->conn->errorInfo(), true) ."\n\n" . $sql; - $backtrace = debug_backtrace(); - $msg .= "\n\nAt file " . $backtrace[1]['file'] . ", line " . $backtrace[1]['line']; - throw new OAuthException2($msg); - } - - /** - * Initialise the database - */ - public function install () - { - // TODO: this depends on mysql extension - require_once dirname(__FILE__) . '/mysql/install.php'; - } - -} - - -/* vi:set ts=4 sts=4 sw=4 binary noeol: */ - -?> diff --git a/vendor/oauth-php/library/store/OAuthStorePostgreSQL.php b/vendor/oauth-php/library/store/OAuthStorePostgreSQL.php deleted file mode 100644 index db55804aa432d89bb00772e99f5ca22adbcf4cf5..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/OAuthStorePostgreSQL.php +++ /dev/null @@ -1,1981 +0,0 @@ -<?php -/** - * OAuthStorePostgreSQL.php - * - * PHP Version 5.2 - * - * @author Elma R&D Team <rdteam@elma.fr> - * @link http://elma.fr - * - * @Id 2010-10-22 10:07:18 ndelanoe $ - * @version $Id: OAuthStorePostgreSQL.php 190 2011-03-22 09:16:01Z scherpenisse $ - * - * The MIT License - * - * Copyright (c) 2007-2008 Mediamatic Lab - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - **/ - -require_once dirname(__FILE__) . '/OAuthStoreAbstract.class.php'; - - -class OAuthStorePostgreSQL extends OAuthStoreAbstract -{ - /** - * Maximum delta a timestamp may be off from a previous timestamp. - * Allows multiple consumers with some clock skew to work with the same token. - * Unit is seconds, default max skew is 10 minutes. - */ - protected $max_timestamp_skew = 600; - - /** - * Default ttl for request tokens - */ - protected $max_request_token_ttl = 3600; - - /** - * Number of affected rowsby the last queries - */ - private $_lastAffectedRows = 0; - - public function install() - { - throw new OAuthException2('Not yet implemented, see postgresql/pgsql.sql'); - } - - /** - * Construct the OAuthStorePostgrSQL. - * In the options you have to supply either: - * - server, username, password and database (for a pg_connect) - * - connectionString (for a pg_connect) - * - conn (for the connection to be used) - * - * @param array options - */ - function __construct ( $options = array() ) - { - if (isset($options['conn'])) - { - $this->conn = $options['conn']; - } - else - { - if (isset($options['server'])) - { - $host = $options['server']; - $user = $options['username']; - $dbname = $options['database']; - - $connectionString = sprintf('host=%s dbname=%s user=%s', $host, $dbname, $user); - - if (isset($options['password'])) - { - $connectionString .= ' password=' . $options['password']; - } - - $this->conn = pg_connect($connectionString); - } - elseif (isset($options['connectionString'])) - { - $this->conn = pg_connect($options['connectionString']); - } - else { - - // Try the default pg connect - $this->conn = pg_connect(); - } - - if ($this->conn === false) - { - throw new OAuthException2('Could not connect to PostgresSQL database'); - } - } - } - - /** - * Find stored credentials for the consumer key and token. Used by an OAuth server - * when verifying an OAuth request. - * - * @param string consumer_key - * @param string token - * @param string token_type false, 'request' or 'access' - * @exception OAuthException2 when no secrets where found - * @return array assoc (consumer_secret, token_secret, osr_id, ost_id, user_id) - */ - public function getSecretsForVerify ( $consumer_key, $token, $token_type = 'access' ) - { - if ($token_type === false) - { - $rs = $this->query_row_assoc(' - SELECT osr_id, - osr_consumer_key as consumer_key, - osr_consumer_secret as consumer_secret - FROM oauth_server_registry - WHERE osr_consumer_key = \'%s\' - AND osr_enabled = \'1\' - ', - $consumer_key); - - if ($rs) - { - $rs['token'] = false; - $rs['token_secret'] = false; - $rs['user_id'] = false; - $rs['ost_id'] = false; - } - } - else - { - $rs = $this->query_row_assoc(' - SELECT osr_id, - ost_id, - ost_usa_id_ref as user_id, - osr_consumer_key as consumer_key, - osr_consumer_secret as consumer_secret, - ost_token as token, - ost_token_secret as token_secret - FROM oauth_server_registry - JOIN oauth_server_token - ON ost_osr_id_ref = osr_id - WHERE ost_token_type = \'%s\' - AND osr_consumer_key = \'%s\' - AND ost_token = \'%s\' - AND osr_enabled = \'1\' - AND ost_token_ttl >= NOW() - ', - $token_type, $consumer_key, $token); - } - - if (empty($rs)) - { - throw new OAuthException2('The consumer_key "'.$consumer_key.'" token "'.$token.'" combination does not exist or is not enabled.'); - } - return $rs; - } - - /** - * Find the server details for signing a request, always looks for an access token. - * The returned credentials depend on which local user is making the request. - * - * The consumer_key must belong to the user or be public (user id is null) - * - * For signing we need all of the following: - * - * consumer_key consumer key associated with the server - * consumer_secret consumer secret associated with this server - * token access token associated with this server - * token_secret secret for the access token - * signature_methods signing methods supported by the server (array) - * - * @todo filter on token type (we should know how and with what to sign this request, and there might be old access tokens) - * @param string uri uri of the server - * @param int user_id id of the logged on user - * @param string name (optional) name of the token (case sensitive) - * @exception OAuthException2 when no credentials found - * @return array - */ - public function getSecretsForSignature ( $uri, $user_id, $name = '' ) - { - // Find a consumer key and token for the given uri - $ps = parse_url($uri); - $host = isset($ps['host']) ? $ps['host'] : 'localhost'; - $path = isset($ps['path']) ? $ps['path'] : ''; - - if (empty($path) || substr($path, -1) != '/') - { - $path .= '/'; - } - - // The owner of the consumer_key is either the user or nobody (public consumer key) - $secrets = $this->query_row_assoc(' - SELECT ocr_consumer_key as consumer_key, - ocr_consumer_secret as consumer_secret, - oct_token as token, - oct_token_secret as token_secret, - ocr_signature_methods as signature_methods - FROM oauth_consumer_registry - JOIN oauth_consumer_token ON oct_ocr_id_ref = ocr_id - WHERE ocr_server_uri_host = \'%s\' - AND ocr_server_uri_path = SUBSTR(\'%s\', 1, LENGTH(ocr_server_uri_path)) - AND (ocr_usa_id_ref = \'%s\' OR ocr_usa_id_ref IS NULL) - AND oct_usa_id_ref = \'%d\' - AND oct_token_type = \'access\' - AND oct_name = \'%s\' - AND oct_token_ttl >= NOW() - ORDER BY ocr_usa_id_ref DESC, ocr_consumer_secret DESC, LENGTH(ocr_server_uri_path) DESC - LIMIT 1 - ', $host, $path, $user_id, $user_id, $name - ); - - if (empty($secrets)) - { - throw new OAuthException2('No server tokens available for '.$uri); - } - $secrets['signature_methods'] = explode(',', $secrets['signature_methods']); - return $secrets; - } - - /** - * Get the token and token secret we obtained from a server. - * - * @param string consumer_key - * @param string token - * @param string token_type - * @param int user_id the user owning the token - * @param string name optional name for a named token - * @exception OAuthException2 when no credentials found - * @return array - */ - public function getServerTokenSecrets ( $consumer_key, $token, $token_type, $user_id, $name = '' ) - { - if ($token_type != 'request' && $token_type != 'access') - { - throw new OAuthException2('Unkown token type "'.$token_type.'", must be either "request" or "access"'); - } - - // Take the most recent token of the given type - $r = $this->query_row_assoc(' - SELECT ocr_consumer_key as consumer_key, - ocr_consumer_secret as consumer_secret, - oct_token as token, - oct_token_secret as token_secret, - oct_name as token_name, - ocr_signature_methods as signature_methods, - ocr_server_uri as server_uri, - ocr_request_token_uri as request_token_uri, - ocr_authorize_uri as authorize_uri, - ocr_access_token_uri as access_token_uri, - CASE WHEN oct_token_ttl >= \'9999-12-31\' THEN NULL ELSE oct_token_ttl - NOW() END as token_ttl - FROM oauth_consumer_registry - JOIN oauth_consumer_token - ON oct_ocr_id_ref = ocr_id - WHERE ocr_consumer_key = \'%s\' - AND oct_token_type = \'%s\' - AND oct_token = \'%s\' - AND oct_usa_id_ref = \'%d\' - AND oct_token_ttl >= NOW() - ', $consumer_key, $token_type, $token, $user_id - ); - - if (empty($r)) - { - throw new OAuthException2('Could not find a "'.$token_type.'" token for consumer "'.$consumer_key.'" and user '.$user_id); - } - if (isset($r['signature_methods']) && !empty($r['signature_methods'])) - { - $r['signature_methods'] = explode(',',$r['signature_methods']); - } - else - { - $r['signature_methods'] = array(); - } - return $r; - } - - - /** - * Add a request token we obtained from a server. - * - * @todo remove old tokens for this user and this ocr_id - * @param string consumer_key key of the server in the consumer registry - * @param string token_type one of 'request' or 'access' - * @param string token - * @param string token_secret - * @param int user_id the user owning the token - * @param array options extra options, name and token_ttl - * @exception OAuthException2 when server is not known - * @exception OAuthException2 when we received a duplicate token - */ - public function addServerToken ( $consumer_key, $token_type, $token, $token_secret, $user_id, $options = array() ) - { - if ($token_type != 'request' && $token_type != 'access') - { - throw new OAuthException2('Unknown token type "'.$token_type.'", must be either "request" or "access"'); - } - - // Maximum time to live for this token - if (isset($options['token_ttl']) && is_numeric($options['token_ttl'])) - { - $ttl = 'NOW() + INTERVAL \''.intval($options['token_ttl']).' SECOND\''; - } - else if ($token_type == 'request') - { - $ttl = 'NOW() + INTERVAL \''.$this->max_request_token_ttl.' SECOND\''; - } - else - { - $ttl = "'9999-12-31'"; - } - - if (isset($options['server_uri'])) - { - $ocr_id = $this->query_one(' - SELECT ocr_id - FROM oauth_consumer_registry - WHERE ocr_consumer_key = \'%s\' - AND ocr_usa_id_ref = \'%d\' - AND ocr_server_uri = \'%s\' - ', $consumer_key, $user_id, $options['server_uri']); - } - else - { - $ocr_id = $this->query_one(' - SELECT ocr_id - FROM oauth_consumer_registry - WHERE ocr_consumer_key = \'%s\' - AND ocr_usa_id_ref = \'%d\' - ', $consumer_key, $user_id); - } - - if (empty($ocr_id)) - { - throw new OAuthException2('No server associated with consumer_key "'.$consumer_key.'"'); - } - - // Named tokens, unique per user/consumer key - if (isset($options['name']) && $options['name'] != '') - { - $name = $options['name']; - } - else - { - $name = ''; - } - - // Delete any old tokens with the same type and name for this user/server combination - $this->query(' - DELETE FROM oauth_consumer_token - WHERE oct_ocr_id_ref = %d - AND oct_usa_id_ref = \'%d\' - AND oct_token_type::text = LOWER(\'%s\')::text - AND oct_name = \'%s\' - ', - $ocr_id, - $user_id, - $token_type, - $name); - - // Insert the new token - $this->query(' - INSERT INTO - oauth_consumer_token( - oct_ocr_id_ref, - oct_usa_id_ref, - oct_name, - oct_token, - oct_token_secret, - oct_token_type, - oct_timestamp, - oct_token_ttl - ) - VALUES (%d,%d,\'%s\',\'%s\',\'%s\',\'%s\',NOW(),'.$ttl.')', - $ocr_id, - $user_id, - $name, - $token, - $token_secret, - $token_type); - - if (!$this->query_affected_rows()) - { - throw new OAuthException2('Received duplicate token "'.$token.'" for the same consumer_key "'.$consumer_key.'"'); - } - } - - /** - * Delete a server key. This removes access to that site. - * - * @param string consumer_key - * @param int user_id user registering this server - * @param boolean user_is_admin - */ - public function deleteServer ( $consumer_key, $user_id, $user_is_admin = false ) - { - if ($user_is_admin) - { - $this->query(' - DELETE FROM oauth_consumer_registry - WHERE ocr_consumer_key = \'%s\' - AND (ocr_usa_id_ref = \'%d\' OR ocr_usa_id_ref IS NULL) - ', $consumer_key, $user_id); - } - else - { - $this->query(' - DELETE FROM oauth_consumer_registry - WHERE ocr_consumer_key = \'%s\' - AND ocr_usa_id_ref = \'%d\' - ', $consumer_key, $user_id); - } - } - - - /** - * Get a server from the consumer registry using the consumer key - * - * @param string consumer_key - * @param int user_id - * @param boolean user_is_admin (optional) - * @exception OAuthException2 when server is not found - * @return array - */ - public function getServer ( $consumer_key, $user_id, $user_is_admin = false ) - { - $r = $this->query_row_assoc(' - SELECT ocr_id as id, - ocr_usa_id_ref as user_id, - ocr_consumer_key as consumer_key, - ocr_consumer_secret as consumer_secret, - ocr_signature_methods as signature_methods, - ocr_server_uri as server_uri, - ocr_request_token_uri as request_token_uri, - ocr_authorize_uri as authorize_uri, - ocr_access_token_uri as access_token_uri - FROM oauth_consumer_registry - WHERE ocr_consumer_key = \'%s\' - AND (ocr_usa_id_ref = \'%d\' OR ocr_usa_id_ref IS NULL) - ', $consumer_key, $user_id); - - if (empty($r)) - { - throw new OAuthException2('No server with consumer_key "'.$consumer_key.'" has been registered (for this user)'); - } - - if (isset($r['signature_methods']) && !empty($r['signature_methods'])) - { - $r['signature_methods'] = explode(',',$r['signature_methods']); - } - else - { - $r['signature_methods'] = array(); - } - return $r; - } - - - /** - * Find the server details that might be used for a request - * - * The consumer_key must belong to the user or be public (user id is null) - * - * @param string uri uri of the server - * @param int user_id id of the logged on user - * @exception OAuthException2 when no credentials found - * @return array - */ - public function getServerForUri ( $uri, $user_id ) - { - // Find a consumer key and token for the given uri - $ps = parse_url($uri); - $host = isset($ps['host']) ? $ps['host'] : 'localhost'; - $path = isset($ps['path']) ? $ps['path'] : ''; - - if (empty($path) || substr($path, -1) != '/') - { - $path .= '/'; - } - - // The owner of the consumer_key is either the user or nobody (public consumer key) - $server = $this->query_row_assoc(' - SELECT ocr_id as id, - ocr_usa_id_ref as user_id, - ocr_consumer_key as consumer_key, - ocr_consumer_secret as consumer_secret, - ocr_signature_methods as signature_methods, - ocr_server_uri as server_uri, - ocr_request_token_uri as request_token_uri, - ocr_authorize_uri as authorize_uri, - ocr_access_token_uri as access_token_uri - FROM oauth_consumer_registry - WHERE ocr_server_uri_host = \'%s\' - AND ocr_server_uri_path = SUBSTR(\'%s\', 1, LENGTH(ocr_server_uri_path)) - AND (ocr_usa_id_ref = \'%s\' OR ocr_usa_id_ref IS NULL) - ORDER BY ocr_usa_id_ref DESC, consumer_secret DESC, LENGTH(ocr_server_uri_path) DESC - LIMIT 1 - ', $host, $path, $user_id - ); - - if (empty($server)) - { - throw new OAuthException2('No server available for '.$uri); - } - $server['signature_methods'] = explode(',', $server['signature_methods']); - return $server; - } - - /** - * Get a list of all server token this user has access to. - * - * @param int usr_id - * @return array - */ - public function listServerTokens ( $user_id ) - { - $ts = $this->query_all_assoc(' - SELECT ocr_consumer_key as consumer_key, - ocr_consumer_secret as consumer_secret, - oct_id as token_id, - oct_token as token, - oct_token_secret as token_secret, - oct_usa_id_ref as user_id, - ocr_signature_methods as signature_methods, - ocr_server_uri as server_uri, - ocr_server_uri_host as server_uri_host, - ocr_server_uri_path as server_uri_path, - ocr_request_token_uri as request_token_uri, - ocr_authorize_uri as authorize_uri, - ocr_access_token_uri as access_token_uri, - oct_timestamp as timestamp - FROM oauth_consumer_registry - JOIN oauth_consumer_token - ON oct_ocr_id_ref = ocr_id - WHERE oct_usa_id_ref = \'%d\' - AND oct_token_type = \'access\' - AND oct_token_ttl >= NOW() - ORDER BY ocr_server_uri_host, ocr_server_uri_path - ', $user_id); - return $ts; - } - - /** - * Count how many tokens we have for the given server - * - * @param string consumer_key - * @return int - */ - public function countServerTokens ( $consumer_key ) - { - $count = $this->query_one(' - SELECT COUNT(oct_id) - FROM oauth_consumer_token - JOIN oauth_consumer_registry - ON oct_ocr_id_ref = ocr_id - WHERE oct_token_type = \'access\' - AND ocr_consumer_key = \'%s\' - AND oct_token_ttl >= NOW() - ', $consumer_key); - - return $count; - } - - /** - * Get a specific server token for the given user - * - * @param string consumer_key - * @param string token - * @param int user_id - * @exception OAuthException2 when no such token found - * @return array - */ - public function getServerToken ( $consumer_key, $token, $user_id ) - { - $ts = $this->query_row_assoc(' - SELECT ocr_consumer_key as consumer_key, - ocr_consumer_secret as consumer_secret, - oct_token as token, - oct_token_secret as token_secret, - oct_usa_id_ref as usr_id, - ocr_signature_methods as signature_methods, - ocr_server_uri as server_uri, - ocr_server_uri_host as server_uri_host, - ocr_server_uri_path as server_uri_path, - ocr_request_token_uri as request_token_uri, - ocr_authorize_uri as authorize_uri, - ocr_access_token_uri as access_token_uri, - oct_timestamp as timestamp - FROM oauth_consumer_registry - JOIN oauth_consumer_token - ON oct_ocr_id_ref = ocr_id - WHERE ocr_consumer_key = \'%s\' - AND oct_usa_id_ref = \'%d\' - AND oct_token_type = \'access\' - AND oct_token = \'%s\' - AND oct_token_ttl >= NOW() - ', $consumer_key, $user_id, $token); - - if (empty($ts)) - { - throw new OAuthException2('No such consumer key ('.$consumer_key.') and token ('.$token.') combination for user "'.$user_id.'"'); - } - return $ts; - } - - - /** - * Delete a token we obtained from a server. - * - * @param string consumer_key - * @param string token - * @param int user_id - * @param boolean user_is_admin - */ - public function deleteServerToken ( $consumer_key, $token, $user_id, $user_is_admin = false ) - { - if ($user_is_admin) - { - $this->query(' - DELETE FROM oauth_consumer_token - USING oauth_consumer_registry - WHERE - oct_ocr_id_ref = ocr_id - AND ocr_consumer_key = \'%s\' - AND oct_token = \'%s\' - ', $consumer_key, $token); - } - else - { - $this->query(' - DELETE FROM oauth_consumer_token - USING oauth_consumer_registry - WHERE - oct_ocr_id_ref = ocr_id - AND ocr_consumer_key = \'%s\' - AND oct_token = \'%s\' - AND oct_usa_id_ref = \'%d\' - ', $consumer_key, $token, $user_id); - } - } - - /** - * Set the ttl of a server access token. This is done when the - * server receives a valid request with a xoauth_token_ttl parameter in it. - * - * @param string consumer_key - * @param string token - * @param int token_ttl - */ - public function setServerTokenTtl ( $consumer_key, $token, $token_ttl, $server_uri = NULL ) - { - if ($token_ttl <= 0) - { - // Immediate delete when the token is past its ttl - $this->deleteServerToken($consumer_key, $token, 0, true); - } - else if ( $server_uri ) - { - // Set maximum time to live for this token - $this->query(' - UPDATE oauth_consumer_token - SET ost_token_ttl = (NOW() + INTERVAL \'%d SECOND\') - WHERE ocr_consumer_key = \'%s\' - AND ocr_server_uri = \'%s\' - AND oct_ocr_id_ref = ocr_id - AND oct_token = \'%s\' - ', $token_ttl, $server_uri, $consumer_key, $token); - - // Set maximum time to live for this token - $this->query(' - UPDATE oauth_consumer_registry - SET ost_token_ttl = (NOW() + INTERVAL \'%d SECOND\') - WHERE ocr_consumer_key = \'%s\' - AND ocr_server_uri = \'%s\' - AND oct_ocr_id_ref = ocr_id - AND oct_token = \'%s\' - ', $token_ttl, $server_uri, $consumer_key, $token); - } - else - { - // Set maximum time to live for this token - $this->query(' - UPDATE oauth_consumer_token - SET ost_token_ttl = (NOW() + INTERVAL \'%d SECOND\') - WHERE ocr_consumer_key = \'%s\' - AND oct_ocr_id_ref = ocr_id - AND oct_token = \'%s\' - ', $token_ttl, $consumer_key, $token); - - // Set maximum time to live for this token - $this->query(' - UPDATE oauth_consumer_registry - SET ost_token_ttl = (NOW() + INTERVAL \'%d SECOND\') - WHERE ocr_consumer_key = \'%s\' - AND oct_ocr_id_ref = ocr_id - AND oct_token = \'%s\' - ', $token_ttl, $consumer_key, $token); - } - } - - /** - * Get a list of all consumers from the consumer registry. - * The consumer keys belong to the user or are public (user id is null) - * - * @param string q query term - * @param int user_id - * @return array - */ - public function listServers ( $q = '', $user_id ) - { - $q = trim(str_replace('%', '', $q)); - $args = array(); - - if (!empty($q)) - { - $where = ' WHERE ( ocr_consumer_key like \'%%%s%%\' - OR ocr_server_uri like \'%%%s%%\' - OR ocr_server_uri_host like \'%%%s%%\' - OR ocr_server_uri_path like \'%%%s%%\') - AND (ocr_usa_id_ref = \'%d\' OR ocr_usa_id_ref IS NULL) - '; - - $args[] = $q; - $args[] = $q; - $args[] = $q; - $args[] = $q; - $args[] = $user_id; - } - else - { - $where = ' WHERE ocr_usa_id_ref = \'%d\' OR ocr_usa_id_ref IS NULL'; - $args[] = $user_id; - } - - $servers = $this->query_all_assoc(' - SELECT ocr_id as id, - ocr_usa_id_ref as user_id, - ocr_consumer_key as consumer_key, - ocr_consumer_secret as consumer_secret, - ocr_signature_methods as signature_methods, - ocr_server_uri as server_uri, - ocr_server_uri_host as server_uri_host, - ocr_server_uri_path as server_uri_path, - ocr_request_token_uri as request_token_uri, - ocr_authorize_uri as authorize_uri, - ocr_access_token_uri as access_token_uri - FROM oauth_consumer_registry - '.$where.' - ORDER BY ocr_server_uri_host, ocr_server_uri_path - ', $args); - return $servers; - } - - /** - * Register or update a server for our site (we will be the consumer) - * - * (This is the registry at the consumers, registering servers ;-) ) - * - * @param array server - * @param int user_id user registering this server - * @param boolean user_is_admin - * @exception OAuthException2 when fields are missing or on duplicate consumer_key - * @return consumer_key - */ - public function updateServer ( $server, $user_id, $user_is_admin = false ) - { - foreach (array('consumer_key', 'server_uri') as $f) - { - if (empty($server[$f])) - { - throw new OAuthException2('The field "'.$f.'" must be set and non empty'); - } - } - - if (!empty($server['id'])) - { - $exists = $this->query_one(' - SELECT ocr_id - FROM oauth_consumer_registry - WHERE ocr_consumer_key = \'%s\' - AND ocr_id <> %d - AND (ocr_usa_id_ref = \'%d\' OR ocr_usa_id_ref IS NULL) - ', $server['consumer_key'], $server['id'], $user_id); - } - else - { - $exists = $this->query_one(' - SELECT ocr_id - FROM oauth_consumer_registry - WHERE ocr_consumer_key = \'%s\' - AND (ocr_usa_id_ref = \'%d\' OR ocr_usa_id_ref IS NULL) - ', $server['consumer_key'], $user_id); - } - - if ($exists) - { - throw new OAuthException2('The server with key "'.$server['consumer_key'].'" has already been registered'); - } - - $parts = parse_url($server['server_uri']); - $host = (isset($parts['host']) ? $parts['host'] : 'localhost'); - $path = (isset($parts['path']) ? $parts['path'] : '/'); - - if (isset($server['signature_methods'])) - { - if (is_array($server['signature_methods'])) - { - $server['signature_methods'] = strtoupper(implode(',', $server['signature_methods'])); - } - } - else - { - $server['signature_methods'] = ''; - } - - // When the user is an admin, then the user can update the user_id of this record - if ($user_is_admin && array_key_exists('user_id', $server)) - { - if (is_null($server['user_id'])) - { - $update_user = ', ocr_usa_id_ref = NULL'; - } - else - { - $update_user = ', ocr_usa_id_ref = \''. intval($server['user_id']) . '\''; - } - } - else - { - $update_user = ''; - } - - if (!empty($server['id'])) - { - // Check if the current user can update this server definition - if (!$user_is_admin) - { - $ocr_usa_id_ref = $this->query_one(' - SELECT ocr_usa_id_ref - FROM oauth_consumer_registry - WHERE ocr_id = %d - ', $server['id']); - - if ($ocr_usa_id_ref != $user_id) - { - throw new OAuthException2('The user "'.$user_id.'" is not allowed to update this server'); - } - } - - // Update the consumer registration - $this->query(' - UPDATE oauth_consumer_registry - SET ocr_consumer_key = \'%s\', - ocr_consumer_secret = \'%s\', - ocr_server_uri = \'%s\', - ocr_server_uri_host = \'%s\', - ocr_server_uri_path = \'%s\', - ocr_timestamp = NOW(), - ocr_request_token_uri = \'%s\', - ocr_authorize_uri = \'%s\', - ocr_access_token_uri = \'%s\', - ocr_signature_methods = \'%s\' - '.$update_user.' - WHERE ocr_id = %d - ', - $server['consumer_key'], - $server['consumer_secret'], - $server['server_uri'], - strtolower($host), - $path, - isset($server['request_token_uri']) ? $server['request_token_uri'] : '', - isset($server['authorize_uri']) ? $server['authorize_uri'] : '', - isset($server['access_token_uri']) ? $server['access_token_uri'] : '', - $server['signature_methods'], - $server['id'] - ); - } - else - { - $update_user_field = ''; - $update_user_value = ''; - if (empty($update_user)) - { - // Per default the user owning the key is the user registering the key - $update_user_field = ', ocr_usa_id_ref'; - $update_user_value = ', ' . intval($user_id); - } - - $this->query(' - INSERT INTO oauth_consumer_registry ( - ocr_consumer_key , - ocr_consumer_secret , - ocr_server_uri , - ocr_server_uri_host , - ocr_server_uri_path , - ocr_timestamp , - ocr_request_token_uri, - ocr_authorize_uri , - ocr_access_token_uri , - ocr_signature_methods' . $update_user_field . ' - ) - VALUES (\'%s\', \'%s\', \'%s\', \'%s\', \'%s\', NOW(), \'%s\', \'%s\', \'%s\', \'%s\''. $update_user_value . ')', - $server['consumer_key'], - $server['consumer_secret'], - $server['server_uri'], - strtolower($host), - $path, - isset($server['request_token_uri']) ? $server['request_token_uri'] : '', - isset($server['authorize_uri']) ? $server['authorize_uri'] : '', - isset($server['access_token_uri']) ? $server['access_token_uri'] : '', - $server['signature_methods'] - ); - - $ocr_id = $this->query_insert_id('oauth_consumer_registry', 'ocr_id'); - } - return $server['consumer_key']; - } - - - /** - * Insert/update a new consumer with this server (we will be the server) - * When this is a new consumer, then also generate the consumer key and secret. - * Never updates the consumer key and secret. - * When the id is set, then the key and secret must correspond to the entry - * being updated. - * - * (This is the registry at the server, registering consumers ;-) ) - * - * @param array consumer - * @param int user_id user registering this consumer - * @param boolean user_is_admin - * @return string consumer key - */ - public function updateConsumer ( $consumer, $user_id, $user_is_admin = false ) - { - if (!$user_is_admin) - { - foreach (array('requester_name', 'requester_email') as $f) - { - if (empty($consumer[$f])) - { - throw new OAuthException2('The field "'.$f.'" must be set and non empty'); - } - } - } - - if (!empty($consumer['id'])) - { - if (empty($consumer['consumer_key'])) - { - throw new OAuthException2('The field "consumer_key" must be set and non empty'); - } - if (!$user_is_admin && empty($consumer['consumer_secret'])) - { - throw new OAuthException2('The field "consumer_secret" must be set and non empty'); - } - - // Check if the current user can update this server definition - if (!$user_is_admin) - { - $osr_usa_id_ref = $this->query_one(' - SELECT osr_usa_id_ref - FROM oauth_server_registry - WHERE osr_id = %d - ', $consumer['id']); - - if ($osr_usa_id_ref != $user_id) - { - throw new OAuthException2('The user "'.$user_id.'" is not allowed to update this consumer'); - } - } - else - { - // User is an admin, allow a key owner to be changed or key to be shared - if (array_key_exists('user_id',$consumer)) - { - if (is_null($consumer['user_id'])) - { - $this->query(' - UPDATE oauth_server_registry - SET osr_usa_id_ref = NULL - WHERE osr_id = %d - ', $consumer['id']); - } - else - { - $this->query(' - UPDATE oauth_server_registry - SET osr_usa_id_ref = \'%d\' - WHERE osr_id = %d - ', $consumer['user_id'], $consumer['id']); - } - } - } - - $this->query(' - UPDATE oauth_server_registry - SET osr_requester_name = \'%s\', - osr_requester_email = \'%s\', - osr_callback_uri = \'%s\', - osr_application_uri = \'%s\', - osr_application_title = \'%s\', - osr_application_descr = \'%s\', - osr_application_notes = \'%s\', - osr_application_type = \'%s\', - osr_application_commercial = IF(%d,\'1\',\'0\'), - osr_timestamp = NOW() - WHERE osr_id = %d - AND osr_consumer_key = \'%s\' - AND osr_consumer_secret = \'%s\' - ', - $consumer['requester_name'], - $consumer['requester_email'], - isset($consumer['callback_uri']) ? $consumer['callback_uri'] : '', - isset($consumer['application_uri']) ? $consumer['application_uri'] : '', - isset($consumer['application_title']) ? $consumer['application_title'] : '', - isset($consumer['application_descr']) ? $consumer['application_descr'] : '', - isset($consumer['application_notes']) ? $consumer['application_notes'] : '', - isset($consumer['application_type']) ? $consumer['application_type'] : '', - isset($consumer['application_commercial']) ? $consumer['application_commercial'] : 0, - $consumer['id'], - $consumer['consumer_key'], - $consumer['consumer_secret'] - ); - - - $consumer_key = $consumer['consumer_key']; - } - else - { - $consumer_key = $this->generateKey(true); - $consumer_secret= $this->generateKey(); - - // When the user is an admin, then the user can be forced to something else that the user - if ($user_is_admin && array_key_exists('user_id',$consumer)) - { - if (is_null($consumer['user_id'])) - { - $owner_id = 'NULL'; - } - else - { - $owner_id = intval($consumer['user_id']); - } - } - else - { - // No admin, take the user id as the owner id. - $owner_id = intval($user_id); - } - - $this->query(' - INSERT INTO oauth_server_registry ( - osr_enabled, - osr_status, - osr_usa_id_ref, - osr_consumer_key, - osr_consumer_secret, - osr_requester_name, - osr_requester_email, - osr_callback_uri, - osr_application_uri, - osr_application_title, - osr_application_descr, - osr_application_notes, - osr_application_type, - osr_application_commercial, - osr_timestamp, - osr_issue_date - ) - VALUES (\'1\', \'active\', \'%s\', \'%s\', \'%s\', \'%s\', \'%s\', \'%s\', \'%s\', \'%s\', \'%s\', \'%s\', \'%s\', \'%d\', NOW(), NOW()) - ', - $owner_id, - $consumer_key, - $consumer_secret, - $consumer['requester_name'], - $consumer['requester_email'], - isset($consumer['callback_uri']) ? $consumer['callback_uri'] : '', - isset($consumer['application_uri']) ? $consumer['application_uri'] : '', - isset($consumer['application_title']) ? $consumer['application_title'] : '', - isset($consumer['application_descr']) ? $consumer['application_descr'] : '', - isset($consumer['application_notes']) ? $consumer['application_notes'] : '', - isset($consumer['application_type']) ? $consumer['application_type'] : '', - isset($consumer['application_commercial']) ? $consumer['application_commercial'] : 0 - ); - } - return $consumer_key; - - } - - /** - * Delete a consumer key. This removes access to our site for all applications using this key. - * - * @param string consumer_key - * @param int user_id user registering this server - * @param boolean user_is_admin - */ - public function deleteConsumer ( $consumer_key, $user_id, $user_is_admin = false ) - { - if ($user_is_admin) - { - $this->query(' - DELETE FROM oauth_server_registry - WHERE osr_consumer_key = \'%s\' - AND (osr_usa_id_ref = \'%d\' OR osr_usa_id_ref IS NULL) - ', $consumer_key, $user_id); - } - else - { - $this->query(' - DELETE FROM oauth_server_registry - WHERE osr_consumer_key = \'%s\' - AND osr_usa_id_ref = \'%d\' - ', $consumer_key, $user_id); - } - } - - /** - * Fetch a consumer of this server, by consumer_key. - * - * @param string consumer_key - * @param int user_id - * @param boolean user_is_admin (optional) - * @exception OAuthException2 when consumer not found - * @return array - */ - public function getConsumer ( $consumer_key, $user_id, $user_is_admin = false ) - { - $consumer = $this->query_row_assoc(' - SELECT * - FROM oauth_server_registry - WHERE osr_consumer_key = \'%s\' - ', $consumer_key); - - if (!is_array($consumer)) - { - throw new OAuthException2('No consumer with consumer_key "'.$consumer_key.'"'); - } - - $c = array(); - foreach ($consumer as $key => $value) - { - $c[substr($key, 4)] = $value; - } - $c['user_id'] = $c['usa_id_ref']; - - if (!$user_is_admin && !empty($c['user_id']) && $c['user_id'] != $user_id) - { - throw new OAuthException2('No access to the consumer information for consumer_key "'.$consumer_key.'"'); - } - return $c; - } - - - /** - * Fetch the static consumer key for this provider. The user for the static consumer - * key is NULL (no user, shared key). If the key did not exist then the key is created. - * - * @return string - */ - public function getConsumerStatic () - { - $consumer = $this->query_one(' - SELECT osr_consumer_key - FROM oauth_server_registry - WHERE osr_consumer_key LIKE \'sc-%%\' - AND osr_usa_id_ref IS NULL - '); - - if (empty($consumer)) - { - $consumer_key = 'sc-'.$this->generateKey(true); - $this->query(' - INSERT INTO oauth_server_registry ( - osr_enabled, - osr_status, - osr_usa_id_ref, - osr_consumer_key, - osr_consumer_secret, - osr_requester_name, - osr_requester_email, - osr_callback_uri, - osr_application_uri, - osr_application_title, - osr_application_descr, - osr_application_notes, - osr_application_type, - osr_application_commercial, - osr_timestamp, - osr_issue_date - ) - VALUES (\'1\',\'active\', NULL, \'%s\', \'\', \'\', \'\', \'\', \'\', \'Static shared consumer key\', \'\', \'Static shared consumer key\', \'\', 0, NOW(), NOW()) - ', - $consumer_key - ); - - // Just make sure that if the consumer key is truncated that we get the truncated string - $consumer = $this->getConsumerStatic(); - } - return $consumer; - } - - /** - * Add an unautorized request token to our server. - * - * @param string consumer_key - * @param array options (eg. token_ttl) - * @return array (token, token_secret) - */ - public function addConsumerRequestToken ( $consumer_key, $options = array() ) - { - $token = $this->generateKey(true); - $secret = !isset($options['secret']) ? $this->generateKey() : $options['secret']; - $osr_id = $this->query_one(' - SELECT osr_id - FROM oauth_server_registry - WHERE osr_consumer_key = \'%s\' - AND osr_enabled = \'1\' - ', $consumer_key); - - if (!$osr_id) - { - throw new OAuthException2('No server with consumer_key "'.$consumer_key.'" or consumer_key is disabled'); - } - - if (isset($options['token_ttl']) && is_numeric($options['token_ttl'])) - { - $ttl = intval($options['token_ttl']); - } - else - { - $ttl = $this->max_request_token_ttl; - } - - if (!isset($options['oauth_callback'])) { - // 1.0a Compatibility : store callback url associated with request token - $options['oauth_callback']='oob'; - } - - $this->query(' - INSERT INTO oauth_server_token ( - ost_osr_id_ref, - ost_usa_id_ref, - ost_token, - ost_token_secret, - ost_token_type, - ost_token_ttl, - ost_callback_url - ) - VALUES (%d, \'1\', \'%s\', \'%s\', \'request\', NOW() + INTERVAL \'%d SECOND\', \'%s\')', - $osr_id, $token, $secret, $ttl, $options['oauth_callback']); - - return array('token'=>$token, 'token_secret'=>$secret, 'token_ttl'=>$ttl); - } - - /** - * Fetch the consumer request token, by request token. - * - * @param string token - * @return array token and consumer details - */ - public function getConsumerRequestToken ( $token ) - { - $rs = $this->query_row_assoc(' - SELECT ost_token as token, - ost_token_secret as token_secret, - osr_consumer_key as consumer_key, - osr_consumer_secret as consumer_secret, - ost_token_type as token_type, - ost_callback_url as callback_url, - osr_application_title as application_title, - osr_application_descr as application_descr, - osr_application_uri as application_uri - FROM oauth_server_token - JOIN oauth_server_registry - ON ost_osr_id_ref = osr_id - WHERE ost_token_type = \'request\' - AND ost_token = \'%s\' - AND ost_token_ttl >= NOW() - ', $token); - - return $rs; - } - - /** - * Delete a consumer token. The token must be a request or authorized token. - * - * @param string token - */ - public function deleteConsumerRequestToken ( $token ) - { - $this->query(' - DELETE FROM oauth_server_token - WHERE ost_token = \'%s\' - AND ost_token_type = \'request\' - ', $token); - } - - /** - * Upgrade a request token to be an authorized request token. - * - * @param string token - * @param int user_id user authorizing the token - * @param string referrer_host used to set the referrer host for this token, for user feedback - */ - public function authorizeConsumerRequestToken ( $token, $user_id, $referrer_host = '' ) - { - // 1.0a Compatibility : create a token verifier - $verifier = substr(md5(rand()),0,10); - - $this->query(' - UPDATE oauth_server_token - SET ost_authorized = \'1\', - ost_usa_id_ref = \'%d\', - ost_timestamp = NOW(), - ost_referrer_host = \'%s\', - ost_verifier = \'%s\' - WHERE ost_token = \'%s\' - AND ost_token_type = \'request\' - ', $user_id, $referrer_host, $verifier, $token); - return $verifier; - } - - /** - * Count the consumer access tokens for the given consumer. - * - * @param string consumer_key - * @return int - */ - public function countConsumerAccessTokens ( $consumer_key ) - { - $count = $this->query_one(' - SELECT COUNT(ost_id) - FROM oauth_server_token - JOIN oauth_server_registry - ON ost_osr_id_ref = osr_id - WHERE ost_token_type = \'access\' - AND osr_consumer_key = \'%s\' - AND ost_token_ttl >= NOW() - ', $consumer_key); - - return $count; - } - - /** - * Exchange an authorized request token for new access token. - * - * @param string token - * @param array options options for the token, token_ttl - * @exception OAuthException2 when token could not be exchanged - * @return array (token, token_secret) - */ - public function exchangeConsumerRequestForAccessToken ( $token, $options = array() ) - { - $new_token = $this->generateKey(true); - $new_secret = $this->generateKey(); - - // Maximum time to live for this token - if (isset($options['token_ttl']) && is_numeric($options['token_ttl'])) - { - $ttl_sql = '(NOW() + INTERVAL \''.intval($options['token_ttl']).' SECOND\')'; - } - else - { - $ttl_sql = "'9999-12-31'"; - } - - if (isset($options['verifier'])) { - $verifier = $options['verifier']; - - // 1.0a Compatibility : check token against oauth_verifier - $this->query(' - UPDATE oauth_server_token - SET ost_token = \'%s\', - ost_token_secret = \'%s\', - ost_token_type = \'access\', - ost_timestamp = NOW(), - ost_token_ttl = '.$ttl_sql.' - WHERE ost_token = \'%s\' - AND ost_token_type = \'request\' - AND ost_authorized = \'1\' - AND ost_token_ttl >= NOW() - AND ost_verifier = \'%s\' - ', $new_token, $new_secret, $token, $verifier); - } else { - - // 1.0 - $this->query(' - UPDATE oauth_server_token - SET ost_token = \'%s\', - ost_token_secret = \'%s\', - ost_token_type = \'access\', - ost_timestamp = NOW(), - ost_token_ttl = '.$ttl_sql.' - WHERE ost_token = \'%s\' - AND ost_token_type = \'request\' - AND ost_authorized = \'1\' - AND ost_token_ttl >= NOW() - ', $new_token, $new_secret, $token); - } - - if ($this->query_affected_rows() != 1) - { - throw new OAuthException2('Can\'t exchange request token "'.$token.'" for access token. No such token or not authorized'); - } - - $ret = array('token' => $new_token, 'token_secret' => $new_secret); - $ttl = $this->query_one(' - SELECT (CASE WHEN ost_token_ttl >= \'9999-12-31\' THEN NULL ELSE ost_token_ttl - NOW() END) as token_ttl - FROM oauth_server_token - WHERE ost_token = \'%s\'', $new_token); - - if (is_numeric($ttl)) - { - $ret['token_ttl'] = intval($ttl); - } - return $ret; - } - - /** - * Fetch the consumer access token, by access token. - * - * @param string token - * @param int user_id - * @exception OAuthException2 when token is not found - * @return array token and consumer details - */ - public function getConsumerAccessToken ( $token, $user_id ) - { - $rs = $this->query_row_assoc(' - SELECT ost_token as token, - ost_token_secret as token_secret, - ost_referrer_host as token_referrer_host, - osr_consumer_key as consumer_key, - osr_consumer_secret as consumer_secret, - osr_application_uri as application_uri, - osr_application_title as application_title, - osr_application_descr as application_descr, - osr_callback_uri as callback_uri - FROM oauth_server_token - JOIN oauth_server_registry - ON ost_osr_id_ref = osr_id - WHERE ost_token_type = \'access\' - AND ost_token = \'%s\' - AND ost_usa_id_ref = \'%d\' - AND ost_token_ttl >= NOW() - ', $token, $user_id); - - if (empty($rs)) - { - throw new OAuthException2('No server_token "'.$token.'" for user "'.$user_id.'"'); - } - return $rs; - } - - /** - * Delete a consumer access token. - * - * @param string token - * @param int user_id - * @param boolean user_is_admin - */ - public function deleteConsumerAccessToken ( $token, $user_id, $user_is_admin = false ) - { - if ($user_is_admin) - { - $this->query(' - DELETE FROM oauth_server_token - WHERE ost_token = \'%s\' - AND ost_token_type = \'access\' - ', $token); - } - else - { - $this->query(' - DELETE FROM oauth_server_token - WHERE ost_token = \'%s\' - AND ost_token_type = \'access\' - AND ost_usa_id_ref = \'%d\' - ', $token, $user_id); - } - } - - /** - * Set the ttl of a consumer access token. This is done when the - * server receives a valid request with a xoauth_token_ttl parameter in it. - * - * @param string token - * @param int ttl - */ - public function setConsumerAccessTokenTtl ( $token, $token_ttl ) - { - if ($token_ttl <= 0) - { - // Immediate delete when the token is past its ttl - $this->deleteConsumerAccessToken($token, 0, true); - } - else - { - // Set maximum time to live for this token - $this->query(' - UPDATE oauth_server_token - SET ost_token_ttl = (NOW() + INTERVAL \'%d SECOND\') - WHERE ost_token = \'%s\' - AND ost_token_type = \'access\' - ', $token_ttl, $token); - } - } - - /** - * Fetch a list of all consumer keys, secrets etc. - * Returns the public (user_id is null) and the keys owned by the user - * - * @param int user_id - * @return array - */ - public function listConsumers ( $user_id ) - { - $rs = $this->query_all_assoc(' - SELECT osr_id as id, - osr_usa_id_ref as user_id, - osr_consumer_key as consumer_key, - osr_consumer_secret as consumer_secret, - osr_enabled as enabled, - osr_status as status, - osr_issue_date as issue_date, - osr_application_uri as application_uri, - osr_application_title as application_title, - osr_application_descr as application_descr, - osr_requester_name as requester_name, - osr_requester_email as requester_email, - osr_callback_uri as callback_uri - FROM oauth_server_registry - WHERE (osr_usa_id_ref = \'%d\' OR osr_usa_id_ref IS NULL) - ORDER BY osr_application_title - ', $user_id); - return $rs; - } - - /** - * List of all registered applications. Data returned has not sensitive - * information and therefore is suitable for public displaying. - * - * @param int $begin - * @param int $total - * @return array - */ - public function listConsumerApplications($begin = 0, $total = 25) - { - $rs = $this->query_all_assoc(' - SELECT osr_id as id, - osr_enabled as enabled, - osr_status as status, - osr_issue_date as issue_date, - osr_application_uri as application_uri, - osr_application_title as application_title, - osr_application_descr as application_descr - FROM oauth_server_registry - ORDER BY osr_application_title - '); - // TODO: pagination - return $rs; - } - - - /** - * Fetch a list of all consumer tokens accessing the account of the given user. - * - * @param int user_id - * @return array - */ - public function listConsumerTokens ( $user_id ) - { - $rs = $this->query_all_assoc(' - SELECT osr_consumer_key as consumer_key, - osr_consumer_secret as consumer_secret, - osr_enabled as enabled, - osr_status as status, - osr_application_uri as application_uri, - osr_application_title as application_title, - osr_application_descr as application_descr, - ost_timestamp as timestamp, - ost_token as token, - ost_token_secret as token_secret, - ost_referrer_host as token_referrer_host, - osr_callback_uri as callback_uri - FROM oauth_server_registry - JOIN oauth_server_token - ON ost_osr_id_ref = osr_id - WHERE ost_usa_id_ref = \'%d\' - AND ost_token_type = \'access\' - AND ost_token_ttl >= NOW() - ORDER BY osr_application_title - ', $user_id); - return $rs; - } - - - /** - * Check an nonce/timestamp combination. Clears any nonce combinations - * that are older than the one received. - * - * @param string consumer_key - * @param string token - * @param int timestamp - * @param string nonce - * @exception OAuthException2 thrown when the timestamp is not in sequence or nonce is not unique - */ - public function checkServerNonce ( $consumer_key, $token, $timestamp, $nonce ) - { - /* removed in Appendix A of RFC 5849 - $r = $this->query_row(' - SELECT MAX(osn_timestamp) - FROM oauth_server_nonce - WHERE osn_consumer_key = \'%s\' - AND osn_token = \'%s\' - ', $timestamp, $this->max_timestamp_skew, $consumer_key, $token); - - if (!empty($r) && $r[1] === 't') - { - throw new OAuthException2('Timestamp is out of sequence. Request rejected. Got '.$timestamp.' last max is '.$r[0].' allowed skew is '.$this->max_timestamp_skew); - } - */ - - // Insert the new combination - $this->query(' - INSERT INTO oauth_server_nonce ( - osn_consumer_key, - osn_token, - osn_timestamp, - osn_nonce - ) - VALUES (\'%s\', \'%s\', %d, \'%s\')', - $consumer_key, $token, $timestamp, $nonce); - - if ($this->query_affected_rows() == 0) - { - throw new OAuthException2('Duplicate timestamp/nonce combination, possible replay attack. Request rejected.'); - } - - // Clean up all timestamps older than the one we just received - $this->query(' - DELETE FROM oauth_server_nonce - WHERE osn_consumer_key = \'%s\' - AND osn_token = \'%s\' - AND osn_timestamp < %d - %d - ', $consumer_key, $token, $timestamp, $this->max_timestamp_skew); - } - - /** - * Add an entry to the log table - * - * @param array keys (osr_consumer_key, ost_token, ocr_consumer_key, oct_token) - * @param string received - * @param string sent - * @param string base_string - * @param string notes - * @param int (optional) user_id - */ - public function addLog ( $keys, $received, $sent, $base_string, $notes, $user_id = null ) - { - $args = array(); - $ps = array(); - foreach ($keys as $key => $value) - { - $args[] = $value; - $ps["olg_$key"] = "'%s'"; - } - - if (!empty($_SERVER['REMOTE_ADDR'])) - { - $remote_ip = $_SERVER['REMOTE_ADDR']; - } - else if (!empty($_SERVER['REMOTE_IP'])) - { - $remote_ip = $_SERVER['REMOTE_IP']; - } - else - { - $remote_ip = '0.0.0.0'; - } - - // Build the SQL - $ps['olg_received'] = "'%s'"; $args[] = $this->makeUTF8($received); - $ps['olg_sent'] = "'%s'"; $args[] = $this->makeUTF8($sent); - $ps['olg_base_string'] = "'%s'"; $args[] = $base_string; - $ps['olg_notes'] = "'%s'"; $args[] = $this->makeUTF8($notes); - $ps['olg_usa_id_ref'] = "NULLIF('%d', '0')"; $args[] = $user_id; - $ps['olg_remote_ip'] = "NULLIF('%s','0.0.0.0')::inet"; $args[] = $remote_ip; - - $this->query(' - INSERT INTO oauth_log ('.implode(',', array_keys($ps)) . ') - VALUES(' . implode(',', $ps) . ')', - $args - ); - } - - /** - * Get a page of entries from the log. Returns the last 100 records - * matching the options given. - * - * @param array options - * @param int user_id current user - * @return array log records - */ - public function listLog ( $options, $user_id ) - { - $where = array(); - $args = array(); - if (empty($options)) - { - $where[] = 'olg_usa_id_ref = \'%d\''; - $args[] = $user_id; - } - else - { - foreach ($options as $option => $value) - { - if (strlen($value) > 0) - { - switch ($option) - { - case 'osr_consumer_key': - case 'ocr_consumer_key': - case 'ost_token': - case 'oct_token': - $where[] = 'olg_'.$option.' = \'%s\''; - $args[] = $value; - break; - } - } - } - - $where[] = '(olg_usa_id_ref IS NULL OR olg_usa_id_ref = \'%d\')'; - $args[] = $user_id; - } - - $rs = $this->query_all_assoc(' - SELECT olg_id, - olg_osr_consumer_key AS osr_consumer_key, - olg_ost_token AS ost_token, - olg_ocr_consumer_key AS ocr_consumer_key, - olg_oct_token AS oct_token, - olg_usa_id_ref AS user_id, - olg_received AS received, - olg_sent AS sent, - olg_base_string AS base_string, - olg_notes AS notes, - olg_timestamp AS timestamp, - olg_remote_ip AS remote_ip - FROM oauth_log - WHERE '.implode(' AND ', $where).' - ORDER BY olg_id DESC - LIMIT 0,100', $args); - - return $rs; - } - - - /* ** Some simple helper functions for querying the pgsql db ** */ - - /** - * Perform a query, ignore the results - * - * @param string sql - * @param vararg arguments (for sprintf) - */ - protected function query ( $sql ) - { - $sql = $this->sql_printf(func_get_args()); - if (!($res = pg_query($this->conn, $sql))) - { - $this->sql_errcheck($sql); - } - $this->_lastAffectedRows = pg_affected_rows($res); - if (is_resource($res)) - { - pg_free_result($res); - } - } - - - /** - * Perform a query, return all rows - * - * @param string sql - * @param vararg arguments (for sprintf) - * @return array - */ - protected function query_all_assoc ( $sql ) - { - $sql = $this->sql_printf(func_get_args()); - if (!($res = pg_query($this->conn, $sql))) - { - $this->sql_errcheck($sql); - } - $rs = array(); - while ($row = pg_fetch_assoc($res)) - { - $rs[] = $row; - } - pg_free_result($res); - return $rs; - } - - - /** - * Perform a query, return the first row - * - * @param string sql - * @param vararg arguments (for sprintf) - * @return array - */ - protected function query_row_assoc ( $sql ) - { - $sql = $this->sql_printf(func_get_args()); - - if (!($res = pg_query($this->conn, $sql))) - { - $this->sql_errcheck($sql); - } - if ($row = pg_fetch_assoc($res)) - { - $rs = $row; - } - else - { - $rs = false; - } - pg_free_result($res); - return $rs; - } - - /** - * Perform a query, return the first row - * - * @param string sql - * @param vararg arguments (for sprintf) - * @return array - */ - protected function query_row ( $sql ) - { - $sql = $this->sql_printf(func_get_args()); - if (!($res = pg_query($this->conn, $sql))) - { - $this->sql_errcheck($sql); - } - if ($row = pg_fetch_array($res)) - { - $rs = $row; - } - else - { - $rs = false; - } - pg_free_result($res); - return $rs; - } - - - /** - * Perform a query, return the first column of the first row - * - * @param string sql - * @param vararg arguments (for sprintf) - * @return mixed - */ - protected function query_one ( $sql ) - { - $sql = $this->sql_printf(func_get_args()); - if (!($res = pg_query($this->conn, $sql))) - { - $this->sql_errcheck($sql); - } - $val = pg_fetch_row($res); - if ($val && isset($val[0])) { - $val = $val[0]; - } - pg_free_result($res); - return $val; - } - - - /** - * Return the number of rows affected in the last query - */ - protected function query_affected_rows () - { - return $this->_lastAffectedRows; - } - - - /** - * Return the id of the last inserted row - * - * @return int - */ - protected function query_insert_id ( $tableName, $primaryKey = null ) - { - $sequenceName = $tableName; - if ($primaryKey) { - $sequenceName .= "_$primaryKey"; - } - $sequenceName .= '_seq'; - - $sql = " - SELECT - CURRVAL('%s') - "; - $args = array($sql, $sequenceName); - $sql = $this->sql_printf($args); - if (!($res = pg_query($this->conn, $sql))) { - return 0; - } - $val = pg_fetch_row($res, 0); - if ($val && isset($val[0])) { - $val = $val[0]; - } - - pg_free_result($res); - return $val; - } - - - protected function sql_printf ( $args ) - { - $sql = array_shift($args); - if (count($args) == 1 && is_array($args[0])) - { - $args = $args[0]; - } - $args = array_map(array($this, 'sql_escape_string'), $args); - return vsprintf($sql, $args); - } - - - protected function sql_escape_string ( $s ) - { - if (is_string($s)) - { - return pg_escape_string($this->conn, $s); - } - else if (is_null($s)) - { - return NULL; - } - else if (is_bool($s)) - { - return intval($s); - } - else if (is_int($s) || is_float($s)) - { - return $s; - } - else - { - return pg_escape_string($this->conn, strval($s)); - } - } - - - protected function sql_errcheck ( $sql ) - { - $msg = "SQL Error in OAuthStorePostgreSQL: ".pg_last_error($this->conn)."\n\n" . $sql; - throw new OAuthException2($msg); - } -} diff --git a/vendor/oauth-php/library/store/OAuthStoreSQL.php b/vendor/oauth-php/library/store/OAuthStoreSQL.php deleted file mode 100644 index 45a48876f207bdf3b0a263c63e48af5c749fe707..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/OAuthStoreSQL.php +++ /dev/null @@ -1,1843 +0,0 @@ -<?php - -/** - * Storage container for the oauth credentials, both server and consumer side. - * Based on MySQL - * - * @version $Id: OAuthStoreMySQL.php 76 2010-01-27 19:51:17Z brunobg@corollarium.com $ - * @author Marc Worrell <marcw@pobox.com> - * @date Nov 16, 2007 4:03:30 PM - * - * - * The MIT License - * - * Copyright (c) 2007-2008 Mediamatic Lab - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - - -require_once dirname(__FILE__) . '/OAuthStoreAbstract.class.php'; - - -abstract class OAuthStoreSQL extends OAuthStoreAbstract -{ - /** - * Maximum delta a timestamp may be off from a previous timestamp. - * Allows multiple consumers with some clock skew to work with the same token. - * Unit is seconds, default max skew is 10 minutes. - */ - protected $max_timestamp_skew = 600; - - /** - * Default ttl for request tokens - */ - protected $max_request_token_ttl = 3600; - - - /** - * Construct the OAuthStoreMySQL. - * In the options you have to supply either: - * - server, username, password and database (for a mysql_connect) - * - conn (for the connection to be used) - * - * @param array options - */ - function __construct ( $options = array() ) - { - if (isset($options['conn'])) - { - $this->conn = $options['conn']; - } - else - { - if (isset($options['server'])) - { - $server = $options['server']; - $username = $options['username']; - - if (isset($options['password'])) - { - $this->conn = mysql_connect($server, $username, $options['password']); - } - else - { - $this->conn = mysql_connect($server, $username); - } - } - else - { - // Try the default mysql connect - $this->conn = mysql_connect(); - } - - if ($this->conn === false) - { - throw new OAuthException2('Could not connect to MySQL database: ' . mysql_error()); - } - - if (isset($options['database'])) - { - if (!mysql_select_db($options['database'], $this->conn)) - { - $this->sql_errcheck(); - } - } - $this->query('set character set utf8'); - } - } - - - /** - * Find stored credentials for the consumer key and token. Used by an OAuth server - * when verifying an OAuth request. - * - * @param string consumer_key - * @param string token - * @param string token_type false, 'request' or 'access' - * @exception OAuthException2 when no secrets where found - * @return array assoc (consumer_secret, token_secret, osr_id, ost_id, user_id) - */ - public function getSecretsForVerify ( $consumer_key, $token, $token_type = 'access' ) - { - if ($token_type === false) - { - $rs = $this->query_row_assoc(' - SELECT osr_id, - osr_consumer_key as consumer_key, - osr_consumer_secret as consumer_secret - FROM oauth_server_registry - WHERE osr_consumer_key = \'%s\' - AND osr_enabled = 1 - ', - $consumer_key); - - if ($rs) - { - $rs['token'] = false; - $rs['token_secret'] = false; - $rs['user_id'] = false; - $rs['ost_id'] = false; - } - } - else - { - $rs = $this->query_row_assoc(' - SELECT osr_id, - ost_id, - ost_usa_id_ref as user_id, - osr_consumer_key as consumer_key, - osr_consumer_secret as consumer_secret, - ost_token as token, - ost_token_secret as token_secret - FROM oauth_server_registry - JOIN oauth_server_token - ON ost_osr_id_ref = osr_id - WHERE ost_token_type = \'%s\' - AND osr_consumer_key = \'%s\' - AND ost_token = \'%s\' - AND osr_enabled = 1 - AND ost_token_ttl >= NOW() - ', - $token_type, $consumer_key, $token); - } - - if (empty($rs)) - { - throw new OAuthException2('The consumer_key "'.$consumer_key.'" token "'.$token.'" combination does not exist or is not enabled.'); - } - return $rs; - } - - - /** - * Find the server details for signing a request, always looks for an access token. - * The returned credentials depend on which local user is making the request. - * - * The consumer_key must belong to the user or be public (user id is null) - * - * For signing we need all of the following: - * - * consumer_key consumer key associated with the server - * consumer_secret consumer secret associated with this server - * token access token associated with this server - * token_secret secret for the access token - * signature_methods signing methods supported by the server (array) - * - * @todo filter on token type (we should know how and with what to sign this request, and there might be old access tokens) - * @param string uri uri of the server - * @param int user_id id of the logged on user - * @param string name (optional) name of the token (case sensitive) - * @exception OAuthException2 when no credentials found - * @return array - */ - public function getSecretsForSignature ( $uri, $user_id, $name = '' ) - { - // Find a consumer key and token for the given uri - $ps = parse_url($uri); - $host = isset($ps['host']) ? $ps['host'] : 'localhost'; - $path = isset($ps['path']) ? $ps['path'] : ''; - - if (empty($path) || substr($path, -1) != '/') - { - $path .= '/'; - } - - // The owner of the consumer_key is either the user or nobody (public consumer key) - $secrets = $this->query_row_assoc(' - SELECT ocr_consumer_key as consumer_key, - ocr_consumer_secret as consumer_secret, - oct_token as token, - oct_token_secret as token_secret, - ocr_signature_methods as signature_methods - FROM oauth_consumer_registry - JOIN oauth_consumer_token ON oct_ocr_id_ref = ocr_id - WHERE ocr_server_uri_host = \'%s\' - AND ocr_server_uri_path = LEFT(\'%s\', LENGTH(ocr_server_uri_path)) - AND (ocr_usa_id_ref = \'%d\' OR ocr_usa_id_ref IS NULL) - AND oct_usa_id_ref = \'%d\' - AND oct_token_type = \'access\' - AND oct_name = \'%s\' - AND oct_token_ttl >= NOW() - ORDER BY ocr_usa_id_ref DESC, ocr_consumer_secret DESC, LENGTH(ocr_server_uri_path) DESC - LIMIT 0,1 - ', $host, $path, $user_id, $user_id, $name - ); - - if (empty($secrets)) - { - throw new OAuthException2('No server tokens available for '.$uri); - } - $secrets['signature_methods'] = explode(',', $secrets['signature_methods']); - return $secrets; - } - - - /** - * Get the token and token secret we obtained from a server. - * - * @param string consumer_key - * @param string token - * @param string token_type - * @param int user_id the user owning the token - * @param string name optional name for a named token - * @exception OAuthException2 when no credentials found - * @return array - */ - public function getServerTokenSecrets ( $consumer_key, $token, $token_type, $user_id, $name = '' ) - { - if ($token_type != 'request' && $token_type != 'access') - { - throw new OAuthException2('Unkown token type "'.$token_type.'", must be either "request" or "access"'); - } - - // Take the most recent token of the given type - $r = $this->query_row_assoc(' - SELECT ocr_consumer_key as consumer_key, - ocr_consumer_secret as consumer_secret, - oct_token as token, - oct_token_secret as token_secret, - oct_name as token_name, - ocr_signature_methods as signature_methods, - ocr_server_uri as server_uri, - ocr_request_token_uri as request_token_uri, - ocr_authorize_uri as authorize_uri, - ocr_access_token_uri as access_token_uri, - IF(oct_token_ttl >= \'9999-12-31\', NULL, UNIX_TIMESTAMP(oct_token_ttl) - UNIX_TIMESTAMP(NOW())) as token_ttl - FROM oauth_consumer_registry - JOIN oauth_consumer_token - ON oct_ocr_id_ref = ocr_id - WHERE ocr_consumer_key = \'%s\' - AND oct_token_type = \'%s\' - AND oct_token = \'%s\' - AND oct_usa_id_ref = %d - AND oct_token_ttl >= NOW() - ', $consumer_key, $token_type, $token, $user_id - ); - - if (empty($r)) - { - throw new OAuthException2('Could not find a "'.$token_type.'" token for consumer "'.$consumer_key.'" and user '.$user_id); - } - if (isset($r['signature_methods']) && !empty($r['signature_methods'])) - { - $r['signature_methods'] = explode(',',$r['signature_methods']); - } - else - { - $r['signature_methods'] = array(); - } - return $r; - } - - - /** - * Add a request token we obtained from a server. - * - * @todo remove old tokens for this user and this ocr_id - * @param string consumer_key key of the server in the consumer registry - * @param string token_type one of 'request' or 'access' - * @param string token - * @param string token_secret - * @param int user_id the user owning the token - * @param array options extra options, server_uri, name and token_ttl - * @exception OAuthException2 when server is not known - * @exception OAuthException2 when we received a duplicate token - */ - public function addServerToken ( $consumer_key, $token_type, $token, $token_secret, $user_id, $options = array() ) - { - if ($token_type != 'request' && $token_type != 'access') - { - throw new OAuthException2('Unknown token type "'.$token_type.'", must be either "request" or "access"'); - } - - // Maximum time to live for this token - if (isset($options['token_ttl']) && is_numeric($options['token_ttl'])) - { - $ttl = 'DATE_ADD(NOW(), INTERVAL '.intval($options['token_ttl']).' SECOND)'; - } - else if ($token_type == 'request') - { - $ttl = 'DATE_ADD(NOW(), INTERVAL '.$this->max_request_token_ttl.' SECOND)'; - } - else - { - $ttl = "'9999-12-31'"; - } - - if (isset($options['server_uri'])) - { - $ocr_id = $this->query_one(' - SELECT ocr_id - FROM oauth_consumer_registry - WHERE ocr_consumer_key = \'%s\' - AND (ocr_usa_id_ref = %d OR ocr_usa_id_ref IS NULL) - AND ocr_server_uri = \'%s\' - ', $consumer_key, $user_id, $options['server_uri']); - } - else - { - $ocr_id = $this->query_one(' - SELECT ocr_id - FROM oauth_consumer_registry - WHERE ocr_consumer_key = \'%s\' - AND (ocr_usa_id_ref = %d OR ocr_usa_id_ref IS NULL) - ', $consumer_key, $user_id); - } - - if (empty($ocr_id)) - { - throw new OAuthException2('No server associated with consumer_key "'.$consumer_key.'"'); - } - - // Named tokens, unique per user/consumer key - if (isset($options['name']) && $options['name'] != '') - { - $name = $options['name']; - } - else - { - $name = ''; - } - - // Delete any old tokens with the same type and name for this user/server combination - $this->query(' - DELETE FROM oauth_consumer_token - WHERE oct_ocr_id_ref = %d - AND oct_usa_id_ref = %d - AND oct_token_type = LOWER(\'%s\') - AND oct_name = \'%s\' - ', - $ocr_id, - $user_id, - $token_type, - $name); - - // Insert the new token - $this->query(' - INSERT IGNORE INTO oauth_consumer_token - SET oct_ocr_id_ref = %d, - oct_usa_id_ref = %d, - oct_name = \'%s\', - oct_token = \'%s\', - oct_token_secret= \'%s\', - oct_token_type = LOWER(\'%s\'), - oct_timestamp = NOW(), - oct_token_ttl = '.$ttl.' - ', - $ocr_id, - $user_id, - $name, - $token, - $token_secret, - $token_type); - - if (!$this->query_affected_rows()) - { - throw new OAuthException2('Received duplicate token "'.$token.'" for the same consumer_key "'.$consumer_key.'"'); - } - } - - - /** - * Delete a server key. This removes access to that site. - * - * @param string consumer_key - * @param int user_id user registering this server - * @param boolean user_is_admin - */ - public function deleteServer ( $consumer_key, $user_id, $user_is_admin = false ) - { - if ($user_is_admin) - { - $this->query(' - DELETE FROM oauth_consumer_registry - WHERE ocr_consumer_key = \'%s\' - AND (ocr_usa_id_ref = %d OR ocr_usa_id_ref IS NULL) - ', $consumer_key, $user_id); - } - else - { - $this->query(' - DELETE FROM oauth_consumer_registry - WHERE ocr_consumer_key = \'%s\' - AND ocr_usa_id_ref = %d - ', $consumer_key, $user_id); - } - } - - - /** - * Get a server from the consumer registry using the consumer key - * - * @param string consumer_key - * @param int user_id - * @param boolean user_is_admin (optional) - * @exception OAuthException2 when server is not found - * @return array - */ - public function getServer ( $consumer_key, $user_id, $user_is_admin = false ) - { - $r = $this->query_row_assoc(' - SELECT ocr_id as id, - ocr_usa_id_ref as user_id, - ocr_consumer_key as consumer_key, - ocr_consumer_secret as consumer_secret, - ocr_signature_methods as signature_methods, - ocr_server_uri as server_uri, - ocr_request_token_uri as request_token_uri, - ocr_authorize_uri as authorize_uri, - ocr_access_token_uri as access_token_uri - FROM oauth_consumer_registry - WHERE ocr_consumer_key = \'%s\' - AND (ocr_usa_id_ref = %d OR ocr_usa_id_ref IS NULL) - ', $consumer_key, $user_id); - - if (empty($r)) - { - throw new OAuthException2('No server with consumer_key "'.$consumer_key.'" has been registered (for this user)'); - } - - if (isset($r['signature_methods']) && !empty($r['signature_methods'])) - { - $r['signature_methods'] = explode(',',$r['signature_methods']); - } - else - { - $r['signature_methods'] = array(); - } - return $r; - } - - - - /** - * Find the server details that might be used for a request - * - * The consumer_key must belong to the user or be public (user id is null) - * - * @param string uri uri of the server - * @param int user_id id of the logged on user - * @exception OAuthException2 when no credentials found - * @return array - */ - public function getServerForUri ( $uri, $user_id ) - { - // Find a consumer key and token for the given uri - $ps = parse_url($uri); - $host = isset($ps['host']) ? $ps['host'] : 'localhost'; - $path = isset($ps['path']) ? $ps['path'] : ''; - - if (empty($path) || substr($path, -1) != '/') - { - $path .= '/'; - } - - // The owner of the consumer_key is either the user or nobody (public consumer key) - $server = $this->query_row_assoc(' - SELECT ocr_id as id, - ocr_usa_id_ref as user_id, - ocr_consumer_key as consumer_key, - ocr_consumer_secret as consumer_secret, - ocr_signature_methods as signature_methods, - ocr_server_uri as server_uri, - ocr_request_token_uri as request_token_uri, - ocr_authorize_uri as authorize_uri, - ocr_access_token_uri as access_token_uri - FROM oauth_consumer_registry - WHERE ocr_server_uri_host = \'%s\' - AND ocr_server_uri_path = LEFT(\'%s\', LENGTH(ocr_server_uri_path)) - AND (ocr_usa_id_ref = \'%d\' OR ocr_usa_id_ref IS NULL) - ORDER BY ocr_usa_id_ref DESC, consumer_secret DESC, LENGTH(ocr_server_uri_path) DESC - LIMIT 0,1 - ', $host, $path, $user_id - ); - - if (empty($server)) - { - throw new OAuthException2('No server available for '.$uri); - } - $server['signature_methods'] = explode(',', $server['signature_methods']); - return $server; - } - - - /** - * Get a list of all server token this user has access to. - * - * @param int usr_id - * @return array - */ - public function listServerTokens ( $user_id ) - { - $ts = $this->query_all_assoc(' - SELECT ocr_consumer_key as consumer_key, - ocr_consumer_secret as consumer_secret, - oct_id as token_id, - oct_token as token, - oct_token_secret as token_secret, - oct_usa_id_ref as user_id, - ocr_signature_methods as signature_methods, - ocr_server_uri as server_uri, - ocr_server_uri_host as server_uri_host, - ocr_server_uri_path as server_uri_path, - ocr_request_token_uri as request_token_uri, - ocr_authorize_uri as authorize_uri, - ocr_access_token_uri as access_token_uri, - oct_timestamp as timestamp - FROM oauth_consumer_registry - JOIN oauth_consumer_token - ON oct_ocr_id_ref = ocr_id - WHERE oct_usa_id_ref = %d - AND oct_token_type = \'access\' - AND oct_token_ttl >= NOW() - ORDER BY ocr_server_uri_host, ocr_server_uri_path - ', $user_id); - return $ts; - } - - - /** - * Count how many tokens we have for the given server - * - * @param string consumer_key - * @return int - */ - public function countServerTokens ( $consumer_key ) - { - $count = $this->query_one(' - SELECT COUNT(oct_id) - FROM oauth_consumer_token - JOIN oauth_consumer_registry - ON oct_ocr_id_ref = ocr_id - WHERE oct_token_type = \'access\' - AND ocr_consumer_key = \'%s\' - AND oct_token_ttl >= NOW() - ', $consumer_key); - - return $count; - } - - - /** - * Get a specific server token for the given user - * - * @param string consumer_key - * @param string token - * @param int user_id - * @exception OAuthException2 when no such token found - * @return array - */ - public function getServerToken ( $consumer_key, $token, $user_id ) - { - $ts = $this->query_row_assoc(' - SELECT ocr_consumer_key as consumer_key, - ocr_consumer_secret as consumer_secret, - oct_token as token, - oct_token_secret as token_secret, - oct_usa_id_ref as usr_id, - ocr_signature_methods as signature_methods, - ocr_server_uri as server_uri, - ocr_server_uri_host as server_uri_host, - ocr_server_uri_path as server_uri_path, - ocr_request_token_uri as request_token_uri, - ocr_authorize_uri as authorize_uri, - ocr_access_token_uri as access_token_uri, - oct_timestamp as timestamp - FROM oauth_consumer_registry - JOIN oauth_consumer_token - ON oct_ocr_id_ref = ocr_id - WHERE ocr_consumer_key = \'%s\' - AND oct_usa_id_ref = %d - AND oct_token_type = \'access\' - AND oct_token = \'%s\' - AND oct_token_ttl >= NOW() - ', $consumer_key, $user_id, $token); - - if (empty($ts)) - { - throw new OAuthException2('No such consumer key ('.$consumer_key.') and token ('.$token.') combination for user "'.$user_id.'"'); - } - return $ts; - } - - - /** - * Delete a token we obtained from a server. - * - * @param string consumer_key - * @param string token - * @param int user_id - * @param boolean user_is_admin - */ - public function deleteServerToken ( $consumer_key, $token, $user_id, $user_is_admin = false ) - { - if ($user_is_admin) - { - $this->query(' - DELETE oauth_consumer_token - FROM oauth_consumer_token - JOIN oauth_consumer_registry - ON oct_ocr_id_ref = ocr_id - WHERE ocr_consumer_key = \'%s\' - AND oct_token = \'%s\' - ', $consumer_key, $token); - } - else - { - $this->query(' - DELETE oauth_consumer_token - FROM oauth_consumer_token - JOIN oauth_consumer_registry - ON oct_ocr_id_ref = ocr_id - WHERE ocr_consumer_key = \'%s\' - AND oct_token = \'%s\' - AND oct_usa_id_ref = %d - ', $consumer_key, $token, $user_id); - } - } - - - /** - * Set the ttl of a server access token. This is done when the - * server receives a valid request with a xoauth_token_ttl parameter in it. - * - * @param string consumer_key - * @param string token - * @param int token_ttl - */ - public function setServerTokenTtl ( $consumer_key, $token, $token_ttl, $server_uri = NULL ) - { - if ($token_ttl <= 0) - { - // Immediate delete when the token is past its ttl - $this->deleteServerToken($consumer_key, $token, 0, true); - } - else if ( $server_uri ) - { - // Set maximum time to live for this token - $this->query(' - UPDATE oauth_consumer_token, oauth_consumer_registry - SET ost_token_ttl = DATE_ADD(NOW(), INTERVAL %d SECOND) - WHERE ocr_consumer_key = \'%s\' - AND ocr_server_uri = \'%s\' - AND oct_ocr_id_ref = ocr_id - AND oct_token = \'%s\' - ', $token_ttl, $server_uri, $consumer_key, $token); - } - else - { - // Set maximum time to live for this token - $this->query(' - UPDATE oauth_consumer_token, oauth_consumer_registry - SET ost_token_ttl = DATE_ADD(NOW(), INTERVAL %d SECOND) - WHERE ocr_consumer_key = \'%s\' - AND oct_ocr_id_ref = ocr_id - AND oct_token = \'%s\' - ', $token_ttl, $consumer_key, $token); - } - } - - - /** - * Get a list of all consumers from the consumer registry. - * The consumer keys belong to the user or are public (user id is null) - * - * @param string q query term - * @param int user_id - * @return array - */ - public function listServers ( $q = '', $user_id ) - { - $q = trim(str_replace('%', '', $q)); - $args = array(); - - if (!empty($q)) - { - $where = ' WHERE ( ocr_consumer_key like \'%%%s%%\' - OR ocr_server_uri like \'%%%s%%\' - OR ocr_server_uri_host like \'%%%s%%\' - OR ocr_server_uri_path like \'%%%s%%\') - AND (ocr_usa_id_ref = %d OR ocr_usa_id_ref IS NULL) - '; - - $args[] = $q; - $args[] = $q; - $args[] = $q; - $args[] = $q; - $args[] = $user_id; - } - else - { - $where = ' WHERE ocr_usa_id_ref = %d OR ocr_usa_id_ref IS NULL'; - $args[] = $user_id; - } - - $servers = $this->query_all_assoc(' - SELECT ocr_id as id, - ocr_usa_id_ref as user_id, - ocr_consumer_key as consumer_key, - ocr_consumer_secret as consumer_secret, - ocr_signature_methods as signature_methods, - ocr_server_uri as server_uri, - ocr_server_uri_host as server_uri_host, - ocr_server_uri_path as server_uri_path, - ocr_request_token_uri as request_token_uri, - ocr_authorize_uri as authorize_uri, - ocr_access_token_uri as access_token_uri - FROM oauth_consumer_registry - '.$where.' - ORDER BY ocr_server_uri_host, ocr_server_uri_path - ', $args); - return $servers; - } - - - /** - * Register or update a server for our site (we will be the consumer) - * - * (This is the registry at the consumers, registering servers ;-) ) - * - * @param array server - * @param int user_id user registering this server - * @param boolean user_is_admin - * @exception OAuthException2 when fields are missing or on duplicate consumer_key - * @return consumer_key - */ - public function updateServer ( $server, $user_id, $user_is_admin = false ) - { - foreach (array('consumer_key', 'server_uri') as $f) - { - if (empty($server[$f])) - { - throw new OAuthException2('The field "'.$f.'" must be set and non empty'); - } - } - - if (!empty($server['id'])) - { - $exists = $this->query_one(' - SELECT ocr_id - FROM oauth_consumer_registry - WHERE ocr_consumer_key = \'%s\' - AND ocr_id <> %d - AND (ocr_usa_id_ref = %d OR ocr_usa_id_ref IS NULL) - ', $server['consumer_key'], $server['id'], $user_id); - } - else - { - $exists = $this->query_one(' - SELECT ocr_id - FROM oauth_consumer_registry - WHERE ocr_consumer_key = \'%s\' - AND (ocr_usa_id_ref = %d OR ocr_usa_id_ref IS NULL) - ', $server['consumer_key'], $user_id); - } - - if ($exists) - { - throw new OAuthException2('The server with key "'.$server['consumer_key'].'" has already been registered'); - } - - $parts = parse_url($server['server_uri']); - $host = (isset($parts['host']) ? $parts['host'] : 'localhost'); - $path = (isset($parts['path']) ? $parts['path'] : '/'); - - if (isset($server['signature_methods'])) - { - if (is_array($server['signature_methods'])) - { - $server['signature_methods'] = strtoupper(implode(',', $server['signature_methods'])); - } - } - else - { - $server['signature_methods'] = ''; - } - - // When the user is an admin, then the user can update the user_id of this record - if ($user_is_admin && array_key_exists('user_id', $server)) - { - if (is_null($server['user_id'])) - { - $update_user = ', ocr_usa_id_ref = NULL'; - } - else - { - $update_user = ', ocr_usa_id_ref = '.intval($server['user_id']); - } - } - else - { - $update_user = ''; - } - - if (!empty($server['id'])) - { - // Check if the current user can update this server definition - if (!$user_is_admin) - { - $ocr_usa_id_ref = $this->query_one(' - SELECT ocr_usa_id_ref - FROM oauth_consumer_registry - WHERE ocr_id = %d - ', $server['id']); - - if ($ocr_usa_id_ref != $user_id) - { - throw new OAuthException2('The user "'.$user_id.'" is not allowed to update this server'); - } - } - - // Update the consumer registration - $this->query(' - UPDATE oauth_consumer_registry - SET ocr_consumer_key = \'%s\', - ocr_consumer_secret = \'%s\', - ocr_server_uri = \'%s\', - ocr_server_uri_host = \'%s\', - ocr_server_uri_path = \'%s\', - ocr_timestamp = NOW(), - ocr_request_token_uri = \'%s\', - ocr_authorize_uri = \'%s\', - ocr_access_token_uri = \'%s\', - ocr_signature_methods = \'%s\' - '.$update_user.' - WHERE ocr_id = %d - ', - $server['consumer_key'], - $server['consumer_secret'], - $server['server_uri'], - strtolower($host), - $path, - isset($server['request_token_uri']) ? $server['request_token_uri'] : '', - isset($server['authorize_uri']) ? $server['authorize_uri'] : '', - isset($server['access_token_uri']) ? $server['access_token_uri'] : '', - $server['signature_methods'], - $server['id'] - ); - } - else - { - if (empty($update_user)) - { - // Per default the user owning the key is the user registering the key - $update_user = ', ocr_usa_id_ref = '.intval($user_id); - } - - $this->query(' - INSERT INTO oauth_consumer_registry - SET ocr_consumer_key = \'%s\', - ocr_consumer_secret = \'%s\', - ocr_server_uri = \'%s\', - ocr_server_uri_host = \'%s\', - ocr_server_uri_path = \'%s\', - ocr_timestamp = NOW(), - ocr_request_token_uri = \'%s\', - ocr_authorize_uri = \'%s\', - ocr_access_token_uri = \'%s\', - ocr_signature_methods = \'%s\' - '.$update_user, - $server['consumer_key'], - $server['consumer_secret'], - $server['server_uri'], - strtolower($host), - $path, - isset($server['request_token_uri']) ? $server['request_token_uri'] : '', - isset($server['authorize_uri']) ? $server['authorize_uri'] : '', - isset($server['access_token_uri']) ? $server['access_token_uri'] : '', - $server['signature_methods'] - ); - - $ocr_id = $this->query_insert_id(); - } - return $server['consumer_key']; - } - - - /** - * Insert/update a new consumer with this server (we will be the server) - * When this is a new consumer, then also generate the consumer key and secret. - * Never updates the consumer key and secret. - * When the id is set, then the key and secret must correspond to the entry - * being updated. - * - * (This is the registry at the server, registering consumers ;-) ) - * - * @param array consumer - * @param int user_id user registering this consumer - * @param boolean user_is_admin - * @return string consumer key - */ - public function updateConsumer ( $consumer, $user_id, $user_is_admin = false ) - { - if (!$user_is_admin) - { - foreach (array('requester_name', 'requester_email') as $f) - { - if (empty($consumer[$f])) - { - throw new OAuthException2('The field "'.$f.'" must be set and non empty'); - } - } - } - - if (!empty($consumer['id'])) - { - if (empty($consumer['consumer_key'])) - { - throw new OAuthException2('The field "consumer_key" must be set and non empty'); - } - if (!$user_is_admin && empty($consumer['consumer_secret'])) - { - throw new OAuthException2('The field "consumer_secret" must be set and non empty'); - } - - // Check if the current user can update this server definition - if (!$user_is_admin) - { - $osr_usa_id_ref = $this->query_one(' - SELECT osr_usa_id_ref - FROM oauth_server_registry - WHERE osr_id = %d - ', $consumer['id']); - - if ($osr_usa_id_ref != $user_id) - { - throw new OAuthException2('The user "'.$user_id.'" is not allowed to update this consumer'); - } - } - else - { - // User is an admin, allow a key owner to be changed or key to be shared - if (array_key_exists('user_id',$consumer)) - { - if (is_null($consumer['user_id'])) - { - $this->query(' - UPDATE oauth_server_registry - SET osr_usa_id_ref = NULL - WHERE osr_id = %d - ', $consumer['id']); - } - else - { - $this->query(' - UPDATE oauth_server_registry - SET osr_usa_id_ref = %d - WHERE osr_id = %d - ', $consumer['user_id'], $consumer['id']); - } - } - } - - $this->query(' - UPDATE oauth_server_registry - SET osr_requester_name = \'%s\', - osr_requester_email = \'%s\', - osr_callback_uri = \'%s\', - osr_application_uri = \'%s\', - osr_application_title = \'%s\', - osr_application_descr = \'%s\', - osr_application_notes = \'%s\', - osr_application_type = \'%s\', - osr_application_commercial = IF(%d,1,0), - osr_timestamp = NOW() - WHERE osr_id = %d - AND osr_consumer_key = \'%s\' - AND osr_consumer_secret = \'%s\' - ', - $consumer['requester_name'], - $consumer['requester_email'], - isset($consumer['callback_uri']) ? $consumer['callback_uri'] : '', - isset($consumer['application_uri']) ? $consumer['application_uri'] : '', - isset($consumer['application_title']) ? $consumer['application_title'] : '', - isset($consumer['application_descr']) ? $consumer['application_descr'] : '', - isset($consumer['application_notes']) ? $consumer['application_notes'] : '', - isset($consumer['application_type']) ? $consumer['application_type'] : '', - isset($consumer['application_commercial']) ? $consumer['application_commercial'] : 0, - $consumer['id'], - $consumer['consumer_key'], - $consumer['consumer_secret'] - ); - - - $consumer_key = $consumer['consumer_key']; - } - else - { - $consumer_key = $this->generateKey(true); - $consumer_secret= $this->generateKey(); - - // When the user is an admin, then the user can be forced to something else that the user - if ($user_is_admin && array_key_exists('user_id',$consumer)) - { - if (is_null($consumer['user_id'])) - { - $owner_id = 'NULL'; - } - else - { - $owner_id = intval($consumer['user_id']); - } - } - else - { - // No admin, take the user id as the owner id. - $owner_id = intval($user_id); - } - - $this->query(' - INSERT INTO oauth_server_registry - SET osr_enabled = 1, - osr_status = \'active\', - osr_usa_id_ref = \'%s\', - osr_consumer_key = \'%s\', - osr_consumer_secret = \'%s\', - osr_requester_name = \'%s\', - osr_requester_email = \'%s\', - osr_callback_uri = \'%s\', - osr_application_uri = \'%s\', - osr_application_title = \'%s\', - osr_application_descr = \'%s\', - osr_application_notes = \'%s\', - osr_application_type = \'%s\', - osr_application_commercial = IF(%d,1,0), - osr_timestamp = NOW(), - osr_issue_date = NOW() - ', - $owner_id, - $consumer_key, - $consumer_secret, - $consumer['requester_name'], - $consumer['requester_email'], - isset($consumer['callback_uri']) ? $consumer['callback_uri'] : '', - isset($consumer['application_uri']) ? $consumer['application_uri'] : '', - isset($consumer['application_title']) ? $consumer['application_title'] : '', - isset($consumer['application_descr']) ? $consumer['application_descr'] : '', - isset($consumer['application_notes']) ? $consumer['application_notes'] : '', - isset($consumer['application_type']) ? $consumer['application_type'] : '', - isset($consumer['application_commercial']) ? $consumer['application_commercial'] : 0 - ); - } - return $consumer_key; - - } - - - - /** - * Delete a consumer key. This removes access to our site for all applications using this key. - * - * @param string consumer_key - * @param int user_id user registering this server - * @param boolean user_is_admin - */ - public function deleteConsumer ( $consumer_key, $user_id, $user_is_admin = false ) - { - if ($user_is_admin) - { - $this->query(' - DELETE FROM oauth_server_registry - WHERE osr_consumer_key = \'%s\' - AND (osr_usa_id_ref = %d OR osr_usa_id_ref IS NULL) - ', $consumer_key, $user_id); - } - else - { - $this->query(' - DELETE FROM oauth_server_registry - WHERE osr_consumer_key = \'%s\' - AND osr_usa_id_ref = %d - ', $consumer_key, $user_id); - } - } - - - - /** - * Fetch a consumer of this server, by consumer_key. - * - * @param string consumer_key - * @param int user_id - * @param boolean user_is_admin (optional) - * @exception OAuthException2 when consumer not found - * @return array - */ - public function getConsumer ( $consumer_key, $user_id, $user_is_admin = false ) - { - $consumer = $this->query_row_assoc(' - SELECT * - FROM oauth_server_registry - WHERE osr_consumer_key = \'%s\' - ', $consumer_key); - - if (!is_array($consumer)) - { - throw new OAuthException2('No consumer with consumer_key "'.$consumer_key.'"'); - } - - $c = array(); - foreach ($consumer as $key => $value) - { - $c[substr($key, 4)] = $value; - } - $c['user_id'] = $c['usa_id_ref']; - - if (!$user_is_admin && !empty($c['user_id']) && $c['user_id'] != $user_id) - { - throw new OAuthException2('No access to the consumer information for consumer_key "'.$consumer_key.'"'); - } - return $c; - } - - - /** - * Fetch the static consumer key for this provider. The user for the static consumer - * key is NULL (no user, shared key). If the key did not exist then the key is created. - * - * @return string - */ - public function getConsumerStatic () - { - $consumer = $this->query_one(' - SELECT osr_consumer_key - FROM oauth_server_registry - WHERE osr_consumer_key LIKE \'sc-%%\' - AND osr_usa_id_ref IS NULL - '); - - if (empty($consumer)) - { - $consumer_key = 'sc-'.$this->generateKey(true); - $this->query(' - INSERT INTO oauth_server_registry - SET osr_enabled = 1, - osr_status = \'active\', - osr_usa_id_ref = NULL, - osr_consumer_key = \'%s\', - osr_consumer_secret = \'\', - osr_requester_name = \'\', - osr_requester_email = \'\', - osr_callback_uri = \'\', - osr_application_uri = \'\', - osr_application_title = \'Static shared consumer key\', - osr_application_descr = \'\', - osr_application_notes = \'Static shared consumer key\', - osr_application_type = \'\', - osr_application_commercial = 0, - osr_timestamp = NOW(), - osr_issue_date = NOW() - ', - $consumer_key - ); - - // Just make sure that if the consumer key is truncated that we get the truncated string - $consumer = $this->getConsumerStatic(); - } - return $consumer; - } - - - /** - * Add an unautorized request token to our server. - * - * @param string consumer_key - * @param array options (eg. token_ttl) - * @return array (token, token_secret) - */ - public function addConsumerRequestToken ( $consumer_key, $options = array() ) - { - $token = $this->generateKey(true); - $secret = !isset($options['secret']) ? $this->generateKey() : $options['secret']; - $osr_id = $this->query_one(' - SELECT osr_id - FROM oauth_server_registry - WHERE osr_consumer_key = \'%s\' - AND osr_enabled = 1 - ', $consumer_key); - - if (!$osr_id) - { - throw new OAuthException2('No server with consumer_key "'.$consumer_key.'" or consumer_key is disabled'); - } - - if (isset($options['token_ttl']) && is_numeric($options['token_ttl'])) - { - $ttl = intval($options['token_ttl']); - } - else - { - $ttl = $this->max_request_token_ttl; - } - - if (!isset($options['oauth_callback'])) { - // 1.0a Compatibility : store callback url associated with request token - $options['oauth_callback']='oob'; - } - - $this->query(' - INSERT INTO oauth_server_token - SET ost_osr_id_ref = %d, - ost_usa_id_ref = 1, - ost_token = \'%s\', - ost_token_secret = \'%s\', - ost_token_type = \'request\', - ost_token_ttl = DATE_ADD(NOW(), INTERVAL %d SECOND), - ost_callback_url = \'%s\' - ON DUPLICATE KEY UPDATE - ost_osr_id_ref = VALUES(ost_osr_id_ref), - ost_usa_id_ref = VALUES(ost_usa_id_ref), - ost_token = VALUES(ost_token), - ost_token_secret = VALUES(ost_token_secret), - ost_token_type = VALUES(ost_token_type), - ost_token_ttl = VALUES(ost_token_ttl), - ost_callback_url = VALUES(ost_callback_url), - ost_timestamp = NOW() - ', $osr_id, $token, $secret, $ttl, $options['oauth_callback']); - - return array('token'=>$token, 'token_secret'=>$secret, 'token_ttl'=>$ttl); - } - - - /** - * Fetch the consumer request token, by request token. - * - * @param string token - * @return array token and consumer details - */ - public function getConsumerRequestToken ( $token ) - { - $rs = $this->query_row_assoc(' - SELECT ost_token as token, - ost_token_secret as token_secret, - osr_consumer_key as consumer_key, - osr_consumer_secret as consumer_secret, - ost_token_type as token_type, - ost_callback_url as callback_url, - osr_application_title as application_title, - osr_application_descr as application_descr, - osr_application_uri as application_uri - FROM oauth_server_token - JOIN oauth_server_registry - ON ost_osr_id_ref = osr_id - WHERE ost_token_type = \'request\' - AND ost_token = \'%s\' - AND ost_token_ttl >= NOW() - ', $token); - - return $rs; - } - - - /** - * Delete a consumer token. The token must be a request or authorized token. - * - * @param string token - */ - public function deleteConsumerRequestToken ( $token ) - { - $this->query(' - DELETE FROM oauth_server_token - WHERE ost_token = \'%s\' - AND ost_token_type = \'request\' - ', $token); - } - - - /** - * Upgrade a request token to be an authorized request token. - * - * @param string token - * @param int user_id user authorizing the token - * @param string referrer_host used to set the referrer host for this token, for user feedback - */ - public function authorizeConsumerRequestToken ( $token, $user_id, $referrer_host = '' ) - { - // 1.0a Compatibility : create a token verifier - $verifier = substr(md5(rand()),0,10); - - $this->query(' - UPDATE oauth_server_token - SET ost_authorized = 1, - ost_usa_id_ref = %d, - ost_timestamp = NOW(), - ost_referrer_host = \'%s\', - ost_verifier = \'%s\' - WHERE ost_token = \'%s\' - AND ost_token_type = \'request\' - ', $user_id, $referrer_host, $verifier, $token); - return $verifier; - } - - - /** - * Count the consumer access tokens for the given consumer. - * - * @param string consumer_key - * @return int - */ - public function countConsumerAccessTokens ( $consumer_key ) - { - $count = $this->query_one(' - SELECT COUNT(ost_id) - FROM oauth_server_token - JOIN oauth_server_registry - ON ost_osr_id_ref = osr_id - WHERE ost_token_type = \'access\' - AND osr_consumer_key = \'%s\' - AND ost_token_ttl >= NOW() - ', $consumer_key); - - return $count; - } - - - /** - * Exchange an authorized request token for new access token. - * - * @param string token - * @param array options options for the token, token_ttl - * @exception OAuthException2 when token could not be exchanged - * @return array (token, token_secret) - */ - public function exchangeConsumerRequestForAccessToken ( $token, $options = array() ) - { - $new_token = $this->generateKey(true); - $new_secret = $this->generateKey(); - - // Maximum time to live for this token - if (isset($options['token_ttl']) && is_numeric($options['token_ttl'])) - { - $ttl_sql = 'DATE_ADD(NOW(), INTERVAL '.intval($options['token_ttl']).' SECOND)'; - } - else - { - $ttl_sql = "'9999-12-31'"; - } - - if (isset($options['verifier'])) { - $verifier = $options['verifier']; - - // 1.0a Compatibility : check token against oauth_verifier - $this->query(' - UPDATE oauth_server_token - SET ost_token = \'%s\', - ost_token_secret = \'%s\', - ost_token_type = \'access\', - ost_timestamp = NOW(), - ost_token_ttl = '.$ttl_sql.' - WHERE ost_token = \'%s\' - AND ost_token_type = \'request\' - AND ost_authorized = 1 - AND ost_token_ttl >= NOW() - AND ost_verifier = \'%s\' - ', $new_token, $new_secret, $token, $verifier); - } else { - - // 1.0 - $this->query(' - UPDATE oauth_server_token - SET ost_token = \'%s\', - ost_token_secret = \'%s\', - ost_token_type = \'access\', - ost_timestamp = NOW(), - ost_token_ttl = '.$ttl_sql.' - WHERE ost_token = \'%s\' - AND ost_token_type = \'request\' - AND ost_authorized = 1 - AND ost_token_ttl >= NOW() - ', $new_token, $new_secret, $token); - } - - if ($this->query_affected_rows() != 1) - { - throw new OAuthException2('Can\'t exchange request token "'.$token.'" for access token. No such token or not authorized'); - } - - $ret = array('token' => $new_token, 'token_secret' => $new_secret); - $ttl = $this->query_one(' - SELECT IF(ost_token_ttl >= \'9999-12-31\', NULL, UNIX_TIMESTAMP(ost_token_ttl) - UNIX_TIMESTAMP(NOW())) as token_ttl - FROM oauth_server_token - WHERE ost_token = \'%s\'', $new_token); - - if (is_numeric($ttl)) - { - $ret['token_ttl'] = intval($ttl); - } - return $ret; - } - - - /** - * Fetch the consumer access token, by access token. - * - * @param string token - * @param int user_id - * @exception OAuthException2 when token is not found - * @return array token and consumer details - */ - public function getConsumerAccessToken ( $token, $user_id ) - { - $rs = $this->query_row_assoc(' - SELECT ost_token as token, - ost_token_secret as token_secret, - ost_referrer_host as token_referrer_host, - osr_consumer_key as consumer_key, - osr_consumer_secret as consumer_secret, - osr_application_uri as application_uri, - osr_application_title as application_title, - osr_application_descr as application_descr, - osr_callback_uri as callback_uri - FROM oauth_server_token - JOIN oauth_server_registry - ON ost_osr_id_ref = osr_id - WHERE ost_token_type = \'access\' - AND ost_token = \'%s\' - AND ost_usa_id_ref = %d - AND ost_token_ttl >= NOW() - ', $token, $user_id); - - if (empty($rs)) - { - throw new OAuthException2('No server_token "'.$token.'" for user "'.$user_id.'"'); - } - return $rs; - } - - - /** - * Delete a consumer access token. - * - * @param string token - * @param int user_id - * @param boolean user_is_admin - */ - public function deleteConsumerAccessToken ( $token, $user_id, $user_is_admin = false ) - { - if ($user_is_admin) - { - $this->query(' - DELETE FROM oauth_server_token - WHERE ost_token = \'%s\' - AND ost_token_type = \'access\' - ', $token); - } - else - { - $this->query(' - DELETE FROM oauth_server_token - WHERE ost_token = \'%s\' - AND ost_token_type = \'access\' - AND ost_usa_id_ref = %d - ', $token, $user_id); - } - } - - - /** - * Set the ttl of a consumer access token. This is done when the - * server receives a valid request with a xoauth_token_ttl parameter in it. - * - * @param string token - * @param int ttl - */ - public function setConsumerAccessTokenTtl ( $token, $token_ttl ) - { - if ($token_ttl <= 0) - { - // Immediate delete when the token is past its ttl - $this->deleteConsumerAccessToken($token, 0, true); - } - else - { - // Set maximum time to live for this token - $this->query(' - UPDATE oauth_server_token - SET ost_token_ttl = DATE_ADD(NOW(), INTERVAL %d SECOND) - WHERE ost_token = \'%s\' - AND ost_token_type = \'access\' - ', $token_ttl, $token); - } - } - - - /** - * Fetch a list of all consumer keys, secrets etc. - * Returns the public (user_id is null) and the keys owned by the user - * - * @param int user_id - * @return array - */ - public function listConsumers ( $user_id ) - { - $rs = $this->query_all_assoc(' - SELECT osr_id as id, - osr_usa_id_ref as user_id, - osr_consumer_key as consumer_key, - osr_consumer_secret as consumer_secret, - osr_enabled as enabled, - osr_status as status, - osr_issue_date as issue_date, - osr_application_uri as application_uri, - osr_application_title as application_title, - osr_application_descr as application_descr, - osr_application_type as application_type, - osr_application_commercial as application_commercial, - osr_requester_name as requester_name, - osr_requester_email as requester_email, - osr_callback_uri as callback_uri - FROM oauth_server_registry - WHERE (osr_usa_id_ref = %d OR osr_usa_id_ref IS NULL) - ORDER BY osr_application_title - ', $user_id); - return $rs; - } - - /** - * List of all registered applications. Data returned has not sensitive - * information and therefore is suitable for public displaying. - * - * @param int $begin - * @param int $total - * @return array - */ - public function listConsumerApplications($begin = 0, $total = 25) - { - $rs = $this->query_all_assoc(' - SELECT osr_id as id, - osr_enabled as enabled, - osr_status as status, - osr_issue_date as issue_date, - osr_application_uri as application_uri, - osr_application_title as application_title, - osr_application_descr as application_descr - FROM oauth_server_registry - ORDER BY osr_application_title - '); - // TODO: pagination - return $rs; - } - - /** - * Fetch a list of all consumer tokens accessing the account of the given user. - * - * @param int user_id - * @return array - */ - public function listConsumerTokens ( $user_id ) - { - $rs = $this->query_all_assoc(' - SELECT osr_consumer_key as consumer_key, - osr_consumer_secret as consumer_secret, - osr_enabled as enabled, - osr_status as status, - osr_application_uri as application_uri, - osr_application_title as application_title, - osr_application_descr as application_descr, - ost_timestamp as timestamp, - ost_token as token, - ost_token_secret as token_secret, - ost_referrer_host as token_referrer_host, - osr_callback_uri as callback_uri - FROM oauth_server_registry - JOIN oauth_server_token - ON ost_osr_id_ref = osr_id - WHERE ost_usa_id_ref = %d - AND ost_token_type = \'access\' - AND ost_token_ttl >= NOW() - ORDER BY osr_application_title - ', $user_id); - return $rs; - } - - - /** - * Check an nonce/timestamp combination. Clears any nonce combinations - * that are older than the one received. - * - * @param string consumer_key - * @param string token - * @param int timestamp - * @param string nonce - * @exception OAuthException2 thrown when the timestamp is not in sequence or nonce is not unique - */ - public function checkServerNonce ( $consumer_key, $token, $timestamp, $nonce ) - { - /* removed in Appendix A of RFC 5849 - $r = $this->query_row(' - SELECT MAX(osn_timestamp), MAX(osn_timestamp) > %d + %d - FROM oauth_server_nonce - WHERE osn_consumer_key = \'%s\' - AND osn_token = \'%s\' - ', $timestamp, $this->max_timestamp_skew, $consumer_key, $token); - - if (!empty($r) && $r[1]) - { - throw new OAuthException2('Timestamp is out of sequence. Request rejected. Got '.$timestamp.' last max is '.$r[0].' allowed skew is '.$this->max_timestamp_skew); - }*/ - - // Insert the new combination - $this->query(' - INSERT IGNORE INTO oauth_server_nonce - SET osn_consumer_key = \'%s\', - osn_token = \'%s\', - osn_timestamp = %d, - osn_nonce = \'%s\' - ', $consumer_key, $token, $timestamp, $nonce); - - if ($this->query_affected_rows() == 0) - { - throw new OAuthException2('Duplicate timestamp/nonce combination, possible replay attack. Request rejected.'); - } - - // Clean up all timestamps older than the one we just received - $this->query(' - DELETE FROM oauth_server_nonce - WHERE osn_consumer_key = \'%s\' - AND osn_token = \'%s\' - AND osn_timestamp < %d - %d - ', $consumer_key, $token, $timestamp, $this->max_timestamp_skew); - } - - - /** - * Add an entry to the log table - * - * @param array keys (osr_consumer_key, ost_token, ocr_consumer_key, oct_token) - * @param string received - * @param string sent - * @param string base_string - * @param string notes - * @param int (optional) user_id - */ - public function addLog ( $keys, $received, $sent, $base_string, $notes, $user_id = null ) - { - $args = array(); - $ps = array(); - foreach ($keys as $key => $value) - { - $args[] = $value; - $ps[] = "olg_$key = '%s'"; - } - - if (!empty($_SERVER['REMOTE_ADDR'])) - { - $remote_ip = $_SERVER['REMOTE_ADDR']; - } - else if (!empty($_SERVER['REMOTE_IP'])) - { - $remote_ip = $_SERVER['REMOTE_IP']; - } - else - { - $remote_ip = '0.0.0.0'; - } - - // Build the SQL - $ps[] = "olg_received = '%s'"; $args[] = $this->makeUTF8($received); - $ps[] = "olg_sent = '%s'"; $args[] = $this->makeUTF8($sent); - $ps[] = "olg_base_string= '%s'"; $args[] = $base_string; - $ps[] = "olg_notes = '%s'"; $args[] = $this->makeUTF8($notes); - $ps[] = "olg_usa_id_ref = NULLIF(%d,0)"; $args[] = $user_id; - $ps[] = "olg_remote_ip = IFNULL(INET_ATON('%s'),0)"; $args[] = $remote_ip; - - $this->query('INSERT INTO oauth_log SET '.implode(',', $ps), $args); - } - - - /** - * Get a page of entries from the log. Returns the last 100 records - * matching the options given. - * - * @param array options - * @param int user_id current user - * @return array log records - */ - public function listLog ( $options, $user_id ) - { - $where = array(); - $args = array(); - if (empty($options)) - { - $where[] = 'olg_usa_id_ref = %d'; - $args[] = $user_id; - } - else - { - foreach ($options as $option => $value) - { - if (strlen($value) > 0) - { - switch ($option) - { - case 'osr_consumer_key': - case 'ocr_consumer_key': - case 'ost_token': - case 'oct_token': - $where[] = 'olg_'.$option.' = \'%s\''; - $args[] = $value; - break; - } - } - } - - $where[] = '(olg_usa_id_ref IS NULL OR olg_usa_id_ref = %d)'; - $args[] = $user_id; - } - - $rs = $this->query_all_assoc(' - SELECT olg_id, - olg_osr_consumer_key AS osr_consumer_key, - olg_ost_token AS ost_token, - olg_ocr_consumer_key AS ocr_consumer_key, - olg_oct_token AS oct_token, - olg_usa_id_ref AS user_id, - olg_received AS received, - olg_sent AS sent, - olg_base_string AS base_string, - olg_notes AS notes, - olg_timestamp AS timestamp, - INET_NTOA(olg_remote_ip) AS remote_ip - FROM oauth_log - WHERE '.implode(' AND ', $where).' - ORDER BY olg_id DESC - LIMIT 0,100', $args); - - return $rs; - } - - - /* ** Some simple helper functions for querying the mysql db ** */ - - /** - * Perform a query, ignore the results - * - * @param string sql - * @param vararg arguments (for sprintf) - */ - abstract protected function query ( $sql ); - - - /** - * Perform a query, ignore the results - * - * @param string sql - * @param vararg arguments (for sprintf) - * @return array - */ - abstract protected function query_all_assoc ( $sql ); - - - /** - * Perform a query, return the first row - * - * @param string sql - * @param vararg arguments (for sprintf) - * @return array - */ - abstract protected function query_row_assoc ( $sql ); - - /** - * Perform a query, return the first row - * - * @param string sql - * @param vararg arguments (for sprintf) - * @return array - */ - abstract protected function query_row ( $sql ); - - - /** - * Perform a query, return the first column of the first row - * - * @param string sql - * @param vararg arguments (for sprintf) - * @return mixed - */ - abstract protected function query_one ( $sql ); - - - /** - * Return the number of rows affected in the last query - */ - abstract protected function query_affected_rows (); - - - /** - * Return the id of the last inserted row - * - * @return int - */ - abstract protected function query_insert_id (); - - - abstract protected function sql_printf ( $args ); - - - abstract protected function sql_escape_string ( $s ); - - - abstract protected function sql_errcheck ( $sql ); -} - - -/* vi:set ts=4 sts=4 sw=4 binary noeol: */ - -?> \ No newline at end of file diff --git a/vendor/oauth-php/library/store/OAuthStoreSession.php b/vendor/oauth-php/library/store/OAuthStoreSession.php deleted file mode 100644 index ecb30c85945dd33bdc34033d1e1c8024a6d6afdc..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/OAuthStoreSession.php +++ /dev/null @@ -1,157 +0,0 @@ -<?php - -/** - * OAuthSession is a really *dirty* storage. It's useful for testing and may - * be enough for some very simple applications, but it's not recommended for - * production use. - * - * @version $Id: OAuthStoreSession.php 183 2011-01-14 11:43:27Z brunobg@corollarium.com $ - * @author BBG - * - * The MIT License - * - * Copyright (c) 2007-2008 Mediamatic Lab - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -require_once dirname(__FILE__) . '/OAuthStoreAbstract.class.php'; - -class OAuthStoreSession extends OAuthStoreAbstract -{ - private $session; - - /* - * Takes two options: consumer_key and consumer_secret - */ - public function __construct( $options = array() ) - { - if (!session_id()) { - session_start(); - } - if(isset($options['consumer_key']) && isset($options['consumer_secret'])) - { - $this->session = &$_SESSION['oauth_' . $options['consumer_key']]; - $this->session['consumer_key'] = $options['consumer_key']; - $this->session['consumer_secret'] = $options['consumer_secret']; - $this->session['signature_methods'] = array('HMAC-SHA1'); - $this->session['server_uri'] = $options['server_uri']; - $this->session['request_token_uri'] = $options['request_token_uri']; - $this->session['authorize_uri'] = $options['authorize_uri']; - $this->session['access_token_uri'] = $options['access_token_uri']; - - } - else - { - throw new OAuthException2("OAuthStoreSession needs consumer_key and consumer_secret"); - } - } - - public function getSecretsForVerify ( $consumer_key, $token, $token_type = 'access' ) { throw new OAuthException2("OAuthStoreSession doesn't support " . __METHOD__); } - public function getSecretsForSignature ( $uri, $user_id ) - { - return $this->session; - } - - public function getServerTokenSecrets ( $consumer_key, $token, $token_type, $user_id, $name = '') - { - if ($consumer_key != $this->session['consumer_key']) { - return array(); - } - return array( - 'consumer_key' => $consumer_key, - 'consumer_secret' => $this->session['consumer_secret'], - 'token' => $token, - 'token_secret' => $this->session['token_secret'], - 'token_name' => $name, - 'signature_methods' => $this->session['signature_methods'], - 'server_uri' => $this->session['server_uri'], - 'request_token_uri' => $this->session['request_token_uri'], - 'authorize_uri' => $this->session['authorize_uri'], - 'access_token_uri' => $this->session['access_token_uri'], - 'token_ttl' => 3600, - ); - } - - public function addServerToken ( $consumer_key, $token_type, $token, $token_secret, $user_id, $options = array() ) - { - $this->session['token_type'] = $token_type; - $this->session['token'] = $token; - $this->session['token_secret'] = $token_secret; - } - - public function deleteServer ( $consumer_key, $user_id, $user_is_admin = false ) { throw new OAuthException2("OAuthStoreSession doesn't support " . __METHOD__); } - public function getServer( $consumer_key, $user_id, $user_is_admin = false ) { - return array( - 'id' => 0, - 'user_id' => $user_id, - 'consumer_key' => $this->session['consumer_key'], - 'consumer_secret' => $this->session['consumer_secret'], - 'signature_methods' => $this->session['signature_methods'], - 'server_uri' => $this->session['server_uri'], - 'request_token_uri' => $this->session['request_token_uri'], - 'authorize_uri' => $this->session['authorize_uri'], - 'access_token_uri' => $this->session['access_token_uri'], - ); - } - - public function getServerForUri ( $uri, $user_id ) { throw new OAuthException2("OAuthStoreSession doesn't support " . __METHOD__); } - public function listServerTokens ( $user_id ) { throw new OAuthException2("OAuthStoreSession doesn't support " . __METHOD__); } - public function countServerTokens ( $consumer_key ) { throw new OAuthException2("OAuthStoreSession doesn't support " . __METHOD__); } - public function getServerToken ( $consumer_key, $token, $user_id ) { throw new OAuthException2("OAuthStoreSession doesn't support " . __METHOD__); } - public function deleteServerToken ( $consumer_key, $token, $user_id, $user_is_admin = false ) { - // TODO - } - - public function setServerTokenTtl ( $consumer_key, $token, $token_ttl, $server_uri = NULL ) - { - //This method just needs to exist. It doesn't have to do anything! - } - - public function listServers ( $q = '', $user_id ) { throw new OAuthException2("OAuthStoreSession doesn't support " . __METHOD__); } - public function updateServer ( $server, $user_id, $user_is_admin = false ) { throw new OAuthException2("OAuthStoreSession doesn't support " . __METHOD__); } - - public function updateConsumer ( $consumer, $user_id, $user_is_admin = false ) { throw new OAuthException2("OAuthStoreSession doesn't support " . __METHOD__); } - public function deleteConsumer ( $consumer_key, $user_id, $user_is_admin = false ) { throw new OAuthException2("OAuthStoreSession doesn't support " . __METHOD__); } - public function getConsumer ( $consumer_key, $user_id, $user_is_admin = false ) { throw new OAuthException2("OAuthStoreSession doesn't support " . __METHOD__); } - public function getConsumerStatic () { throw new OAuthException2("OAuthStoreSession doesn't support " . __METHOD__); } - - public function addConsumerRequestToken ( $consumer_key, $options = array() ) { throw new OAuthException2("OAuthStoreSession doesn't support " . __METHOD__); } - public function getConsumerRequestToken ( $token ) { throw new OAuthException2("OAuthStoreSession doesn't support " . __METHOD__); } - public function deleteConsumerRequestToken ( $token ) { throw new OAuthException2("OAuthStoreSession doesn't support " . __METHOD__); } - public function authorizeConsumerRequestToken ( $token, $user_id, $referrer_host = '' ) { throw new OAuthException2("OAuthStoreSession doesn't support " . __METHOD__); } - public function countConsumerAccessTokens ( $consumer_key ) { throw new OAuthException2("OAuthStoreSession doesn't support " . __METHOD__); } - public function exchangeConsumerRequestForAccessToken ( $token, $options = array() ) { throw new OAuthException2("OAuthStoreSession doesn't support " . __METHOD__); } - public function getConsumerAccessToken ( $token, $user_id ) { throw new OAuthException2("OAuthStoreSession doesn't support " . __METHOD__); } - public function deleteConsumerAccessToken ( $token, $user_id, $user_is_admin = false ) { throw new OAuthException2("OAuthStoreSession doesn't support " . __METHOD__); } - public function setConsumerAccessTokenTtl ( $token, $ttl ) { throw new OAuthException2("OAuthStoreSession doesn't support " . __METHOD__); } - - public function listConsumers ( $user_id ) { throw new OAuthException2("OAuthStoreSession doesn't support " . __METHOD__); } - public function listConsumerApplications( $begin = 0, $total = 25 ) { throw new OAuthException2("OAuthStoreSession doesn't support " . __METHOD__); } - public function listConsumerTokens ( $user_id ) { throw new OAuthException2("OAuthStoreSession doesn't support " . __METHOD__); } - - public function checkServerNonce ( $consumer_key, $token, $timestamp, $nonce ) { throw new OAuthException2("OAuthStoreSession doesn't support " . __METHOD__); } - - public function addLog ( $keys, $received, $sent, $base_string, $notes, $user_id = null ) { throw new OAuthException2("OAuthStoreSession doesn't support " . __METHOD__); } - public function listLog ( $options, $user_id ) { throw new OAuthException2("OAuthStoreSession doesn't support " . __METHOD__); } - - public function install () { throw new OAuthException2("OAuthStoreSession doesn't support " . __METHOD__); } -} - -?> \ No newline at end of file diff --git a/vendor/oauth-php/library/store/mysql/install.php b/vendor/oauth-php/library/store/mysql/install.php deleted file mode 100644 index 0015da5e3203572c035693b07270eef7518f2a2b..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/mysql/install.php +++ /dev/null @@ -1,32 +0,0 @@ -<?php - -/** - * Installs all tables in the mysql.sql file, using the default mysql connection - */ - -/* Change and uncomment this when you need to: */ - -/* -mysql_connect('localhost', 'root'); -if (mysql_errno()) -{ - die(' Error '.mysql_errno().': '.mysql_error()); -} -mysql_select_db('test'); -*/ - -$sql = file_get_contents(dirname(__FILE__) . '/mysql.sql'); -$ps = explode('#--SPLIT--', $sql); - -foreach ($ps as $p) -{ - $p = preg_replace('/^\s*#.*$/m', '', $p); - - mysql_query($p); - if (mysql_errno()) - { - die(' Error '.mysql_errno().': '.mysql_error()); - } -} - -?> \ No newline at end of file diff --git a/vendor/oauth-php/library/store/mysql/mysql.sql b/vendor/oauth-php/library/store/mysql/mysql.sql deleted file mode 100644 index ca8eb08bd32ee40bb06a71ce7018af59ffb1a12a..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/mysql/mysql.sql +++ /dev/null @@ -1,240 +0,0 @@ -# Datamodel for OAuthStoreMySQL -# -# You need to add the foreign key constraints for the user ids your are using. -# I have commented the constraints out, just look for 'usa_id_ref' to enable them. -# -# The --SPLIT-- markers are used by the install.php script -# -# @version $Id: mysql.sql 188 2011-02-25 14:40:26Z scherpenisse $ -# @author Marc Worrell -# - -# Changes: -# -# 2011-02-25 -# ALTER TABLE oauth_consumer_token MODIFY oct_token varchar(255) binary not null; -# ALTER TABLE oauth_consumer_token MODIFY oct_token_secret varchar(255) binary not null; -# -# 2010-09-15 -# ALTER TABLE oauth_server_token MODIFY ost_referrer_host varchar(128) not null default ''; -# -# 2010-07-22 -# ALTER TABLE oauth_consumer_registry DROP INDEX ocr_consumer_key; -# ALTER TABLE oauth_consumer_registry ADD UNIQUE ocr_consumer_key(ocr_consumer_key,ocr_usa_id_ref,ocr_server_uri) -# -# 2010-04-20 (on 103 and 110) -# ALTER TABLE oauth_consumer_registry MODIFY ocr_consumer_key varchar(128) binary not null; -# ALTER TABLE oauth_consumer_registry MODIFY ocr_consumer_secret varchar(128) binary not null; -# -# 2010-04-20 (on 103 and 110) -# ALTER TABLE oauth_server_token ADD ost_verifier char(10); -# ALTER TABLE oauth_server_token ADD ost_callback_url varchar(512); -# -# 2008-10-15 (on r48) Added ttl to consumer and server tokens, added named server tokens -# -# ALTER TABLE oauth_server_token -# ADD ost_token_ttl datetime not null default '9999-12-31', -# ADD KEY (ost_token_ttl); -# -# ALTER TABLE oauth_consumer_token -# ADD oct_name varchar(64) binary not null default '', -# ADD oct_token_ttl datetime not null default '9999-12-31', -# DROP KEY oct_usa_id_ref, -# ADD UNIQUE KEY (oct_usa_id_ref, oct_ocr_id_ref, oct_token_type, oct_name), -# ADD KEY (oct_token_ttl); -# -# 2008-09-09 (on r5) Added referrer host to server access token -# -# ALTER TABLE oauth_server_token ADD ost_referrer_host VARCHAR(128) NOT NULL; -# - - -# -# Log table to hold all OAuth request when you enabled logging -# - -CREATE TABLE IF NOT EXISTS oauth_log ( - olg_id int(11) not null auto_increment, - olg_osr_consumer_key varchar(64) binary, - olg_ost_token varchar(64) binary, - olg_ocr_consumer_key varchar(64) binary, - olg_oct_token varchar(64) binary, - olg_usa_id_ref int(11), - olg_received text not null, - olg_sent text not null, - olg_base_string text not null, - olg_notes text not null, - olg_timestamp timestamp not null default current_timestamp, - olg_remote_ip bigint not null, - - primary key (olg_id), - key (olg_osr_consumer_key, olg_id), - key (olg_ost_token, olg_id), - key (olg_ocr_consumer_key, olg_id), - key (olg_oct_token, olg_id), - key (olg_usa_id_ref, olg_id) - -# , foreign key (olg_usa_id_ref) references any_user_auth (usa_id_ref) -# on update cascade -# on delete cascade -) engine=InnoDB default charset=utf8; - -#--SPLIT-- - -# -# /////////////////// CONSUMER SIDE /////////////////// -# - -# This is a registry of all consumer codes we got from other servers -# The consumer_key/secret is obtained from the server -# We also register the server uri, so that we can find the consumer key and secret -# for a certain server. From that server we can check if we have a token for a -# particular user. - -CREATE TABLE IF NOT EXISTS oauth_consumer_registry ( - ocr_id int(11) not null auto_increment, - ocr_usa_id_ref int(11), - ocr_consumer_key varchar(128) binary not null, - ocr_consumer_secret varchar(128) binary not null, - ocr_signature_methods varchar(255) not null default 'HMAC-SHA1,PLAINTEXT', - ocr_server_uri varchar(255) not null, - ocr_server_uri_host varchar(128) not null, - ocr_server_uri_path varchar(128) binary not null, - - ocr_request_token_uri varchar(255) not null, - ocr_authorize_uri varchar(255) not null, - ocr_access_token_uri varchar(255) not null, - ocr_timestamp timestamp not null default current_timestamp, - - primary key (ocr_id), - unique key (ocr_consumer_key, ocr_usa_id_ref, ocr_server_uri), - key (ocr_server_uri), - key (ocr_server_uri_host, ocr_server_uri_path), - key (ocr_usa_id_ref) - -# , foreign key (ocr_usa_id_ref) references any_user_auth(usa_id_ref) -# on update cascade -# on delete set null -) engine=InnoDB default charset=utf8; - -#--SPLIT-- - -# Table used to sign requests for sending to a server by the consumer -# The key is defined for a particular user. Only one single named -# key is allowed per user/server combination - -CREATE TABLE IF NOT EXISTS oauth_consumer_token ( - oct_id int(11) not null auto_increment, - oct_ocr_id_ref int(11) not null, - oct_usa_id_ref int(11) not null, - oct_name varchar(64) binary not null default '', - oct_token varchar(255) binary not null, - oct_token_secret varchar(255) binary not null, - oct_token_type enum('request','authorized','access'), - oct_token_ttl datetime not null default '9999-12-31', - oct_timestamp timestamp not null default current_timestamp, - - primary key (oct_id), - unique key (oct_ocr_id_ref, oct_token), - unique key (oct_usa_id_ref, oct_ocr_id_ref, oct_token_type, oct_name), - key (oct_token_ttl), - - foreign key (oct_ocr_id_ref) references oauth_consumer_registry (ocr_id) - on update cascade - on delete cascade - -# , foreign key (oct_usa_id_ref) references any_user_auth (usa_id_ref) -# on update cascade -# on delete cascade -) engine=InnoDB default charset=utf8; - -#--SPLIT-- - - -# -# ////////////////// SERVER SIDE ///////////////// -# - -# Table holding consumer key/secret combos an user issued to consumers. -# Used for verification of incoming requests. - -CREATE TABLE IF NOT EXISTS oauth_server_registry ( - osr_id int(11) not null auto_increment, - osr_usa_id_ref int(11), - osr_consumer_key varchar(64) binary not null, - osr_consumer_secret varchar(64) binary not null, - osr_enabled tinyint(1) not null default '1', - osr_status varchar(16) not null, - osr_requester_name varchar(64) not null, - osr_requester_email varchar(64) not null, - osr_callback_uri varchar(255) not null, - osr_application_uri varchar(255) not null, - osr_application_title varchar(80) not null, - osr_application_descr text not null, - osr_application_notes text not null, - osr_application_type varchar(20) not null, - osr_application_commercial tinyint(1) not null default '0', - osr_issue_date datetime not null, - osr_timestamp timestamp not null default current_timestamp, - - primary key (osr_id), - unique key (osr_consumer_key), - key (osr_usa_id_ref) - -# , foreign key (osr_usa_id_ref) references any_user_auth(usa_id_ref) -# on update cascade -# on delete set null -) engine=InnoDB default charset=utf8; - -#--SPLIT-- - -# Nonce used by a certain consumer, every used nonce should be unique, this prevents -# replaying attacks. We need to store all timestamp/nonce combinations for the -# maximum timestamp received. - -CREATE TABLE IF NOT EXISTS oauth_server_nonce ( - osn_id int(11) not null auto_increment, - osn_consumer_key varchar(64) binary not null, - osn_token varchar(64) binary not null, - osn_timestamp bigint not null, - osn_nonce varchar(80) binary not null, - - primary key (osn_id), - unique key (osn_consumer_key, osn_token, osn_timestamp, osn_nonce) -) engine=InnoDB default charset=utf8; - -#--SPLIT-- - -# Table used to verify signed requests sent to a server by the consumer -# When the verification is succesful then the associated user id is returned. - -CREATE TABLE IF NOT EXISTS oauth_server_token ( - ost_id int(11) not null auto_increment, - ost_osr_id_ref int(11) not null, - ost_usa_id_ref int(11) not null, - ost_token varchar(64) binary not null, - ost_token_secret varchar(64) binary not null, - ost_token_type enum('request','access'), - ost_authorized tinyint(1) not null default '0', - ost_referrer_host varchar(128) not null default '', - ost_token_ttl datetime not null default '9999-12-31', - ost_timestamp timestamp not null default current_timestamp, - ost_verifier char(10), - ost_callback_url varchar(512), - - primary key (ost_id), - unique key (ost_token), - key (ost_osr_id_ref), - key (ost_token_ttl), - - foreign key (ost_osr_id_ref) references oauth_server_registry (osr_id) - on update cascade - on delete cascade - -# , foreign key (ost_usa_id_ref) references any_user_auth (usa_id_ref) -# on update cascade -# on delete cascade -) engine=InnoDB default charset=utf8; - - - diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/1_Tables/TABLES.sql b/vendor/oauth-php/library/store/oracle/OracleDB/1_Tables/TABLES.sql deleted file mode 100644 index 3d4fa22d6f447ea33883e4c4fccf384cba0cec5b..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/1_Tables/TABLES.sql +++ /dev/null @@ -1,114 +0,0 @@ -CREATE TABLE oauth_log -( - olg_id number, - olg_osr_consumer_key varchar2(64), - olg_ost_token varchar2(64), - olg_ocr_consumer_key varchar2(64), - olg_oct_token varchar2(64), - olg_usa_id_ref number, - olg_received varchar2(500), - olg_sent varchar2(500), - olg_base_string varchar2(500), - olg_notes varchar2(500), - olg_timestamp date default sysdate, - olg_remote_ip varchar2(50) -); - -alter table oauth_log - add constraint oauth_log_pk primary key (olg_id); - - -CREATE TABLE oauth_consumer_registry -( - ocr_id number, - ocr_usa_id_ref number, - ocr_consumer_key varchar2(64), - ocr_consumer_secret varchar2(64), - ocr_signature_methods varchar2(255)default 'HMAC-SHA1,PLAINTEXT', - ocr_server_uri varchar2(255), - ocr_server_uri_host varchar2(128), - ocr_server_uri_path varchar2(128), - ocr_request_token_uri varchar2(255), - ocr_authorize_uri varchar2(255), - ocr_access_token_uri varchar2(255), - ocr_timestamp date default sysdate -) - -alter table oauth_consumer_registry - add constraint oauth_consumer_registry_pk primary key (ocr_id); - - -CREATE TABLE oauth_consumer_token -( - oct_id number, - oct_ocr_id_ref number, - oct_usa_id_ref number, - oct_name varchar2(64) default '', - oct_token varchar2(64), - oct_token_secret varchar2(64), - oct_token_type varchar2(20), -- enum('request','authorized','access'), - oct_token_ttl date default TO_DATE('9999.12.31', 'yyyy.mm.dd'), - oct_timestamp date default sysdate -); - -alter table oauth_consumer_token - add constraint oauth_consumer_token_pk primary key (oct_id); - - -CREATE TABLE oauth_server_registry -( - osr_id number, - osr_usa_id_ref number, - osr_consumer_key varchar2(64), - osr_consumer_secret varchar2(64), - osr_enabled integer default '1', - osr_status varchar2(16), - osr_requester_name varchar2(64), - osr_requester_email varchar2(64), - osr_callback_uri varchar2(255), - osr_application_uri varchar2(255), - osr_application_title varchar2(80), - osr_application_descr varchar2(500), - osr_application_notes varchar2(500), - osr_application_type varchar2(20), - osr_application_commercial integer default '0', - osr_issue_date date, - osr_timestamp date default sysdate -); - - -alter table oauth_server_registry - add constraint oauth_server_registry_pk primary key (osr_id); - - -CREATE TABLE oauth_server_nonce -( - osn_id number, - osn_consumer_key varchar2(64), - osn_token varchar2(64), - osn_timestamp number, - osn_nonce varchar2(80) -); - -alter table oauth_server_nonce - add constraint oauth_server_nonce_pk primary key (osn_id); - - -CREATE TABLE oauth_server_token -( - ost_id number, - ost_osr_id_ref number, - ost_usa_id_ref number, - ost_token varchar2(64), - ost_token_secret varchar2(64), - ost_token_type varchar2(20), -- enum('request','access'), - ost_authorized integer default '0', - ost_referrer_host varchar2(128), - ost_token_ttl date default TO_DATE('9999.12.31', 'yyyy.mm.dd'), - ost_timestamp date default sysdate, - ost_verifier varchar2(10), - ost_callback_url varchar2(512) -); - -alter table oauth_server_token - add constraint oauth_server_token_pk primary key (ost_id); \ No newline at end of file diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/2_Sequences/SEQUENCES.sql b/vendor/oauth-php/library/store/oracle/OracleDB/2_Sequences/SEQUENCES.sql deleted file mode 100644 index 53e42278884a6deaaa58d2274d962d18ca464442..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/2_Sequences/SEQUENCES.sql +++ /dev/null @@ -1,9 +0,0 @@ -CREATE SEQUENCE SEQ_OCT_ID NOCACHE; - -CREATE SEQUENCE SEQ_OCR_ID NOCACHE; - -CREATE SEQUENCE SEQ_OSR_ID NOCACHE; - -CREATE SEQUENCE SEQ_OSN_ID NOCACHE; - -CREATE SEQUENCE SEQ_OLG_ID NOCACHE; diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_ADD_CONSUMER_REQUEST_TOKEN.prc b/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_ADD_CONSUMER_REQUEST_TOKEN.prc deleted file mode 100644 index efb9536502b68c0b9608f982e20f22837b114c5f..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_ADD_CONSUMER_REQUEST_TOKEN.prc +++ /dev/null @@ -1,71 +0,0 @@ -CREATE OR REPLACE PROCEDURE SP_ADD_CONSUMER_REQUEST_TOKEN -( -P_TOKEN_TTL IN NUMBER, -- IN SECOND -P_CONSUMER_KEY IN VARCHAR2, -P_TOKEN IN VARCHAR2, -P_TOKEN_SECRET IN VARCHAR2, -P_CALLBACK_URL IN VARCHAR2, -P_RESULT OUT NUMBER -) -AS - - -- PROCEDURE TO Add an unautorized request token to our server. - -V_OSR_ID NUMBER; -V_OSR_ID_REF NUMBER; - -V_EXC_NO_SERVER_EXIST EXCEPTION; -BEGIN - - P_RESULT := 0; - - BEGIN - SELECT OSR_ID INTO V_OSR_ID - FROM OAUTH_SERVER_REGISTRY - WHERE OSR_CONSUMER_KEY = P_CONSUMER_KEY - AND OSR_ENABLED = 1; - EXCEPTION - WHEN NO_DATA_FOUND THEN - RAISE V_EXC_NO_SERVER_EXIST; - END; - - -BEGIN - SELECT OST_OSR_ID_REF INTO V_OSR_ID_REF - FROM OAUTH_SERVER_TOKEN - WHERE OST_OSR_ID_REF = V_OSR_ID; - - UPDATE OAUTH_SERVER_TOKEN - SET OST_OSR_ID_REF = V_OSR_ID, - OST_USA_ID_REF = 1, - OST_TOKEN = P_TOKEN, - OST_TOKEN_SECRET = P_TOKEN_SECRET, - OST_TOKEN_TYPE = 'REQUEST', - OST_TOKEN_TTL = SYSDATE + (P_TOKEN_TTL/(24*60*60)), - OST_CALLBACK_URL = P_CALLBACK_URL, - OST_TIMESTAMP = SYSDATE - WHERE OST_OSR_ID_REF = V_OSR_ID_REF; - - - EXCEPTION - WHEN NO_DATA_FOUND THEN - - INSERT INTO OAUTH_SERVER_TOKEN - (OST_ID, OST_OSR_ID_REF, OST_USA_ID_REF, OST_TOKEN, OST_TOKEN_SECRET, OST_TOKEN_TYPE, - OST_TOKEN_TTL, OST_CALLBACK_URL) - VALUES - (SEQ_OCT_ID.NEXTVAL, V_OSR_ID, 1, P_TOKEN, P_TOKEN_SECRET, 'REQUEST', SYSDATE + (P_TOKEN_TTL/(24*60*60)), - P_CALLBACK_URL); - - END; - - -EXCEPTION -WHEN V_EXC_NO_SERVER_EXIST THEN -P_RESULT := 2; -- NO_SERVER_EXIST -WHEN OTHERS THEN --- CALL THE FUNCTION TO LOG ERRORS -ROLLBACK; -P_RESULT := 1; -- ERROR -END; -/ diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_ADD_LOG.prc b/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_ADD_LOG.prc deleted file mode 100644 index 329499d9c94f29df31c48fd127307513d8dfdad1..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_ADD_LOG.prc +++ /dev/null @@ -1,31 +0,0 @@ -CREATE OR REPLACE PROCEDURE SP_ADD_LOG -( -P_RECEIVED IN VARCHAR2, -P_SENT IN VARCHAR2, -P_BASE_STRING IN VARCHAR2, -P_NOTES IN VARCHAR2, -P_USA_ID_REF IN NUMBER, -P_REMOTE_IP IN VARCHAR2, -P_RESULT OUT NUMBER -) -AS - - -- PROCEDURE TO Add an entry to the log table - -BEGIN - - P_RESULT := 0; - - INSERT INTO oauth_log - (OLG_ID, olg_received, olg_sent, olg_base_string, olg_notes, olg_usa_id_ref, olg_remote_ip) - VALUES - (SEQ_OLG_ID.NEXTVAL, P_RECEIVED, P_SENT, P_BASE_STRING, P_NOTES, NVL(P_USA_ID_REF, 0), P_REMOTE_IP); - - -EXCEPTION -WHEN OTHERS THEN --- CALL THE FUNCTION TO LOG ERRORS -ROLLBACK; -P_RESULT := 1; -- ERROR -END; -/ diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_ADD_SERVER_TOKEN.prc b/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_ADD_SERVER_TOKEN.prc deleted file mode 100644 index 371134c9b68510014507f2f51d47ca7e0ef7a3d0..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_ADD_SERVER_TOKEN.prc +++ /dev/null @@ -1,55 +0,0 @@ -CREATE OR REPLACE PROCEDURE SP_ADD_SERVER_TOKEN -( -P_CONSUMER_KEY IN VARCHAR2, -P_USER_ID IN NUMBER, -P_NAME IN VARCHAR2, -P_TOKEN_TYPE IN VARCHAR2, -P_TOKEN IN VARCHAR2, -P_TOKEN_SECRET IN VARCHAR2, -P_TOKEN_INTERVAL_IN_SEC IN NUMBER, -P_RESULT OUT NUMBER -) -AS - - -- Add a request token we obtained from a server. -V_OCR_ID NUMBER; -V_TOKEN_TTL DATE; - -V_EXC_INVALID_CONSUMER_KEY EXCEPTION; -BEGIN -P_RESULT := 0; - - BEGIN - SELECT OCR_ID INTO V_OCR_ID FROM OAUTH_CONSUMER_REGISTRY - WHERE OCR_CONSUMER_KEY = P_CONSUMER_KEY AND OCR_USA_ID_REF = P_USER_ID; - EXCEPTION - WHEN NO_DATA_FOUND THEN - RAISE V_EXC_INVALID_CONSUMER_KEY; - END; - - DELETE FROM OAUTH_CONSUMER_TOKEN - WHERE OCT_OCR_ID_REF = V_OCR_ID - AND OCT_USA_ID_REF = P_USER_ID - AND UPPER(OCT_TOKEN_TYPE) = UPPER(P_TOKEN_TYPE) - AND OCT_NAME = P_NAME; - - IF P_TOKEN_INTERVAL_IN_SEC IS NOT NULL THEN - V_TOKEN_TTL := SYSDATE + (P_TOKEN_INTERVAL_IN_SEC/(24*60*60)); - ELSE - V_TOKEN_TTL := TO_DATE('9999.12.31', 'yyyy.mm.dd'); - END IF; - - INSERT INTO OAUTH_CONSUMER_TOKEN - (OCT_ID, OCT_OCR_ID_REF,OCT_USA_ID_REF, OCT_NAME, OCT_TOKEN, OCT_TOKEN_SECRET, OCT_TOKEN_TYPE, OCT_TIMESTAMP, OCT_TOKEN_TTL) - VALUES - (SEQ_OCT_ID.NEXTVAL, V_OCR_ID, P_USER_ID, P_NAME, P_TOKEN, P_TOKEN_SECRET, UPPER(P_TOKEN_TYPE), SYSDATE, V_TOKEN_TTL); - -EXCEPTION -WHEN V_EXC_INVALID_CONSUMER_KEY THEN -P_RESULT := 2; -- INVALID_CONSUMER_KEY -WHEN OTHERS THEN --- CALL THE FUNCTION TO LOG ERRORS -ROLLBACK; -P_RESULT := 1; -- ERROR -END; -/ diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_AUTH_CONSUMER_REQ_TOKEN.prc b/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_AUTH_CONSUMER_REQ_TOKEN.prc deleted file mode 100644 index c3693491d5627814404487c6f7c7c3de706a6639..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_AUTH_CONSUMER_REQ_TOKEN.prc +++ /dev/null @@ -1,32 +0,0 @@ -CREATE OR REPLACE PROCEDURE SP_AUTH_CONSUMER_REQ_TOKEN -( -P_USER_ID IN NUMBER, -P_REFERRER_HOST IN VARCHAR2, -P_VERIFIER IN VARCHAR2, -P_TOKEN IN VARCHAR2, -P_RESULT OUT NUMBER -) -AS - - -- PROCEDURE TO Fetch the consumer request token, by request token. -BEGIN -P_RESULT := 0; - - -UPDATE OAUTH_SERVER_TOKEN - SET OST_AUTHORIZED = 1, - OST_USA_ID_REF = P_USER_ID, - OST_TIMESTAMP = SYSDATE, - OST_REFERRER_HOST = P_REFERRER_HOST, - OST_VERIFIER = P_VERIFIER - WHERE OST_TOKEN = P_TOKEN - AND OST_TOKEN_TYPE = 'REQUEST'; - - -EXCEPTION -WHEN OTHERS THEN --- CALL THE FUNCTION TO LOG ERRORS -ROLLBACK; -P_RESULT := 1; -- ERROR -END; -/ diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_CHECK_SERVER_NONCE.prc b/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_CHECK_SERVER_NONCE.prc deleted file mode 100644 index 765dd3b8a6ccd009c99f06a29d00f11a76c63a11..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_CHECK_SERVER_NONCE.prc +++ /dev/null @@ -1,82 +0,0 @@ -CREATE OR REPLACE PROCEDURE SP_CHECK_SERVER_NONCE -( -P_CONSUMER_KEY IN VARCHAR2, -P_TOKEN IN VARCHAR2, -P_TIMESTAMP IN NUMBER, -P_MAX_TIMESTAMP_SKEW IN NUMBER, -P_NONCE IN VARCHAR2, -P_RESULT OUT NUMBER -) -AS - - -- PROCEDURE TO Check an nonce/timestamp combination. Clears any nonce combinations - -- that are older than the one received. -V_IS_MAX NUMBER; -V_MAX_TIMESTAMP NUMBER; -V_IS_DUPLICATE_TIMESTAMP NUMBER; - -V_EXC_INVALID_TIMESTAMP EXCEPTION; -V_EXC_DUPLICATE_TIMESTAMP EXCEPTION; -BEGIN - - P_RESULT := 0; - - -- removed in Appendix A of RFC 5849 - -- BEGIN - -- SELECT MAX(OSN_TIMESTAMP), - -- CASE - -- WHEN MAX(OSN_TIMESTAMP) > (P_TIMESTAMP + P_MAX_TIMESTAMP_SKEW) THEN 1 ELSE 0 - -- END "IS_MAX" INTO V_MAX_TIMESTAMP, V_IS_MAX - -- FROM OAUTH_SERVER_NONCE - -- WHERE OSN_CONSUMER_KEY = P_CONSUMER_KEY - -- AND OSN_TOKEN = P_TOKEN; - -- - -- IF V_IS_MAX = 1 THEN - -- RAISE V_EXC_INVALID_TIMESTAMP; - -- END IF; - -- - -- EXCEPTION - -- WHEN NO_DATA_FOUND THEN - -- NULL; - -- END; - - BEGIN - SELECT 1 INTO V_IS_DUPLICATE_TIMESTAMP FROM DUAL WHERE EXISTS - (SELECT OSN_ID FROM OAUTH_SERVER_NONCE - WHERE OSN_CONSUMER_KEY = P_CONSUMER_KEY - AND OSN_TOKEN = P_TOKEN - AND OSN_TIMESTAMP = P_TIMESTAMP - AND OSN_NONCE = P_NONCE); - - IF V_IS_DUPLICATE_TIMESTAMP = 1 THEN - RAISE V_EXC_DUPLICATE_TIMESTAMP; - END IF; - EXCEPTION - WHEN NO_DATA_FOUND THEN - NULL; - END; - - -- Insert the new combination - INSERT INTO OAUTH_SERVER_NONCE - (OSN_ID, OSN_CONSUMER_KEY, OSN_TOKEN, OSN_TIMESTAMP, OSN_NONCE) - VALUES - (SEQ_OSN_ID.NEXTVAL, P_CONSUMER_KEY, P_TOKEN, P_TIMESTAMP, P_NONCE); - - -- Clean up all timestamps older than the one we just received - DELETE FROM OAUTH_SERVER_NONCE - WHERE OSN_CONSUMER_KEY = P_CONSUMER_KEY - AND OSN_TOKEN = P_TOKEN - AND OSN_TIMESTAMP < (P_TIMESTAMP - P_MAX_TIMESTAMP_SKEW); - - -EXCEPTION -WHEN V_EXC_INVALID_TIMESTAMP THEN -P_RESULT := 2; -- INVALID_TIMESTAMP -WHEN V_EXC_DUPLICATE_TIMESTAMP THEN -P_RESULT := 3; -- DUPLICATE_TIMESTAMP -WHEN OTHERS THEN --- CALL THE FUNCTION TO LOG ERRORS -ROLLBACK; -P_RESULT := 1; -- ERROR -END; -/ diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_CONSUMER_STATIC_SAVE.prc b/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_CONSUMER_STATIC_SAVE.prc deleted file mode 100644 index 047c77bf2d9de27202e54a0516c0067f12b3071a..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_CONSUMER_STATIC_SAVE.prc +++ /dev/null @@ -1,28 +0,0 @@ -CREATE OR REPLACE PROCEDURE SP_CONSUMER_STATIC_SAVE -( -P_OSR_CONSUMER_KEY IN VARCHAR2, -P_RESULT OUT NUMBER -) -AS - --- PROCEDURE TO Fetch the static consumer key for this provider. -BEGIN -P_RESULT := 0; - - - INSERT INTO OAUTH_SERVER_REGISTRY - (OSR_ID, OSR_ENABLED, OSR_STATUS, OSR_USA_ID_REF, OSR_CONSUMER_KEY, OSR_CONSUMER_SECRET, OSR_REQUESTER_NAME, OSR_REQUESTER_EMAIL, OSR_CALLBACK_URI, - OSR_APPLICATION_URI, OSR_APPLICATION_TITLE, OSR_APPLICATION_DESCR, OSR_APPLICATION_NOTES, - OSR_APPLICATION_TYPE, OSR_APPLICATION_COMMERCIAL, OSR_TIMESTAMP,OSR_ISSUE_DATE) - VALUES - (SEQ_OSR_ID.NEXTVAL, 1, 'ACTIVE', NULL, P_OSR_CONSUMER_KEY, '\', '\', '\', '\', '\', - 'STATIC SHARED CONSUMER KEY', '\', 'STATIC SHARED CONSUMER KEY', '\', 0, SYSDATE, SYSDATE); - - -EXCEPTION -WHEN OTHERS THEN --- CALL THE FUNCTION TO LOG ERRORS -ROLLBACK; -P_RESULT := 1; -- ERROR -END; -/ diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_COUNT_CONSUMER_ACCESS_TOKEN.prc b/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_COUNT_CONSUMER_ACCESS_TOKEN.prc deleted file mode 100644 index f7099b979528a9557ed547e0fd00f19da3c3ff94..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_COUNT_CONSUMER_ACCESS_TOKEN.prc +++ /dev/null @@ -1,27 +0,0 @@ -CREATE OR REPLACE PROCEDURE SP_COUNT_CONSUMER_ACCESS_TOKEN -( -P_CONSUMER_KEY IN VARCHAR2, -P_COUNT OUT NUMBER, -P_RESULT OUT NUMBER -) -AS --- PROCEDURE TO Count the consumer access tokens for the given consumer. -BEGIN -P_RESULT := 0; - -SELECT COUNT(OST_ID) INTO P_COUNT - FROM OAUTH_SERVER_TOKEN - JOIN OAUTH_SERVER_REGISTRY - ON OST_OSR_ID_REF = OSR_ID - WHERE OST_TOKEN_TYPE = 'ACCESS' - AND OSR_CONSUMER_KEY = P_CONSUMER_KEY - AND OST_TOKEN_TTL >= SYSDATE; - - -EXCEPTION -WHEN OTHERS THEN --- CALL THE FUNCTION TO LOG ERRORS -ROLLBACK; -P_RESULT := 1; -- ERROR -END; -/ diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_COUNT_SERVICE_TOKENS.prc b/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_COUNT_SERVICE_TOKENS.prc deleted file mode 100644 index c73b36682206e76d34d8e0bd3f7d1373cb79791f..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_COUNT_SERVICE_TOKENS.prc +++ /dev/null @@ -1,28 +0,0 @@ -CREATE OR REPLACE PROCEDURE SP_COUNT_SERVICE_TOKENS -( -P_CONSUMER_KEY IN VARCHAR2, -P_COUNT OUT NUMBER, -P_RESULT OUT NUMBER -) -AS - - -- PROCEDURE TO Count how many tokens we have for the given server -BEGIN -P_RESULT := 0; - - SELECT COUNT(OCT_ID) INTO P_COUNT - FROM OAUTH_CONSUMER_TOKEN - JOIN OAUTH_CONSUMER_REGISTRY - ON OCT_OCR_ID_REF = OCR_ID - WHERE OCT_TOKEN_TYPE = 'ACCESS' - AND OCR_CONSUMER_KEY = P_CONSUMER_KEY - AND OCT_TOKEN_TTL >= SYSDATE; - - -EXCEPTION -WHEN OTHERS THEN --- CALL THE FUNCTION TO LOG ERRORS -ROLLBACK; -P_RESULT := 1; -- ERROR -END; -/ diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_DELETE_CONSUMER.prc b/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_DELETE_CONSUMER.prc deleted file mode 100644 index 3f18562ef774df94705ae7865a8cfcad1ba755d9..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_DELETE_CONSUMER.prc +++ /dev/null @@ -1,35 +0,0 @@ -CREATE OR REPLACE PROCEDURE SP_DELETE_CONSUMER -( -P_CONSUMER_KEY IN VARCHAR2, -P_USER_ID IN NUMBER, -P_USER_IS_ADMIN IN NUMBER, --0:NO; 1:YES -P_RESULT OUT NUMBER -) -AS - - -- Delete a consumer key. This removes access to our site for all applications using this key. - -BEGIN -P_RESULT := 0; - -IF P_USER_IS_ADMIN = 1 THEN - - DELETE FROM OAUTH_SERVER_REGISTRY - WHERE OSR_CONSUMER_KEY = P_CONSUMER_KEY - AND (OSR_USA_ID_REF = P_USER_ID OR OSR_USA_ID_REF IS NULL); - -ELSIF P_USER_IS_ADMIN = 0 THEN - - DELETE FROM OAUTH_SERVER_REGISTRY - WHERE OSR_CONSUMER_KEY = P_CONSUMER_KEY - AND OSR_USA_ID_REF = P_USER_ID; - -END IF; - -EXCEPTION -WHEN OTHERS THEN --- CALL THE FUNCTION TO LOG ERRORS -ROLLBACK; -P_RESULT := 1; -- ERROR -END; -/ diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_DELETE_SERVER.prc b/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_DELETE_SERVER.prc deleted file mode 100644 index ba259dee9867642db4cc2ceda98cf998becc3e89..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_DELETE_SERVER.prc +++ /dev/null @@ -1,35 +0,0 @@ -CREATE OR REPLACE PROCEDURE SP_DELETE_SERVER -( -P_CONSUMER_KEY IN VARCHAR2, -P_USER_ID IN NUMBER, -P_USER_IS_ADMIN IN NUMBER, --0:NO; 1:YES -P_RESULT OUT NUMBER -) -AS - - -- Delete a server key. This removes access to that site. - -BEGIN -P_RESULT := 0; - -IF P_USER_IS_ADMIN = 1 THEN - - DELETE FROM OAUTH_CONSUMER_REGISTRY - WHERE OCR_CONSUMER_KEY = P_CONSUMER_KEY - AND (OCR_USA_ID_REF = P_USER_ID OR OCR_USA_ID_REF IS NULL); - -ELSIF P_USER_IS_ADMIN = 0 THEN - - DELETE FROM OAUTH_CONSUMER_REGISTRY - WHERE OCR_CONSUMER_KEY = P_CONSUMER_KEY - AND OCR_USA_ID_REF = P_USER_ID; - -END IF; - -EXCEPTION -WHEN OTHERS THEN --- CALL THE FUNCTION TO LOG ERRORS -ROLLBACK; -P_RESULT := 1; -- ERROR -END; -/ diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_DELETE_SERVER_TOKEN.prc b/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_DELETE_SERVER_TOKEN.prc deleted file mode 100644 index de9d45007ba108fd4942fd987756a0e0c4d80bcc..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_DELETE_SERVER_TOKEN.prc +++ /dev/null @@ -1,37 +0,0 @@ -CREATE OR REPLACE PROCEDURE SP_DELETE_SERVER_TOKEN -( -P_CONSUMER_KEY IN VARCHAR2, -P_USER_ID IN NUMBER, -P_TOKEN IN VARCHAR2, -P_USER_IS_ADMIN IN NUMBER, --0:NO; 1:YES -P_RESULT OUT NUMBER -) -AS - - -- Delete a token we obtained from a server. - -BEGIN -P_RESULT := 0; - -IF P_USER_IS_ADMIN = 1 THEN - - DELETE FROM OAUTH_CONSUMER_TOKEN - WHERE OCT_TOKEN = P_TOKEN - AND OCT_OCR_ID_REF IN (SELECT OCR_ID FROM OAUTH_CONSUMER_REGISTRY WHERE OCR_CONSUMER_KEY = P_CONSUMER_KEY); - -ELSIF P_USER_IS_ADMIN = 0 THEN - - DELETE FROM OAUTH_CONSUMER_TOKEN - WHERE OCT_TOKEN = P_TOKEN - AND OCT_USA_ID_REF = P_USER_ID - AND OCT_OCR_ID_REF IN (SELECT OCR_ID FROM OAUTH_CONSUMER_REGISTRY WHERE OCR_CONSUMER_KEY = P_CONSUMER_KEY); - -END IF; - -EXCEPTION -WHEN OTHERS THEN --- CALL THE FUNCTION TO LOG ERRORS -ROLLBACK; -P_RESULT := 1; -- ERROR -END; -/ diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_DEL_CONSUMER_ACCESS_TOKEN.prc b/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_DEL_CONSUMER_ACCESS_TOKEN.prc deleted file mode 100644 index 4281bdb9decf7d91dba8198129e0bdcc2e5eb01e..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_DEL_CONSUMER_ACCESS_TOKEN.prc +++ /dev/null @@ -1,33 +0,0 @@ -CREATE OR REPLACE PROCEDURE SP_DEL_CONSUMER_ACCESS_TOKEN -( -P_USER_ID IN NUMBER, -P_TOKEN IN VARCHAR2, -P_USER_IS_ADMIN IN NUMBER, -- 1:YES; 0:NO -P_RESULT OUT NUMBER -) -AS - - -- PROCEDURE TO Delete a consumer access token. - -BEGIN - - P_RESULT := 0; - - IF P_USER_IS_ADMIN = 1 THEN - DELETE FROM OAUTH_SERVER_TOKEN - WHERE OST_TOKEN = P_TOKEN - AND OST_TOKEN_TYPE = 'ACCESS'; - ELSE - DELETE FROM OAUTH_SERVER_TOKEN - WHERE OST_TOKEN = P_TOKEN - AND OST_TOKEN_TYPE = 'ACCESS' - AND OST_USA_ID_REF = P_USER_ID; - END IF; - -EXCEPTION -WHEN OTHERS THEN --- CALL THE FUNCTION TO LOG ERRORS -ROLLBACK; -P_RESULT := 1; -- ERROR -END; -/ diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_DEL_CONSUMER_REQUEST_TOKEN.prc b/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_DEL_CONSUMER_REQUEST_TOKEN.prc deleted file mode 100644 index 01678d6bd4f01b6e6b515694ffebbb238ebcbb77..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_DEL_CONSUMER_REQUEST_TOKEN.prc +++ /dev/null @@ -1,25 +0,0 @@ -CREATE OR REPLACE PROCEDURE SP_DEL_CONSUMER_REQUEST_TOKEN -( -P_TOKEN IN VARCHAR2, -P_RESULT OUT NUMBER -) -AS - - -- PROCEDURE TO Delete a consumer token. The token must be a request or authorized token. - -BEGIN - - P_RESULT := 0; - - DELETE FROM OAUTH_SERVER_TOKEN - WHERE OST_TOKEN = P_TOKEN - AND OST_TOKEN_TYPE = 'REQUEST'; - - -EXCEPTION -WHEN OTHERS THEN --- CALL THE FUNCTION TO LOG ERRORS -ROLLBACK; -P_RESULT := 1; -- ERROR -END; -/ diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_EXCH_CONS_REQ_FOR_ACC_TOKEN.prc b/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_EXCH_CONS_REQ_FOR_ACC_TOKEN.prc deleted file mode 100644 index 66a53ed836559f82d120d17e98216a224054eb0b..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_EXCH_CONS_REQ_FOR_ACC_TOKEN.prc +++ /dev/null @@ -1,96 +0,0 @@ -CREATE OR REPLACE PROCEDURE SP_EXCH_CONS_REQ_FOR_ACC_TOKEN -( -P_TOKEN_TTL IN NUMBER, -- IN SECOND -P_NEW_TOKEN IN VARCHAR2, -P_TOKEN IN VARCHAR2, -P_TOKEN_SECRET IN VARCHAR2, -P_VERIFIER IN VARCHAR2, -P_OUT_TOKEN_TTL OUT NUMBER, -P_RESULT OUT NUMBER -) -AS - - -- PROCEDURE TO Add an unautorized request token to our server. - -V_TOKEN_EXIST NUMBER; - - -V_EXC_NO_TOKEN_EXIST EXCEPTION; -BEGIN - - P_RESULT := 0; - - IF P_VERIFIER IS NOT NULL THEN - - BEGIN - SELECT 1 INTO V_TOKEN_EXIST FROM DUAL WHERE EXISTS - (SELECT OST_TOKEN FROM OAUTH_SERVER_TOKEN - WHERE OST_TOKEN = P_TOKEN - AND OST_TOKEN_TYPE = 'REQUEST' - AND OST_AUTHORIZED = 1 - AND OST_TOKEN_TTL >= SYSDATE - AND OST_VERIFIER = P_VERIFIER); - EXCEPTION - WHEN NO_DATA_FOUND THEN - RAISE V_EXC_NO_TOKEN_EXIST; - END; - - UPDATE OAUTH_SERVER_TOKEN - SET OST_TOKEN = P_NEW_TOKEN, - OST_TOKEN_SECRET = P_TOKEN_SECRET, - OST_TOKEN_TYPE = 'ACCESS', - OST_TIMESTAMP = SYSDATE, - OST_TOKEN_TTL = NVL(SYSDATE + (P_TOKEN_TTL/(24*60*60)), TO_DATE('9999.12.31', 'yyyy.mm.dd')) - WHERE OST_TOKEN = P_TOKEN - AND OST_TOKEN_TYPE = 'REQUEST' - AND OST_AUTHORIZED = 1 - AND OST_TOKEN_TTL >= SYSDATE - AND OST_VERIFIER = P_VERIFIER; - - ELSE - BEGIN - SELECT 1 INTO V_TOKEN_EXIST FROM DUAL WHERE EXISTS - (SELECT OST_TOKEN FROM OAUTH_SERVER_TOKEN - WHERE OST_TOKEN = P_TOKEN - AND OST_TOKEN_TYPE = 'REQUEST' - AND OST_AUTHORIZED = 1 - AND OST_TOKEN_TTL >= SYSDATE); - EXCEPTION - WHEN NO_DATA_FOUND THEN - RAISE V_EXC_NO_TOKEN_EXIST; - END; - - UPDATE OAUTH_SERVER_TOKEN - SET OST_TOKEN = P_NEW_TOKEN, - OST_TOKEN_SECRET = P_TOKEN_SECRET, - OST_TOKEN_TYPE = 'ACCESS', - OST_TIMESTAMP = SYSDATE, - OST_TOKEN_TTL = NVL(SYSDATE + (P_TOKEN_TTL/(24*60*60)), TO_DATE('9999.12.31', 'yyyy.mm.dd')) - WHERE OST_TOKEN = P_TOKEN - AND OST_TOKEN_TYPE = 'REQUEST' - AND OST_AUTHORIZED = 1 - AND OST_TOKEN_TTL >= SYSDATE; - - - END IF; - - SELECT CASE - WHEN OST_TOKEN_TTL >= TO_DATE('9999.12.31', 'yyyy.mm.dd') THEN NULL ELSE (OST_TOKEN_TTL - SYSDATE)*24*60*60 - END "TOKEN_TTL" INTO P_OUT_TOKEN_TTL - FROM OAUTH_SERVER_TOKEN - WHERE OST_TOKEN = P_NEW_TOKEN; - - - - - - -EXCEPTION -WHEN V_EXC_NO_TOKEN_EXIST THEN -P_RESULT := 2; -- NO_TOKEN_EXIST -WHEN OTHERS THEN --- CALL THE FUNCTION TO LOG ERRORS -ROLLBACK; -P_RESULT := 1; -- ERROR -END; -/ diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_GET_CONSUMER.prc b/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_GET_CONSUMER.prc deleted file mode 100644 index 4225ff212faf4d2b3fa53330373c395bf48977d0..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_GET_CONSUMER.prc +++ /dev/null @@ -1,41 +0,0 @@ -CREATE OR REPLACE PROCEDURE SP_GET_CONSUMER -( -P_CONSUMER_KEY IN STRING, -P_ROWS OUT TYPES.REF_CURSOR, -P_RESULT OUT NUMBER -) -AS - - -- PROCEDURE TO Fetch a consumer of this server, by consumer_key. -BEGIN -P_RESULT := 0; - -OPEN P_ROWS FOR - SELECT OSR_ID "osr_id", - OSR_USA_ID_REF "osr_usa_id_ref", - OSR_CONSUMER_KEY "osr_consumer_key", - OSR_CONSUMER_SECRET "osr_consumer_secret", - OSR_ENABLED "osr_enabled", - OSR_STATUS "osr_status", - OSR_REQUESTER_NAME "osr_requester_name", - OSR_REQUESTER_EMAIL "osr_requester_email", - OSR_CALLBACK_URI "osr_callback_uri", - OSR_APPLICATION_URI "osr_application_uri", - OSR_APPLICATION_TITLE "osr_application_title", - OSR_APPLICATION_DESCR "osr_application_descr", - OSR_APPLICATION_NOTES "osr_application_notes", - OSR_APPLICATION_TYPE "osr_application_type", - OSR_APPLICATION_COMMERCIAL "osr_application_commercial", - OSR_ISSUE_DATE "osr_issue_date", - OSR_TIMESTAMP "osr_timestamp" - FROM OAUTH_SERVER_REGISTRY - WHERE OSR_CONSUMER_KEY = P_CONSUMER_KEY; - - -EXCEPTION -WHEN OTHERS THEN --- CALL THE FUNCTION TO LOG ERRORS -ROLLBACK; -P_RESULT := 1; -- ERROR -END; -/ diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_GET_CONSUMER_ACCESS_TOKEN.prc b/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_GET_CONSUMER_ACCESS_TOKEN.prc deleted file mode 100644 index 0db2ea9caa53f6a493c23d8fee172a4ac38b4b48..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_GET_CONSUMER_ACCESS_TOKEN.prc +++ /dev/null @@ -1,43 +0,0 @@ -CREATE OR REPLACE PROCEDURE SP_GET_CONSUMER_ACCESS_TOKEN -( -P_USER_ID IN NUMBER, -P_TOKEN IN VARCHAR2, -P_ROWS OUT TYPES.REF_CURSOR, -P_RESULT OUT NUMBER -) -AS - - -- PROCEDURE TO Fetch the consumer access token, by access token. - -BEGIN - - P_RESULT := 0; - - - OPEN P_ROWS FOR - SELECT OST_TOKEN "token", - OST_TOKEN_SECRET "token_secret", - OST_REFERRER_HOST "token_referrer_host", - OSR_CONSUMER_KEY "consumer_key", - OSR_CONSUMER_SECRET "consumer_secret", - OSR_APPLICATION_URI "application_uri", - OSR_APPLICATION_TITLE "application_title", - OSR_APPLICATION_DESCR "application_descr", - OSR_CALLBACK_URI "callback_uri" - FROM OAUTH_SERVER_TOKEN - JOIN OAUTH_SERVER_REGISTRY - ON OST_OSR_ID_REF = OSR_ID - WHERE OST_TOKEN_TYPE = 'ACCESS' - AND OST_TOKEN = P_TOKEN - AND OST_USA_ID_REF = P_USER_ID - AND OST_TOKEN_TTL >= SYSDATE; - - - -EXCEPTION -WHEN OTHERS THEN --- CALL THE FUNCTION TO LOG ERRORS -ROLLBACK; -P_RESULT := 1; -- ERROR -END; -/ diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_GET_CONSUMER_REQUEST_TOKEN.prc b/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_GET_CONSUMER_REQUEST_TOKEN.prc deleted file mode 100644 index 6d3b59061329e2efbbf9679f7634ec872153c68e..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_GET_CONSUMER_REQUEST_TOKEN.prc +++ /dev/null @@ -1,41 +0,0 @@ -CREATE OR REPLACE PROCEDURE SP_GET_CONSUMER_REQUEST_TOKEN -( -P_TOKEN IN VARCHAR2, -P_ROWS OUT TYPES.REF_CURSOR, -P_RESULT OUT NUMBER -) -AS - - -- PROCEDURE TO Fetch the consumer request token, by request token. -BEGIN -P_RESULT := 0; - -OPEN P_ROWS FOR - -SELECT OST_TOKEN "token", - OST_TOKEN_SECRET "token_secret", - OSR_CONSUMER_KEY "consumer_key", - OSR_CONSUMER_SECRET "consumer_secret", - OST_TOKEN_TYPE "token_type", - OST_CALLBACK_URL "callback_url", - OSR_APPLICATION_TITLE "application_title", - OSR_APPLICATION_DESCR "application_descr", - OSR_APPLICATION_URI "application_uri" - FROM OAUTH_SERVER_TOKEN - JOIN OAUTH_SERVER_REGISTRY - ON OST_OSR_ID_REF = OSR_ID - WHERE OST_TOKEN_TYPE = 'REQUEST' - AND OST_TOKEN = P_TOKEN - AND OST_TOKEN_TTL >= SYSDATE; - - - - - -EXCEPTION -WHEN OTHERS THEN --- CALL THE FUNCTION TO LOG ERRORS -ROLLBACK; -P_RESULT := 1; -- ERROR -END; -/ diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_GET_CONSUMER_STATIC_SELECT.prc b/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_GET_CONSUMER_STATIC_SELECT.prc deleted file mode 100644 index 1126ef6aea730fb3774d81c732be5dcbfa49b6af..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_GET_CONSUMER_STATIC_SELECT.prc +++ /dev/null @@ -1,25 +0,0 @@ -CREATE OR REPLACE PROCEDURE SP_GET_CONSUMER_STATIC_SELECT -( -P_OSR_CONSUMER_KEY OUT VARCHAR2, -P_RESULT OUT NUMBER -) -AS - --- PROCEDURE TO Fetch the static consumer key for this provider. -BEGIN -P_RESULT := 0; - - - SELECT OSR_CONSUMER_KEY INTO P_OSR_CONSUMER_KEY - FROM OAUTH_SERVER_REGISTRY - WHERE OSR_CONSUMER_KEY LIKE 'sc-%%' - AND OSR_USA_ID_REF IS NULL; - - -EXCEPTION -WHEN OTHERS THEN --- CALL THE FUNCTION TO LOG ERRORS -ROLLBACK; -P_RESULT := 1; -- ERROR -END; -/ diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_GET_SECRETS_FOR_SIGNATURE.prc b/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_GET_SECRETS_FOR_SIGNATURE.prc deleted file mode 100644 index 2af78475313a0e2606b08bf0cc675602bee5b964..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_GET_SECRETS_FOR_SIGNATURE.prc +++ /dev/null @@ -1,43 +0,0 @@ -CREATE OR REPLACE PROCEDURE SP_GET_SECRETS_FOR_SIGNATURE -( -P_HOST IN VARCHAR2, -P_PATH IN VARCHAR2, -P_USER_ID IN NUMBER, -P_NAME IN VARCHAR2, -P_ROWS OUT TYPES.REF_CURSOR, -P_RESULT OUT NUMBER -) -AS - - -- PROCEDURE TO Find the server details for signing a request, always looks for an access token. - -- The returned credentials depend on which local user is making the request. -BEGIN -P_RESULT := 0; - - OPEN P_ROWS FOR - SELECT * FROM ( - SELECT OCR_CONSUMER_KEY "consumer_key", - OCR_CONSUMER_SECRET "consumer_secret", - OCT_TOKEN "token", - OCT_TOKEN_SECRET "token_secret", - OCR_SIGNATURE_METHODS "signature_methods" - FROM OAUTH_CONSUMER_REGISTRY - JOIN OAUTH_CONSUMER_TOKEN ON OCT_OCR_ID_REF = OCR_ID - WHERE OCR_SERVER_URI_HOST = P_HOST - AND OCR_SERVER_URI_PATH = SUBSTR(P_PATH, 1, LENGTH(OCR_SERVER_URI_PATH)) - AND (OCR_USA_ID_REF = P_USER_ID OR OCR_USA_ID_REF IS NULL) - AND OCT_USA_ID_REF = P_USER_ID - AND OCT_TOKEN_TYPE = 'ACCESS' - AND OCT_NAME = P_NAME - AND OCT_TOKEN_TTL >= SYSDATE - ORDER BY OCR_USA_ID_REF DESC, OCR_CONSUMER_SECRET DESC, LENGTH(OCR_SERVER_URI_PATH) DESC - ) WHERE ROWNUM<=1; - - -EXCEPTION -WHEN OTHERS THEN --- CALL THE FUNCTION TO LOG ERRORS -ROLLBACK; -P_RESULT := 1; -- ERROR -END; -/ diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_GET_SECRETS_FOR_VERIFY.prc b/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_GET_SECRETS_FOR_VERIFY.prc deleted file mode 100644 index 4fbb435c85f7bf387e68f4baa65119ebc98b0358..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_GET_SECRETS_FOR_VERIFY.prc +++ /dev/null @@ -1,52 +0,0 @@ -CREATE OR REPLACE PROCEDURE SP_GET_SECRETS_FOR_VERIFY -( -P_CONSUMER_KEY IN VARCHAR2, -P_TOKEN IN VARCHAR2, -P_TOKEN_TYPE IN VARCHAR2, -P_ROWS OUT TYPES.REF_CURSOR, -P_RESULT OUT NUMBER -) -AS - - -- PROCEDURE to Find stored credentials for the consumer key and token. Used by an OAuth server - -- when verifying an OAuth request. - -BEGIN -P_RESULT := 0; - -IF P_TOKEN_TYPE IS NULL THEN - OPEN P_ROWS FOR - SELECT OSR.OSR_ID "osr_id", - OSR.OSR_CONSUMER_KEY "consumer_key", - OSR.OSR_CONSUMER_SECRET "consumer_secret" - FROM OAUTH_SERVER_REGISTRY OSR - WHERE OSR.OSR_CONSUMER_KEY = P_CONSUMER_KEY - AND OSR.OSR_ENABLED = 1; -ELSE - OPEN P_ROWS FOR - SELECT OSR.OSR_ID "osr_id", - OST.OST_ID "ost_id", - OST.OST_USA_ID_REF "user_id", - OSR.OSR_CONSUMER_KEY "consumer_key", - OSR.OSR_CONSUMER_SECRET "consumer_secret", - OST.OST_TOKEN "token", - OST.OST_TOKEN_SECRET "token_secret" - FROM OAUTH_SERVER_REGISTRY OSR, OAUTH_SERVER_TOKEN OST - WHERE OST.OST_OSR_ID_REF = OSR.OSR_ID - AND upper(OST.OST_TOKEN_TYPE) = upper(P_TOKEN_TYPE) - AND OSR.OSR_CONSUMER_KEY = P_CONSUMER_KEY - AND OST.OST_TOKEN = P_TOKEN - AND OSR.OSR_ENABLED = 1 - AND OST.OST_TOKEN_TTL >= SYSDATE; - -END IF; - - - -EXCEPTION -WHEN OTHERS THEN --- CALL THE FUNCTION TO LOG ERRORS -ROLLBACK; -P_RESULT := 1; -- ERROR -END; -/ diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_GET_SERVER.prc b/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_GET_SERVER.prc deleted file mode 100644 index af7d2755b7c4b5583d135c618ad13d86736fed3d..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_GET_SERVER.prc +++ /dev/null @@ -1,35 +0,0 @@ -CREATE OR REPLACE PROCEDURE SP_GET_SERVER -( -P_CONSUMER_KEY IN VARCHAR2, -P_USER_ID IN NUMBER, -P_ROWS OUT TYPES.REF_CURSOR, -P_RESULT OUT NUMBER -) -AS - - -- PROCEDURE TO Get a server from the consumer registry using the consumer key -BEGIN -P_RESULT := 0; - -OPEN P_ROWS FOR - SELECT OCR_ID "id", - OCR_USA_ID_REF "user_id", - OCR_CONSUMER_KEY "consumer_key", - OCR_CONSUMER_SECRET "consumer_secret", - OCR_SIGNATURE_METHODS "signature_methods", - OCR_SERVER_URI "server_uri", - OCR_REQUEST_TOKEN_URI "request_token_uri", - OCR_AUTHORIZE_URI "authorize_uri", - OCR_ACCESS_TOKEN_URI "access_token_uri" - FROM OAUTH_CONSUMER_REGISTRY - WHERE OCR_CONSUMER_KEY = P_CONSUMER_KEY - AND (OCR_USA_ID_REF = P_USER_ID OR OCR_USA_ID_REF IS NULL); - - -EXCEPTION -WHEN OTHERS THEN --- CALL THE FUNCTION TO LOG ERRORS -ROLLBACK; -P_RESULT := 1; -- ERROR -END; -/ diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_GET_SERVER_FOR_URI.prc b/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_GET_SERVER_FOR_URI.prc deleted file mode 100644 index d838b511bcf86d6d0177a486af9bd2349cfd637b..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_GET_SERVER_FOR_URI.prc +++ /dev/null @@ -1,41 +0,0 @@ -CREATE OR REPLACE PROCEDURE SP_GET_SERVER_FOR_URI -( -P_HOST IN VARCHAR2, -P_PATH IN VARCHAR2, -P_USER_ID IN NUMBER, -P_ROWS OUT TYPES.REF_CURSOR, -P_RESULT OUT NUMBER -) -AS - - -- PROCEDURE TO Find the server details that might be used for a request -BEGIN -P_RESULT := 0; - -OPEN P_ROWS FOR -SELECT * FROM ( - SELECT OCR_ID "id", - OCR_USA_ID_REF "user_id", - OCR_CONSUMER_KEY "consumer_key", - OCR_CONSUMER_SECRET "consumer_secret", - OCR_SIGNATURE_METHODS "signature_methods", - OCR_SERVER_URI "server_uri", - OCR_REQUEST_TOKEN_URI "request_token_uri", - OCR_AUTHORIZE_URI "authorize_uri", - OCR_ACCESS_TOKEN_URI "access_token_uri" - FROM OAUTH_CONSUMER_REGISTRY - WHERE OCR_SERVER_URI_HOST = P_HOST - AND OCR_SERVER_URI_PATH = SUBSTR(P_PATH, 1, LENGTH(OCR_SERVER_URI_PATH)) - AND (OCR_USA_ID_REF = P_USER_ID OR OCR_USA_ID_REF IS NULL) - ORDER BY ocr_usa_id_ref DESC, OCR_CONSUMER_KEY DESC, LENGTH(ocr_server_uri_path) DESC -) WHERE ROWNUM<=1; - - - -EXCEPTION -WHEN OTHERS THEN --- CALL THE FUNCTION TO LOG ERRORS -ROLLBACK; -P_RESULT := 1; -- ERROR -END; -/ diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_GET_SERVER_TOKEN.prc b/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_GET_SERVER_TOKEN.prc deleted file mode 100644 index fefbe8acaf6f1cc25ee4834ebe905f0b260537c8..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_GET_SERVER_TOKEN.prc +++ /dev/null @@ -1,45 +0,0 @@ -CREATE OR REPLACE PROCEDURE SP_GET_SERVER_TOKEN -( -P_CONSUMER_KEY IN VARCHAR2, -P_USER_ID IN NUMBER, -P_TOKEN IN VARCHAR2, -P_ROWS OUT TYPES.REF_CURSOR, -P_RESULT OUT NUMBER -) -AS - - -- PROCEDURE TO Get a specific server token for the given user -BEGIN -P_RESULT := 0; - -OPEN P_ROWS FOR - SELECT OCR_CONSUMER_KEY "consumer_key", - OCR_CONSUMER_SECRET "consumer_secret", - OCT_TOKEN "token", - OCT_TOKEN_SECRET "token_secret", - OCT_USA_ID_REF "usr_id", - OCR_SIGNATURE_METHODS "signature_methods", - OCR_SERVER_URI "server_uri", - OCR_SERVER_URI_HOST "server_uri_host", - OCR_SERVER_URI_PATH "server_uri_path", - OCR_REQUEST_TOKEN_URI "request_token_uri", - OCR_AUTHORIZE_URI "authorize_uri", - OCR_ACCESS_TOKEN_URI "access_token_uri", - OCT_TIMESTAMP "timestamp" - FROM OAUTH_CONSUMER_REGISTRY - JOIN OAUTH_CONSUMER_TOKEN - ON OCT_OCR_ID_REF = OCR_ID - WHERE OCR_CONSUMER_KEY = P_CONSUMER_KEY - AND OCT_USA_ID_REF = P_USER_ID - AND OCT_TOKEN_TYPE = 'ACCESS' - AND OCT_TOKEN = P_TOKEN - AND OCT_TOKEN_TTL >= SYSDATE; - - -EXCEPTION -WHEN OTHERS THEN --- CALL THE FUNCTION TO LOG ERRORS -ROLLBACK; -P_RESULT := 1; -- ERROR -END; -/ diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_GET_SERVER_TOKEN_SECRETS.prc b/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_GET_SERVER_TOKEN_SECRETS.prc deleted file mode 100644 index 95eec885a68cc697748af838a53eaacdd1973a15..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_GET_SERVER_TOKEN_SECRETS.prc +++ /dev/null @@ -1,47 +0,0 @@ -CREATE OR REPLACE PROCEDURE SP_GET_SERVER_TOKEN_SECRETS -( -P_CONSUMER_KEY IN VARCHAR2, -P_TOKEN IN VARCHAR2, -P_TOKEN_TYPE IN VARCHAR2, -P_USER_ID IN NUMBER, -P_ROWS OUT TYPES.REF_CURSOR, -P_RESULT OUT NUMBER -) -AS - - -- Get the token and token secret we obtained from a server. - -BEGIN -P_RESULT := 0; - - - OPEN P_ROWS FOR - SELECT OCR.OCR_CONSUMER_KEY "consumer_key", - OCR.OCR_CONSUMER_SECRET "consumer_secret", - OCT.OCT_TOKEN "token", - OCT.OCT_TOKEN_SECRET "token_secret", - OCT.OCT_NAME "token_name", - OCR.OCR_SIGNATURE_METHODS "signature_methods", - OCR.OCR_SERVER_URI "server_uri", - OCR.OCR_REQUEST_TOKEN_URI "request_token_uri", - OCR.OCR_AUTHORIZE_URI "authorize_uri", - OCR.OCR_ACCESS_TOKEN_URI "access_token_uri", - CASE WHEN OCT.OCT_TOKEN_TTL >= TO_DATE('9999.12.31', 'yyyy.mm.dd') THEN NULL - ELSE OCT.OCT_TOKEN_TTL - SYSDATE - END "token_ttl" - FROM OAUTH_CONSUMER_REGISTRY OCR, OAUTH_CONSUMER_TOKEN OCT - WHERE OCT.OCT_OCR_ID_REF = OCR_ID - AND OCR.OCR_CONSUMER_KEY = P_CONSUMER_KEY - AND upper(OCT.OCT_TOKEN_TYPE) = upper(P_TOKEN_TYPE) - AND OCT.OCT_TOKEN = P_TOKEN - AND OCT.OCT_USA_ID_REF = P_USER_ID - AND OCT.OCT_TOKEN_TTL >= SYSDATE; - - -EXCEPTION -WHEN OTHERS THEN --- CALL THE FUNCTION TO LOG ERRORS -ROLLBACK; -P_RESULT := 1; -- ERROR -END; -/ diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_LIST_CONSUMERS.prc b/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_LIST_CONSUMERS.prc deleted file mode 100644 index bb4246557c540ca55357453f104819d886762dc8..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_LIST_CONSUMERS.prc +++ /dev/null @@ -1,41 +0,0 @@ -CREATE OR REPLACE PROCEDURE SP_LIST_CONSUMERS -( -P_USER_ID IN NUMBER, -P_ROWS OUT TYPES.REF_CURSOR, -P_RESULT OUT NUMBER -) -AS - - -- PROCEDURE TO Fetch a list of all consumer keys, secrets etc. - -- Returns the public (user_id is null) and the keys owned by the user - -BEGIN - - P_RESULT := 0; - - OPEN P_ROWS FOR - SELECT OSR_ID "id", - OSR_USA_ID_REF "user_id", - OSR_CONSUMER_KEY "consumer_key", - OSR_CONSUMER_SECRET "consumer_secret", - OSR_ENABLED "enabled", - OSR_STATUS "status", - OSR_ISSUE_DATE "issue_date", - OSR_APPLICATION_URI "application_uri", - OSR_APPLICATION_TITLE "application_title", - OSR_APPLICATION_DESCR "application_descr", - OSR_REQUESTER_NAME "requester_name", - OSR_REQUESTER_EMAIL "requester_email", - OSR_CALLBACK_URI "callback_uri" - FROM OAUTH_SERVER_REGISTRY - WHERE (OSR_USA_ID_REF = P_USER_ID OR OSR_USA_ID_REF IS NULL) - ORDER BY OSR_APPLICATION_TITLE; - - -EXCEPTION -WHEN OTHERS THEN --- CALL THE FUNCTION TO LOG ERRORS -ROLLBACK; -P_RESULT := 1; -- ERROR -END; -/ diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_LIST_CONSUMER_TOKENS.prc b/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_LIST_CONSUMER_TOKENS.prc deleted file mode 100644 index dae9c72cc0f9284a29d6a5934609140bb6f7d296..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_LIST_CONSUMER_TOKENS.prc +++ /dev/null @@ -1,43 +0,0 @@ -CREATE OR REPLACE PROCEDURE SP_LIST_CONSUMER_TOKENS -( -P_USER_ID IN NUMBER, -P_ROWS OUT TYPES.REF_CURSOR, -P_RESULT OUT NUMBER -) -AS - - -- PROCEDURE TO Fetch a list of all consumer tokens accessing the account of the given user. - -BEGIN - - P_RESULT := 0; - - OPEN P_ROWS FOR - SELECT OSR_CONSUMER_KEY "consumer_key", - OSR_CONSUMER_SECRET "consumer_secret", - OSR_ENABLED "enabled", - OSR_STATUS "status", - OSR_APPLICATION_URI "application_uri", - OSR_APPLICATION_TITLE "application_title", - OSR_APPLICATION_DESCR "application_descr", - OST_TIMESTAMP "timestamp", - OST_TOKEN "token", - OST_TOKEN_SECRET "token_secret", - OST_REFERRER_HOST "token_referrer_host", - OSR_CALLBACK_URI "callback_uri" - FROM OAUTH_SERVER_REGISTRY - JOIN OAUTH_SERVER_TOKEN - ON OST_OSR_ID_REF = OSR_ID - WHERE OST_USA_ID_REF = P_USER_ID - AND OST_TOKEN_TYPE = 'ACCESS' - AND OST_TOKEN_TTL >= SYSDATE - ORDER BY OSR_APPLICATION_TITLE; - - -EXCEPTION -WHEN OTHERS THEN --- CALL THE FUNCTION TO LOG ERRORS -ROLLBACK; -P_RESULT := 1; -- ERROR -END; -/ diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_LIST_LOG.prc b/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_LIST_LOG.prc deleted file mode 100644 index 275950e4190ee4321c20e4ffc8c38abb705b483f..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_LIST_LOG.prc +++ /dev/null @@ -1,75 +0,0 @@ -CREATE OR REPLACE PROCEDURE SP_LIST_LOG -( -P_OPTION_FLAG IN NUMBER, -- 0:NULL; 1:OTHERWISE -P_USA_ID IN NUMBER, -P_OSR_CONSUMER_KEY IN VARCHAR2, -P_OCR_CONSUMER_KEY IN VARCHAR2, -P_OST_TOKEN IN VARCHAR2, -P_OCT_TOKEN IN VARCHAR2, -P_ROWS OUT TYPES.REF_CURSOR, -P_RESULT OUT NUMBER -) -AS - - -- PROCEDURE TO Get a page of entries from the log. Returns the last 100 records - -- matching the options given. - -BEGIN - - P_RESULT := 0; - - IF P_OPTION_FLAG IS NULL OR P_OPTION_FLAG = 0 THEN - OPEN P_ROWS FOR - SELECT * FROM ( - SELECT OLG_ID "olg_id", - OLG_OSR_CONSUMER_KEY "osr_consumer_key", - OLG_OST_TOKEN "ost_token", - OLG_OCR_CONSUMER_KEY "ocr_consumer_key", - OLG_OCT_TOKEN "oct_token", - OLG_USA_ID_REF "user_id", - OLG_RECEIVED "received", - OLG_SENT "sent", - OLG_BASE_STRING "base_string", - OLG_NOTES "notes", - OLG_TIMESTAMP "timestamp", - -- INET_NTOA(OLG_REMOTE_IP) "remote_ip" - OLG_REMOTE_IP "remote_ip" - FROM OAUTH_LOG - WHERE OLG_USA_ID_REF = P_USA_ID - ORDER BY OLG_ID DESC - ) WHERE ROWNUM<=100; - ELSE - OPEN P_ROWS FOR - SELECT * FROM ( - SELECT OLG_ID "olg_id", - OLG_OSR_CONSUMER_KEY "osr_consumer_key", - OLG_OST_TOKEN "ost_token", - OLG_OCR_CONSUMER_KEY "ocr_consumer_key", - OLG_OCT_TOKEN "oct_token", - OLG_USA_ID_REF "user_id", - OLG_RECEIVED "received", - OLG_SENT "sent", - OLG_BASE_STRING "base_string", - OLG_NOTES "notes", - OLG_TIMESTAMP "timestamp", - -- INET_NTOA(OLG_REMOTE_IP) "remote_ip" - OLG_REMOTE_IP "remote_ip" - FROM OAUTH_LOG - WHERE OLG_OSR_CONSUMER_KEY = P_OSR_CONSUMER_KEY - AND OLG_OCR_CONSUMER_KEY = P_OCR_CONSUMER_KEY - AND OLG_OST_TOKEN = P_OST_TOKEN - AND OLG_OCT_TOKEN = P_OCT_TOKEN - AND (OLG_USA_ID_REF IS NULL OR OLG_USA_ID_REF = P_USA_ID) - ORDER BY OLG_ID DESC - ) WHERE ROWNUM<=100; - - END IF; - - -EXCEPTION -WHEN OTHERS THEN --- CALL THE FUNCTION TO LOG ERRORS -ROLLBACK; -P_RESULT := 1; -- ERROR -END; -/ diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_LIST_SERVERS.prc b/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_LIST_SERVERS.prc deleted file mode 100644 index 51dd39a06c13bb7d47f9c2f08a026617f8689b4f..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_LIST_SERVERS.prc +++ /dev/null @@ -1,66 +0,0 @@ -CREATE OR REPLACE PROCEDURE SP_LIST_SERVERS -( -P_Q IN VARCHAR2, -P_USER_ID IN NUMBER, -P_ROWS OUT TYPES.REF_CURSOR, -P_RESULT OUT NUMBER -) -AS - - -- PROCEDURE TO Get a list of all consumers from the consumer registry. -BEGIN -P_RESULT := 0; - -IF P_Q IS NOT NULL THEN - - OPEN P_ROWS FOR - SELECT OCR_ID "id", - OCR_USA_ID_REF "user_id", - OCR_CONSUMER_KEY "consumer_key", - OCR_CONSUMER_SECRET "consumer_secret", - OCR_SIGNATURE_METHODS "signature_methods", - OCR_SERVER_URI "server_uri", - OCR_SERVER_URI_HOST "server_uri_host", - OCR_SERVER_URI_PATH "server_uri_path", - OCR_REQUEST_TOKEN_URI "request_token_uri", - OCR_AUTHORIZE_URI "authorize_uri", - OCR_ACCESS_TOKEN_URI "access_token_uri" - FROM OAUTH_CONSUMER_REGISTRY - WHERE ( OCR_CONSUMER_KEY LIKE '%'|| P_Q ||'%' - OR OCR_SERVER_URI LIKE '%'|| P_Q ||'%' - OR OCR_SERVER_URI_HOST LIKE '%'|| P_Q ||'%' - OR OCR_SERVER_URI_PATH LIKE '%'|| P_Q ||'%') - AND (OCR_USA_ID_REF = P_USER_ID OR OCR_USA_ID_REF IS NULL) - ORDER BY OCR_SERVER_URI_HOST, OCR_SERVER_URI_PATH; - -ELSE - - OPEN P_ROWS FOR - SELECT OCR_ID "id", - OCR_USA_ID_REF "user_id", - OCR_CONSUMER_KEY "consumer_key", - OCR_CONSUMER_SECRET "consumer_secret", - OCR_SIGNATURE_METHODS "signature_methods", - OCR_SERVER_URI "server_uri", - OCR_SERVER_URI_HOST "server_uri_host", - OCR_SERVER_URI_PATH "server_uri_path", - OCR_REQUEST_TOKEN_URI "request_token_uri", - OCR_AUTHORIZE_URI "authorize_uri", - OCR_ACCESS_TOKEN_URI "access_token_uri" - FROM OAUTH_CONSUMER_REGISTRY - WHERE OCR_USA_ID_REF = P_USER_ID OR OCR_USA_ID_REF IS NULL - ORDER BY OCR_SERVER_URI_HOST, OCR_SERVER_URI_PATH; - -END IF; - - - - - -EXCEPTION -WHEN OTHERS THEN --- CALL THE FUNCTION TO LOG ERRORS -ROLLBACK; -P_RESULT := 1; -- ERROR -END; -/ diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_LIST_SERVER_TOKENS.prc b/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_LIST_SERVER_TOKENS.prc deleted file mode 100644 index baa62c02e5348fa806e227a4d0ea5e33091057dd..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_LIST_SERVER_TOKENS.prc +++ /dev/null @@ -1,45 +0,0 @@ -CREATE OR REPLACE PROCEDURE SP_LIST_SERVER_TOKENS -( -P_USER_ID IN NUMBER, -P_ROWS OUT TYPES.REF_CURSOR, -P_RESULT OUT NUMBER -) -AS - - -- PROCEDURE TO Find the server details that might be used for a request -BEGIN -P_RESULT := 0; - -OPEN P_ROWS FOR - SELECT OCR_CONSUMER_KEY "consumer_key", - OCR_CONSUMER_SECRET "consumer_secret", - OCT_ID "token_id", - OCT_TOKEN "token", - OCT_TOKEN_SECRET "token_secret", - OCT_USA_ID_REF "user_id", - OCR_SIGNATURE_METHODS "signature_methods", - OCR_SERVER_URI "server_uri", - OCR_SERVER_URI_HOST "server_uri_host", - OCR_SERVER_URI_PATH "server_uri_path", - OCR_REQUEST_TOKEN_URI "request_token_uri", - OCR_AUTHORIZE_URI "authorize_uri", - OCR_ACCESS_TOKEN_URI "access_token_uri", - OCT_TIMESTAMP "timestamp" - FROM OAUTH_CONSUMER_REGISTRY - JOIN OAUTH_CONSUMER_TOKEN - ON OCT_OCR_ID_REF = OCR_ID - WHERE OCT_USA_ID_REF = P_USER_ID - AND OCT_TOKEN_TYPE = 'ACCESS' - AND OCT_TOKEN_TTL >= SYSDATE - ORDER BY OCR_SERVER_URI_HOST, OCR_SERVER_URI_PATH; - - - - -EXCEPTION -WHEN OTHERS THEN --- CALL THE FUNCTION TO LOG ERRORS -ROLLBACK; -P_RESULT := 1; -- ERROR -END; -/ diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_SET_CONSUMER_ACC_TOKEN_TTL.prc b/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_SET_CONSUMER_ACC_TOKEN_TTL.prc deleted file mode 100644 index e5a96c966ac1cc130fa0987dc313547a4eaff81f..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_SET_CONSUMER_ACC_TOKEN_TTL.prc +++ /dev/null @@ -1,28 +0,0 @@ -CREATE OR REPLACE PROCEDURE SP_SET_CONSUMER_ACC_TOKEN_TTL -( -P_TOKEN IN VARCHAR2, -P_TOKEN_TTL IN NUMBER, -P_RESULT OUT NUMBER -) -AS - - -- PROCEDURE TO Set the ttl of a consumer access token. This is done when the - -- server receives a valid request with a xoauth_token_ttl parameter in it. - -BEGIN - - P_RESULT := 0; - - UPDATE OAUTH_SERVER_TOKEN - SET OST_TOKEN_TTL = SYSDATE + (P_TOKEN_TTL/(24*60*60)) - WHERE OST_TOKEN = P_TOKEN - AND OST_TOKEN_TYPE = 'ACCESS'; - - -EXCEPTION -WHEN OTHERS THEN --- CALL THE FUNCTION TO LOG ERRORS -ROLLBACK; -P_RESULT := 1; -- ERROR -END; -/ diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_SET_SERVER_TOKEN_TTL.prc b/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_SET_SERVER_TOKEN_TTL.prc deleted file mode 100644 index 34a99de067414756ff4a39b6009ee8c94728feba..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_SET_SERVER_TOKEN_TTL.prc +++ /dev/null @@ -1,29 +0,0 @@ -CREATE OR REPLACE PROCEDURE SP_SET_SERVER_TOKEN_TTL -( -P_TOKEN_TTL IN NUMBER, -- IN SECOND -P_CONSUMER_KEY IN VARCHAR2, -P_TOKEN IN VARCHAR2, -P_RESULT OUT NUMBER -) -AS - - -- PROCEDURE TO Set the ttl of a server access token. - -BEGIN - - P_RESULT := 0; - - -UPDATE OAUTH_CONSUMER_TOKEN -SET OCT_TOKEN_TTL = SYSDATE + (P_TOKEN_TTL/(24*60*60)) -- DATE_ADD(NOW(), INTERVAL %D SECOND) -WHERE OCT_TOKEN = P_TOKEN -AND OCT_OCR_ID_REF IN (SELECT OCR_ID FROM OAUTH_CONSUMER_REGISTRY WHERE OCR_CONSUMER_KEY = P_CONSUMER_KEY); - - -EXCEPTION -WHEN OTHERS THEN --- CALL THE FUNCTION TO LOG ERRORS -ROLLBACK; -P_RESULT := 1; -- ERROR -END; -/ diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_UPDATE_CONSUMER.prc b/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_UPDATE_CONSUMER.prc deleted file mode 100644 index a79e64c3beb72883e46b6deb9260a002b5c9f770..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_UPDATE_CONSUMER.prc +++ /dev/null @@ -1,40 +0,0 @@ -CREATE OR REPLACE PROCEDURE SP_UPDATE_CONSUMER -( -P_OSR_USA_ID_REF IN NUMBER, -P_OSR_CONSUMER_KEY IN VARCHAR2, -P_OSR_CONSUMER_SECRET IN VARCHAR2, -P_OSR_REQUESTER_NAME IN VARCHAR2, -P_OSR_REQUESTER_EMAIL IN VARCHAR2, -P_OSR_CALLBACK_URI IN VARCHAR2, -P_OSR_APPLICATION_URI IN VARCHAR2, -P_OSR_APPLICATION_TITLE IN VARCHAR2, -P_OSR_APPLICATION_DESCR IN VARCHAR2, -P_OSR_APPLICATION_NOTES IN VARCHAR2, -P_OSR_APPLICATION_TYPE IN VARCHAR2, -P_OSR_APPLICATION_COMMERCIAL IN INTEGER, -P_RESULT OUT NUMBER -) -AS - - -- PROCEDURE TO Insert a new consumer with this server (we will be the server) -BEGIN -P_RESULT := 0; - - - INSERT INTO OAUTH_SERVER_REGISTRY - ( OSR_ID, OSR_ENABLED, OSR_STATUS,OSR_USA_ID_REF,OSR_CONSUMER_KEY, OSR_CONSUMER_SECRET,OSR_REQUESTER_NAME, - OSR_REQUESTER_EMAIL, OSR_CALLBACK_URI, OSR_APPLICATION_URI, OSR_APPLICATION_TITLE, OSR_APPLICATION_DESCR, - OSR_APPLICATION_NOTES, OSR_APPLICATION_TYPE, OSR_APPLICATION_COMMERCIAL, OSR_TIMESTAMP, OSR_ISSUE_DATE) - VALUES - ( SEQ_OSR_ID.NEXTVAL, 1, 'ACTIVE', P_OSR_USA_ID_REF, P_OSR_CONSUMER_KEY, P_OSR_CONSUMER_SECRET,P_OSR_REQUESTER_NAME, - P_OSR_REQUESTER_EMAIL, P_OSR_CALLBACK_URI, P_OSR_APPLICATION_URI, P_OSR_APPLICATION_TITLE, P_OSR_APPLICATION_DESCR, - P_OSR_APPLICATION_NOTES, P_OSR_APPLICATION_TYPE, P_OSR_APPLICATION_COMMERCIAL, SYSDATE, SYSDATE); - - -EXCEPTION -WHEN OTHERS THEN --- CALL THE FUNCTION TO LOG ERRORS -ROLLBACK; -P_RESULT := 1; -- ERROR -END; -/ diff --git a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_UPDATE_SERVER.prc b/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_UPDATE_SERVER.prc deleted file mode 100644 index 7826eb6249d14468a310414486ad45bbe40c7711..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/OracleDB/3_Procedures/SP_UPDATE_SERVER.prc +++ /dev/null @@ -1,139 +0,0 @@ -CREATE OR REPLACE PROCEDURE SP_UPDATE_SERVER -( -P_CONSUMER_KEY IN VARCHAR2, -P_USER_ID IN NUMBER, -P_OCR_ID IN NUMBER, -P_USER_IS_ADMIN IN NUMBER, -- 0:NO; 1:YES; -P_OCR_CONSUMER_SECRET IN VARCHAR2, -P_OCR_SERVER_URI IN VARCHAR2, -P_OCR_SERVER_URI_HOST IN VARCHAR2, -P_OCR_SERVER_URI_PATH IN VARCHAR2, -P_OCR_REQUEST_TOKEN_URI IN VARCHAR2, -P_OCR_AUTHORIZE_URI IN VARCHAR2, -P_OCR_ACCESS_TOKEN_URI IN VARCHAR2, -P_OCR_SIGNATURE_METHODS IN VARCHAR2, -P_OCR_USA_ID_REF IN NUMBER, -P_UPDATE_P_OCR_USA_ID_REF_FLAG IN NUMBER, -- 1:TRUE; 0:FALSE -P_RESULT OUT NUMBER -) -AS - - -- Add a request token we obtained from a server. -V_OCR_ID_EXIST NUMBER; -V_OCR_USA_ID_REF NUMBER; - -V_EXC_DUPLICATE_CONSUMER_KEY EXCEPTION; -V_EXC_UNAUTHORISED_USER_ID EXCEPTION; -BEGIN -P_RESULT := 0; - -V_OCR_USA_ID_REF := P_OCR_USA_ID_REF; - - IF P_OCR_ID IS NOT NULL THEN - BEGIN - SELECT 1 INTO V_OCR_ID_EXIST FROM DUAL WHERE EXISTS - (SELECT OCR_ID FROM OAUTH_CONSUMER_REGISTRY - WHERE OCR_CONSUMER_KEY = P_CONSUMER_KEY - AND OCR_ID != P_OCR_ID - AND (OCR_USA_ID_REF = P_USER_ID OR OCR_USA_ID_REF IS NULL)); - - EXCEPTION - WHEN NO_DATA_FOUND THEN - V_OCR_ID_EXIST :=0; - END; - ELSE - BEGIN - SELECT 1 INTO V_OCR_ID_EXIST FROM DUAL WHERE EXISTS - (SELECT OCR_ID FROM OAUTH_CONSUMER_REGISTRY - WHERE OCR_CONSUMER_KEY = P_CONSUMER_KEY - AND (OCR_USA_ID_REF = P_USER_ID OR OCR_USA_ID_REF IS NULL)); - - EXCEPTION - WHEN NO_DATA_FOUND THEN - V_OCR_ID_EXIST :=0; - END; - END IF; - - IF V_OCR_ID_EXIST = 1 THEN - RAISE V_EXC_DUPLICATE_CONSUMER_KEY; - END IF; - - - IF P_OCR_ID IS NOT NULL THEN - IF P_USER_IS_ADMIN != 1 THEN - BEGIN - SELECT OCR_USA_ID_REF INTO V_OCR_USA_ID_REF - FROM OAUTH_CONSUMER_REGISTRY - WHERE OCR_ID = P_OCR_ID; - - EXCEPTION - WHEN NO_DATA_FOUND THEN - NULL; - END; - - IF V_OCR_USA_ID_REF != P_USER_ID THEN - RAISE V_EXC_UNAUTHORISED_USER_ID; - END IF; - END IF; - - IF P_UPDATE_P_OCR_USA_ID_REF_FLAG = 0 THEN - - UPDATE OAUTH_CONSUMER_REGISTRY - SET OCR_CONSUMER_KEY = P_CONSUMER_KEY, - OCR_CONSUMER_SECRET = P_OCR_CONSUMER_SECRET, - OCR_SERVER_URI = P_OCR_SERVER_URI, - OCR_SERVER_URI_HOST = P_OCR_SERVER_URI_HOST, - OCR_SERVER_URI_PATH = P_OCR_SERVER_URI_PATH, - OCR_TIMESTAMP = SYSDATE, - OCR_REQUEST_TOKEN_URI = P_OCR_REQUEST_TOKEN_URI, - OCR_AUTHORIZE_URI = P_OCR_AUTHORIZE_URI, - OCR_ACCESS_TOKEN_URI = P_OCR_ACCESS_TOKEN_URI, - OCR_SIGNATURE_METHODS = P_OCR_SIGNATURE_METHODS - WHERE OCR_ID = P_OCR_ID; - - ELSIF P_UPDATE_P_OCR_USA_ID_REF_FLAG = 1 THEN - UPDATE OAUTH_CONSUMER_REGISTRY - SET OCR_CONSUMER_KEY = P_CONSUMER_KEY, - OCR_CONSUMER_SECRET = P_OCR_CONSUMER_SECRET, - OCR_SERVER_URI = P_OCR_SERVER_URI, - OCR_SERVER_URI_HOST = P_OCR_SERVER_URI_HOST, - OCR_SERVER_URI_PATH = P_OCR_SERVER_URI_PATH, - OCR_TIMESTAMP = SYSDATE, - OCR_REQUEST_TOKEN_URI = P_OCR_REQUEST_TOKEN_URI, - OCR_AUTHORIZE_URI = P_OCR_AUTHORIZE_URI, - OCR_ACCESS_TOKEN_URI = P_OCR_ACCESS_TOKEN_URI, - OCR_SIGNATURE_METHODS = P_OCR_SIGNATURE_METHODS, - OCR_USA_ID_REF = P_OCR_USA_ID_REF - WHERE OCR_ID = P_OCR_ID; - - END IF; - - ELSE - IF P_UPDATE_P_OCR_USA_ID_REF_FLAG = 0 THEN - V_OCR_USA_ID_REF := P_USER_ID; - END IF; - - INSERT INTO OAUTH_CONSUMER_REGISTRY - (OCR_ID, OCR_CONSUMER_KEY ,OCR_CONSUMER_SECRET, OCR_SERVER_URI, OCR_SERVER_URI_HOST, OCR_SERVER_URI_PATH, - OCR_TIMESTAMP, OCR_REQUEST_TOKEN_URI, OCR_AUTHORIZE_URI, OCR_ACCESS_TOKEN_URI, OCR_SIGNATURE_METHODS, - OCR_USA_ID_REF) - VALUES - (SEQ_OCR_ID.NEXTVAL, P_CONSUMER_KEY, P_OCR_CONSUMER_SECRET, P_OCR_SERVER_URI, P_OCR_SERVER_URI_HOST, P_OCR_SERVER_URI_PATH, - SYSDATE, P_OCR_REQUEST_TOKEN_URI, P_OCR_AUTHORIZE_URI, P_OCR_ACCESS_TOKEN_URI, P_OCR_SIGNATURE_METHODS, - V_OCR_USA_ID_REF); - - END IF; - - -EXCEPTION -WHEN V_EXC_DUPLICATE_CONSUMER_KEY THEN -P_RESULT := 2; -- DUPLICATE_CONSUMER_KEY -WHEN V_EXC_UNAUTHORISED_USER_ID THEN -P_RESULT := 3; -- UNAUTHORISED_USER_ID - -WHEN OTHERS THEN --- CALL THE FUNCTION TO LOG ERRORS -ROLLBACK; -P_RESULT := 1; -- ERROR -END; -/ diff --git a/vendor/oauth-php/library/store/oracle/install.php b/vendor/oauth-php/library/store/oracle/install.php deleted file mode 100644 index 5a80f040236bcd55b786d2db88aff8eaf0952fd0..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/oracle/install.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php - - -/** - Added by Vinay Kant Sahu. -vinaykant.sahu@gmail.com - * Storage container for the oauth credentials, both server and consumer side. - * Based on Oracle - * - - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - - - - */ - -echo 'Right now we do not have Oracle DB installer. -Please find OracleDB folder here with this Table, Sequences and Procedures. You need to manually install/create DB schema and SP with your oracle DB. '; -?> \ No newline at end of file diff --git a/vendor/oauth-php/library/store/postgresql/pgsql.sql b/vendor/oauth-php/library/store/postgresql/pgsql.sql deleted file mode 100644 index 8f0e4d3e2c6db997a38a561e27e3bce05c27a8df..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/library/store/postgresql/pgsql.sql +++ /dev/null @@ -1,166 +0,0 @@ -# -# Log table to hold all OAuth request when you enabled logging -# - -CREATE TABLE oauth_log ( - olg_id serial primary key, - olg_osr_consumer_key varchar(64), - olg_ost_token varchar(64), - olg_ocr_consumer_key varchar(64), - olg_oct_token varchar(64), - olg_usa_id_ref text, - olg_received text not null, - olg_sent text not null, - olg_base_string text not null, - olg_notes text not null, - olg_timestamp timestamp not null default current_timestamp, - olg_remote_ip inet not null -); - -COMMENT ON TABLE oauth_log IS 'Log table to hold all OAuth request when you enabled logging'; - - -# -# /////////////////// CONSUMER SIDE /////////////////// -# - -# This is a registry of all consumer codes we got from other servers -# The consumer_key/secret is obtained from the server -# We also register the server uri, so that we can find the consumer key and secret -# for a certain server. From that server we can check if we have a token for a -# particular user. - -CREATE TABLE oauth_consumer_registry ( - ocr_id serial primary key, - ocr_usa_id_ref text, - ocr_consumer_key varchar(128) not null, - ocr_consumer_secret varchar(128) not null, - ocr_signature_methods varchar(255) not null default 'HMAC-SHA1,PLAINTEXT', - ocr_server_uri varchar(255) not null, - ocr_server_uri_host varchar(128) not null, - ocr_server_uri_path varchar(128) not null, - - ocr_request_token_uri varchar(255) not null, - ocr_authorize_uri varchar(255) not null, - ocr_access_token_uri varchar(255) not null, - ocr_timestamp timestamp not null default current_timestamp, - - unique (ocr_consumer_key, ocr_usa_id_ref, ocr_server_uri) -); - -COMMENT ON TABLE oauth_consumer_registry IS 'This is a registry of all consumer codes we got from other servers'; - -# Table used to sign requests for sending to a server by the consumer -# The key is defined for a particular user. Only one single named -# key is allowed per user/server combination - --- Create enum type token_type -CREATE TYPE consumer_token_type AS ENUM ( - 'request', - 'authorized', - 'access' -); - -CREATE TABLE oauth_consumer_token ( - oct_id serial primary key, - oct_ocr_id_ref integer not null, - oct_usa_id_ref text not null, - oct_name varchar(64) not null default '', - oct_token varchar(64) not null, - oct_token_secret varchar(64) not null, - oct_token_type consumer_token_type, - oct_token_ttl timestamp not null default timestamp '9999-12-31', - oct_timestamp timestamp not null default current_timestamp, - - unique (oct_ocr_id_ref, oct_token), - unique (oct_usa_id_ref, oct_ocr_id_ref, oct_token_type, oct_name), - - foreign key (oct_ocr_id_ref) references oauth_consumer_registry (ocr_id) - on update cascade - on delete cascade -); - - -COMMENT ON TABLE oauth_consumer_token IS 'Table used to sign requests for sending to a server by the consumer'; - -# -# ////////////////// SERVER SIDE ///////////////// -# - -# Table holding consumer key/secret combos an user issued to consumers. -# Used for verification of incoming requests. - -CREATE TABLE oauth_server_registry ( - osr_id serial primary key, - osr_usa_id_ref text, - osr_consumer_key varchar(64) not null, - osr_consumer_secret varchar(64) not null, - osr_enabled boolean not null default true, - osr_status varchar(16) not null, - osr_requester_name varchar(64) not null, - osr_requester_email varchar(64) not null, - osr_callback_uri varchar(255) not null, - osr_application_uri varchar(255) not null, - osr_application_title varchar(80) not null, - osr_application_descr text not null, - osr_application_notes text not null, - osr_application_type varchar(20) not null, - osr_application_commercial boolean not null default false, - osr_issue_date timestamp not null, - osr_timestamp timestamp not null default current_timestamp, - - unique (osr_consumer_key) -); - - -COMMENT ON TABLE oauth_server_registry IS 'Table holding consumer key/secret combos an user issued to consumers'; - -# Nonce used by a certain consumer, every used nonce should be unique, this prevents -# replaying attacks. We need to store all timestamp/nonce combinations for the -# maximum timestamp received. - -CREATE TABLE oauth_server_nonce ( - osn_id serial primary key, - osn_consumer_key varchar(64) not null, - osn_token varchar(64) not null, - osn_timestamp bigint not null, - osn_nonce varchar(80) not null, - - unique (osn_consumer_key, osn_token, osn_timestamp, osn_nonce) -); - - -COMMENT ON TABLE oauth_server_nonce IS 'Nonce used by a certain consumer, every used nonce should be unique, this prevents replaying attacks'; - -# Table used to verify signed requests sent to a server by the consumer -# When the verification is succesful then the associated user id is returned. - --- Create enum type token_type -CREATE TYPE server_token_type AS ENUM ( - 'request', - 'access' -); - -CREATE TABLE oauth_server_token ( - ost_id serial primary key, - ost_osr_id_ref integer not null, - ost_usa_id_ref text not null, - ost_token varchar(64) not null, - ost_token_secret varchar(64) not null, - ost_token_type server_token_type, - ost_authorized boolean not null default false, - ost_referrer_host varchar(128) not null default '', - ost_token_ttl timestamp not null default timestamp '9999-12-31', - ost_timestamp timestamp not null default current_timestamp, - ost_verifier char(10), - ost_callback_url varchar(512), - - unique (ost_token), - - foreign key (ost_osr_id_ref) references oauth_server_registry (osr_id) - on update cascade - on delete cascade -); - - -COMMENT ON TABLE oauth_server_token IS 'Table used to verify signed requests sent to a server by the consumer'; diff --git a/vendor/oauth-php/test/discovery/xrds-fireeagle.xrds b/vendor/oauth-php/test/discovery/xrds-fireeagle.xrds deleted file mode 100644 index 0f5eba222359b9906012e6a8fdcc542156a65db7..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/test/discovery/xrds-fireeagle.xrds +++ /dev/null @@ -1,78 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<XRDS xmlns="xri://$xrds"> - - <!-- FireEagle User-Centric OAuth Configuration --> - <XRD xml:id="oauth" xmlns:simple="http://xrds-simple.net/core/1.0" xmlns="xri://$XRD*($v*2.0)" version="2.0"> - - <Type>xri://$xrds*simple</Type> - <Expires>2008-04-15T00:25:30-07:00</Expires> - - <!-- Request Token --> - <Service> - <Type>http://oauth.net/core/1.0/endpoint/request</Type> - - <Type>http://oauth.net/core/1.0/parameters/auth-header</Type> - <Type>http://oauth.net/core/1.0/parameters/post-body</Type> - <Type>http://oauth.net/core/1.0/parameters/uri-query</Type> - <Type>http://oauth.net/core/1.0/signature/HMAC-SHA1</Type> - <Type>http://oauth.net/core/1.0/signature/PLAINTEXT</Type> - - <URI>https://fireeagle.yahooapis.com/oauth/request_token</URI> - </Service> - - <!-- User Authorization --> - <Service> - <Type>http://oauth.net/core/1.0/endpoint/authorize</Type> - - <Type>http://oauth.net/core/1.0/parameters/auth-header</Type> - <Type>http://oauth.net/core/1.0/parameters/uri-query</Type> - - <URI>https://fireeagle.yahooapis.com/oauth/access_token</URI> - </Service> - - <!-- Access Token --> - <Service> - <Type>http://oauth.net/core/1.0/endpoint/access</Type> - - <Type>http://oauth.net/core/1.0/parameters/auth-header</Type> - <Type>http://oauth.net/core/1.0/parameters/post-body</Type> - <Type>http://oauth.net/core/1.0/parameters/uri-query</Type> - <Type>http://oauth.net/core/1.0/signature/HMAC-SHA1</Type> - <Type>http://oauth.net/core/1.0/signature/PLAINTEXT</Type> - - <URI>http://fireeagle.yahoo.net/oauth/authorize</URI> - </Service> - - <!-- Protected Resources --> - <Service> - <Type>http://oauth.net/core/1.0/endpoint/resource</Type> - - <Type>http://oauth.net/core/1.0/parameters/auth-header</Type> - <Type>http://oauth.net/core/1.0/parameters/post-body</Type> - <Type>http://oauth.net/core/1.0/parameters/uri-query</Type> - <Type>http://oauth.net/core/1.0/signature/HMAC-SHA1</Type> - <Type>http://oauth.net/core/1.0/signature/PLAINTEXT</Type> - </Service> - - <!-- Consumer Identity --> - - <!-- Manual Consumer Identity Allocation --> - <Service> - <Type>http://oauth.net/discovery/1.0/consumer-identity/oob</Type> - <URI>https://fireeagle.yahoo.net/developer/create</URI> - </Service> - </XRD> - - <!-- Global Resource Definition --> - - <XRD xmlns="xri://$XRD*($v*2.0)" version="2.0"> - <Type>xri://$xrds*simple</Type> - - <!-- OAuth Endpoints Definition --> - <Service> - <Type>http://oauth.net/discovery/1.0</Type> - <URI>#oauth</URI> - </Service> - </XRD> - -</XRDS> \ No newline at end of file diff --git a/vendor/oauth-php/test/discovery/xrds-getsatisfaction.xrds b/vendor/oauth-php/test/discovery/xrds-getsatisfaction.xrds deleted file mode 100644 index ab94b5bea1a4dbd0c35a31f4004b4223172c7ec4..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/test/discovery/xrds-getsatisfaction.xrds +++ /dev/null @@ -1,73 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<XRDS xmlns="xri://$xrds"> - - <XRD xml:id="oauth" xmlns:simple="http://xrds-simple.net/core/1.0" xmlns="xri://$XRD*($v*2.0)" version="2.0"> - <Type>xri://$xrds*simple</Type> - <Expires>2008-04-30T23:59:59Z</Expires> - - <!-- Request Token --> - <Service> - <Type>http://oauth.net/core/1.0/endpoint/request</Type> - - <Type>http://oauth.net/core/1.0/parameters/auth-header</Type> - <Type>http://oauth.net/core/1.0/signature/HMAC-SHA1</Type> - - <URI>http://getsatisfaction.com/api/request_token</URI> - </Service> - - <Service> - <Type>http://oauth.net/core/1.0/endpoint/authorize</Type> - - <Type>http://oauth.net/core/1.0/parameters/uri-query</Type> - - <URI>http://getsatisfaction.com/api/authorize</URI> - </Service> - - <!-- Access Token --> - <Service> - <Type>http://oauth.net/core/1.0/endpoint/access</Type> - - <Type>http://oauth.net/core/1.0/parameters/auth-header</Type> - <Type>http://oauth.net/core/1.0/signature/HMAC-SHA1</Type> - - <URI>http://getsatisfaction.com/api/access_token</URI> - </Service> - - <!-- Protected Resources --> - <!-- - - To test successful access token grant, make a request against - - http://api.getsatisfaction.com/me - - The API should respond with hCard of the user who authorized the token - --> - <Service> - <Type>http://oauth.net/core/1.0/endpoint/resource</Type> - - <Type>http://oauth.net/core/1.0/parameters/auth-header</Type> - <Type>http://oauth.net/core/1.0/signature/HMAC-SHA1</Type> - - </Service> - - <!-- Consumer Identity --> - - <Service> - <Type>http://oauth.net/discovery/1.0/consumer-identity/oob</Type> - <URI>http://getsatisfaction.com/me/extensions/new</URI> - </Service> - </XRD> - - <!-- Global Resource Definition --> - - <XRD xmlns="xri://$XRD*($v*2.0)" version="2.0"> - <Type>xri://$xrds*simple</Type> - - <!-- OAuth Endpoints Definition --> - <Service priority="10"> - <Type>http://oauth.net/discovery/1.0</Type> - <URI>#oauth</URI> - </Service> - </XRD> - -</XRDS> \ No newline at end of file diff --git a/vendor/oauth-php/test/discovery/xrds-magnolia.xrds b/vendor/oauth-php/test/discovery/xrds-magnolia.xrds deleted file mode 100644 index 361b5c9a16d189376111a08fb2fbd41c3a5783f8..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/test/discovery/xrds-magnolia.xrds +++ /dev/null @@ -1,81 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<XRDS xmlns="xri://$xrds"> - - <!-- Ma.gnolia OAuth Configuration --> - <XRD xml:id="oauth" xmlns="xri://$XRD*($v*2.0)" version="2.0"> - - <Type>xri://$xrds*simple</Type> - <Expires>2008-04-13T07:34:58Z</Expires> - - <!-- Request Token --> - <Service> - <Type>http://oauth.net/core/1.0/endpoint/request</Type> - - <Type>http://oauth.net/core/1.0/parameters/auth-header</Type> - <Type>http://oauth.net/core/1.0/parameters/post-body</Type> - <Type>http://oauth.net/core/1.0/parameters/uri-query</Type> - <Type>http://oauth.net/core/1.0/signature/HMAC-SHA1</Type> - <Type>http://oauth.net/core/1.0/signature/RSA-SHA1</Type> - <Type>http://oauth.net/core/1.0/signature/PLAINTEXT</Type> - - <URI>https://ma.gnolia.com/oauth/get_request_token</URI> - </Service> - - <!-- User Authorization (HTTPS Prefered) --> - <Service> - <Type>http://oauth.net/core/1.0/endpoint/authorize</Type> - - <Type>http://oauth.net/core/1.0/parameters/auth-header</Type> - <Type>http://oauth.net/core/1.0/parameters/uri-query</Type> - - <URI priority="10">https://ma.gnolia.com/oauth/authorize</URI> - <URI priority="20">http://ma.gnolia.com/oauth/authorize</URI> - </Service> - - <!-- Access Token --> - <Service> - <Type>http://oauth.net/core/1.0/endpoint/access</Type> - - <Type>http://oauth.net/core/1.0/parameters/auth-header</Type> - <Type>http://oauth.net/core/1.0/parameters/post-body</Type> - <Type>http://oauth.net/core/1.0/parameters/uri-query</Type> - <Type>http://oauth.net/core/1.0/signature/HMAC-SHA1</Type> - <Type>http://oauth.net/core/1.0/signature/RSA-SHA1</Type> - <Type>http://oauth.net/core/1.0/signature/PLAINTEXT</Type> - - <URI>https://ma.gnolia.com/oauth/get_access_token</URI> - </Service> - - <!-- Protected Resources --> - <Service> - <Type>http://oauth.net/core/1.0/endpoint/resource</Type> - - <Type>http://oauth.net/core/1.0/parameters/auth-header</Type> - <Type>http://oauth.net/core/1.0/parameters/post-body</Type> - <Type>http://oauth.net/core/1.0/parameters/uri-query</Type> - <Type>http://oauth.net/core/1.0/signature/HMAC-SHA1</Type> - <Type>http://oauth.net/core/1.0/signature/RSA-SHA1</Type> - </Service> - - <!-- Consumer Identity --> - - <!-- Manual Consumer Identity Allocation --> - <Service> - <Type>http://oauth.net/discovery/1.0/consumer-identity/oob</Type> - <URI>http://ma.gnolia.com/applications/new</URI> - </Service> - </XRD> - - <!-- Global Resource Definition --> - - <XRD xmlns="xri://$XRD*($v*2.0)" version="2.0"> - <Type>xri://$xrds*simple</Type> - - <!-- OAuth Endpoints Definition --> - <Service priority="10"> - <Type>http://oauth.net/discovery/1.0</Type> - <URI>#oauth</URI> - </Service> - </XRD> - -</XRDS> \ No newline at end of file diff --git a/vendor/oauth-php/test/oauth_test.php b/vendor/oauth-php/test/oauth_test.php deleted file mode 100644 index c7d174b8c4fcddd5afd1365aad4cc7a5296f9ccd..0000000000000000000000000000000000000000 --- a/vendor/oauth-php/test/oauth_test.php +++ /dev/null @@ -1,188 +0,0 @@ -<?php - -/** - * Tests of OAuth implementation. - * - * @version $Id$ - * @author Marc Worrell <marcw@pobox.com> - * @date Nov 29, 2007 3:46:56 PM - * @see http://wiki.oauth.net/TestCases - * - * The MIT License - * - * Copyright (c) 2007-2008 Mediamatic Lab - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -require_once dirname(__FILE__) . '/../library/OAuthRequest.php'; -require_once dirname(__FILE__) . '/../library/OAuthRequester.php'; -require_once dirname(__FILE__) . '/../library/OAuthRequestSigner.php'; -require_once dirname(__FILE__) . '/../library/OAuthRequestVerifier.php'; - -if (!function_exists('getallheaders')) -{ - function getallheaders() - { - return array(); - } -} - - -oauth_test(); - -function oauth_test () -{ - error_reporting(E_ALL); - - header('Content-Type: text/plain; charset=utf-8'); - - echo "Performing OAuth module tests.\n\n"; - echo "See also: http://wiki.oauth.net/TestCases\n\n"; - - assert_options(ASSERT_CALLBACK, 'oauth_assert_handler'); - assert_options(ASSERT_WARNING, 0); - - $req = new OAuthRequest('http://www.example.com', 'GET'); - - echo "***** Parameter Encoding *****\n\n"; - - assert('$req->urlencode(\'abcABC123\') == \'abcABC123\''); - assert('$req->urlencode(\'-._~\') == \'-._~\''); - assert('$req->urlencode(\'%\') == \'%25\''); - assert('$req->urlencode(\'&=*\') == \'%26%3D%2A\''); - assert('$req->urlencode(\'&=*\') == \'%26%3D%2A\''); - assert('$req->urlencode("\n") == \'%0A\''); - assert('$req->urlencode(" ") == \'%20\''); - assert('$req->urlencode("\x7f") == \'%7F\''); - - - echo "***** Normalize Request Parameters *****\n\n"; - - $req = new OAuthRequest('http://example.com/?name', 'GET'); - assert('$req->getNormalizedParams() == \'name=\''); - - $req = new OAuthRequest('http://example.com/?a=b', 'GET'); - assert('$req->getNormalizedParams() == \'a=b\''); - - $req = new OAuthRequest('http://example.com/?a=b&c=d', 'GET'); - assert('$req->getNormalizedParams() == \'a=b&c=d\''); - - // At this moment we don't support two parameters with the same name - // so I changed this test case to "a=" and "b=" and not "a=" and "a=" - $req = new OAuthRequest('http://example.com/?b=x!y&a=x+y', 'GET'); - assert('$req->getNormalizedParams() == \'a=x%2By&b=x%21y\''); - - $req = new OAuthRequest('http://example.com/?x!y=a&x=a', 'GET'); - assert('$req->getNormalizedParams() == \'x=a&x%21y=a\''); - - - echo "***** Base String *****\n\n"; - - $req = new OAuthRequest('http://example.com/?n=v', 'GET'); - assert('$req->signatureBaseString() == \'GET&http%3A%2F%2Fexample.com%2F&n%3Dv\''); - - $req = new OAuthRequest( - 'https://photos.example.net/request_token', - 'POST', - 'oauth_version=1.0&oauth_consumer_key=dpf43f3p2l4k3l03&oauth_timestamp=1191242090&oauth_nonce=hsu94j3884jdopsl&oauth_signature_method=PLAINTEXT&oauth_signature=ignored', - array('X-OAuth-Test' => true)); - assert('$req->signatureBaseString() == \'POST&https%3A%2F%2Fphotos.example.net%2Frequest_token&oauth_consumer_key%3Ddpf43f3p2l4k3l03%26oauth_nonce%3Dhsu94j3884jdopsl%26oauth_signature_method%3DPLAINTEXT%26oauth_timestamp%3D1191242090%26oauth_version%3D1.0\''); - - $req = new OAuthRequest( - 'http://photos.example.net/photos?file=vacation.jpg&size=original&oauth_version=1.0&oauth_consumer_key=dpf43f3p2l4k3l03&oauth_token=nnch734d00sl2jdk&oauth_timestamp=1191242096&oauth_nonce=kllo9940pd9333jh&oauth_signature=ignored&oauth_signature_method=HMAC-SHA1', - 'GET'); - assert('$req->signatureBaseString() == \'GET&http%3A%2F%2Fphotos.example.net%2Fphotos&file%3Dvacation.jpg%26oauth_consumer_key%3Ddpf43f3p2l4k3l03%26oauth_nonce%3Dkllo9940pd9333jh%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1191242096%26oauth_token%3Dnnch734d00sl2jdk%26oauth_version%3D1.0%26size%3Doriginal\''); - - - echo "***** HMAC-SHA1 *****\nRequest signing\n"; - - OAuthStore::instance('MySQL', array('conn'=>false)); - $req = new OAuthRequestSigner('http://photos.example.net/photos?file=vacation.jpg&size=original', 'GET'); - - assert('$req->urldecode($req->calculateDataSignature(\'bs\', \'cs\', \'\', \'HMAC-SHA1\')) == \'egQqG5AJep5sJ7anhXju1unge2I=\''); - assert('$req->urldecode($req->calculateDataSignature(\'bs\', \'cs\', \'ts\', \'HMAC-SHA1\')) == \'VZVjXceV7JgPq/dOTnNmEfO0Fv8=\''); - - $secrets = array( - 'consumer_key' => 'dpf43f3p2l4k3l03', - 'consumer_secret' => 'kd94hf93k423kf44', - 'token' => 'nnch734d00sl2jdk', - 'token_secret' => 'pfkkdhi9sl3r4s00', - 'signature_methods' => array('HMAC-SHA1'), - 'nonce' => 'kllo9940pd9333jh', - 'timestamp' => '1191242096' - ); - $req->sign(0, $secrets); - assert('$req->getParam(\'oauth_signature\', true) == \'tR3+Ty81lMeYAr/Fid0kMTYa/WM=\''); - - echo "***** HMAC-SHA1 *****\nRequest verification\n"; - - $req = new OAuthRequestVerifier( - 'http://photos.example.net/photos?file=vacation.jpg&size=original' - .'&oauth_consumer_key=dpf43f3p2l4k3l03&oauth_token=nnch734d00sl2jdk' - .'&oauth_signature_method=HMAC-SHA1&oauth_nonce=kllo9940pd9333jh' - .'&oauth_timestamp=1191242096&oauth_version=1.0' - .'&oauth_signature='.rawurlencode('tR3+Ty81lMeYAr/Fid0kMTYa/WM=') - , 'GET'); - - $req->verifySignature('kd94hf93k423kf44', 'pfkkdhi9sl3r4s00'); - - echo "\n"; - echo "***** Yahoo! test case ******\n\n"; - - OAuthStore::instance('MySQL', array('conn'=>false)); - $req = new OAuthRequestSigner('http://example.com:80/photo', 'GET'); - - $req->setParam('title', 'taken with a 30% orange filter'); - $req->setParam('file', 'mountain & water view'); - $req->setParam('format', 'jpeg'); - $req->setParam('include', array('date','aperture')); - - $secrets = array( - 'consumer_key' => '1234=asdf=4567', - 'consumer_secret' => 'erks823*43=asd&123ls%23', - 'token' => 'asdf-4354=asew-5698', - 'token_secret' => 'dis9$#$Js009%==', - 'signature_methods' => array('HMAC-SHA1'), - 'nonce' => '3jd834jd9', - 'timestamp' => '12303202302' - ); - $req->sign(0, $secrets); - - // echo "Basestring:\n",$req->signatureBaseString(), "\n\n"; - - //echo "queryString:\n",$req->getQueryString(), "\n\n"; - assert('$req->getQueryString() == \'title=taken%20with%20a%2030%25%20orange%20filter&file=mountain%20%26%20water%20view&format=jpeg&include=date&include=aperture\''); - - //echo "oauth_signature:\n",$req->getParam('oauth_signature', true),"\n\n"; - assert('$req->getParam(\'oauth_signature\', true) == \'jMdUSR1vOr3SzNv3gZ5DDDuGirA=\''); - - echo "\n\nFinished.\n"; -} - - -function oauth_assert_handler ( $file, $line, $code ) -{ - echo "\nAssertion failed in $file:$line - $code\n\n"; -} - -/* vi:set ts=4 sts=4 sw=4 binary noeol: */ - -?> \ No newline at end of file