Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
/*
3
 * Copyright 2010 Google Inc.
4
 *
5
 * Licensed under the Apache License, Version 2.0 (the "License");
6
 * you may not use this file except in compliance with the License.
7
 * You may obtain a copy of the License at
8
 *
9
 *     http://www.apache.org/licenses/LICENSE-2.0
10
 *
11
 * Unless required by applicable law or agreed to in writing, software
12
 * distributed under the License is distributed on an "AS IS" BASIS,
13
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 * See the License for the specific language governing permissions and
15
 * limitations under the License.
16
 */
17
 
18
/**
19
 * A class to contain the library configuration for the Google API client.
20
 */
21
#[AllowDynamicProperties]
22
class Google_Config
23
{
24
  const GZIP_DISABLED = true;
25
  const GZIP_ENABLED = false;
26
  const GZIP_UPLOADS_ENABLED = true;
27
  const GZIP_UPLOADS_DISABLED = false;
28
  const USE_AUTO_IO_SELECTION = "auto";
29
  const TASK_RETRY_NEVER = 0;
30
  const TASK_RETRY_ONCE = 1;
31
  const TASK_RETRY_ALWAYS = -1;
32
  protected $configuration;
33
 
34
  /**
35
   * Create a new Google_Config. Can accept an ini file location with the
36
   * local configuration. For example:
37
   *     application_name="My App"
38
   *
39
   * @param [$ini_file_location] - optional - The location of the ini file to load
40
   */
41
  public function __construct($ini_file_location = null)
42
  {
43
    $this->configuration = array(
44
      // The application_name is included in the User-Agent HTTP header.
45
      'application_name' => '',
46
 
47
      // Which Authentication, Storage and HTTP IO classes to use.
48
      'auth_class'    => 'Google_Auth_OAuth2',
49
      'io_class'      => self::USE_AUTO_IO_SELECTION,
50
      'cache_class'   => 'Google_Cache_File',
51
      'logger_class'  => 'Google_Logger_Null',
52
 
53
      // Don't change these unless you're working against a special development
54
      // or testing environment.
55
      'base_path' => 'https://www.googleapis.com',
56
 
57
      // Definition of class specific values, like file paths and so on.
58
      'classes' => array(
59
        'Google_IO_Abstract' => array(
60
          'request_timeout_seconds' => 100,
61
        ),
62
        'Google_IO_Curl' => array(
63
          'disable_proxy_workaround' => false,
64
          'options' => null,
65
        ),
66
        'Google_Logger_Abstract' => array(
67
          'level' => 'debug',
68
          'log_format' => "[%datetime%] %level%: %message% %context%\n",
69
          'date_format' => 'd/M/Y:H:i:s O',
70
          'allow_newlines' => true
71
        ),
72
        'Google_Logger_File' => array(
73
          'file' => 'php://stdout',
74
          'mode' => 0640,
75
          'lock' => false,
76
        ),
77
        'Google_Http_Request' => array(
78
          // Disable the use of gzip on calls if set to true. Defaults to false.
79
          'disable_gzip' => self::GZIP_ENABLED,
80
 
81
          // We default gzip to disabled on uploads even if gzip is otherwise
82
          // enabled, due to some issues seen with small packet sizes for uploads.
83
          // Please test with this option before enabling gzip for uploads in
84
          // a production environment.
85
          'enable_gzip_for_uploads' => self::GZIP_UPLOADS_DISABLED,
86
        ),
87
        // If you want to pass in OAuth 2.0 settings, they will need to be
88
        // structured like this.
89
        'Google_Auth_OAuth2' => array(
90
          // Keys for OAuth 2.0 access, see the API console at
91
          // https://developers.google.com/console
92
          'client_id' => '',
93
          'client_secret' => '',
94
          'redirect_uri' => '',
95
 
96
          // Simple API access key, also from the API console. Ensure you get
97
          // a Server key, and not a Browser key.
98
          'developer_key' => '',
99
 
100
          // Other parameters.
101
          'hd' => '',
102
          'prompt' => '',
103
          'openid.realm' => '',
104
          'include_granted_scopes' => '',
105
          'login_hint' => '',
106
          'request_visible_actions' => '',
107
          'access_type' => 'online',
108
          'approval_prompt' => 'auto',
109
          'federated_signon_certs_url' =>
110
              'https://www.googleapis.com/oauth2/v1/certs',
111
        ),
112
        'Google_Task_Runner' => array(
113
          // Delays are specified in seconds
114
          'initial_delay' => 1,
115
          'max_delay' => 60,
116
          // Base number for exponential backoff
117
          'factor' => 2,
118
          // A random number between -jitter and jitter will be added to the
119
          // factor on each iteration to allow for better distribution of
120
          // retries.
121
          'jitter' => .5,
122
          // Maximum number of retries allowed
123
          'retries' => 0
124
        ),
125
        'Google_Service_Exception' => array(
126
          'retry_map' => array(
127
            '500' => self::TASK_RETRY_ALWAYS,
128
            '503' => self::TASK_RETRY_ALWAYS,
129
            'rateLimitExceeded' => self::TASK_RETRY_ALWAYS,
130
            'userRateLimitExceeded' => self::TASK_RETRY_ALWAYS
131
          )
132
        ),
133
        'Google_IO_Exception' => array(
134
          'retry_map' => !extension_loaded('curl') ? array() : array(
135
            CURLE_COULDNT_RESOLVE_HOST => self::TASK_RETRY_ALWAYS,
136
            CURLE_COULDNT_CONNECT => self::TASK_RETRY_ALWAYS,
137
            CURLE_OPERATION_TIMEOUTED => self::TASK_RETRY_ALWAYS,
138
            CURLE_SSL_CONNECT_ERROR => self::TASK_RETRY_ALWAYS,
139
            CURLE_GOT_NOTHING => self::TASK_RETRY_ALWAYS
140
          )
141
        ),
142
        // Set a default directory for the file cache.
143
        'Google_Cache_File' => array(
144
          'directory' => sys_get_temp_dir() . '/Google_Client'
145
        )
146
      ),
147
    );
148
    if ($ini_file_location) {
149
      $ini = parse_ini_file($ini_file_location, true);
150
      if (is_array($ini) && count($ini)) {
151
        $merged_configuration = $ini + $this->configuration;
152
        if (isset($ini['classes']) && isset($this->configuration['classes'])) {
153
          $merged_configuration['classes'] = $ini['classes'] + $this->configuration['classes'];
154
        }
155
        $this->configuration = $merged_configuration;
156
      }
157
    }
158
  }
159
 
160
  /**
161
   * Set configuration specific to a given class.
162
   * $config->setClassConfig('Google_Cache_File',
163
   *   array('directory' => '/tmp/cache'));
164
   * @param $class string The class name for the configuration
165
   * @param $config string key or an array of configuration values
166
   * @param $value string optional - if $config is a key, the value
167
   */
168
  public function setClassConfig($class, $config, $value = null)
169
  {
170
    if (!is_array($config)) {
171
      if (!isset($this->configuration['classes'][$class])) {
172
        $this->configuration['classes'][$class] = array();
173
      }
174
      $this->configuration['classes'][$class][$config] = $value;
175
    } else {
176
      $this->configuration['classes'][$class] = $config;
177
    }
178
  }
179
 
180
  public function getClassConfig($class, $key = null)
181
  {
182
    if (!isset($this->configuration['classes'][$class])) {
183
      return null;
184
    }
185
    if ($key === null) {
186
      return $this->configuration['classes'][$class];
187
    } else {
188
      return $this->configuration['classes'][$class][$key];
189
    }
190
  }
191
 
192
  /**
193
   * Return the configured cache class.
194
   * @return string
195
   */
196
  public function getCacheClass()
197
  {
198
    return $this->configuration['cache_class'];
199
  }
200
 
201
  /**
202
   * Return the configured logger class.
203
   * @return string
204
   */
205
  public function getLoggerClass()
206
  {
207
    return $this->configuration['logger_class'];
208
  }
209
 
210
  /**
211
   * Return the configured Auth class.
212
   * @return string
213
   */
214
  public function getAuthClass()
215
  {
216
    return $this->configuration['auth_class'];
217
  }
218
 
219
  /**
220
   * Set the auth class.
221
   *
222
   * @param $class string the class name to set
223
   */
224
  public function setAuthClass($class)
225
  {
226
    $prev = $this->configuration['auth_class'];
227
    if (!isset($this->configuration['classes'][$class]) &&
228
        isset($this->configuration['classes'][$prev])) {
229
      $this->configuration['classes'][$class] =
230
          $this->configuration['classes'][$prev];
231
    }
232
    $this->configuration['auth_class'] = $class;
233
  }
234
 
235
  /**
236
   * Set the IO class.
237
   *
238
   * @param $class string the class name to set
239
   */
240
  public function setIoClass($class)
241
  {
242
    $prev = $this->configuration['io_class'];
243
    if (!isset($this->configuration['classes'][$class]) &&
244
        isset($this->configuration['classes'][$prev])) {
245
      $this->configuration['classes'][$class] =
246
          $this->configuration['classes'][$prev];
247
    }
248
    $this->configuration['io_class'] = $class;
249
  }
250
 
251
  /**
252
   * Set the cache class.
253
   *
254
   * @param $class string the class name to set
255
   */
256
  public function setCacheClass($class)
257
  {
258
    $prev = $this->configuration['cache_class'];
259
    if (!isset($this->configuration['classes'][$class]) &&
260
        isset($this->configuration['classes'][$prev])) {
261
      $this->configuration['classes'][$class] =
262
          $this->configuration['classes'][$prev];
263
    }
264
    $this->configuration['cache_class'] = $class;
265
  }
266
 
267
  /**
268
   * Set the logger class.
269
   *
270
   * @param $class string the class name to set
271
   */
272
  public function setLoggerClass($class)
273
  {
274
    $prev = $this->configuration['logger_class'];
275
    if (!isset($this->configuration['classes'][$class]) &&
276
        isset($this->configuration['classes'][$prev])) {
277
      $this->configuration['classes'][$class] =
278
          $this->configuration['classes'][$prev];
279
    }
280
    $this->configuration['logger_class'] = $class;
281
  }
282
 
283
  /**
284
   * Return the configured IO class.
285
   *
286
   * @return string
287
   */
288
  public function getIoClass()
289
  {
290
    return $this->configuration['io_class'];
291
  }
292
 
293
  /**
294
   * Set the application name, this is included in the User-Agent HTTP header.
295
   * @param string $name
296
   */
297
  public function setApplicationName($name)
298
  {
299
    $this->configuration['application_name'] = $name;
300
  }
301
 
302
  /**
303
   * @return string the name of the application
304
   */
305
  public function getApplicationName()
306
  {
307
    return $this->configuration['application_name'];
308
  }
309
 
310
  /**
311
   * Set the client ID for the auth class.
312
   * @param $clientId string - the API console client ID
313
   */
314
  public function setClientId($clientId)
315
  {
316
    $this->setAuthConfig('client_id', $clientId);
317
  }
318
 
319
  /**
320
   * Set the client secret for the auth class.
321
   * @param $secret string - the API console client secret
322
   */
323
  public function setClientSecret($secret)
324
  {
325
    $this->setAuthConfig('client_secret', $secret);
326
  }
327
 
328
  /**
329
   * Set the redirect uri for the auth class. Note that if using the
330
   * Javascript based sign in flow, this should be the string 'postmessage'.
331
   *
332
   * @param $uri string - the URI that users should be redirected to
333
   */
334
  public function setRedirectUri($uri)
335
  {
336
    $this->setAuthConfig('redirect_uri', $uri);
337
  }
338
 
339
  /**
340
   * Set the app activities for the auth class.
341
   * @param $rva string a space separated list of app activity types
342
   */
343
  public function setRequestVisibleActions($rva)
344
  {
345
    $this->setAuthConfig('request_visible_actions', $rva);
346
  }
347
 
348
  /**
349
   * Set the the access type requested (offline or online.)
350
   * @param $access string - the access type
351
   */
352
  public function setAccessType($access)
353
  {
354
    $this->setAuthConfig('access_type', $access);
355
  }
356
 
357
  /**
358
   * Set when to show the approval prompt (auto or force)
359
   * @param $approval string - the approval request
360
   */
361
  public function setApprovalPrompt($approval)
362
  {
363
    $this->setAuthConfig('approval_prompt', $approval);
364
  }
365
 
366
  /**
367
   * Set the login hint (email address or sub identifier)
368
   * @param $hint string
369
   */
370
  public function setLoginHint($hint)
371
  {
372
    $this->setAuthConfig('login_hint', $hint);
373
  }
374
 
375
  /**
376
   * Set the developer key for the auth class. Note that this is separate value
377
   * from the client ID - if it looks like a URL, its a client ID!
378
   * @param $key string - the API console developer key
379
   */
380
  public function setDeveloperKey($key)
381
  {
382
    $this->setAuthConfig('developer_key', $key);
383
  }
384
 
385
  /**
386
   * Set the hd (hosted domain) parameter streamlines the login process for
387
   * Google Apps hosted accounts. By including the domain of the user, you
388
   * restrict sign-in to accounts at that domain.
389
   *
390
   * This should not be used to ensure security on your application - check
391
   * the hd values within an id token (@see Google_Auth_LoginTicket) after sign
392
   * in to ensure that the user is from the domain you were expecting.
393
   *
394
   * @param $hd string - the domain to use.
395
   */
396
  public function setHostedDomain($hd)
397
  {
398
    $this->setAuthConfig('hd', $hd);
399
  }
400
 
401
  /**
402
   * Set the prompt hint. Valid values are none, consent and select_account.
403
   * If no value is specified and the user has not previously authorized
404
   * access, then the user is shown a consent screen.
405
   * @param $prompt string
406
   */
407
  public function setPrompt($prompt)
408
  {
409
    $this->setAuthConfig('prompt', $prompt);
410
  }
411
 
412
  /**
413
   * openid.realm is a parameter from the OpenID 2.0 protocol, not from OAuth
414
   * 2.0. It is used in OpenID 2.0 requests to signify the URL-space for which
415
   * an authentication request is valid.
416
   * @param $realm string - the URL-space to use.
417
   */
418
  public function setOpenidRealm($realm)
419
  {
420
    $this->setAuthConfig('openid.realm', $realm);
421
  }
422
 
423
  /**
424
   * If this is provided with the value true, and the authorization request is
425
   * granted, the authorization will include any previous authorizations
426
   * granted to this user/application combination for other scopes.
427
   * @param $include boolean - the URL-space to use.
428
   */
429
  public function setIncludeGrantedScopes($include)
430
  {
431
    $this->setAuthConfig(
432
        'include_granted_scopes',
433
        $include ? "true" : "false"
434
    );
435
  }
436
 
437
  /**
438
   * @return string the base URL to use for API calls
439
   */
440
  public function getBasePath()
441
  {
442
    return $this->configuration['base_path'];
443
  }
444
 
445
  /**
446
   * Set the auth configuration for the current auth class.
447
   * @param $key - the key to set
448
   * @param $value - the parameter value
449
   */
450
  private function setAuthConfig($key, $value)
451
  {
452
    if (!isset($this->configuration['classes'][$this->getAuthClass()])) {
453
      $this->configuration['classes'][$this->getAuthClass()] = array();
454
    }
455
    $this->configuration['classes'][$this->getAuthClass()][$key] = $value;
456
  }
457
}