Skip to content

Commit

Permalink
MDL-58126 googledocs: Re-implement the google docs repo
Browse files Browse the repository at this point in the history
Use latest REST API (v3) - but avoid the google client libraries
(too big, too much to update, not integrated with auth).

Part of MDL-58220
  • Loading branch information
Damyon Wiese committed Apr 3, 2017
1 parent 2991124 commit 0e59638
Show file tree
Hide file tree
Showing 10 changed files with 372 additions and 167 deletions.
2 changes: 1 addition & 1 deletion admin/tool/oauth2/settings.php
Expand Up @@ -25,6 +25,6 @@
defined('MOODLE_INTERNAL') || die;

if ($hassiteconfig) {
$ADMIN->add('server', new admin_externalpage('oauth2', new lang_string('pluginname','tool_oauth2'),
$ADMIN->add('server', new admin_externalpage('oauth2', new lang_string('pluginname', 'tool_oauth2'),
"$CFG->wwwroot/$CFG->admin/tool/oauth2/issuers.php"));
}
2 changes: 1 addition & 1 deletion auth/oauth2/auth.php
Expand Up @@ -27,7 +27,7 @@
require_once($CFG->libdir.'/authlib.php');

/**
* Plugin for oauth2 authentication.
* Plugin for oauth2 authentication.
*
* @package auth_oauth2
* @copyright 2017 Damyon Wiese
Expand Down
4 changes: 4 additions & 0 deletions auth/oauth2/login.php
Expand Up @@ -37,6 +37,10 @@
$client = \core\oauth2\api::get_user_oauth_client($issuer, $returnurl);

if ($client) {
if (!$client->is_logged_in()) {
redirect($client->get_login_url());
}

$auth = new \auth_oauth2\auth();
$auth->complete_login($client, $wantsurl);
} else {
Expand Down
3 changes: 0 additions & 3 deletions lib/classes/oauth2/api.php
Expand Up @@ -321,9 +321,6 @@ public static function get_system_oauth_client(issuer $issuer) {
public static function get_user_oauth_client(issuer $issuer, moodle_url $currenturl, $additionalscopes = '') {
$client = new \core\oauth2\client($issuer, $currenturl, $additionalscopes);

if (!$client->is_logged_in()) {
redirect($client->get_login_url());
}
return $client;
}

Expand Down
105 changes: 105 additions & 0 deletions lib/classes/oauth2/rest.php
@@ -0,0 +1,105 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle 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 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.

/**
* Rest API base class mapping rest api methods to endpoints with http methods, args and post body.
*
* @package core
* @copyright 2017 Damyon Wiese
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace core\oauth2;

use curl;
use coding_exception;

defined('MOODLE_INTERNAL') || die();

require_once($CFG->libdir . '/filelib.php');

/**
* Rest API base class mapping rest api methods to endpoints with http methods, args and post body.
*
* @copyright 2017 Damyon Wiese
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
abstract class rest {

/** @var curl $curl */
private $curl;

/**
* Constructor.
*
* @param curl $curl
*/
public function __construct(curl $curl) {
$this->curl = $curl;
}

/**
* Abstract function to define the functions of the rest API.
*
* @return array Example:
* [ 'listFiles' => [ 'method' => 'get', 'args' => [ 'folder' => PARAM_STRING ], 'response' => 'json' ] ]
*/
public abstract function get_api_functions();

/**
* Call a function from the Api with a set of arguments and optional data.
*
* @param string $functionname
* @param array $functionargs
*/
public function call($functionname, $functionargs) {
$functions = $this->get_api_functions();
$supportedmethods = [ 'get', 'put', 'post', 'patch', 'head', 'delete' ];
if (empty($functions[$functionname])) {
throw new coding_exception('unsupported api functionname: ' . $functionname);
}

$method = $functions[$functionname]['method'];
$endpoint = $functions[$functionname]['endpoint'];
$responsetype = $functions[$functionname]['response'];
if (!in_array($method, $supportedmethods)) {
throw new coding_exception('unsupported api method: ' . $method);
}

$args = $functions[$functionname]['args'];
$callargs = [];
foreach ($args as $argname => $argtype) {
if (isset($functionargs[$argname])) {
$callargs[$argname] = clean_param($functionargs[$argname], $argtype);
}
}

$response = $this->curl->$method($endpoint, $callargs);

if ($this->curl->errno == 0) {
if ($responsetype == 'json') {
$json = json_decode($response);

if (!empty($json->error)) {
throw new rest_exception($json->error->message, $json->error->code);
}
return $json;
}
return $response;
} else {
throw new rest_exception($this->curl->error, $this->curl->errno);
}
}
}
40 changes: 40 additions & 0 deletions lib/classes/oauth2/rest_exception.php
@@ -0,0 +1,40 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle 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 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.

/**
* Rest Exception class containing error code and message.
*
* @package core
* @copyright 2017 Damyon Wiese
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace core\oauth2;

use Exception;

defined('MOODLE_INTERNAL') || die();

require_once($CFG->libdir . '/filelib.php');

/**
* Rest Exception class containing error code and message.
*
* @copyright 2017 Damyon Wiese
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class rest_exception extends Exception {

}
60 changes: 60 additions & 0 deletions repository/googledocs/classes/rest.php
@@ -0,0 +1,60 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle 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 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.

/**
* Google Drive Rest API.
*
* @package repository_googledocs
* @copyright 2017 Damyon Wiese
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace repository_googledocs;

defined('MOODLE_INTERNAL') || die();

/**
* Google Drive Rest API.
*
* @copyright 2017 Damyon Wiese
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class rest extends \core\oauth2\rest {

/**
* Define the functions of the rest API.
*
* @return array Example:
* [ 'listFiles' => [ 'method' => 'get', 'endpoint' => 'http://...', 'args' => [ 'folder' => PARAM_STRING ] ] ]
*/
public function get_api_functions() {
return [
'list' => [
'endpoint' => 'https://www.googleapis.com/drive/v3/files',
'method' => 'get',
'args' => [
'corpus' => PARAM_RAW,
'orderBy' => PARAM_RAW,
'fields' => PARAM_RAW,
'pageSize' => PARAM_INT,
'pageToken' => PARAM_RAW,
'q' => PARAM_RAW,
'spaces' => PARAM_RAW
],
'response' => 'json'
]
];
}
}
14 changes: 10 additions & 4 deletions repository/googledocs/lang/en/repository_googledocs.php
Expand Up @@ -22,15 +22,21 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/

$string['clientid'] = 'Client ID';
$string['configplugin'] = 'Configure Google Drive plugin';
$string['docsformat'] = 'Default document import format';
$string['drawingformat'] = 'Default drawing import format';
$string['googledocs:view'] = 'View Google Drive repository';
$string['importformat'] = 'Configure the default import formats from google';
$string['oauthinfo'] = '<p>To use this plugin, you must register your site with Google, as described in the documentation <a href="{$a->docsurl}">Google OAuth 2.0 setup</a>.</p><p>As part of the registration process, you will need to enter the following URL as \'Authorized Redirect URIs\':</p><p>{$a->callbackurl}</p><p>Once registered, you will be provided with a client ID and secret which can be used to configure all Google Drive and Picasa plugins.</p><p>Please also note that you will have to enable the service \'Drive API\'.</p>';
$string['pluginname'] = 'Google Drive';
$string['presentationformat'] = 'Default presentation import format';
$string['secret'] = 'Secret';
$string['servicenotenabled'] = 'Access not configured. Make sure the service \'Drive API\' is enabled.';
$string['spreadsheetformat'] = 'Default spreadsheet import format';
$string['issuer'] = 'OAuth 2 service';
$string['issuer_help'] = 'Select the OAuth 2 service that is configured to talk to the Google Drive API. If the services does not exist yet, you might need to create it.';
$string['servicenotenabled'] = 'Access not configured. Make sure the service \'Drive API\' is enabled.';
$string['oauth2serviceslink'] = '<a href="{$a}" title="Link to OAuth Services configuration">OAuth 2 Services Configuration</a>';
$string['searchfor'] = 'Search for {$a}';

// Deprecated since Moodle 3.3.
$string['oauthinfo'] = '<p>To use this plugin, you must register your site with Google, as described in the documentation <a href="{$a->docsurl}">Google OAuth 2.0 setup</a>.</p><p>As part of the registration process, you will need to enter the following URL as \'Authorized Redirect URIs\':</p><p>{$a->callbackurl}</p><p>Once registered, you will be provided with a client ID and secret which can be used to configure all Google Drive and Picasa plugins.</p><p>Please also note that you will have to enable the service \'Drive API\'.</p>';
$string['secret'] = 'Secret';
$string['clientid'] = 'Client ID';

0 comments on commit 0e59638

Please sign in to comment.