8201836a7e3ba6d2f4816cdc17b26e6d5e55858a
[moodle.git] / portfolio / googledocs / lib.php
1 <?php
2 /**
3  * Google Documents Portfolio Plugin
4  *
5  * @author Dan Poltawski <talktodan@gmail.com>
6  * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
7  */
8 require_once($CFG->libdir.'/googleapi.php');
10 class portfolio_plugin_googledocs extends portfolio_plugin_push_base {
11     private $sessiontoken;
13     public static function supported_formats() {
14         return array(
15             PORTFOLIO_FORMAT_PLAINHTML,
16             PORTFOLIO_FORMAT_IMAGE,
17             PORTFOLIO_FORMAT_TEXT,
18             PORTFOLIO_FORMAT_PDF,
19             PORTFOLIO_FORMAT_DOCUMENT,
20             PORTFOLIO_FORMAT_PRESENTATION,
21             PORTFOLIO_FORMAT_SPREADSHEET
22         );
23     }
25     public static function get_name() {
26         return get_string('pluginname', 'portfolio_googledocs');
27     }
29     public function prepare_package() {
30         // we send the files as they are, no prep required
31         return true;
32     }
33         
34     public function get_interactive_continue_url(){
35         return 'http://docs.google.com/';
36     }
38     public function expected_time($callertime) {
39         // we trust what the portfolio says
40         return $callertime;
41     }
43     public function send_package() {
45         if(!$this->sessiontoken){
46             throw new portfolio_plugin_exception('nosessiontoken', 'portfolio_googledocs');
47         }
49         $gdocs = new google_docs(new google_authsub($this->sessiontoken));
51         foreach ($this->exporter->get_tempfiles() as $file) {
52             if(!$gdocs->send_file($file)){
53                 throw new portfolio_plugin_exception('sendfailed', 'portfolio_gdocs', $file->get_filename());
54             }
55         }
56     }
58     public function steal_control($stage) {
59         global $CFG;
60         if ($stage != PORTFOLIO_STAGE_CONFIG) {
61             return false;
62         }
64         $sesskey = google_docs::get_sesskey($this->get('user')->id);
66         if($sesskey){
67             try{
68                 $gauth = new google_authsub($sesskey);
69                 $this->sessiontoken = $sesskey;
70                 return false;
71             }catch(Exception $e){
72                 // sesskey is not valid, delete store and re-auth
73                 google_docs::delete_sesskey($this->get('user')->id);
74             }
75         }
77         return google_authsub::login_url($CFG->wwwroot.'/portfolio/add.php?postcontrol=1&id=' . $this->exporter->get('id') . '&sesskey=' . sesskey(), google_docs::REALM);
78     }
80     public function post_control($stage, $params) {
81         if ($stage != PORTFOLIO_STAGE_CONFIG) {
82             return;
83         }
85         if(!array_key_exists('token', $params)){
86             throw new portfolio_plugin_exception('noauthtoken', 'portfolio_googledocs');
87         }
89         // we now have our auth token, get a session token..
90         $gauth = new google_authsub(false, $params['token']);
91         $this->sessiontoken = $gauth->get_sessiontoken();
93         google_docs::set_sesskey($this->sessiontoken, $this->get('user')->id);
94     }
96 }
98 /**
99  * Registers to the user_deleted event to revoke any
100  * subauth tokens we have from them
101  *
102  * @param $user user object
103  * @return boolean true in all cases as its only minor cleanup
104  */
105 function portfolio_googledocs_user_deleted($user){
106     // it is only by luck that the user prefstill exists now?
107     // We probably need a pre-delete event?
108     if($sesskey = google_docs::get_sesskey($user->id)){
109         try{
110             $gauth = new google_authsub($sesskey);
112             $gauth->revoke_session_token();
113         }catch(Exception $e){
114             // we don't care that much about success- just being good
115             // google api citzens
116             return true;
117         }
118     }
120     return true;