From 0ae799360fe061e3d9742eabd6775b9842efde94 Mon Sep 17 00:00:00 2001 From: Danny Hermes Date: Fri, 5 Dec 2014 09:20:09 -0800 Subject: [PATCH] Removing docs from code repository. Docs are now checked in to the gh-pages branch and serve via: google.github.io/oauth2client --- docs/build => doc-build | 0 docs/epy/api-objects.txt | 585 ----- docs/epy/class-tree.html | 209 -- docs/epy/crarr.png | Bin 340 -> 0 bytes docs/epy/epydoc.css | 322 --- docs/epy/epydoc.js | 293 --- docs/epy/frames.html | 17 - docs/epy/help.html | 268 -- docs/epy/identifier-index.html | 1293 --------- docs/epy/index.html | 17 - docs/epy/module-tree.html | 124 - docs/epy/oauth2client-module.html | 234 -- docs/epy/oauth2client-pysrc.html | 118 - docs/epy/oauth2client.anyjson-module.html | 116 - docs/epy/oauth2client.anyjson-pysrc.html | 143 - docs/epy/oauth2client.appengine-module.html | 601 ----- docs/epy/oauth2client.appengine-pysrc.html | 1290 --------- ...pengine.AppAssertionCredentials-class.html | 639 ----- ...ient.appengine.CredentialsModel-class.html | 146 -- ...t.appengine.CredentialsNDBModel-class.html | 188 -- ...ppengine.CredentialsNDBProperty-class.html | 305 --- ...t.appengine.CredentialsProperty-class.html | 219 -- ...lient.appengine.FlowNDBProperty-class.html | 210 -- ...h2client.appengine.FlowProperty-class.html | 237 -- ...ngine.InvalidClientSecretsError-class.html | 208 -- ...appengine.InvalidXsrfTokenError-class.html | 208 -- ...lient.appengine.OAuth2Decorator-class.html | 941 ------- ...Auth2DecoratorFromClientSecrets-class.html | 346 --- ...ent.appengine.SiteXsrfSecretKey-class.html | 147 -- ....appengine.SiteXsrfSecretKeyNDB-class.html | 187 -- ...ient.appengine.StorageByKeyName-class.html | 562 ---- docs/epy/oauth2client.client-module.html | 1347 ---------- docs/epy/oauth2client.client-pysrc.html | 2332 ----------------- ...t.client.AccessTokenCredentials-class.html | 523 ---- ...ent.AccessTokenCredentialsError-class.html | 209 -- ....client.AccessTokenRefreshError-class.html | 209 -- ...licationDefaultCredentialsError-class.html | 209 -- ...ent.client.AssertionCredentials-class.html | 508 ---- ...oauth2client.client.Credentials-class.html | 631 ----- ...t.client.CryptoUnavailableError-class.html | 212 -- ...th2client.client.DeviceFlowInfo-class.html | 193 -- docs/epy/oauth2client.client.Error-class.html | 208 -- docs/epy/oauth2client.client.Flow-class.html | 180 -- ...client.client.FlowExchangeError-class.html | 209 -- ...client.client.GoogleCredentials-class.html | 651 ----- ...oauth2client.client.MemoryCache-class.html | 298 --- ...ient.client.NonAsciiHeaderError-class.html | 209 -- ...client.client.OAuth2Credentials-class.html | 1138 -------- ...nt.client.OAuth2DeviceCodeError-class.html | 209 -- ...ient.client.OAuth2WebServerFlow-class.html | 473 ---- ...t.SignedJwtAssertionCredentials-class.html | 520 ---- .../oauth2client.client.Storage-class.html | 560 ---- ...2client.client.TokenRevokeError-class.html | 209 -- ...t.UnknownClientSecretsFlowError-class.html | 209 -- ...ient.client.VerifyJwtTokenError-class.html | 209 -- .../oauth2client.clientsecrets-module.html | 404 --- .../epy/oauth2client.clientsecrets-pysrc.html | 274 -- ...auth2client.clientsecrets.Error-class.html | 208 -- ...crets.InvalidClientSecretsError-class.html | 209 -- docs/epy/oauth2client.crypt-module.html | 462 ---- docs/epy/oauth2client.crypt-pysrc.html | 545 ---- ...h2client.crypt.AppIdentityError-class.html | 203 -- docs/epy/oauth2client.django_orm-module.html | 157 -- docs/epy/oauth2client.django_orm-pysrc.html | 302 --- ...ent.django_orm.CredentialsField-class.html | 231 -- ...uth2client.django_orm.FlowField-class.html | 231 -- ...oauth2client.django_orm.Storage-class.html | 415 --- docs/epy/oauth2client.file-module.html | 150 -- docs/epy/oauth2client.file-pysrc.html | 252 -- ...redentialsFileSymbolicLinkError-class.html | 208 -- docs/epy/oauth2client.file.Storage-class.html | 549 ---- docs/epy/oauth2client.gce-module.html | 212 -- docs/epy/oauth2client.gce-pysrc.html | 246 -- ...ent.gce.AppAssertionCredentials-class.html | 634 ----- .../oauth2client.keyring_storage-module.html | 141 - .../oauth2client.keyring_storage-pysrc.html | 235 -- ...2client.keyring_storage.Storage-class.html | 507 ---- docs/epy/oauth2client.locked_file-module.html | 257 -- docs/epy/oauth2client.locked_file-pysrc.html | 525 ---- ...ked_file.AlreadyLockedException-class.html | 208 -- ...redentialsFileSymbolicLinkError-class.html | 208 -- ...h2client.locked_file.LockedFile-class.html | 384 --- ...auth2client.locked_file._Opener-class.html | 395 --- ...client.locked_file._PosixOpener-class.html | 328 --- .../oauth2client.multistore_file-module.html | 545 ---- .../oauth2client.multistore_file-pysrc.html | 647 ----- ...th2client.multistore_file.Error-class.html | 208 -- ..._file.NewerCredentialStoreError-class.html | 209 -- ...ent.multistore_file._MultiStore-class.html | 813 ------ ...store_file._MultiStore._Storage-class.html | 494 ---- docs/epy/oauth2client.old_run-module.html | 256 -- docs/epy/oauth2client.old_run-pysrc.html | 272 -- .../oauth2client.service_account-module.html | 188 -- .../oauth2client.service_account-pysrc.html | 276 -- ...ount._ServiceAccountCredentials-class.html | 645 ----- docs/epy/oauth2client.tools-module.html | 416 --- docs/epy/oauth2client.tools-pysrc.html | 358 --- ...ent.tools.ClientRedirectHandler-class.html | 348 --- ...ient.tools.ClientRedirectServer-class.html | 233 -- docs/epy/oauth2client.util-module.html | 505 ---- docs/epy/oauth2client.util-pysrc.html | 323 --- docs/epy/oauth2client.xsrfutil-module.html | 326 --- docs/epy/oauth2client.xsrfutil-pysrc.html | 229 -- docs/epy/redirect.html | 38 - docs/epy/toc-everything.html | 300 --- docs/epy/toc-oauth2client-module.html | 34 - docs/epy/toc-oauth2client.anyjson-module.html | 29 - .../toc-oauth2client.appengine-module.html | 64 - docs/epy/toc-oauth2client.client-module.html | 121 - ...toc-oauth2client.clientsecrets-module.html | 46 - docs/epy/toc-oauth2client.crypt-module.html | 57 - .../toc-oauth2client.django_orm-module.html | 33 - docs/epy/toc-oauth2client.file-module.html | 32 - docs/epy/toc-oauth2client.gce-module.html | 34 - ...c-oauth2client.keyring_storage-module.html | 31 - .../toc-oauth2client.locked_file-module.html | 49 - ...c-oauth2client.multistore_file-module.html | 51 - docs/epy/toc-oauth2client.old_run-module.html | 33 - ...c-oauth2client.service_account-module.html | 40 - docs/epy/toc-oauth2client.tools-module.html | 48 - docs/epy/toc-oauth2client.util-module.html | 53 - .../epy/toc-oauth2client.xsrfutil-module.html | 38 - docs/epy/toc.html | 48 - docs/epy/uml_class_diagram_for_oauth2cl.gif | Bin 22645 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_10.gif | Bin 26165 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_11.gif | Bin 17833 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_12.gif | Bin 1650 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_13.gif | Bin 3276 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_14.gif | Bin 11554 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_15.gif | Bin 17240 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_16.gif | Bin 12368 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_17.gif | Bin 11968 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_18.gif | Bin 12734 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_19.gif | Bin 25336 -> 0 bytes docs/epy/uml_class_diagram_for_oauth2cl_2.gif | Bin 1805 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_20.gif | Bin 7245 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_21.gif | Bin 16343 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_22.gif | Bin 10246 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_23.gif | Bin 627 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_24.gif | Bin 11587 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_25.gif | Bin 25660 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_26.gif | Bin 3406 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_27.gif | Bin 11760 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_28.gif | Bin 19708 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_29.gif | Bin 11958 -> 0 bytes docs/epy/uml_class_diagram_for_oauth2cl_3.gif | Bin 3541 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_30.gif | Bin 16839 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_31.gif | Bin 30674 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_32.gif | Bin 6119 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_33.gif | Bin 11515 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_34.gif | Bin 12619 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_35.gif | Bin 11639 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_36.gif | Bin 10246 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_37.gif | Bin 11958 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_38.gif | Bin 10894 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_39.gif | Bin 6417 -> 0 bytes docs/epy/uml_class_diagram_for_oauth2cl_4.gif | Bin 3072 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_40.gif | Bin 6222 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_41.gif | Bin 11395 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_42.gif | Bin 12038 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_43.gif | Bin 9500 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_44.gif | Bin 22645 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_45.gif | Bin 9982 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_46.gif | Bin 11286 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_47.gif | Bin 12038 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_48.gif | Bin 7412 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_49.gif | Bin 5870 -> 0 bytes docs/epy/uml_class_diagram_for_oauth2cl_5.gif | Bin 5427 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_50.gif | Bin 8723 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_51.gif | Bin 10246 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_52.gif | Bin 12173 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_53.gif | Bin 2583 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_54.gif | Bin 9609 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_55.gif | Bin 34447 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_56.gif | Bin 29028 -> 0 bytes .../epy/uml_class_diagram_for_oauth2cl_57.gif | Bin 24501 -> 0 bytes docs/epy/uml_class_diagram_for_oauth2cl_6.gif | Bin 2749 -> 0 bytes docs/epy/uml_class_diagram_for_oauth2cl_7.gif | Bin 5904 -> 0 bytes docs/epy/uml_class_diagram_for_oauth2cl_8.gif | Bin 11285 -> 0 bytes docs/epy/uml_class_diagram_for_oauth2cl_9.gif | Bin 11087 -> 0 bytes 180 files changed, 39378 deletions(-) rename docs/build => doc-build (100%) delete mode 100644 docs/epy/api-objects.txt delete mode 100644 docs/epy/class-tree.html delete mode 100644 docs/epy/crarr.png delete mode 100644 docs/epy/epydoc.css delete mode 100644 docs/epy/epydoc.js delete mode 100644 docs/epy/frames.html delete mode 100644 docs/epy/help.html delete mode 100644 docs/epy/identifier-index.html delete mode 100644 docs/epy/index.html delete mode 100644 docs/epy/module-tree.html delete mode 100644 docs/epy/oauth2client-module.html delete mode 100644 docs/epy/oauth2client-pysrc.html delete mode 100644 docs/epy/oauth2client.anyjson-module.html delete mode 100644 docs/epy/oauth2client.anyjson-pysrc.html delete mode 100644 docs/epy/oauth2client.appengine-module.html delete mode 100644 docs/epy/oauth2client.appengine-pysrc.html delete mode 100644 docs/epy/oauth2client.appengine.AppAssertionCredentials-class.html delete mode 100644 docs/epy/oauth2client.appengine.CredentialsModel-class.html delete mode 100644 docs/epy/oauth2client.appengine.CredentialsNDBModel-class.html delete mode 100644 docs/epy/oauth2client.appengine.CredentialsNDBProperty-class.html delete mode 100644 docs/epy/oauth2client.appengine.CredentialsProperty-class.html delete mode 100644 docs/epy/oauth2client.appengine.FlowNDBProperty-class.html delete mode 100644 docs/epy/oauth2client.appengine.FlowProperty-class.html delete mode 100644 docs/epy/oauth2client.appengine.InvalidClientSecretsError-class.html delete mode 100644 docs/epy/oauth2client.appengine.InvalidXsrfTokenError-class.html delete mode 100644 docs/epy/oauth2client.appengine.OAuth2Decorator-class.html delete mode 100644 docs/epy/oauth2client.appengine.OAuth2DecoratorFromClientSecrets-class.html delete mode 100644 docs/epy/oauth2client.appengine.SiteXsrfSecretKey-class.html delete mode 100644 docs/epy/oauth2client.appengine.SiteXsrfSecretKeyNDB-class.html delete mode 100644 docs/epy/oauth2client.appengine.StorageByKeyName-class.html delete mode 100644 docs/epy/oauth2client.client-module.html delete mode 100644 docs/epy/oauth2client.client-pysrc.html delete mode 100644 docs/epy/oauth2client.client.AccessTokenCredentials-class.html delete mode 100644 docs/epy/oauth2client.client.AccessTokenCredentialsError-class.html delete mode 100644 docs/epy/oauth2client.client.AccessTokenRefreshError-class.html delete mode 100644 docs/epy/oauth2client.client.ApplicationDefaultCredentialsError-class.html delete mode 100644 docs/epy/oauth2client.client.AssertionCredentials-class.html delete mode 100644 docs/epy/oauth2client.client.Credentials-class.html delete mode 100644 docs/epy/oauth2client.client.CryptoUnavailableError-class.html delete mode 100644 docs/epy/oauth2client.client.DeviceFlowInfo-class.html delete mode 100644 docs/epy/oauth2client.client.Error-class.html delete mode 100644 docs/epy/oauth2client.client.Flow-class.html delete mode 100644 docs/epy/oauth2client.client.FlowExchangeError-class.html delete mode 100644 docs/epy/oauth2client.client.GoogleCredentials-class.html delete mode 100644 docs/epy/oauth2client.client.MemoryCache-class.html delete mode 100644 docs/epy/oauth2client.client.NonAsciiHeaderError-class.html delete mode 100644 docs/epy/oauth2client.client.OAuth2Credentials-class.html delete mode 100644 docs/epy/oauth2client.client.OAuth2DeviceCodeError-class.html delete mode 100644 docs/epy/oauth2client.client.OAuth2WebServerFlow-class.html delete mode 100644 docs/epy/oauth2client.client.SignedJwtAssertionCredentials-class.html delete mode 100644 docs/epy/oauth2client.client.Storage-class.html delete mode 100644 docs/epy/oauth2client.client.TokenRevokeError-class.html delete mode 100644 docs/epy/oauth2client.client.UnknownClientSecretsFlowError-class.html delete mode 100644 docs/epy/oauth2client.client.VerifyJwtTokenError-class.html delete mode 100644 docs/epy/oauth2client.clientsecrets-module.html delete mode 100644 docs/epy/oauth2client.clientsecrets-pysrc.html delete mode 100644 docs/epy/oauth2client.clientsecrets.Error-class.html delete mode 100644 docs/epy/oauth2client.clientsecrets.InvalidClientSecretsError-class.html delete mode 100644 docs/epy/oauth2client.crypt-module.html delete mode 100644 docs/epy/oauth2client.crypt-pysrc.html delete mode 100644 docs/epy/oauth2client.crypt.AppIdentityError-class.html delete mode 100644 docs/epy/oauth2client.django_orm-module.html delete mode 100644 docs/epy/oauth2client.django_orm-pysrc.html delete mode 100644 docs/epy/oauth2client.django_orm.CredentialsField-class.html delete mode 100644 docs/epy/oauth2client.django_orm.FlowField-class.html delete mode 100644 docs/epy/oauth2client.django_orm.Storage-class.html delete mode 100644 docs/epy/oauth2client.file-module.html delete mode 100644 docs/epy/oauth2client.file-pysrc.html delete mode 100644 docs/epy/oauth2client.file.CredentialsFileSymbolicLinkError-class.html delete mode 100644 docs/epy/oauth2client.file.Storage-class.html delete mode 100644 docs/epy/oauth2client.gce-module.html delete mode 100644 docs/epy/oauth2client.gce-pysrc.html delete mode 100644 docs/epy/oauth2client.gce.AppAssertionCredentials-class.html delete mode 100644 docs/epy/oauth2client.keyring_storage-module.html delete mode 100644 docs/epy/oauth2client.keyring_storage-pysrc.html delete mode 100644 docs/epy/oauth2client.keyring_storage.Storage-class.html delete mode 100644 docs/epy/oauth2client.locked_file-module.html delete mode 100644 docs/epy/oauth2client.locked_file-pysrc.html delete mode 100644 docs/epy/oauth2client.locked_file.AlreadyLockedException-class.html delete mode 100644 docs/epy/oauth2client.locked_file.CredentialsFileSymbolicLinkError-class.html delete mode 100644 docs/epy/oauth2client.locked_file.LockedFile-class.html delete mode 100644 docs/epy/oauth2client.locked_file._Opener-class.html delete mode 100644 docs/epy/oauth2client.locked_file._PosixOpener-class.html delete mode 100644 docs/epy/oauth2client.multistore_file-module.html delete mode 100644 docs/epy/oauth2client.multistore_file-pysrc.html delete mode 100644 docs/epy/oauth2client.multistore_file.Error-class.html delete mode 100644 docs/epy/oauth2client.multistore_file.NewerCredentialStoreError-class.html delete mode 100644 docs/epy/oauth2client.multistore_file._MultiStore-class.html delete mode 100644 docs/epy/oauth2client.multistore_file._MultiStore._Storage-class.html delete mode 100644 docs/epy/oauth2client.old_run-module.html delete mode 100644 docs/epy/oauth2client.old_run-pysrc.html delete mode 100644 docs/epy/oauth2client.service_account-module.html delete mode 100644 docs/epy/oauth2client.service_account-pysrc.html delete mode 100644 docs/epy/oauth2client.service_account._ServiceAccountCredentials-class.html delete mode 100644 docs/epy/oauth2client.tools-module.html delete mode 100644 docs/epy/oauth2client.tools-pysrc.html delete mode 100644 docs/epy/oauth2client.tools.ClientRedirectHandler-class.html delete mode 100644 docs/epy/oauth2client.tools.ClientRedirectServer-class.html delete mode 100644 docs/epy/oauth2client.util-module.html delete mode 100644 docs/epy/oauth2client.util-pysrc.html delete mode 100644 docs/epy/oauth2client.xsrfutil-module.html delete mode 100644 docs/epy/oauth2client.xsrfutil-pysrc.html delete mode 100644 docs/epy/redirect.html delete mode 100644 docs/epy/toc-everything.html delete mode 100644 docs/epy/toc-oauth2client-module.html delete mode 100644 docs/epy/toc-oauth2client.anyjson-module.html delete mode 100644 docs/epy/toc-oauth2client.appengine-module.html delete mode 100644 docs/epy/toc-oauth2client.client-module.html delete mode 100644 docs/epy/toc-oauth2client.clientsecrets-module.html delete mode 100644 docs/epy/toc-oauth2client.crypt-module.html delete mode 100644 docs/epy/toc-oauth2client.django_orm-module.html delete mode 100644 docs/epy/toc-oauth2client.file-module.html delete mode 100644 docs/epy/toc-oauth2client.gce-module.html delete mode 100644 docs/epy/toc-oauth2client.keyring_storage-module.html delete mode 100644 docs/epy/toc-oauth2client.locked_file-module.html delete mode 100644 docs/epy/toc-oauth2client.multistore_file-module.html delete mode 100644 docs/epy/toc-oauth2client.old_run-module.html delete mode 100644 docs/epy/toc-oauth2client.service_account-module.html delete mode 100644 docs/epy/toc-oauth2client.tools-module.html delete mode 100644 docs/epy/toc-oauth2client.util-module.html delete mode 100644 docs/epy/toc-oauth2client.xsrfutil-module.html delete mode 100644 docs/epy/toc.html delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_10.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_11.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_12.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_13.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_14.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_15.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_16.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_17.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_18.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_19.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_2.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_20.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_21.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_22.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_23.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_24.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_25.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_26.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_27.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_28.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_29.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_3.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_30.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_31.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_32.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_33.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_34.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_35.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_36.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_37.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_38.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_39.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_4.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_40.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_41.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_42.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_43.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_44.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_45.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_46.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_47.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_48.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_49.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_5.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_50.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_51.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_52.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_53.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_54.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_55.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_56.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_57.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_6.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_7.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_8.gif delete mode 100644 docs/epy/uml_class_diagram_for_oauth2cl_9.gif diff --git a/docs/build b/doc-build similarity index 100% rename from docs/build rename to doc-build diff --git a/docs/epy/api-objects.txt b/docs/epy/api-objects.txt deleted file mode 100644 index ef1ed4c..0000000 --- a/docs/epy/api-objects.txt +++ /dev/null @@ -1,585 +0,0 @@ -oauth2client oauth2client-module.html -oauth2client.GOOGLE_REVOKE_URI oauth2client-module.html#GOOGLE_REVOKE_URI -oauth2client.GOOGLE_TOKEN_URI oauth2client-module.html#GOOGLE_TOKEN_URI -oauth2client.GOOGLE_DEVICE_URI oauth2client-module.html#GOOGLE_DEVICE_URI -oauth2client.GOOGLE_AUTH_URI oauth2client-module.html#GOOGLE_AUTH_URI -oauth2client.appengine oauth2client.appengine-module.html -oauth2client.appengine._safe_html oauth2client.appengine-module.html#_safe_html -oauth2client.appengine._build_state_value oauth2client.appengine-module.html#_build_state_value -oauth2client.appengine.XSRF_MEMCACHE_ID oauth2client.appengine-module.html#XSRF_MEMCACHE_ID -oauth2client.appengine.OAUTH2CLIENT_NAMESPACE oauth2client.appengine-module.html#OAUTH2CLIENT_NAMESPACE -oauth2client.appengine.logger oauth2client.appengine-module.html#logger -oauth2client.appengine._generate_new_xsrf_secret_key oauth2client.appengine-module.html#_generate_new_xsrf_secret_key -oauth2client.appengine.xsrf_secret_key oauth2client.appengine-module.html#xsrf_secret_key -oauth2client.appengine.ndb oauth2client.appengine-module.html#ndb -oauth2client.appengine.oauth2decorator_from_clientsecrets oauth2client.appengine-module.html#oauth2decorator_from_clientsecrets -oauth2client.appengine._parse_state_value oauth2client.appengine-module.html#_parse_state_value -oauth2client.client oauth2client.client-module.html -oauth2client.client._get_well_known_file oauth2client.client-module.html#_get_well_known_file -oauth2client.client._extract_id_token oauth2client.client-module.html#_extract_id_token -oauth2client.client.HAS_CRYPTO oauth2client.client-module.html#HAS_CRYPTO -oauth2client.client._get_environment oauth2client.client-module.html#_get_environment -oauth2client.client.AUTHORIZED_USER oauth2client.client-module.html#AUTHORIZED_USER -oauth2client.client.ADC_HELP_MSG oauth2client.client-module.html#ADC_HELP_MSG -oauth2client.client._get_application_default_credential_GCE oauth2client.client-module.html#_get_application_default_credential_GCE -oauth2client.client._get_application_default_credential_from_file oauth2client.client-module.html#_get_application_default_credential_from_file -oauth2client.client._get_application_default_credential_GAE oauth2client.client-module.html#_get_application_default_credential_GAE -oauth2client.client.credentials_from_code oauth2client.client-module.html#credentials_from_code -oauth2client.client.ID_TOKEN_VERIFICATON_CERTS oauth2client.client-module.html#ID_TOKEN_VERIFICATON_CERTS -oauth2client.client.credentials_from_clientsecrets_and_code oauth2client.client-module.html#credentials_from_clientsecrets_and_code -oauth2client.client._raise_exception_for_missing_fields oauth2client.client-module.html#_raise_exception_for_missing_fields -oauth2client.client.EXPIRY_FORMAT oauth2client.client-module.html#EXPIRY_FORMAT -oauth2client.client.logger oauth2client.client-module.html#logger -oauth2client.client._update_query_params oauth2client.client-module.html#_update_query_params -oauth2client.client._env_name oauth2client.client-module.html#_env_name -oauth2client.client.AccessTokenInfo oauth2client.client-module.html#AccessTokenInfo -oauth2client.client._abstract oauth2client.client-module.html#_abstract -oauth2client.client.clean_headers oauth2client.client-module.html#clean_headers -oauth2client.client._get_environment_variable_file oauth2client.client-module.html#_get_environment_variable_file -oauth2client.client.OOB_CALLBACK_URN oauth2client.client-module.html#OOB_CALLBACK_URN -oauth2client.client._raise_exception_for_reading_json oauth2client.client-module.html#_raise_exception_for_reading_json -oauth2client.client._parse_exchange_token_response oauth2client.client-module.html#_parse_exchange_token_response -oauth2client.client.HAS_OPENSSL oauth2client.client-module.html#HAS_OPENSSL -oauth2client.client.ID_TOKEN_VERIFICATION_CERTS oauth2client.client-module.html#ID_TOKEN_VERIFICATION_CERTS -oauth2client.client._RequireCryptoOrDie oauth2client.client-module.html#_RequireCryptoOrDie -oauth2client.client.GOOGLE_APPLICATION_CREDENTIALS oauth2client.client-module.html#GOOGLE_APPLICATION_CREDENTIALS -oauth2client.client._cached_http oauth2client.client-module.html#_cached_http -oauth2client.client.verify_id_token oauth2client.client-module.html#verify_id_token -oauth2client.client.flow_from_clientsecrets oauth2client.client-module.html#flow_from_clientsecrets -oauth2client.client.save_to_well_known_file oauth2client.client-module.html#save_to_well_known_file -oauth2client.client.SERVICE_ACCOUNT oauth2client.client-module.html#SERVICE_ACCOUNT -oauth2client.client._urlsafe_b64decode oauth2client.client-module.html#_urlsafe_b64decode -oauth2client.client.REFRESH_STATUS_CODES oauth2client.client-module.html#REFRESH_STATUS_CODES -oauth2client.clientsecrets oauth2client.clientsecrets-module.html -oauth2client.clientsecrets.load oauth2client.clientsecrets-module.html#load -oauth2client.clientsecrets.TYPE_INSTALLED oauth2client.clientsecrets-module.html#TYPE_INSTALLED -oauth2client.clientsecrets._validate_clientsecrets oauth2client.clientsecrets-module.html#_validate_clientsecrets -oauth2client.clientsecrets.TYPE_WEB oauth2client.clientsecrets-module.html#TYPE_WEB -oauth2client.clientsecrets.VALID_CLIENT oauth2client.clientsecrets-module.html#VALID_CLIENT -oauth2client.clientsecrets.loadfile oauth2client.clientsecrets-module.html#loadfile -oauth2client.clientsecrets._loadfile oauth2client.clientsecrets-module.html#_loadfile -oauth2client.clientsecrets.loads oauth2client.clientsecrets-module.html#loads -oauth2client.crypt oauth2client.crypt-module.html -oauth2client.crypt.AUTH_TOKEN_LIFETIME_SECS oauth2client.crypt-module.html#AUTH_TOKEN_LIFETIME_SECS -oauth2client.crypt.PyCryptoVerifier oauth2client.crypt-module.html#PyCryptoVerifier -oauth2client.crypt.Verifier oauth2client.crypt-module.html#Verifier -oauth2client.crypt.PyCryptoSigner oauth2client.crypt-module.html#PyCryptoSigner -oauth2client.crypt.OpenSSLSigner oauth2client.crypt-module.html#OpenSSLSigner -oauth2client.crypt.MAX_TOKEN_LIFETIME_SECS oauth2client.crypt-module.html#MAX_TOKEN_LIFETIME_SECS -oauth2client.crypt.logger oauth2client.crypt-module.html#logger -oauth2client.crypt._parse_pem_key oauth2client.crypt-module.html#_parse_pem_key -oauth2client.crypt.OpenSSLVerifier oauth2client.crypt-module.html#OpenSSLVerifier -oauth2client.crypt._urlsafe_b64encode oauth2client.crypt-module.html#_urlsafe_b64encode -oauth2client.crypt.Signer oauth2client.crypt-module.html#Signer -oauth2client.crypt._urlsafe_b64decode oauth2client.crypt-module.html#_urlsafe_b64decode -oauth2client.crypt.verify_signed_jwt_with_certs oauth2client.crypt-module.html#verify_signed_jwt_with_certs -oauth2client.crypt.CLOCK_SKEW_SECS oauth2client.crypt-module.html#CLOCK_SKEW_SECS -oauth2client.crypt._json_encode oauth2client.crypt-module.html#_json_encode -oauth2client.crypt.make_signed_jwt oauth2client.crypt-module.html#make_signed_jwt -oauth2client.django_orm oauth2client.django_orm-module.html -oauth2client.file oauth2client.file-module.html -oauth2client.gce oauth2client.gce-module.html -oauth2client.gce.META oauth2client.gce-module.html#META -oauth2client.gce.logger oauth2client.gce-module.html#logger -oauth2client.keyring_storage oauth2client.keyring_storage-module.html -oauth2client.locked_file oauth2client.locked_file-module.html -oauth2client.locked_file._FcntlOpener oauth2client.locked_file-module.html#_FcntlOpener -oauth2client.locked_file._Win32Opener oauth2client.locked_file-module.html#_Win32Opener -oauth2client.locked_file.validate_file oauth2client.locked_file-module.html#validate_file -oauth2client.locked_file.logger oauth2client.locked_file-module.html#logger -oauth2client.multistore_file oauth2client.multistore_file-module.html -oauth2client.multistore_file.get_credential_storage oauth2client.multistore_file-module.html#get_credential_storage -oauth2client.multistore_file._get_multistore oauth2client.multistore_file-module.html#_get_multistore -oauth2client.multistore_file.get_all_credential_keys oauth2client.multistore_file-module.html#get_all_credential_keys -oauth2client.multistore_file._multistores_lock oauth2client.multistore_file-module.html#_multistores_lock -oauth2client.multistore_file.get_credential_storage_custom_key oauth2client.multistore_file-module.html#get_credential_storage_custom_key -oauth2client.multistore_file._multistores oauth2client.multistore_file-module.html#_multistores -oauth2client.multistore_file.get_credential_storage_custom_string_key oauth2client.multistore_file-module.html#get_credential_storage_custom_string_key -oauth2client.multistore_file.logger oauth2client.multistore_file-module.html#logger -oauth2client.old_run oauth2client.old_run-module.html -oauth2client.old_run.run oauth2client.old_run-module.html#run -oauth2client.old_run.FLAGS oauth2client.old_run-module.html#FLAGS -oauth2client.service_account oauth2client.service_account-module.html -oauth2client.service_account._urlsafe_b64encode oauth2client.service_account-module.html#_urlsafe_b64encode -oauth2client.service_account._get_private_key oauth2client.service_account-module.html#_get_private_key -oauth2client.tools oauth2client.tools-module.html -oauth2client.tools.argparser oauth2client.tools-module.html#argparser -oauth2client.tools._CLIENT_SECRETS_MESSAGE oauth2client.tools-module.html#_CLIENT_SECRETS_MESSAGE -oauth2client.tools.message_if_missing oauth2client.tools-module.html#message_if_missing -oauth2client.tools._CreateArgumentParser oauth2client.tools-module.html#_CreateArgumentParser -oauth2client.tools.run oauth2client.tools-module.html#run -oauth2client.tools.run_flow oauth2client.tools-module.html#run_flow -oauth2client.util oauth2client.util-module.html -oauth2client.util.POSITIONAL_EXCEPTION oauth2client.util-module.html#POSITIONAL_EXCEPTION -oauth2client.util._add_query_parameter oauth2client.util-module.html#_add_query_parameter -oauth2client.util.scopes_to_string oauth2client.util-module.html#scopes_to_string -oauth2client.util.dict_to_tuple_key oauth2client.util-module.html#dict_to_tuple_key -oauth2client.util.POSITIONAL_IGNORE oauth2client.util-module.html#POSITIONAL_IGNORE -oauth2client.util.positional oauth2client.util-module.html#positional -oauth2client.util.POSITIONAL_WARNING oauth2client.util-module.html#POSITIONAL_WARNING -oauth2client.util.logger oauth2client.util-module.html#logger -oauth2client.util.positional_parameters_enforcement oauth2client.util-module.html#positional_parameters_enforcement -oauth2client.util.POSITIONAL_SET oauth2client.util-module.html#POSITIONAL_SET -oauth2client.xsrfutil oauth2client.xsrfutil-module.html -oauth2client.xsrfutil.validate_token oauth2client.xsrfutil-module.html#validate_token -oauth2client.xsrfutil._force_bytes oauth2client.xsrfutil-module.html#_force_bytes -oauth2client.xsrfutil.DEFAULT_TIMEOUT_SECS oauth2client.xsrfutil-module.html#DEFAULT_TIMEOUT_SECS -oauth2client.xsrfutil.DELIMITER oauth2client.xsrfutil-module.html#DELIMITER -oauth2client.xsrfutil.generate_token oauth2client.xsrfutil-module.html#generate_token -oauth2client.appengine.AppAssertionCredentials oauth2client.appengine.AppAssertionCredentials-class.html -oauth2client.appengine.AppAssertionCredentials.from_json oauth2client.appengine.AppAssertionCredentials-class.html#from_json -oauth2client.appengine.AppAssertionCredentials.serialization_data oauth2client.appengine.AppAssertionCredentials-class.html#serialization_data -oauth2client.client.OAuth2Credentials.revoke oauth2client.client.OAuth2Credentials-class.html#revoke -oauth2client.client.OAuth2Credentials.set_store oauth2client.client.OAuth2Credentials-class.html#set_store -oauth2client.client.OAuth2Credentials.authorize oauth2client.client.OAuth2Credentials-class.html#authorize -oauth2client.client.OAuth2Credentials.to_json oauth2client.client.OAuth2Credentials-class.html#to_json -oauth2client.client.OAuth2Credentials.apply oauth2client.client.OAuth2Credentials-class.html#apply -oauth2client.client.Credentials.new_from_json oauth2client.client.Credentials-class.html#new_from_json -oauth2client.appengine.AppAssertionCredentials.__init__ oauth2client.appengine.AppAssertionCredentials-class.html#__init__ -oauth2client.client.OAuth2Credentials._generate_refresh_request_headers oauth2client.client.OAuth2Credentials-class.html#_generate_refresh_request_headers -oauth2client.client.Credentials._to_json oauth2client.client.Credentials-class.html#_to_json -oauth2client.client.AssertionCredentials._generate_assertion oauth2client.client.AssertionCredentials-class.html#_generate_assertion -oauth2client.client.OAuth2Credentials.__getstate__ oauth2client.client.OAuth2Credentials-class.html#__getstate__ -oauth2client.client.GoogleCredentials.from_stream oauth2client.client.GoogleCredentials-class.html#from_stream -oauth2client.client.OAuth2Credentials.__setstate__ oauth2client.client.OAuth2Credentials-class.html#__setstate__ -oauth2client.client.OAuth2Credentials._expires_in oauth2client.client.OAuth2Credentials-class.html#_expires_in -oauth2client.appengine.AppAssertionCredentials._refresh oauth2client.appengine.AppAssertionCredentials-class.html#_refresh -oauth2client.client.AssertionCredentials._revoke oauth2client.client.AssertionCredentials-class.html#_revoke -oauth2client.client.Credentials.NON_SERIALIZED_MEMBERS oauth2client.client.Credentials-class.html#NON_SERIALIZED_MEMBERS -oauth2client.appengine.AppAssertionCredentials.create_scoped oauth2client.appengine.AppAssertionCredentials-class.html#create_scoped -oauth2client.client.OAuth2Credentials._do_revoke oauth2client.client.OAuth2Credentials-class.html#_do_revoke -oauth2client.client.AssertionCredentials._generate_refresh_request_body oauth2client.client.AssertionCredentials-class.html#_generate_refresh_request_body -oauth2client.client.GoogleCredentials.get_application_default oauth2client.client.GoogleCredentials-class.html#get_application_default -oauth2client.client.OAuth2Credentials._updateFromCredential oauth2client.client.OAuth2Credentials-class.html#_updateFromCredential -oauth2client.client.OAuth2Credentials._do_refresh_request oauth2client.client.OAuth2Credentials-class.html#_do_refresh_request -oauth2client.appengine.AppAssertionCredentials.create_scoped_required oauth2client.appengine.AppAssertionCredentials-class.html#create_scoped_required -oauth2client.client.OAuth2Credentials.refresh oauth2client.client.OAuth2Credentials-class.html#refresh -oauth2client.client.OAuth2Credentials.get_access_token oauth2client.client.OAuth2Credentials-class.html#get_access_token -oauth2client.client.OAuth2Credentials.access_token_expired oauth2client.client.OAuth2Credentials-class.html#access_token_expired -oauth2client.appengine.CredentialsModel oauth2client.appengine.CredentialsModel-class.html -oauth2client.appengine.CredentialsModel.credentials oauth2client.appengine.CredentialsModel-class.html#credentials -oauth2client.appengine.CredentialsNDBModel oauth2client.appengine.CredentialsNDBModel-class.html -oauth2client.appengine.CredentialsNDBModel.credentials oauth2client.appengine.CredentialsNDBModel-class.html#credentials -oauth2client.appengine.CredentialsNDBModel._get_kind oauth2client.appengine.CredentialsNDBModel-class.html#_get_kind -oauth2client.appengine.CredentialsNDBProperty oauth2client.appengine.CredentialsNDBProperty-class.html -oauth2client.appengine.CredentialsNDBProperty._validate oauth2client.appengine.CredentialsNDBProperty-class.html#_validate -oauth2client.appengine.CredentialsNDBProperty._from_base_type oauth2client.appengine.CredentialsNDBProperty-class.html#_from_base_type -oauth2client.appengine.CredentialsNDBProperty._to_base_type oauth2client.appengine.CredentialsNDBProperty-class.html#_to_base_type -oauth2client.appengine.CredentialsProperty oauth2client.appengine.CredentialsProperty-class.html -oauth2client.appengine.CredentialsProperty.make_value_from_datastore oauth2client.appengine.CredentialsProperty-class.html#make_value_from_datastore -oauth2client.appengine.CredentialsProperty.validate oauth2client.appengine.CredentialsProperty-class.html#validate -oauth2client.appengine.CredentialsProperty.get_value_for_datastore oauth2client.appengine.CredentialsProperty-class.html#get_value_for_datastore -oauth2client.appengine.CredentialsProperty.data_type oauth2client.appengine.CredentialsProperty-class.html#data_type -oauth2client.appengine.FlowNDBProperty oauth2client.appengine.FlowNDBProperty-class.html -oauth2client.appengine.FlowNDBProperty._validate oauth2client.appengine.FlowNDBProperty-class.html#_validate -oauth2client.appengine.FlowProperty oauth2client.appengine.FlowProperty-class.html -oauth2client.appengine.FlowProperty.make_value_from_datastore oauth2client.appengine.FlowProperty-class.html#make_value_from_datastore -oauth2client.appengine.FlowProperty.validate oauth2client.appengine.FlowProperty-class.html#validate -oauth2client.appengine.FlowProperty.get_value_for_datastore oauth2client.appengine.FlowProperty-class.html#get_value_for_datastore -oauth2client.appengine.FlowProperty.empty oauth2client.appengine.FlowProperty-class.html#empty -oauth2client.appengine.FlowProperty.data_type oauth2client.appengine.FlowProperty-class.html#data_type -oauth2client.appengine.InvalidClientSecretsError oauth2client.appengine.InvalidClientSecretsError-class.html -oauth2client.appengine.InvalidXsrfTokenError oauth2client.appengine.InvalidXsrfTokenError-class.html -oauth2client.appengine.OAuth2Decorator oauth2client.appengine.OAuth2Decorator-class.html -oauth2client.appengine.OAuth2Decorator.get_flow oauth2client.appengine.OAuth2Decorator-class.html#get_flow -oauth2client.appengine.OAuth2Decorator.set_credentials oauth2client.appengine.OAuth2Decorator-class.html#set_credentials -oauth2client.appengine.OAuth2Decorator.set_flow oauth2client.appengine.OAuth2Decorator-class.html#set_flow -oauth2client.appengine.OAuth2Decorator.__init__ oauth2client.appengine.OAuth2Decorator-class.html#__init__ -oauth2client.appengine.OAuth2Decorator.authorize_url oauth2client.appengine.OAuth2Decorator-class.html#authorize_url -oauth2client.appengine.OAuth2Decorator.callback_handler oauth2client.appengine.OAuth2Decorator-class.html#callback_handler -oauth2client.appengine.OAuth2Decorator._display_error_message oauth2client.appengine.OAuth2Decorator-class.html#_display_error_message -oauth2client.appengine.OAuth2Decorator.http oauth2client.appengine.OAuth2Decorator-class.html#http -oauth2client.appengine.OAuth2Decorator._create_flow oauth2client.appengine.OAuth2Decorator-class.html#_create_flow -oauth2client.appengine.OAuth2Decorator.has_credentials oauth2client.appengine.OAuth2Decorator-class.html#has_credentials -oauth2client.appengine.OAuth2Decorator.credentials oauth2client.appengine.OAuth2Decorator-class.html#credentials -oauth2client.appengine.OAuth2Decorator.callback_application oauth2client.appengine.OAuth2Decorator-class.html#callback_application -oauth2client.appengine.OAuth2Decorator.oauth_aware oauth2client.appengine.OAuth2Decorator-class.html#oauth_aware -oauth2client.appengine.OAuth2Decorator.flow oauth2client.appengine.OAuth2Decorator-class.html#flow -oauth2client.appengine.OAuth2Decorator.get_credentials oauth2client.appengine.OAuth2Decorator-class.html#get_credentials -oauth2client.appengine.OAuth2Decorator.callback_path oauth2client.appengine.OAuth2Decorator-class.html#callback_path -oauth2client.appengine.OAuth2Decorator.oauth_required oauth2client.appengine.OAuth2Decorator-class.html#oauth_required -oauth2client.appengine.OAuth2DecoratorFromClientSecrets oauth2client.appengine.OAuth2DecoratorFromClientSecrets-class.html -oauth2client.appengine.OAuth2Decorator.get_flow oauth2client.appengine.OAuth2Decorator-class.html#get_flow -oauth2client.appengine.OAuth2Decorator.set_credentials oauth2client.appengine.OAuth2Decorator-class.html#set_credentials -oauth2client.appengine.OAuth2Decorator.set_flow oauth2client.appengine.OAuth2Decorator-class.html#set_flow -oauth2client.appengine.OAuth2DecoratorFromClientSecrets.__init__ oauth2client.appengine.OAuth2DecoratorFromClientSecrets-class.html#__init__ -oauth2client.appengine.OAuth2Decorator.authorize_url oauth2client.appengine.OAuth2Decorator-class.html#authorize_url -oauth2client.appengine.OAuth2Decorator.callback_handler oauth2client.appengine.OAuth2Decorator-class.html#callback_handler -oauth2client.appengine.OAuth2Decorator._display_error_message oauth2client.appengine.OAuth2Decorator-class.html#_display_error_message -oauth2client.appengine.OAuth2Decorator.http oauth2client.appengine.OAuth2Decorator-class.html#http -oauth2client.appengine.OAuth2Decorator._create_flow oauth2client.appengine.OAuth2Decorator-class.html#_create_flow -oauth2client.appengine.OAuth2Decorator.has_credentials oauth2client.appengine.OAuth2Decorator-class.html#has_credentials -oauth2client.appengine.OAuth2Decorator.credentials oauth2client.appengine.OAuth2Decorator-class.html#credentials -oauth2client.appengine.OAuth2Decorator.callback_application oauth2client.appengine.OAuth2Decorator-class.html#callback_application -oauth2client.appengine.OAuth2Decorator.oauth_aware oauth2client.appengine.OAuth2Decorator-class.html#oauth_aware -oauth2client.appengine.OAuth2Decorator.flow oauth2client.appengine.OAuth2Decorator-class.html#flow -oauth2client.appengine.OAuth2Decorator.get_credentials oauth2client.appengine.OAuth2Decorator-class.html#get_credentials -oauth2client.appengine.OAuth2Decorator.callback_path oauth2client.appengine.OAuth2Decorator-class.html#callback_path -oauth2client.appengine.OAuth2Decorator.oauth_required oauth2client.appengine.OAuth2Decorator-class.html#oauth_required -oauth2client.appengine.SiteXsrfSecretKey oauth2client.appengine.SiteXsrfSecretKey-class.html -oauth2client.appengine.SiteXsrfSecretKey.secret oauth2client.appengine.SiteXsrfSecretKey-class.html#secret -oauth2client.appengine.SiteXsrfSecretKeyNDB oauth2client.appengine.SiteXsrfSecretKeyNDB-class.html -oauth2client.appengine.SiteXsrfSecretKeyNDB.secret oauth2client.appengine.SiteXsrfSecretKeyNDB-class.html#secret -oauth2client.appengine.SiteXsrfSecretKeyNDB._get_kind oauth2client.appengine.SiteXsrfSecretKeyNDB-class.html#_get_kind -oauth2client.appengine.StorageByKeyName oauth2client.appengine.StorageByKeyName-class.html -oauth2client.client.Storage.acquire_lock oauth2client.client.Storage-class.html#acquire_lock -oauth2client.appengine.StorageByKeyName.locked_put oauth2client.appengine.StorageByKeyName-class.html#locked_put -oauth2client.appengine.StorageByKeyName.__init__ oauth2client.appengine.StorageByKeyName-class.html#__init__ -oauth2client.appengine.StorageByKeyName.locked_delete oauth2client.appengine.StorageByKeyName-class.html#locked_delete -oauth2client.appengine.StorageByKeyName.locked_get oauth2client.appengine.StorageByKeyName-class.html#locked_get -oauth2client.client.Storage.get oauth2client.client.Storage-class.html#get -oauth2client.client.Storage.put oauth2client.client.Storage-class.html#put -oauth2client.appengine.StorageByKeyName._is_ndb oauth2client.appengine.StorageByKeyName-class.html#_is_ndb -oauth2client.appengine.StorageByKeyName._get_entity oauth2client.appengine.StorageByKeyName-class.html#_get_entity -oauth2client.client.Storage.release_lock oauth2client.client.Storage-class.html#release_lock -oauth2client.appengine.StorageByKeyName._delete_entity oauth2client.appengine.StorageByKeyName-class.html#_delete_entity -oauth2client.client.Storage.delete oauth2client.client.Storage-class.html#delete -oauth2client.client.AccessTokenCredentials oauth2client.client.AccessTokenCredentials-class.html -oauth2client.client.AccessTokenCredentials.from_json oauth2client.client.AccessTokenCredentials-class.html#from_json -oauth2client.client.OAuth2Credentials.authorize oauth2client.client.OAuth2Credentials-class.html#authorize -oauth2client.client.OAuth2Credentials.revoke oauth2client.client.OAuth2Credentials-class.html#revoke -oauth2client.client.OAuth2Credentials.set_store oauth2client.client.OAuth2Credentials-class.html#set_store -oauth2client.client.OAuth2Credentials.to_json oauth2client.client.OAuth2Credentials-class.html#to_json -oauth2client.client.OAuth2Credentials.apply oauth2client.client.OAuth2Credentials-class.html#apply -oauth2client.client.Credentials.new_from_json oauth2client.client.Credentials-class.html#new_from_json -oauth2client.client.AccessTokenCredentials.__init__ oauth2client.client.AccessTokenCredentials-class.html#__init__ -oauth2client.client.OAuth2Credentials._generate_refresh_request_headers oauth2client.client.OAuth2Credentials-class.html#_generate_refresh_request_headers -oauth2client.client.Credentials._to_json oauth2client.client.Credentials-class.html#_to_json -oauth2client.client.Credentials.NON_SERIALIZED_MEMBERS oauth2client.client.Credentials-class.html#NON_SERIALIZED_MEMBERS -oauth2client.client.OAuth2Credentials.__getstate__ oauth2client.client.OAuth2Credentials-class.html#__getstate__ -oauth2client.client.OAuth2Credentials.__setstate__ oauth2client.client.OAuth2Credentials-class.html#__setstate__ -oauth2client.client.OAuth2Credentials._expires_in oauth2client.client.OAuth2Credentials-class.html#_expires_in -oauth2client.client.AccessTokenCredentials._refresh oauth2client.client.AccessTokenCredentials-class.html#_refresh -oauth2client.client.AccessTokenCredentials._revoke oauth2client.client.AccessTokenCredentials-class.html#_revoke -oauth2client.client.OAuth2Credentials._do_revoke oauth2client.client.OAuth2Credentials-class.html#_do_revoke -oauth2client.client.OAuth2Credentials._generate_refresh_request_body oauth2client.client.OAuth2Credentials-class.html#_generate_refresh_request_body -oauth2client.client.OAuth2Credentials._updateFromCredential oauth2client.client.OAuth2Credentials-class.html#_updateFromCredential -oauth2client.client.OAuth2Credentials._do_refresh_request oauth2client.client.OAuth2Credentials-class.html#_do_refresh_request -oauth2client.client.OAuth2Credentials.refresh oauth2client.client.OAuth2Credentials-class.html#refresh -oauth2client.client.OAuth2Credentials.get_access_token oauth2client.client.OAuth2Credentials-class.html#get_access_token -oauth2client.client.OAuth2Credentials.access_token_expired oauth2client.client.OAuth2Credentials-class.html#access_token_expired -oauth2client.client.AccessTokenCredentialsError oauth2client.client.AccessTokenCredentialsError-class.html -oauth2client.client.AccessTokenRefreshError oauth2client.client.AccessTokenRefreshError-class.html -oauth2client.client.ApplicationDefaultCredentialsError oauth2client.client.ApplicationDefaultCredentialsError-class.html -oauth2client.client.AssertionCredentials oauth2client.client.AssertionCredentials-class.html -oauth2client.client.OAuth2Credentials.authorize oauth2client.client.OAuth2Credentials-class.html#authorize -oauth2client.client.GoogleCredentials.serialization_data oauth2client.client.GoogleCredentials-class.html#serialization_data -oauth2client.client.OAuth2Credentials.revoke oauth2client.client.OAuth2Credentials-class.html#revoke -oauth2client.client.OAuth2Credentials.set_store oauth2client.client.OAuth2Credentials-class.html#set_store -oauth2client.client.OAuth2Credentials.to_json oauth2client.client.OAuth2Credentials-class.html#to_json -oauth2client.client.OAuth2Credentials.apply oauth2client.client.OAuth2Credentials-class.html#apply -oauth2client.client.Credentials.new_from_json oauth2client.client.Credentials-class.html#new_from_json -oauth2client.client.AssertionCredentials.__init__ oauth2client.client.AssertionCredentials-class.html#__init__ -oauth2client.client.OAuth2Credentials._generate_refresh_request_headers oauth2client.client.OAuth2Credentials-class.html#_generate_refresh_request_headers -oauth2client.client.Credentials._to_json oauth2client.client.Credentials-class.html#_to_json -oauth2client.client.AssertionCredentials._generate_assertion oauth2client.client.AssertionCredentials-class.html#_generate_assertion -oauth2client.client.OAuth2Credentials.__getstate__ oauth2client.client.OAuth2Credentials-class.html#__getstate__ -oauth2client.client.GoogleCredentials.from_stream oauth2client.client.GoogleCredentials-class.html#from_stream -oauth2client.client.OAuth2Credentials.__setstate__ oauth2client.client.OAuth2Credentials-class.html#__setstate__ -oauth2client.client.OAuth2Credentials._expires_in oauth2client.client.OAuth2Credentials-class.html#_expires_in -oauth2client.client.OAuth2Credentials._refresh oauth2client.client.OAuth2Credentials-class.html#_refresh -oauth2client.client.AssertionCredentials._revoke oauth2client.client.AssertionCredentials-class.html#_revoke -oauth2client.client.Credentials.NON_SERIALIZED_MEMBERS oauth2client.client.Credentials-class.html#NON_SERIALIZED_MEMBERS -oauth2client.client.GoogleCredentials.create_scoped oauth2client.client.GoogleCredentials-class.html#create_scoped -oauth2client.client.OAuth2Credentials._do_revoke oauth2client.client.OAuth2Credentials-class.html#_do_revoke -oauth2client.client.AssertionCredentials._generate_refresh_request_body oauth2client.client.AssertionCredentials-class.html#_generate_refresh_request_body -oauth2client.client.GoogleCredentials.get_application_default oauth2client.client.GoogleCredentials-class.html#get_application_default -oauth2client.client.OAuth2Credentials._updateFromCredential oauth2client.client.OAuth2Credentials-class.html#_updateFromCredential -oauth2client.client.OAuth2Credentials._do_refresh_request oauth2client.client.OAuth2Credentials-class.html#_do_refresh_request -oauth2client.client.GoogleCredentials.create_scoped_required oauth2client.client.GoogleCredentials-class.html#create_scoped_required -oauth2client.client.OAuth2Credentials.refresh oauth2client.client.OAuth2Credentials-class.html#refresh -oauth2client.client.OAuth2Credentials.get_access_token oauth2client.client.OAuth2Credentials-class.html#get_access_token -oauth2client.client.OAuth2Credentials.from_json oauth2client.client.OAuth2Credentials-class.html#from_json -oauth2client.client.OAuth2Credentials.access_token_expired oauth2client.client.OAuth2Credentials-class.html#access_token_expired -oauth2client.client.Credentials oauth2client.client.Credentials-class.html -oauth2client.client.Credentials.authorize oauth2client.client.Credentials-class.html#authorize -oauth2client.client.Credentials.from_json oauth2client.client.Credentials-class.html#from_json -oauth2client.client.Credentials.revoke oauth2client.client.Credentials-class.html#revoke -oauth2client.client.Credentials.to_json oauth2client.client.Credentials-class.html#to_json -oauth2client.client.Credentials.apply oauth2client.client.Credentials-class.html#apply -oauth2client.client.Credentials.new_from_json oauth2client.client.Credentials-class.html#new_from_json -oauth2client.client.Credentials._to_json oauth2client.client.Credentials-class.html#_to_json -oauth2client.client.Credentials.NON_SERIALIZED_MEMBERS oauth2client.client.Credentials-class.html#NON_SERIALIZED_MEMBERS -oauth2client.client.Credentials.refresh oauth2client.client.Credentials-class.html#refresh -oauth2client.client.CryptoUnavailableError oauth2client.client.CryptoUnavailableError-class.html -oauth2client.client.DeviceFlowInfo oauth2client.client.DeviceFlowInfo-class.html -oauth2client.client.DeviceFlowInfo.FromResponse oauth2client.client.DeviceFlowInfo-class.html#FromResponse -oauth2client.client.Error oauth2client.client.Error-class.html -oauth2client.client.Flow oauth2client.client.Flow-class.html -oauth2client.client.FlowExchangeError oauth2client.client.FlowExchangeError-class.html -oauth2client.client.GoogleCredentials oauth2client.client.GoogleCredentials-class.html -oauth2client.client.OAuth2Credentials.authorize oauth2client.client.OAuth2Credentials-class.html#authorize -oauth2client.client.GoogleCredentials.serialization_data oauth2client.client.GoogleCredentials-class.html#serialization_data -oauth2client.client.OAuth2Credentials.revoke oauth2client.client.OAuth2Credentials-class.html#revoke -oauth2client.client.OAuth2Credentials.set_store oauth2client.client.OAuth2Credentials-class.html#set_store -oauth2client.client.OAuth2Credentials.to_json oauth2client.client.OAuth2Credentials-class.html#to_json -oauth2client.client.OAuth2Credentials.apply oauth2client.client.OAuth2Credentials-class.html#apply -oauth2client.client.Credentials.new_from_json oauth2client.client.Credentials-class.html#new_from_json -oauth2client.client.GoogleCredentials.__init__ oauth2client.client.GoogleCredentials-class.html#__init__ -oauth2client.client.OAuth2Credentials._generate_refresh_request_headers oauth2client.client.OAuth2Credentials-class.html#_generate_refresh_request_headers -oauth2client.client.Credentials._to_json oauth2client.client.Credentials-class.html#_to_json -oauth2client.client.Credentials.NON_SERIALIZED_MEMBERS oauth2client.client.Credentials-class.html#NON_SERIALIZED_MEMBERS -oauth2client.client.OAuth2Credentials.__getstate__ oauth2client.client.OAuth2Credentials-class.html#__getstate__ -oauth2client.client.GoogleCredentials.from_stream oauth2client.client.GoogleCredentials-class.html#from_stream -oauth2client.client.OAuth2Credentials.__setstate__ oauth2client.client.OAuth2Credentials-class.html#__setstate__ -oauth2client.client.OAuth2Credentials._expires_in oauth2client.client.OAuth2Credentials-class.html#_expires_in -oauth2client.client.OAuth2Credentials._refresh oauth2client.client.OAuth2Credentials-class.html#_refresh -oauth2client.client.OAuth2Credentials._revoke oauth2client.client.OAuth2Credentials-class.html#_revoke -oauth2client.client.GoogleCredentials.create_scoped oauth2client.client.GoogleCredentials-class.html#create_scoped -oauth2client.client.OAuth2Credentials._do_revoke oauth2client.client.OAuth2Credentials-class.html#_do_revoke -oauth2client.client.OAuth2Credentials._generate_refresh_request_body oauth2client.client.OAuth2Credentials-class.html#_generate_refresh_request_body -oauth2client.client.GoogleCredentials.get_application_default oauth2client.client.GoogleCredentials-class.html#get_application_default -oauth2client.client.OAuth2Credentials._updateFromCredential oauth2client.client.OAuth2Credentials-class.html#_updateFromCredential -oauth2client.client.OAuth2Credentials._do_refresh_request oauth2client.client.OAuth2Credentials-class.html#_do_refresh_request -oauth2client.client.GoogleCredentials.create_scoped_required oauth2client.client.GoogleCredentials-class.html#create_scoped_required -oauth2client.client.OAuth2Credentials.refresh oauth2client.client.OAuth2Credentials-class.html#refresh -oauth2client.client.OAuth2Credentials.get_access_token oauth2client.client.OAuth2Credentials-class.html#get_access_token -oauth2client.client.OAuth2Credentials.from_json oauth2client.client.OAuth2Credentials-class.html#from_json -oauth2client.client.OAuth2Credentials.access_token_expired oauth2client.client.OAuth2Credentials-class.html#access_token_expired -oauth2client.client.MemoryCache oauth2client.client.MemoryCache-class.html -oauth2client.client.MemoryCache.set oauth2client.client.MemoryCache-class.html#set -oauth2client.client.MemoryCache.get oauth2client.client.MemoryCache-class.html#get -oauth2client.client.MemoryCache.__init__ oauth2client.client.MemoryCache-class.html#__init__ -oauth2client.client.MemoryCache.delete oauth2client.client.MemoryCache-class.html#delete -oauth2client.client.NonAsciiHeaderError oauth2client.client.NonAsciiHeaderError-class.html -oauth2client.client.OAuth2Credentials oauth2client.client.OAuth2Credentials-class.html -oauth2client.client.OAuth2Credentials.authorize oauth2client.client.OAuth2Credentials-class.html#authorize -oauth2client.client.OAuth2Credentials.from_json oauth2client.client.OAuth2Credentials-class.html#from_json -oauth2client.client.OAuth2Credentials.revoke oauth2client.client.OAuth2Credentials-class.html#revoke -oauth2client.client.OAuth2Credentials.set_store oauth2client.client.OAuth2Credentials-class.html#set_store -oauth2client.client.OAuth2Credentials.to_json oauth2client.client.OAuth2Credentials-class.html#to_json -oauth2client.client.OAuth2Credentials.apply oauth2client.client.OAuth2Credentials-class.html#apply -oauth2client.client.Credentials.new_from_json oauth2client.client.Credentials-class.html#new_from_json -oauth2client.client.OAuth2Credentials.__init__ oauth2client.client.OAuth2Credentials-class.html#__init__ -oauth2client.client.OAuth2Credentials._generate_refresh_request_headers oauth2client.client.OAuth2Credentials-class.html#_generate_refresh_request_headers -oauth2client.client.Credentials._to_json oauth2client.client.Credentials-class.html#_to_json -oauth2client.client.Credentials.NON_SERIALIZED_MEMBERS oauth2client.client.Credentials-class.html#NON_SERIALIZED_MEMBERS -oauth2client.client.OAuth2Credentials.__getstate__ oauth2client.client.OAuth2Credentials-class.html#__getstate__ -oauth2client.client.OAuth2Credentials.__setstate__ oauth2client.client.OAuth2Credentials-class.html#__setstate__ -oauth2client.client.OAuth2Credentials._expires_in oauth2client.client.OAuth2Credentials-class.html#_expires_in -oauth2client.client.OAuth2Credentials._refresh oauth2client.client.OAuth2Credentials-class.html#_refresh -oauth2client.client.OAuth2Credentials._revoke oauth2client.client.OAuth2Credentials-class.html#_revoke -oauth2client.client.OAuth2Credentials._do_revoke oauth2client.client.OAuth2Credentials-class.html#_do_revoke -oauth2client.client.OAuth2Credentials._generate_refresh_request_body oauth2client.client.OAuth2Credentials-class.html#_generate_refresh_request_body -oauth2client.client.OAuth2Credentials._updateFromCredential oauth2client.client.OAuth2Credentials-class.html#_updateFromCredential -oauth2client.client.OAuth2Credentials._do_refresh_request oauth2client.client.OAuth2Credentials-class.html#_do_refresh_request -oauth2client.client.OAuth2Credentials.refresh oauth2client.client.OAuth2Credentials-class.html#refresh -oauth2client.client.OAuth2Credentials.get_access_token oauth2client.client.OAuth2Credentials-class.html#get_access_token -oauth2client.client.OAuth2Credentials.access_token_expired oauth2client.client.OAuth2Credentials-class.html#access_token_expired -oauth2client.client.OAuth2DeviceCodeError oauth2client.client.OAuth2DeviceCodeError-class.html -oauth2client.client.OAuth2WebServerFlow oauth2client.client.OAuth2WebServerFlow-class.html -oauth2client.client.OAuth2WebServerFlow.step1_get_device_and_user_codes oauth2client.client.OAuth2WebServerFlow-class.html#step1_get_device_and_user_codes -oauth2client.client.OAuth2WebServerFlow.step2_exchange oauth2client.client.OAuth2WebServerFlow-class.html#step2_exchange -oauth2client.client.OAuth2WebServerFlow.step1_get_authorize_url oauth2client.client.OAuth2WebServerFlow-class.html#step1_get_authorize_url -oauth2client.client.OAuth2WebServerFlow.__init__ oauth2client.client.OAuth2WebServerFlow-class.html#__init__ -oauth2client.client.SignedJwtAssertionCredentials oauth2client.client.SignedJwtAssertionCredentials-class.html -oauth2client.client.SignedJwtAssertionCredentials.from_json oauth2client.client.SignedJwtAssertionCredentials-class.html#from_json -oauth2client.client.GoogleCredentials.serialization_data oauth2client.client.GoogleCredentials-class.html#serialization_data -oauth2client.client.OAuth2Credentials.revoke oauth2client.client.OAuth2Credentials-class.html#revoke -oauth2client.client.OAuth2Credentials.set_store oauth2client.client.OAuth2Credentials-class.html#set_store -oauth2client.client.OAuth2Credentials.authorize oauth2client.client.OAuth2Credentials-class.html#authorize -oauth2client.client.OAuth2Credentials.to_json oauth2client.client.OAuth2Credentials-class.html#to_json -oauth2client.client.OAuth2Credentials.apply oauth2client.client.OAuth2Credentials-class.html#apply -oauth2client.client.Credentials.new_from_json oauth2client.client.Credentials-class.html#new_from_json -oauth2client.client.SignedJwtAssertionCredentials.__init__ oauth2client.client.SignedJwtAssertionCredentials-class.html#__init__ -oauth2client.client.OAuth2Credentials._generate_refresh_request_headers oauth2client.client.OAuth2Credentials-class.html#_generate_refresh_request_headers -oauth2client.client.Credentials._to_json oauth2client.client.Credentials-class.html#_to_json -oauth2client.client.SignedJwtAssertionCredentials.MAX_TOKEN_LIFETIME_SECS oauth2client.client.SignedJwtAssertionCredentials-class.html#MAX_TOKEN_LIFETIME_SECS -oauth2client.client.SignedJwtAssertionCredentials._generate_assertion oauth2client.client.SignedJwtAssertionCredentials-class.html#_generate_assertion -oauth2client.client.OAuth2Credentials.__getstate__ oauth2client.client.OAuth2Credentials-class.html#__getstate__ -oauth2client.client.GoogleCredentials.from_stream oauth2client.client.GoogleCredentials-class.html#from_stream -oauth2client.client.OAuth2Credentials.__setstate__ oauth2client.client.OAuth2Credentials-class.html#__setstate__ -oauth2client.client.OAuth2Credentials._expires_in oauth2client.client.OAuth2Credentials-class.html#_expires_in -oauth2client.client.OAuth2Credentials._refresh oauth2client.client.OAuth2Credentials-class.html#_refresh -oauth2client.client.AssertionCredentials._revoke oauth2client.client.AssertionCredentials-class.html#_revoke -oauth2client.client.Credentials.NON_SERIALIZED_MEMBERS oauth2client.client.Credentials-class.html#NON_SERIALIZED_MEMBERS -oauth2client.client.GoogleCredentials.create_scoped oauth2client.client.GoogleCredentials-class.html#create_scoped -oauth2client.client.OAuth2Credentials._do_revoke oauth2client.client.OAuth2Credentials-class.html#_do_revoke -oauth2client.client.AssertionCredentials._generate_refresh_request_body oauth2client.client.AssertionCredentials-class.html#_generate_refresh_request_body -oauth2client.client.GoogleCredentials.get_application_default oauth2client.client.GoogleCredentials-class.html#get_application_default -oauth2client.client.OAuth2Credentials._updateFromCredential oauth2client.client.OAuth2Credentials-class.html#_updateFromCredential -oauth2client.client.OAuth2Credentials._do_refresh_request oauth2client.client.OAuth2Credentials-class.html#_do_refresh_request -oauth2client.client.GoogleCredentials.create_scoped_required oauth2client.client.GoogleCredentials-class.html#create_scoped_required -oauth2client.client.OAuth2Credentials.refresh oauth2client.client.OAuth2Credentials-class.html#refresh -oauth2client.client.OAuth2Credentials.get_access_token oauth2client.client.OAuth2Credentials-class.html#get_access_token -oauth2client.client.OAuth2Credentials.access_token_expired oauth2client.client.OAuth2Credentials-class.html#access_token_expired -oauth2client.client.Storage oauth2client.client.Storage-class.html -oauth2client.client.Storage.acquire_lock oauth2client.client.Storage-class.html#acquire_lock -oauth2client.client.Storage.locked_put oauth2client.client.Storage-class.html#locked_put -oauth2client.client.Storage.locked_delete oauth2client.client.Storage-class.html#locked_delete -oauth2client.client.Storage.locked_get oauth2client.client.Storage-class.html#locked_get -oauth2client.client.Storage.get oauth2client.client.Storage-class.html#get -oauth2client.client.Storage.put oauth2client.client.Storage-class.html#put -oauth2client.client.Storage.release_lock oauth2client.client.Storage-class.html#release_lock -oauth2client.client.Storage.delete oauth2client.client.Storage-class.html#delete -oauth2client.client.TokenRevokeError oauth2client.client.TokenRevokeError-class.html -oauth2client.client.UnknownClientSecretsFlowError oauth2client.client.UnknownClientSecretsFlowError-class.html -oauth2client.client.VerifyJwtTokenError oauth2client.client.VerifyJwtTokenError-class.html -oauth2client.clientsecrets.Error oauth2client.clientsecrets.Error-class.html -oauth2client.clientsecrets.InvalidClientSecretsError oauth2client.clientsecrets.InvalidClientSecretsError-class.html -oauth2client.crypt.AppIdentityError oauth2client.crypt.AppIdentityError-class.html -oauth2client.django_orm.CredentialsField oauth2client.django_orm.CredentialsField-class.html -oauth2client.django_orm.CredentialsField.get_internal_type oauth2client.django_orm.CredentialsField-class.html#get_internal_type -oauth2client.django_orm.CredentialsField.__metaclass__ oauth2client.django_orm.CredentialsField-class.html#__metaclass__ -oauth2client.django_orm.CredentialsField.to_python oauth2client.django_orm.CredentialsField-class.html#to_python -oauth2client.django_orm.CredentialsField.__init__ oauth2client.django_orm.CredentialsField-class.html#__init__ -oauth2client.django_orm.CredentialsField.get_db_prep_value oauth2client.django_orm.CredentialsField-class.html#get_db_prep_value -oauth2client.django_orm.FlowField oauth2client.django_orm.FlowField-class.html -oauth2client.django_orm.FlowField.get_internal_type oauth2client.django_orm.FlowField-class.html#get_internal_type -oauth2client.django_orm.FlowField.__metaclass__ oauth2client.django_orm.FlowField-class.html#__metaclass__ -oauth2client.django_orm.FlowField.to_python oauth2client.django_orm.FlowField-class.html#to_python -oauth2client.django_orm.FlowField.__init__ oauth2client.django_orm.FlowField-class.html#__init__ -oauth2client.django_orm.FlowField.get_db_prep_value oauth2client.django_orm.FlowField-class.html#get_db_prep_value -oauth2client.django_orm.Storage oauth2client.django_orm.Storage-class.html -oauth2client.client.Storage.acquire_lock oauth2client.client.Storage-class.html#acquire_lock -oauth2client.django_orm.Storage.locked_put oauth2client.django_orm.Storage-class.html#locked_put -oauth2client.django_orm.Storage.__init__ oauth2client.django_orm.Storage-class.html#__init__ -oauth2client.django_orm.Storage.locked_delete oauth2client.django_orm.Storage-class.html#locked_delete -oauth2client.django_orm.Storage.locked_get oauth2client.django_orm.Storage-class.html#locked_get -oauth2client.client.Storage.get oauth2client.client.Storage-class.html#get -oauth2client.client.Storage.put oauth2client.client.Storage-class.html#put -oauth2client.client.Storage.release_lock oauth2client.client.Storage-class.html#release_lock -oauth2client.client.Storage.delete oauth2client.client.Storage-class.html#delete -oauth2client.file.CredentialsFileSymbolicLinkError oauth2client.file.CredentialsFileSymbolicLinkError-class.html -oauth2client.file.Storage oauth2client.file.Storage-class.html -oauth2client.file.Storage.acquire_lock oauth2client.file.Storage-class.html#acquire_lock -oauth2client.file.Storage._validate_file oauth2client.file.Storage-class.html#_validate_file -oauth2client.file.Storage.locked_put oauth2client.file.Storage-class.html#locked_put -oauth2client.file.Storage.__init__ oauth2client.file.Storage-class.html#__init__ -oauth2client.file.Storage.locked_delete oauth2client.file.Storage-class.html#locked_delete -oauth2client.file.Storage.locked_get oauth2client.file.Storage-class.html#locked_get -oauth2client.client.Storage.get oauth2client.client.Storage-class.html#get -oauth2client.file.Storage._create_file_if_needed oauth2client.file.Storage-class.html#_create_file_if_needed -oauth2client.client.Storage.put oauth2client.client.Storage-class.html#put -oauth2client.file.Storage.release_lock oauth2client.file.Storage-class.html#release_lock -oauth2client.client.Storage.delete oauth2client.client.Storage-class.html#delete -oauth2client.gce.AppAssertionCredentials oauth2client.gce.AppAssertionCredentials-class.html -oauth2client.gce.AppAssertionCredentials.from_json oauth2client.gce.AppAssertionCredentials-class.html#from_json -oauth2client.gce.AppAssertionCredentials.serialization_data oauth2client.gce.AppAssertionCredentials-class.html#serialization_data -oauth2client.client.OAuth2Credentials.revoke oauth2client.client.OAuth2Credentials-class.html#revoke -oauth2client.client.OAuth2Credentials.set_store oauth2client.client.OAuth2Credentials-class.html#set_store -oauth2client.client.OAuth2Credentials.authorize oauth2client.client.OAuth2Credentials-class.html#authorize -oauth2client.client.OAuth2Credentials.to_json oauth2client.client.OAuth2Credentials-class.html#to_json -oauth2client.client.OAuth2Credentials.apply oauth2client.client.OAuth2Credentials-class.html#apply -oauth2client.client.Credentials.new_from_json oauth2client.client.Credentials-class.html#new_from_json -oauth2client.gce.AppAssertionCredentials.__init__ oauth2client.gce.AppAssertionCredentials-class.html#__init__ -oauth2client.client.OAuth2Credentials._generate_refresh_request_headers oauth2client.client.OAuth2Credentials-class.html#_generate_refresh_request_headers -oauth2client.client.Credentials._to_json oauth2client.client.Credentials-class.html#_to_json -oauth2client.client.AssertionCredentials._generate_assertion oauth2client.client.AssertionCredentials-class.html#_generate_assertion -oauth2client.client.OAuth2Credentials.__getstate__ oauth2client.client.OAuth2Credentials-class.html#__getstate__ -oauth2client.client.GoogleCredentials.from_stream oauth2client.client.GoogleCredentials-class.html#from_stream -oauth2client.client.OAuth2Credentials.__setstate__ oauth2client.client.OAuth2Credentials-class.html#__setstate__ -oauth2client.client.OAuth2Credentials._expires_in oauth2client.client.OAuth2Credentials-class.html#_expires_in -oauth2client.gce.AppAssertionCredentials._refresh oauth2client.gce.AppAssertionCredentials-class.html#_refresh -oauth2client.client.AssertionCredentials._revoke oauth2client.client.AssertionCredentials-class.html#_revoke -oauth2client.client.Credentials.NON_SERIALIZED_MEMBERS oauth2client.client.Credentials-class.html#NON_SERIALIZED_MEMBERS -oauth2client.gce.AppAssertionCredentials.create_scoped oauth2client.gce.AppAssertionCredentials-class.html#create_scoped -oauth2client.client.OAuth2Credentials._do_revoke oauth2client.client.OAuth2Credentials-class.html#_do_revoke -oauth2client.client.AssertionCredentials._generate_refresh_request_body oauth2client.client.AssertionCredentials-class.html#_generate_refresh_request_body -oauth2client.client.GoogleCredentials.get_application_default oauth2client.client.GoogleCredentials-class.html#get_application_default -oauth2client.client.OAuth2Credentials._updateFromCredential oauth2client.client.OAuth2Credentials-class.html#_updateFromCredential -oauth2client.client.OAuth2Credentials._do_refresh_request oauth2client.client.OAuth2Credentials-class.html#_do_refresh_request -oauth2client.gce.AppAssertionCredentials.create_scoped_required oauth2client.gce.AppAssertionCredentials-class.html#create_scoped_required -oauth2client.client.OAuth2Credentials.refresh oauth2client.client.OAuth2Credentials-class.html#refresh -oauth2client.client.OAuth2Credentials.get_access_token oauth2client.client.OAuth2Credentials-class.html#get_access_token -oauth2client.client.OAuth2Credentials.access_token_expired oauth2client.client.OAuth2Credentials-class.html#access_token_expired -oauth2client.keyring_storage.Storage oauth2client.keyring_storage.Storage-class.html -oauth2client.keyring_storage.Storage.acquire_lock oauth2client.keyring_storage.Storage-class.html#acquire_lock -oauth2client.keyring_storage.Storage.locked_put oauth2client.keyring_storage.Storage-class.html#locked_put -oauth2client.keyring_storage.Storage.__init__ oauth2client.keyring_storage.Storage-class.html#__init__ -oauth2client.keyring_storage.Storage.locked_delete oauth2client.keyring_storage.Storage-class.html#locked_delete -oauth2client.keyring_storage.Storage.locked_get oauth2client.keyring_storage.Storage-class.html#locked_get -oauth2client.client.Storage.get oauth2client.client.Storage-class.html#get -oauth2client.client.Storage.put oauth2client.client.Storage-class.html#put -oauth2client.keyring_storage.Storage.release_lock oauth2client.keyring_storage.Storage-class.html#release_lock -oauth2client.client.Storage.delete oauth2client.client.Storage-class.html#delete -oauth2client.locked_file.AlreadyLockedException oauth2client.locked_file.AlreadyLockedException-class.html -oauth2client.locked_file.CredentialsFileSymbolicLinkError oauth2client.locked_file.CredentialsFileSymbolicLinkError-class.html -oauth2client.locked_file.LockedFile oauth2client.locked_file.LockedFile-class.html -oauth2client.locked_file.LockedFile.open_and_lock oauth2client.locked_file.LockedFile-class.html#open_and_lock -oauth2client.locked_file.LockedFile.file_handle oauth2client.locked_file.LockedFile-class.html#file_handle -oauth2client.locked_file.LockedFile.is_locked oauth2client.locked_file.LockedFile-class.html#is_locked -oauth2client.locked_file.LockedFile.unlock_and_close oauth2client.locked_file.LockedFile-class.html#unlock_and_close -oauth2client.locked_file.LockedFile.filename oauth2client.locked_file.LockedFile-class.html#filename -oauth2client.locked_file.LockedFile.__init__ oauth2client.locked_file.LockedFile-class.html#__init__ -oauth2client.locked_file._Opener oauth2client.locked_file._Opener-class.html -oauth2client.locked_file._Opener.open_and_lock oauth2client.locked_file._Opener-class.html#open_and_lock -oauth2client.locked_file._Opener.file_handle oauth2client.locked_file._Opener-class.html#file_handle -oauth2client.locked_file._Opener.is_locked oauth2client.locked_file._Opener-class.html#is_locked -oauth2client.locked_file._Opener.unlock_and_close oauth2client.locked_file._Opener-class.html#unlock_and_close -oauth2client.locked_file._Opener.filename oauth2client.locked_file._Opener-class.html#filename -oauth2client.locked_file._Opener.__init__ oauth2client.locked_file._Opener-class.html#__init__ -oauth2client.locked_file._PosixOpener oauth2client.locked_file._PosixOpener-class.html -oauth2client.locked_file._PosixOpener.open_and_lock oauth2client.locked_file._PosixOpener-class.html#open_and_lock -oauth2client.locked_file._Opener.file_handle oauth2client.locked_file._Opener-class.html#file_handle -oauth2client.locked_file._Opener.is_locked oauth2client.locked_file._Opener-class.html#is_locked -oauth2client.locked_file._PosixOpener._posix_lockfile oauth2client.locked_file._PosixOpener-class.html#_posix_lockfile -oauth2client.locked_file._Opener.filename oauth2client.locked_file._Opener-class.html#filename -oauth2client.locked_file._PosixOpener.unlock_and_close oauth2client.locked_file._PosixOpener-class.html#unlock_and_close -oauth2client.locked_file._Opener.__init__ oauth2client.locked_file._Opener-class.html#__init__ -oauth2client.multistore_file.Error oauth2client.multistore_file.Error-class.html -oauth2client.multistore_file.NewerCredentialStoreError oauth2client.multistore_file.NewerCredentialStoreError-class.html -oauth2client.multistore_file._MultiStore oauth2client.multistore_file._MultiStore-class.html -oauth2client.multistore_file._MultiStore._get_storage oauth2client.multistore_file._MultiStore-class.html#_get_storage -oauth2client.multistore_file._MultiStore._delete_credential oauth2client.multistore_file._MultiStore-class.html#_delete_credential -oauth2client.multistore_file._MultiStore._write oauth2client.multistore_file._MultiStore-class.html#_write -oauth2client.multistore_file._MultiStore.__init__ oauth2client.multistore_file._MultiStore-class.html#__init__ -oauth2client.multistore_file._MultiStore._locked_json_write oauth2client.multistore_file._MultiStore-class.html#_locked_json_write -oauth2client.multistore_file._MultiStore._get_credential oauth2client.multistore_file._MultiStore-class.html#_get_credential -oauth2client.multistore_file._MultiStore._lock oauth2client.multistore_file._MultiStore-class.html#_lock -oauth2client.multistore_file._MultiStore._refresh_data_cache oauth2client.multistore_file._MultiStore-class.html#_refresh_data_cache -oauth2client.multistore_file._MultiStore._unlock oauth2client.multistore_file._MultiStore-class.html#_unlock -oauth2client.multistore_file._MultiStore._create_file_if_needed oauth2client.multistore_file._MultiStore-class.html#_create_file_if_needed -oauth2client.multistore_file._MultiStore._get_all_credential_keys oauth2client.multistore_file._MultiStore-class.html#_get_all_credential_keys -oauth2client.multistore_file._MultiStore._Storage oauth2client.multistore_file._MultiStore._Storage-class.html -oauth2client.multistore_file._MultiStore._update_credential oauth2client.multistore_file._MultiStore-class.html#_update_credential -oauth2client.multistore_file._MultiStore._decode_credential_from_json oauth2client.multistore_file._MultiStore-class.html#_decode_credential_from_json -oauth2client.multistore_file._MultiStore._locked_json_read oauth2client.multistore_file._MultiStore-class.html#_locked_json_read -oauth2client.multistore_file._MultiStore._Storage oauth2client.multistore_file._MultiStore._Storage-class.html -oauth2client.multistore_file._MultiStore._Storage.acquire_lock oauth2client.multistore_file._MultiStore._Storage-class.html#acquire_lock -oauth2client.multistore_file._MultiStore._Storage.locked_put oauth2client.multistore_file._MultiStore._Storage-class.html#locked_put -oauth2client.multistore_file._MultiStore._Storage.__init__ oauth2client.multistore_file._MultiStore._Storage-class.html#__init__ -oauth2client.multistore_file._MultiStore._Storage.locked_delete oauth2client.multistore_file._MultiStore._Storage-class.html#locked_delete -oauth2client.multistore_file._MultiStore._Storage.locked_get oauth2client.multistore_file._MultiStore._Storage-class.html#locked_get -oauth2client.client.Storage.get oauth2client.client.Storage-class.html#get -oauth2client.client.Storage.put oauth2client.client.Storage-class.html#put -oauth2client.multistore_file._MultiStore._Storage.release_lock oauth2client.multistore_file._MultiStore._Storage-class.html#release_lock -oauth2client.client.Storage.delete oauth2client.client.Storage-class.html#delete -oauth2client.service_account._ServiceAccountCredentials oauth2client.service_account._ServiceAccountCredentials-class.html -oauth2client.client.OAuth2Credentials.authorize oauth2client.client.OAuth2Credentials-class.html#authorize -oauth2client.service_account._ServiceAccountCredentials.serialization_data oauth2client.service_account._ServiceAccountCredentials-class.html#serialization_data -oauth2client.client.OAuth2Credentials.revoke oauth2client.client.OAuth2Credentials-class.html#revoke -oauth2client.client.OAuth2Credentials.set_store oauth2client.client.OAuth2Credentials-class.html#set_store -oauth2client.client.OAuth2Credentials.to_json oauth2client.client.OAuth2Credentials-class.html#to_json -oauth2client.client.OAuth2Credentials.apply oauth2client.client.OAuth2Credentials-class.html#apply -oauth2client.client.Credentials.new_from_json oauth2client.client.Credentials-class.html#new_from_json -oauth2client.service_account._ServiceAccountCredentials.__init__ oauth2client.service_account._ServiceAccountCredentials-class.html#__init__ -oauth2client.client.OAuth2Credentials._generate_refresh_request_headers oauth2client.client.OAuth2Credentials-class.html#_generate_refresh_request_headers -oauth2client.client.Credentials._to_json oauth2client.client.Credentials-class.html#_to_json -oauth2client.service_account._ServiceAccountCredentials.MAX_TOKEN_LIFETIME_SECS oauth2client.service_account._ServiceAccountCredentials-class.html#MAX_TOKEN_LIFETIME_SECS -oauth2client.service_account._ServiceAccountCredentials.service_account_email oauth2client.service_account._ServiceAccountCredentials-class.html#service_account_email -oauth2client.service_account._ServiceAccountCredentials._generate_assertion oauth2client.service_account._ServiceAccountCredentials-class.html#_generate_assertion -oauth2client.client.OAuth2Credentials.__getstate__ oauth2client.client.OAuth2Credentials-class.html#__getstate__ -oauth2client.client.GoogleCredentials.from_stream oauth2client.client.GoogleCredentials-class.html#from_stream -oauth2client.client.OAuth2Credentials.__setstate__ oauth2client.client.OAuth2Credentials-class.html#__setstate__ -oauth2client.client.OAuth2Credentials._expires_in oauth2client.client.OAuth2Credentials-class.html#_expires_in -oauth2client.client.OAuth2Credentials._refresh oauth2client.client.OAuth2Credentials-class.html#_refresh -oauth2client.client.OAuth2Credentials._updateFromCredential oauth2client.client.OAuth2Credentials-class.html#_updateFromCredential -oauth2client.client.AssertionCredentials._revoke oauth2client.client.AssertionCredentials-class.html#_revoke -oauth2client.client.Credentials.NON_SERIALIZED_MEMBERS oauth2client.client.Credentials-class.html#NON_SERIALIZED_MEMBERS -oauth2client.service_account._ServiceAccountCredentials.create_scoped oauth2client.service_account._ServiceAccountCredentials-class.html#create_scoped -oauth2client.client.OAuth2Credentials._do_revoke oauth2client.client.OAuth2Credentials-class.html#_do_revoke -oauth2client.client.AssertionCredentials._generate_refresh_request_body oauth2client.client.AssertionCredentials-class.html#_generate_refresh_request_body -oauth2client.client.GoogleCredentials.get_application_default oauth2client.client.GoogleCredentials-class.html#get_application_default -oauth2client.service_account._ServiceAccountCredentials.sign_blob oauth2client.service_account._ServiceAccountCredentials-class.html#sign_blob -oauth2client.client.OAuth2Credentials._do_refresh_request oauth2client.client.OAuth2Credentials-class.html#_do_refresh_request -oauth2client.service_account._ServiceAccountCredentials.create_scoped_required oauth2client.service_account._ServiceAccountCredentials-class.html#create_scoped_required -oauth2client.client.OAuth2Credentials.refresh oauth2client.client.OAuth2Credentials-class.html#refresh -oauth2client.client.OAuth2Credentials.get_access_token oauth2client.client.OAuth2Credentials-class.html#get_access_token -oauth2client.client.OAuth2Credentials.from_json oauth2client.client.OAuth2Credentials-class.html#from_json -oauth2client.client.OAuth2Credentials.access_token_expired oauth2client.client.OAuth2Credentials-class.html#access_token_expired -oauth2client.tools.ClientRedirectHandler oauth2client.tools.ClientRedirectHandler-class.html -oauth2client.tools.ClientRedirectHandler.do_GET oauth2client.tools.ClientRedirectHandler-class.html#do_GET -oauth2client.tools.ClientRedirectHandler.log_message oauth2client.tools.ClientRedirectHandler-class.html#log_message -oauth2client.tools.ClientRedirectServer oauth2client.tools.ClientRedirectServer-class.html -oauth2client.tools.ClientRedirectServer.query_params oauth2client.tools.ClientRedirectServer-class.html#query_params diff --git a/docs/epy/class-tree.html b/docs/epy/class-tree.html deleted file mode 100644 index a64bd64..0000000 --- a/docs/epy/class-tree.html +++ /dev/null @@ -1,209 +0,0 @@ - - - - - Class Hierarchy - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  - - - - -
[hide private]
[frames] | no frames]
-
-
- [ Module Hierarchy - | Class Hierarchy ] -

-

Class Hierarchy

- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/crarr.png b/docs/epy/crarr.png deleted file mode 100644 index 26b43c52433b71e72a9a478c52d446278335f0e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 340 zcmeAS@N?(olHy`uVBq!ia0vp^f?NMQuI$%1#8??M1uoZK z0}62#ctjR6FvuMOVaB`*rFK9;mUKs7M+SzC{oH>NS%G}l0G|-o|NsA=J-p%i`2!7U zCdJ_j4{u-SDsoA1U`TRixpVcz%O`iHHAYk?=&YaLkmD!Pp6~GW^M_S4D^grJKD>P~ zuPf!ku`N^TLavn`Edv_JSQ6wH%;50sMjDXg>*?YcQgJIe!GUqln>_|<+Os&OOUQS1 zY~Wzutud*iVS#|PHMc&?2WHoZpEo8l+6!Oc$x~=%U)469Gl^f?nq7UBw#1AXkrEde cmFKWBXcRFE*(?@T0vgQV>FVdQ&MBb@0LpZ4r2qf` diff --git a/docs/epy/epydoc.css b/docs/epy/epydoc.css deleted file mode 100644 index 86d4170..0000000 --- a/docs/epy/epydoc.css +++ /dev/null @@ -1,322 +0,0 @@ - - -/* Epydoc CSS Stylesheet - * - * This stylesheet can be used to customize the appearance of epydoc's - * HTML output. - * - */ - -/* Default Colors & Styles - * - Set the default foreground & background color with 'body'; and - * link colors with 'a:link' and 'a:visited'. - * - Use bold for decision list terms. - * - The heading styles defined here are used for headings *within* - * docstring descriptions. All headings used by epydoc itself use - * either class='epydoc' or class='toc' (CSS styles for both - * defined below). - */ -body { background: #ffffff; color: #000000; } -p { margin-top: 0.5em; margin-bottom: 0.5em; } -a:link { color: #0000ff; } -a:visited { color: #204080; } -dt { font-weight: bold; } -h1 { font-size: +140%; font-style: italic; - font-weight: bold; } -h2 { font-size: +125%; font-style: italic; - font-weight: bold; } -h3 { font-size: +110%; font-style: italic; - font-weight: normal; } -code { font-size: 100%; } -/* N.B.: class, not pseudoclass */ -a.link { font-family: monospace; } - -/* Page Header & Footer - * - The standard page header consists of a navigation bar (with - * pointers to standard pages such as 'home' and 'trees'); a - * breadcrumbs list, which can be used to navigate to containing - * classes or modules; options links, to show/hide private - * variables and to show/hide frames; and a page title (using - *

). The page title may be followed by a link to the - * corresponding source code (using 'span.codelink'). - * - The footer consists of a navigation bar, a timestamp, and a - * pointer to epydoc's homepage. - */ -h1.epydoc { margin: 0; font-size: +140%; font-weight: bold; } -h2.epydoc { font-size: +130%; font-weight: bold; } -h3.epydoc { font-size: +115%; font-weight: bold; - margin-top: 0.2em; } -td h3.epydoc { font-size: +115%; font-weight: bold; - margin-bottom: 0; } -table.navbar { background: #a0c0ff; color: #000000; - border: 2px groove #c0d0d0; } -table.navbar table { color: #000000; } -th.navbar-select { background: #70b0ff; - color: #000000; } -table.navbar a { text-decoration: none; } -table.navbar a:link { color: #0000ff; } -table.navbar a:visited { color: #204080; } -span.breadcrumbs { font-size: 85%; font-weight: bold; } -span.options { font-size: 70%; } -span.codelink { font-size: 85%; } -td.footer { font-size: 85%; } - -/* Table Headers - * - Each summary table and details section begins with a 'header' - * row. This row contains a section title (marked by - * 'span.table-header') as well as a show/hide private link - * (marked by 'span.options', defined above). - * - Summary tables that contain user-defined groups mark those - * groups using 'group header' rows. - */ -td.table-header { background: #70b0ff; color: #000000; - border: 1px solid #608090; } -td.table-header table { color: #000000; } -td.table-header table a:link { color: #0000ff; } -td.table-header table a:visited { color: #204080; } -span.table-header { font-size: 120%; font-weight: bold; } -th.group-header { background: #c0e0f8; color: #000000; - text-align: left; font-style: italic; - font-size: 115%; - border: 1px solid #608090; } - -/* Summary Tables (functions, variables, etc) - * - Each object is described by a single row of the table with - * two cells. The left cell gives the object's type, and is - * marked with 'code.summary-type'. The right cell gives the - * object's name and a summary description. - * - CSS styles for the table's header and group headers are - * defined above, under 'Table Headers' - */ -table.summary { border-collapse: collapse; - background: #e8f0f8; color: #000000; - border: 1px solid #608090; - margin-bottom: 0.5em; } -td.summary { border: 1px solid #608090; } -code.summary-type { font-size: 85%; } -table.summary a:link { color: #0000ff; } -table.summary a:visited { color: #204080; } - - -/* Details Tables (functions, variables, etc) - * - Each object is described in its own div. - * - A single-row summary table w/ table-header is used as - * a header for each details section (CSS style for table-header - * is defined above, under 'Table Headers'). - */ -table.details { border-collapse: collapse; - background: #e8f0f8; color: #000000; - border: 1px solid #608090; - margin: .2em 0 0 0; } -table.details table { color: #000000; } -table.details a:link { color: #0000ff; } -table.details a:visited { color: #204080; } - -/* Fields */ -dl.fields { margin-left: 2em; margin-top: 1em; - margin-bottom: 1em; } -dl.fields dd ul { margin-left: 0em; padding-left: 0em; } -dl.fields dd ul li ul { margin-left: 2em; padding-left: 0em; } -div.fields { margin-left: 2em; } -div.fields p { margin-bottom: 0.5em; } - -/* Index tables (identifier index, term index, etc) - * - link-index is used for indices containing lists of links - * (namely, the identifier index & term index). - * - index-where is used in link indices for the text indicating - * the container/source for each link. - * - metadata-index is used for indices containing metadata - * extracted from fields (namely, the bug index & todo index). - */ -table.link-index { border-collapse: collapse; - background: #e8f0f8; color: #000000; - border: 1px solid #608090; } -td.link-index { border-width: 0px; } -table.link-index a:link { color: #0000ff; } -table.link-index a:visited { color: #204080; } -span.index-where { font-size: 70%; } -table.metadata-index { border-collapse: collapse; - background: #e8f0f8; color: #000000; - border: 1px solid #608090; - margin: .2em 0 0 0; } -td.metadata-index { border-width: 1px; border-style: solid; } -table.metadata-index a:link { color: #0000ff; } -table.metadata-index a:visited { color: #204080; } - -/* Function signatures - * - sig* is used for the signature in the details section. - * - .summary-sig* is used for the signature in the summary - * table, and when listing property accessor functions. - * */ -.sig-name { color: #006080; } -.sig-arg { color: #008060; } -.sig-default { color: #602000; } -.summary-sig { font-family: monospace; } -.summary-sig-name { color: #006080; font-weight: bold; } -table.summary a.summary-sig-name:link - { color: #006080; font-weight: bold; } -table.summary a.summary-sig-name:visited - { color: #006080; font-weight: bold; } -.summary-sig-arg { color: #006040; } -.summary-sig-default { color: #501800; } - -/* Subclass list - */ -ul.subclass-list { display: inline; } -ul.subclass-list li { display: inline; } - -/* To render variables, classes etc. like functions */ -table.summary .summary-name { color: #006080; font-weight: bold; - font-family: monospace; } -table.summary - a.summary-name:link { color: #006080; font-weight: bold; - font-family: monospace; } -table.summary - a.summary-name:visited { color: #006080; font-weight: bold; - font-family: monospace; } - -/* Variable values - * - In the 'variable details' sections, each varaible's value is - * listed in a 'pre.variable' box. The width of this box is - * restricted to 80 chars; if the value's repr is longer than - * this it will be wrapped, using a backslash marked with - * class 'variable-linewrap'. If the value's repr is longer - * than 3 lines, the rest will be ellided; and an ellipsis - * marker ('...' marked with 'variable-ellipsis') will be used. - * - If the value is a string, its quote marks will be marked - * with 'variable-quote'. - * - If the variable is a regexp, it is syntax-highlighted using - * the re* CSS classes. - */ -pre.variable { padding: .5em; margin: 0; - background: #dce4ec; color: #000000; - border: 1px solid #708890; } -.variable-linewrap { color: #604000; font-weight: bold; } -.variable-ellipsis { color: #604000; font-weight: bold; } -.variable-quote { color: #604000; font-weight: bold; } -.variable-group { color: #008000; font-weight: bold; } -.variable-op { color: #604000; font-weight: bold; } -.variable-string { color: #006030; } -.variable-unknown { color: #a00000; font-weight: bold; } -.re { color: #000000; } -.re-char { color: #006030; } -.re-op { color: #600000; } -.re-group { color: #003060; } -.re-ref { color: #404040; } - -/* Base tree - * - Used by class pages to display the base class hierarchy. - */ -pre.base-tree { font-size: 80%; margin: 0; } - -/* Frames-based table of contents headers - * - Consists of two frames: one for selecting modules; and - * the other listing the contents of the selected module. - * - h1.toc is used for each frame's heading - * - h2.toc is used for subheadings within each frame. - */ -h1.toc { text-align: center; font-size: 105%; - margin: 0; font-weight: bold; - padding: 0; } -h2.toc { font-size: 100%; font-weight: bold; - margin: 0.5em 0 0 -0.3em; } - -/* Syntax Highlighting for Source Code - * - doctest examples are displayed in a 'pre.py-doctest' block. - * If the example is in a details table entry, then it will use - * the colors specified by the 'table pre.py-doctest' line. - * - Source code listings are displayed in a 'pre.py-src' block. - * Each line is marked with 'span.py-line' (used to draw a line - * down the left margin, separating the code from the line - * numbers). Line numbers are displayed with 'span.py-lineno'. - * The expand/collapse block toggle button is displayed with - * 'a.py-toggle' (Note: the CSS style for 'a.py-toggle' should not - * modify the font size of the text.) - * - If a source code page is opened with an anchor, then the - * corresponding code block will be highlighted. The code - * block's header is highlighted with 'py-highlight-hdr'; and - * the code block's body is highlighted with 'py-highlight'. - * - The remaining py-* classes are used to perform syntax - * highlighting (py-string for string literals, py-name for names, - * etc.) - */ -pre.py-doctest { padding: .5em; margin: 1em; - background: #e8f0f8; color: #000000; - border: 1px solid #708890; } -table pre.py-doctest { background: #dce4ec; - color: #000000; } -pre.py-src { border: 2px solid #000000; - background: #f0f0f0; color: #000000; } -.py-line { border-left: 2px solid #000000; - margin-left: .2em; padding-left: .4em; } -.py-lineno { font-style: italic; font-size: 90%; - padding-left: .5em; } -a.py-toggle { text-decoration: none; } -div.py-highlight-hdr { border-top: 2px solid #000000; - border-bottom: 2px solid #000000; - background: #d8e8e8; } -div.py-highlight { border-bottom: 2px solid #000000; - background: #d0e0e0; } -.py-prompt { color: #005050; font-weight: bold;} -.py-more { color: #005050; font-weight: bold;} -.py-string { color: #006030; } -.py-comment { color: #003060; } -.py-keyword { color: #600000; } -.py-output { color: #404040; } -.py-name { color: #000050; } -.py-name:link { color: #000050 !important; } -.py-name:visited { color: #000050 !important; } -.py-number { color: #005000; } -.py-defname { color: #000060; font-weight: bold; } -.py-def-name { color: #000060; font-weight: bold; } -.py-base-class { color: #000060; } -.py-param { color: #000060; } -.py-docstring { color: #006030; } -.py-decorator { color: #804020; } -/* Use this if you don't want links to names underlined: */ -/*a.py-name { text-decoration: none; }*/ - -/* Graphs & Diagrams - * - These CSS styles are used for graphs & diagrams generated using - * Graphviz dot. 'img.graph-without-title' is used for bare - * diagrams (to remove the border created by making the image - * clickable). - */ -img.graph-without-title { border: none; } -img.graph-with-title { border: 1px solid #000000; } -span.graph-title { font-weight: bold; } -span.graph-caption { } - -/* General-purpose classes - * - 'p.indent-wrapped-lines' defines a paragraph whose first line - * is not indented, but whose subsequent lines are. - * - The 'nomargin-top' class is used to remove the top margin (e.g. - * from lists). The 'nomargin' class is used to remove both the - * top and bottom margin (but not the left or right margin -- - * for lists, that would cause the bullets to disappear.) - */ -p.indent-wrapped-lines { padding: 0 0 0 7em; text-indent: -7em; - margin: 0; } -.nomargin-top { margin-top: 0; } -.nomargin { margin-top: 0; margin-bottom: 0; } - -/* HTML Log */ -div.log-block { padding: 0; margin: .5em 0 .5em 0; - background: #e8f0f8; color: #000000; - border: 1px solid #000000; } -div.log-error { padding: .1em .3em .1em .3em; margin: 4px; - background: #ffb0b0; color: #000000; - border: 1px solid #000000; } -div.log-warning { padding: .1em .3em .1em .3em; margin: 4px; - background: #ffffb0; color: #000000; - border: 1px solid #000000; } -div.log-info { padding: .1em .3em .1em .3em; margin: 4px; - background: #b0ffb0; color: #000000; - border: 1px solid #000000; } -h2.log-hdr { background: #70b0ff; color: #000000; - margin: 0; padding: 0em 0.5em 0em 0.5em; - border-bottom: 1px solid #000000; font-size: 110%; } -p.log { font-weight: bold; margin: .5em 0 .5em 0; } -tr.opt-changed { color: #000000; font-weight: bold; } -tr.opt-default { color: #606060; } -pre.log { margin: 0; padding: 0; padding-left: 1em; } diff --git a/docs/epy/epydoc.js b/docs/epy/epydoc.js deleted file mode 100644 index 119e71e..0000000 --- a/docs/epy/epydoc.js +++ /dev/null @@ -1,293 +0,0 @@ -function toggle_private() { - // Search for any private/public links on this page. Store - // their old text in "cmd," so we will know what action to - // take; and change their text to the opposite action. - var cmd = "?"; - var elts = document.getElementsByTagName("a"); - for(var i=0; i...
"; - elt.innerHTML = s; - } -} - -function toggle(id) { - elt = document.getElementById(id+"-toggle"); - if (elt.innerHTML == "-") - collapse(id); - else - expand(id); - return false; -} - -function highlight(id) { - var elt = document.getElementById(id+"-def"); - if (elt) elt.className = "py-highlight-hdr"; - var elt = document.getElementById(id+"-expanded"); - if (elt) elt.className = "py-highlight"; - var elt = document.getElementById(id+"-collapsed"); - if (elt) elt.className = "py-highlight"; -} - -function num_lines(s) { - var n = 1; - var pos = s.indexOf("\n"); - while ( pos > 0) { - n += 1; - pos = s.indexOf("\n", pos+1); - } - return n; -} - -// Collapse all blocks that mave more than `min_lines` lines. -function collapse_all(min_lines) { - var elts = document.getElementsByTagName("div"); - for (var i=0; i 0) - if (elt.id.substring(split, elt.id.length) == "-expanded") - if (num_lines(elt.innerHTML) > min_lines) - collapse(elt.id.substring(0, split)); - } -} - -function expandto(href) { - var start = href.indexOf("#")+1; - if (start != 0 && start != href.length) { - if (href.substring(start, href.length) != "-") { - collapse_all(4); - pos = href.indexOf(".", start); - while (pos != -1) { - var id = href.substring(start, pos); - expand(id); - pos = href.indexOf(".", pos+1); - } - var id = href.substring(start, href.length); - expand(id); - highlight(id); - } - } -} - -function kill_doclink(id) { - var parent = document.getElementById(id); - parent.removeChild(parent.childNodes.item(0)); -} -function auto_kill_doclink(ev) { - if (!ev) var ev = window.event; - if (!this.contains(ev.toElement)) { - var parent = document.getElementById(this.parentID); - parent.removeChild(parent.childNodes.item(0)); - } -} - -function doclink(id, name, targets_id) { - var elt = document.getElementById(id); - - // If we already opened the box, then destroy it. - // (This case should never occur, but leave it in just in case.) - if (elt.childNodes.length > 1) { - elt.removeChild(elt.childNodes.item(0)); - } - else { - // The outer box: relative + inline positioning. - var box1 = document.createElement("div"); - box1.style.position = "relative"; - box1.style.display = "inline"; - box1.style.top = 0; - box1.style.left = 0; - - // A shadow for fun - var shadow = document.createElement("div"); - shadow.style.position = "absolute"; - shadow.style.left = "-1.3em"; - shadow.style.top = "-1.3em"; - shadow.style.background = "#404040"; - - // The inner box: absolute positioning. - var box2 = document.createElement("div"); - box2.style.position = "relative"; - box2.style.border = "1px solid #a0a0a0"; - box2.style.left = "-.2em"; - box2.style.top = "-.2em"; - box2.style.background = "white"; - box2.style.padding = ".3em .4em .3em .4em"; - box2.style.fontStyle = "normal"; - box2.onmouseout=auto_kill_doclink; - box2.parentID = id; - - // Get the targets - var targets_elt = document.getElementById(targets_id); - var targets = targets_elt.getAttribute("targets"); - var links = ""; - target_list = targets.split(","); - for (var i=0; i" + - target[0] + ""; - } - - // Put it all together. - elt.insertBefore(box1, elt.childNodes.item(0)); - //box1.appendChild(box2); - box1.appendChild(shadow); - shadow.appendChild(box2); - box2.innerHTML = - "Which "+name+" do you want to see documentation for?" + - ""; - } - return false; -} - -function get_anchor() { - var href = location.href; - var start = href.indexOf("#")+1; - if ((start != 0) && (start != href.length)) - return href.substring(start, href.length); - } -function redirect_url(dottedName) { - // Scan through each element of the "pages" list, and check - // if "name" matches with any of them. - for (var i=0; i-m" or "-c"; - // extract the portion & compare it to dottedName. - var pagename = pages[i].substring(0, pages[i].length-2); - if (pagename == dottedName.substring(0,pagename.length)) { - - // We've found a page that matches `dottedName`; - // construct its URL, using leftover `dottedName` - // content to form an anchor. - var pagetype = pages[i].charAt(pages[i].length-1); - var url = pagename + ((pagetype=="m")?"-module.html": - "-class.html"); - if (dottedName.length > pagename.length) - url += "#" + dottedName.substring(pagename.length+1, - dottedName.length); - return url; - } - } - } diff --git a/docs/epy/frames.html b/docs/epy/frames.html deleted file mode 100644 index ea17d6d..0000000 --- a/docs/epy/frames.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - API Documentation - - - - - - - - - diff --git a/docs/epy/help.html b/docs/epy/help.html deleted file mode 100644 index 7aec3b8..0000000 --- a/docs/epy/help.html +++ /dev/null @@ -1,268 +0,0 @@ - - - - - Help - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  - - - - -
[hide private]
[frames] | no frames]
-
- -

API Documentation

- -

This document contains the API (Application Programming Interface) -documentation for this project. Documentation for the Python -objects defined by the project is divided into separate pages for each -package, module, and class. The API documentation also includes two -pages containing information about the project as a whole: a trees -page, and an index page.

- -

Object Documentation

- -

Each Package Documentation page contains:

-
    -
  • A description of the package.
  • -
  • A list of the modules and sub-packages contained by the - package.
  • -
  • A summary of the classes defined by the package.
  • -
  • A summary of the functions defined by the package.
  • -
  • A summary of the variables defined by the package.
  • -
  • A detailed description of each function defined by the - package.
  • -
  • A detailed description of each variable defined by the - package.
  • -
- -

Each Module Documentation page contains:

-
    -
  • A description of the module.
  • -
  • A summary of the classes defined by the module.
  • -
  • A summary of the functions defined by the module.
  • -
  • A summary of the variables defined by the module.
  • -
  • A detailed description of each function defined by the - module.
  • -
  • A detailed description of each variable defined by the - module.
  • -
- -

Each Class Documentation page contains:

-
    -
  • A class inheritance diagram.
  • -
  • A list of known subclasses.
  • -
  • A description of the class.
  • -
  • A summary of the methods defined by the class.
  • -
  • A summary of the instance variables defined by the class.
  • -
  • A summary of the class (static) variables defined by the - class.
  • -
  • A detailed description of each method defined by the - class.
  • -
  • A detailed description of each instance variable defined by the - class.
  • -
  • A detailed description of each class (static) variable defined - by the class.
  • -
- -

Project Documentation

- -

The Trees page contains the module and class hierarchies:

-
    -
  • The module hierarchy lists every package and module, with - modules grouped into packages. At the top level, and within each - package, modules and sub-packages are listed alphabetically.
  • -
  • The class hierarchy lists every class, grouped by base - class. If a class has more than one base class, then it will be - listed under each base class. At the top level, and under each base - class, classes are listed alphabetically.
  • -
- -

The Index page contains indices of terms and - identifiers:

-
    -
  • The term index lists every term indexed by any object's - documentation. For each term, the index provides links to each - place where the term is indexed.
  • -
  • The identifier index lists the (short) name of every package, - module, class, method, function, variable, and parameter. For each - identifier, the index provides a short description, and a link to - its documentation.
  • -
- -

The Table of Contents

- -

The table of contents occupies the two frames on the left side of -the window. The upper-left frame displays the project -contents, and the lower-left frame displays the module -contents:

- - - - - - - - - -
- Project
Contents
...
- API
Documentation
Frame


-
- Module
Contents
 
...
  -

- -

The project contents frame contains a list of all packages -and modules that are defined by the project. Clicking on an entry -will display its contents in the module contents frame. Clicking on a -special entry, labeled "Everything," will display the contents of -the entire project.

- -

The module contents frame contains a list of every -submodule, class, type, exception, function, and variable defined by a -module or package. Clicking on an entry will display its -documentation in the API documentation frame. Clicking on the name of -the module, at the top of the frame, will display the documentation -for the module itself.

- -

The "frames" and "no frames" buttons below the top -navigation bar can be used to control whether the table of contents is -displayed or not.

- -

The Navigation Bar

- -

A navigation bar is located at the top and bottom of every page. -It indicates what type of page you are currently viewing, and allows -you to go to related pages. The following table describes the labels -on the navigation bar. Note that not some labels (such as -[Parent]) are not displayed on all pages.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
LabelHighlighted when...Links to...
[Parent](never highlighted) the parent of the current package
[Package]viewing a packagethe package containing the current object -
[Module]viewing a modulethe module containing the current object -
[Class]viewing a class the class containing the current object
[Trees]viewing the trees page the trees page
[Index]viewing the index page the index page
[Help]viewing the help page the help page
- -

The "show private" and "hide private" buttons below -the top navigation bar can be used to control whether documentation -for private objects is displayed. Private objects are usually defined -as objects whose (short) names begin with a single underscore, but do -not end with an underscore. For example, "_x", -"__pprint", and "epydoc.epytext._tokenize" -are private objects; but "re.sub", -"__init__", and "type_" are not. However, -if a module defines the "__all__" variable, then its -contents are used to decide which objects are private.

- -

A timestamp below the bottom navigation bar indicates when each -page was last updated.

- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/identifier-index.html b/docs/epy/identifier-index.html deleted file mode 100644 index 3ccb743..0000000 --- a/docs/epy/identifier-index.html +++ /dev/null @@ -1,1293 +0,0 @@ - - - - - Identifier Index - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  - - - - -
[hide private]
[frames] | no frames]
-
- -
-

Identifier Index

-
-[ - A - B - C - D - E - F - G - H - I - J - K - L - M - N - O - P - Q - R - S - T - U - V - W - X - Y - Z - _ -] -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

A

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

C

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

D

- - - - - - - - - - - - - - - - - - - - - - -

E

- - - - - - - - - - - - -

F

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

G

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

H

- - - - - - - - - - - - -

I

- - - - - - - - - - - - - - - - - -

K

- - - - - - - - -

L

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

M

- - - - - - - - - - - - - - - - - - - - - - -

N

- - - - - - - - - - - - -

O

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

P

- - - - - - - - - - - - - - - - - -

Q

- - - - - - - - -

R

- - - - - - - - - - - - - - - - - - - - - - -

S

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

T

- - - - - - - - - - - - - - - - - -

U

- - - - - - - - - - - - -

V

- - - - - - - - - - - - - - - - - -

X

- - - - - - - - -

_

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-

- - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/index.html b/docs/epy/index.html deleted file mode 100644 index ea17d6d..0000000 --- a/docs/epy/index.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - API Documentation - - - - - - - - - diff --git a/docs/epy/module-tree.html b/docs/epy/module-tree.html deleted file mode 100644 index a53a8b9..0000000 --- a/docs/epy/module-tree.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - Module Hierarchy - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  - - - - -
[hide private]
[frames] | no frames]
-
-
- [ Module Hierarchy - | Class Hierarchy ] -

-

Module Hierarchy

- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client-module.html b/docs/epy/oauth2client-module.html deleted file mode 100644 index bd7d5a2..0000000 --- a/docs/epy/oauth2client-module.html +++ /dev/null @@ -1,234 +0,0 @@ - - - - - oauth2client - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Package oauth2client

source code

-
-Client library for using OAuth2, especially with Google APIs.
-
-
- -
-

Version: - 1.4.2 -

-
- - - - - - -
- - - - - -
Submodules[hide private]
-
-
- -
- - - - - - - - - - - - - - - - - - -
- - - - - -
Variables[hide private]
-
-   - - GOOGLE_AUTH_URI = 'https://accounts.google.com/o/oauth2/auth' -
-   - - GOOGLE_DEVICE_URI = 'https://accounts.google.com/o/oauth2/devi... -
-   - - GOOGLE_REVOKE_URI = 'https://accounts.google.com/o/oauth2/revoke' -
-   - - GOOGLE_TOKEN_URI = 'https://accounts.google.com/o/oauth2/token' -
- - - - - - -
- - - - - -
Variables Details[hide private]
-
- -
- -
-

GOOGLE_DEVICE_URI

- -
-
-
-
Value:
-
-'https://accounts.google.com/o/oauth2/device/code'
-
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client-pysrc.html b/docs/epy/oauth2client-pysrc.html deleted file mode 100644 index a2eda66..0000000 --- a/docs/epy/oauth2client-pysrc.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - oauth2client - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client - - - - - - -
[hide private]
[frames] | no frames]
-
-

Source Code for Package oauth2client

-
- 1  """Client library for using OAuth2, especially with Google APIs.""" 
- 2   
- 3  __version__ = '1.4.2' 
- 4   
- 5  GOOGLE_AUTH_URI = 'https://accounts.google.com/o/oauth2/auth' 
- 6  GOOGLE_DEVICE_URI = 'https://accounts.google.com/o/oauth2/device/code' 
- 7  GOOGLE_REVOKE_URI = 'https://accounts.google.com/o/oauth2/revoke' 
- 8  GOOGLE_TOKEN_URI = 'https://accounts.google.com/o/oauth2/token' 
- 9   
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.anyjson-module.html b/docs/epy/oauth2client.anyjson-module.html deleted file mode 100644 index 942e155..0000000 --- a/docs/epy/oauth2client.anyjson-module.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - oauth2client.anyjson - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module anyjson - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Module anyjson

source code

-
-Utility module to import a JSON module
-
-Hides all the messy details of exactly where
-we get a simplejson module from.
-
-
- -
-

Author: - jcgregorio@google.com (Joe Gregorio) -

-
- - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.anyjson-pysrc.html b/docs/epy/oauth2client.anyjson-pysrc.html deleted file mode 100644 index f599941..0000000 --- a/docs/epy/oauth2client.anyjson-pysrc.html +++ /dev/null @@ -1,143 +0,0 @@ - - - - - oauth2client.anyjson - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module anyjson - - - - - - -
[hide private]
[frames] | no frames]
-
-

Source Code for Module oauth2client.anyjson

-
- 1  # Copyright 2014 Google Inc. All rights reserved. 
- 2  # 
- 3  # Licensed under the Apache License, Version 2.0 (the "License"); 
- 4  # you may not use this file except in compliance with the License. 
- 5  # You may obtain a copy of the License at 
- 6  # 
- 7  #      http://www.apache.org/licenses/LICENSE-2.0 
- 8  # 
- 9  # Unless required by applicable law or agreed to in writing, software 
-10  # distributed under the License is distributed on an "AS IS" BASIS, 
-11  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
-12  # See the License for the specific language governing permissions and 
-13  # limitations under the License. 
-14   
-15  """Utility module to import a JSON module 
-16   
-17  Hides all the messy details of exactly where 
-18  we get a simplejson module from. 
-19  """ 
-20   
-21  __author__ = 'jcgregorio@google.com (Joe Gregorio)' 
-22   
-23   
-24  try: # pragma: no cover 
-25    # Should work for Python2.6 and higher. 
-26    import json as simplejson 
-27  except ImportError: # pragma: no cover 
-28    try: 
-29      import simplejson 
-30    except ImportError: 
-31      # Try to import from django, should work on App Engine 
-32      from django.utils import simplejson 
-33   
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.appengine-module.html b/docs/epy/oauth2client.appengine-module.html deleted file mode 100644 index c731c5c..0000000 --- a/docs/epy/oauth2client.appengine-module.html +++ /dev/null @@ -1,601 +0,0 @@ - - - - - oauth2client.appengine - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module appengine - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Module appengine

source code

-
-Utilities for Google App Engine
-
-Utilities for making it easier to use OAuth 2.0 on Google App Engine.
-
-
- -
-

Author: - jcgregorio@google.com (Joe Gregorio) -

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
Classes[hide private]
-
-   - - InvalidClientSecretsError
- The client_secrets.json file is malformed or missing required fields. -
-   - - InvalidXsrfTokenError
- The XSRF token is invalid or expired. -
-   - - SiteXsrfSecretKey
- Storage for the sites XSRF secret key. -
-   - - SiteXsrfSecretKeyNDB
- NDB Model for storage for the sites XSRF secret key. -
-   - - AppAssertionCredentials
- Credentials object for App Engine Assertion Grants -
-   - - FlowProperty
- App Engine datastore Property for Flow. -
-   - - FlowNDBProperty
- App Engine NDB datastore Property for Flow. -
-   - - CredentialsProperty
- App Engine datastore Property for Credentials. -
-   - - CredentialsNDBProperty
- App Engine NDB datastore Property for Credentials. -
-   - - StorageByKeyName
- Store and retrieve a credential to and from the App Engine datastore. -
-   - - CredentialsModel
- Storage for OAuth 2.0 Credentials -
-   - - CredentialsNDBModel
- NDB Model for storage of OAuth 2.0 Credentials -
-   - - OAuth2Decorator
- Utility for making OAuth 2.0 easier. -
-   - - OAuth2DecoratorFromClientSecrets
- An OAuth2Decorator that builds from a clientsecrets file. -
- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
Functions[hide private]
-
-   - - - - - - -
_safe_html(s)
- Escape text to make it safe to display.
- source code - -
- -
-   - - - - - - -
_generate_new_xsrf_secret_key()
- Returns a random XSRF secret key.
- source code - -
- -
-   - - - - - - -
xsrf_secret_key()
- Return the secret key for use for XSRF protection.
- source code - -
- -
-   - - - - - - -
_build_state_value(request_handler, - user)
- Composes the value for the 'state' parameter.
- source code - -
- -
-   - - - - - - -
_parse_state_value(state, - user)
- Parse the value of the 'state' parameter.
- source code - -
- -
-   - - - - - - -
oauth2decorator_from_clientsecrets(filename, - scope, - message=None, - cache=None)
- Creates an OAuth2Decorator populated from a clientsecrets file.
- source code - -
- -
- - - - - - - - - - - - - - - - - - -
- - - - - -
Variables[hide private]
-
-   - - ndb = None -
-   - - logger = logging.getLogger(__name__) -
-   - - OAUTH2CLIENT_NAMESPACE = 'oauth2client#ns' -
-   - - XSRF_MEMCACHE_ID = 'xsrf_secret_key' -
- - - - - - -
- - - - - -
Function Details[hide private]
-
- -
- -
- - -
-

_safe_html(s) -

-
source code  -
- -
-Escape text to make it safe to display.
-
-Args:
-  s: string, The text to escape.
-
-Returns:
-  The escaped text as a string.
-
-
-
-
-
-
- -
- -
- - -
-

xsrf_secret_key() -

-
source code  -
- -
-Return the secret key for use for XSRF protection.
-
-If the Site entity does not have a secret key, this method will also create
-one and persist it.
-
-Returns:
-  The secret key.
-
-
-
-
-
-
- -
- -
- - -
-

_build_state_value(request_handler, - user) -

-
source code  -
- -
-Composes the value for the 'state' parameter.
-
-Packs the current request URI and an XSRF token into an opaque string that
-can be passed to the authentication server via the 'state' parameter.
-
-Args:
-  request_handler: webapp.RequestHandler, The request.
-  user: google.appengine.api.users.User, The current user.
-
-Returns:
-  The state value as a string.
-
-
-
-
-
-
- -
- -
- - -
-

_parse_state_value(state, - user) -

-
source code  -
- -
-Parse the value of the 'state' parameter.
-
-Parses the value and validates the XSRF token in the state parameter.
-
-Args:
-  state: string, The value of the state parameter.
-  user: google.appengine.api.users.User, The current user.
-
-Raises:
-  InvalidXsrfTokenError: if the XSRF token is invalid.
-
-Returns:
-  The redirect URI.
-
-
-
-
-
-
- -
- -
- - -
-

oauth2decorator_from_clientsecrets(filename, - scope, - message=None, - cache=None) -

-
source code  -
- -
-Creates an OAuth2Decorator populated from a clientsecrets file.
-
-Args:
-  filename: string, File name of client secrets.
-  scope: string or list of strings, scope(s) of the credentials being
-    requested.
-  message: string, A friendly string to display to the user if the
-    clientsecrets file is missing or invalid. The message may contain HTML and
-    will be presented on the web interface for any method that uses the
-    decorator.
-  cache: An optional cache service client that implements get() and set()
-    methods. See clientsecrets.loadfile() for details.
-
-Returns: An OAuth2Decorator
-
-
-
-
Decorators:
-
    -
  • @util.positional(2)
  • -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.appengine-pysrc.html b/docs/epy/oauth2client.appengine-pysrc.html deleted file mode 100644 index 7202b62..0000000 --- a/docs/epy/oauth2client.appengine-pysrc.html +++ /dev/null @@ -1,1290 +0,0 @@ - - - - - oauth2client.appengine - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module appengine - - - - - - -
[hide private]
[frames] | no frames]
-
-

Source Code for Module oauth2client.appengine

-
-  1  # Copyright 2014 Google Inc. All rights reserved. 
-  2  # 
-  3  # Licensed under the Apache License, Version 2.0 (the "License"); 
-  4  # you may not use this file except in compliance with the License. 
-  5  # You may obtain a copy of the License at 
-  6  # 
-  7  #      http://www.apache.org/licenses/LICENSE-2.0 
-  8  # 
-  9  # Unless required by applicable law or agreed to in writing, software 
- 10  # distributed under the License is distributed on an "AS IS" BASIS, 
- 11  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
- 12  # See the License for the specific language governing permissions and 
- 13  # limitations under the License. 
- 14   
- 15  """Utilities for Google App Engine 
- 16   
- 17  Utilities for making it easier to use OAuth 2.0 on Google App Engine. 
- 18  """ 
- 19   
- 20  __author__ = 'jcgregorio@google.com (Joe Gregorio)' 
- 21   
- 22  import cgi 
- 23  import json 
- 24  import logging 
- 25  import os 
- 26  import pickle 
- 27  import threading 
- 28   
- 29  import httplib2 
- 30   
- 31  from google.appengine.api import app_identity 
- 32  from google.appengine.api import memcache 
- 33  from google.appengine.api import users 
- 34  from google.appengine.ext import db 
- 35  from google.appengine.ext import webapp 
- 36  from google.appengine.ext.webapp.util import login_required 
- 37  from google.appengine.ext.webapp.util import run_wsgi_app 
- 38  from oauth2client import GOOGLE_AUTH_URI 
- 39  from oauth2client import GOOGLE_REVOKE_URI 
- 40  from oauth2client import GOOGLE_TOKEN_URI 
- 41  from oauth2client import clientsecrets 
- 42  from oauth2client import util 
- 43  from oauth2client import xsrfutil 
- 44  from oauth2client.client import AccessTokenRefreshError 
- 45  from oauth2client.client import AssertionCredentials 
- 46  from oauth2client.client import Credentials 
- 47  from oauth2client.client import Flow 
- 48  from oauth2client.client import OAuth2WebServerFlow 
- 49  from oauth2client.client import Storage 
- 50   
- 51  # TODO(dhermes): Resolve import issue. 
- 52  # This is a temporary fix for a Google internal issue. 
- 53  try: 
- 54    from google.appengine.ext import ndb 
- 55  except ImportError: 
- 56    ndb = None 
- 57   
- 58   
- 59  logger = logging.getLogger(__name__) 
- 60   
- 61  OAUTH2CLIENT_NAMESPACE = 'oauth2client#ns' 
- 62   
- 63  XSRF_MEMCACHE_ID = 'xsrf_secret_key' 
-
64 - 65 - 66 -def _safe_html(s): -
67 """Escape text to make it safe to display. - 68 - 69 Args: - 70 s: string, The text to escape. - 71 - 72 Returns: - 73 The escaped text as a string. - 74 """ - 75 return cgi.escape(s, quote=1).replace("'", '&#39;') -
76 -
77 - 78 -class InvalidClientSecretsError(Exception): -
79 """The client_secrets.json file is malformed or missing required fields.""" -
80 -
81 - 82 -class InvalidXsrfTokenError(Exception): -
83 """The XSRF token is invalid or expired.""" -
84 -
85 - 86 -class SiteXsrfSecretKey(db.Model): -
87 """Storage for the sites XSRF secret key. - 88 - 89 There will only be one instance stored of this model, the one used for the - 90 site. - 91 """ - 92 secret = db.StringProperty() -
93 - 94 if ndb is not None: -
95 - class SiteXsrfSecretKeyNDB(ndb.Model): -
96 """NDB Model for storage for the sites XSRF secret key. - 97 - 98 Since this model uses the same kind as SiteXsrfSecretKey, it can be used - 99 interchangeably. This simply provides an NDB model for interacting with the -100 same data the DB model interacts with. -101 -102 There should only be one instance stored of this model, the one used for the -103 site. -104 """ -105 secret = ndb.StringProperty() -106 -107 @classmethod -
108 - def _get_kind(cls): -
109 """Return the kind name for this class.""" -110 return 'SiteXsrfSecretKey' -
111 -
114 """Returns a random XSRF secret key. -115 """ -116 return os.urandom(16).encode("hex") -
117 -
118 -119 -def xsrf_secret_key(): -
120 """Return the secret key for use for XSRF protection. -121 -122 If the Site entity does not have a secret key, this method will also create -123 one and persist it. -124 -125 Returns: -126 The secret key. -127 """ -128 secret = memcache.get(XSRF_MEMCACHE_ID, namespace=OAUTH2CLIENT_NAMESPACE) -129 if not secret: -130 # Load the one and only instance of SiteXsrfSecretKey. -131 model = SiteXsrfSecretKey.get_or_insert(key_name='site') -132 if not model.secret: -133 model.secret = _generate_new_xsrf_secret_key() -134 model.put() -135 secret = model.secret -136 memcache.add(XSRF_MEMCACHE_ID, secret, namespace=OAUTH2CLIENT_NAMESPACE) -137 -138 return str(secret) -
139 -
140 -141 -class AppAssertionCredentials(AssertionCredentials): -
142 """Credentials object for App Engine Assertion Grants -143 -144 This object will allow an App Engine application to identify itself to Google -145 and other OAuth 2.0 servers that can verify assertions. It can be used for the -146 purpose of accessing data stored under an account assigned to the App Engine -147 application itself. -148 -149 This credential does not require a flow to instantiate because it represents -150 a two legged flow, and therefore has all of the required information to -151 generate and refresh its own access tokens. -152 """ -153 -154 @util.positional(2) -
155 - def __init__(self, scope, **kwargs): -
156 """Constructor for AppAssertionCredentials -157 -158 Args: -159 scope: string or iterable of strings, scope(s) of the credentials being -160 requested. -161 **kwargs: optional keyword args, including: -162 service_account_id: service account id of the application. If None or -163 unspecified, the default service account for the app is used. -164 """ -165 self.scope = util.scopes_to_string(scope) -166 self._kwargs = kwargs -167 self.service_account_id = kwargs.get('service_account_id', None) -168 -169 # Assertion type is no longer used, but still in the parent class signature. -170 super(AppAssertionCredentials, self).__init__(None) -
171 -172 @classmethod -
173 - def from_json(cls, json_data): -
174 data = json.loads(json_data) -175 return AppAssertionCredentials(data['scope']) -
176 -
177 - def _refresh(self, http_request): -
178 """Refreshes the access_token. -179 -180 Since the underlying App Engine app_identity implementation does its own -181 caching we can skip all the storage hoops and just to a refresh using the -182 API. -183 -184 Args: -185 http_request: callable, a callable that matches the method signature of -186 httplib2.Http.request, used to make the refresh request. -187 -188 Raises: -189 AccessTokenRefreshError: When the refresh fails. -190 """ -191 try: -192 scopes = self.scope.split() -193 (token, _) = app_identity.get_access_token( -194 scopes, service_account_id=self.service_account_id) -195 except app_identity.Error as e: -196 raise AccessTokenRefreshError(str(e)) -197 self.access_token = token -
198 -199 @property -
200 - def serialization_data(self): -
201 raise NotImplementedError('Cannot serialize credentials for AppEngine.') -
202 -
203 - def create_scoped_required(self): -
204 return not self.scope -
205 -
206 - def create_scoped(self, scopes): -
207 return AppAssertionCredentials(scopes, **self._kwargs) -
208 -
209 -210 -class FlowProperty(db.Property): -
211 """App Engine datastore Property for Flow. -212 -213 Utility property that allows easy storage and retrieval of an -214 oauth2client.Flow""" -215 -216 # Tell what the user type is. -217 data_type = Flow -218 -219 # For writing to datastore. -
220 - def get_value_for_datastore(self, model_instance): -
221 flow = super(FlowProperty, -222 self).get_value_for_datastore(model_instance) -223 return db.Blob(pickle.dumps(flow)) -
224 -225 # For reading from datastore. -
226 - def make_value_from_datastore(self, value): -
227 if value is None: -228 return None -229 return pickle.loads(value) -
230 -
231 - def validate(self, value): -
232 if value is not None and not isinstance(value, Flow): -233 raise db.BadValueError('Property %s must be convertible ' -234 'to a FlowThreeLegged instance (%s)' % -235 (self.name, value)) -236 return super(FlowProperty, self).validate(value) -
237 -
238 - def empty(self, value): -
239 return not value -
240 -241 -242 if ndb is not None: -
243 - class FlowNDBProperty(ndb.PickleProperty): -
244 """App Engine NDB datastore Property for Flow. -245 -246 Serves the same purpose as the DB FlowProperty, but for NDB models. Since -247 PickleProperty inherits from BlobProperty, the underlying representation of -248 the data in the datastore will be the same as in the DB case. -249 -250 Utility property that allows easy storage and retrieval of an -251 oauth2client.Flow -252 """ -253 -
254 - def _validate(self, value): -
255 """Validates a value as a proper Flow object. -256 -257 Args: -258 value: A value to be set on the property. -259 -260 Raises: -261 TypeError if the value is not an instance of Flow. -262 """ -263 logger.info('validate: Got type %s', type(value)) -264 if value is not None and not isinstance(value, Flow): -265 raise TypeError('Property %s must be convertible to a flow ' -266 'instance; received: %s.' % (self._name, value)) -
267 -
268 -269 -class CredentialsProperty(db.Property): -
270 """App Engine datastore Property for Credentials. -271 -272 Utility property that allows easy storage and retrieval of -273 oath2client.Credentials -274 """ -275 -276 # Tell what the user type is. -277 data_type = Credentials -278 -279 # For writing to datastore. -
280 - def get_value_for_datastore(self, model_instance): -
281 logger.info("get: Got type " + str(type(model_instance))) -282 cred = super(CredentialsProperty, -283 self).get_value_for_datastore(model_instance) -284 if cred is None: -285 cred = '' -286 else: -287 cred = cred.to_json() -288 return db.Blob(cred) -
289 -290 # For reading from datastore. -
291 - def make_value_from_datastore(self, value): -
292 logger.info("make: Got type " + str(type(value))) -293 if value is None: -294 return None -295 if len(value) == 0: -296 return None -297 try: -298 credentials = Credentials.new_from_json(value) -299 except ValueError: -300 credentials = None -301 return credentials -
302 -
303 - def validate(self, value): -
304 value = super(CredentialsProperty, self).validate(value) -305 logger.info("validate: Got type " + str(type(value))) -306 if value is not None and not isinstance(value, Credentials): -307 raise db.BadValueError('Property %s must be convertible ' -308 'to a Credentials instance (%s)' % -309 (self.name, value)) -310 #if value is not None and not isinstance(value, Credentials): -311 # return None -312 return value -
313 -314 -315 if ndb is not None: -
316 # TODO(dhermes): Turn this into a JsonProperty and overhaul the Credentials -317 # and subclass mechanics to use new_from_dict, to_dict, -318 # from_dict, etc. -319 - class CredentialsNDBProperty(ndb.BlobProperty): -
320 """App Engine NDB datastore Property for Credentials. -321 -322 Serves the same purpose as the DB CredentialsProperty, but for NDB models. -323 Since CredentialsProperty stores data as a blob and this inherits from -324 BlobProperty, the data in the datastore will be the same as in the DB case. -325 -326 Utility property that allows easy storage and retrieval of Credentials and -327 subclasses. -328 """ -
329 - def _validate(self, value): -
330 """Validates a value as a proper credentials object. -331 -332 Args: -333 value: A value to be set on the property. -334 -335 Raises: -336 TypeError if the value is not an instance of Credentials. -337 """ -338 logger.info('validate: Got type %s', type(value)) -339 if value is not None and not isinstance(value, Credentials): -340 raise TypeError('Property %s must be convertible to a credentials ' -341 'instance; received: %s.' % (self._name, value)) -
342 -
343 - def _to_base_type(self, value): -
344 """Converts our validated value to a JSON serialized string. -345 -346 Args: -347 value: A value to be set in the datastore. -348 -349 Returns: -350 A JSON serialized version of the credential, else '' if value is None. -351 """ -352 if value is None: -353 return '' -354 else: -355 return value.to_json() -
356 -
357 - def _from_base_type(self, value): -
358 """Converts our stored JSON string back to the desired type. -359 -360 Args: -361 value: A value from the datastore to be converted to the desired type. -362 -363 Returns: -364 A deserialized Credentials (or subclass) object, else None if the -365 value can't be parsed. -366 """ -367 if not value: -368 return None -369 try: -370 # Uses the from_json method of the implied class of value -371 credentials = Credentials.new_from_json(value) -372 except ValueError: -373 credentials = None -374 return credentials -
375 -
376 -377 -class StorageByKeyName(Storage): -
378 """Store and retrieve a credential to and from the App Engine datastore. -379 -380 This Storage helper presumes the Credentials have been stored as a -381 CredentialsProperty or CredentialsNDBProperty on a datastore model class, and -382 that entities are stored by key_name. -383 """ -384 -385 @util.positional(4) -
386 - def __init__(self, model, key_name, property_name, cache=None, user=None): -
387 """Constructor for Storage. -388 -389 Args: -390 model: db.Model or ndb.Model, model class -391 key_name: string, key name for the entity that has the credentials -392 property_name: string, name of the property that is a CredentialsProperty -393 or CredentialsNDBProperty. -394 cache: memcache, a write-through cache to put in front of the datastore. -395 If the model you are using is an NDB model, using a cache will be -396 redundant since the model uses an instance cache and memcache for you. -397 user: users.User object, optional. Can be used to grab user ID as a -398 key_name if no key name is specified. -399 """ -400 if key_name is None: -401 if user is None: -402 raise ValueError('StorageByKeyName called with no key name or user.') -403 key_name = user.user_id() -404 -405 self._model = model -406 self._key_name = key_name -407 self._property_name = property_name -408 self._cache = cache -
409 -
410 - def _is_ndb(self): -
411 """Determine whether the model of the instance is an NDB model. -412 -413 Returns: -414 Boolean indicating whether or not the model is an NDB or DB model. -415 """ -416 # issubclass will fail if one of the arguments is not a class, only need -417 # worry about new-style classes since ndb and db models are new-style -418 if isinstance(self._model, type): -419 if ndb is not None and issubclass(self._model, ndb.Model): -420 return True -421 elif issubclass(self._model, db.Model): -422 return False -423 -424 raise TypeError('Model class not an NDB or DB model: %s.' % (self._model,)) -
425 -
426 - def _get_entity(self): -
427 """Retrieve entity from datastore. -428 -429 Uses a different model method for db or ndb models. -430 -431 Returns: -432 Instance of the model corresponding to the current storage object -433 and stored using the key name of the storage object. -434 """ -435 if self._is_ndb(): -436 return self._model.get_by_id(self._key_name) -437 else: -438 return self._model.get_by_key_name(self._key_name) -
439 -
440 - def _delete_entity(self): -
441 """Delete entity from datastore. -442 -443 Attempts to delete using the key_name stored on the object, whether or not -444 the given key is in the datastore. -445 """ -446 if self._is_ndb(): -447 ndb.Key(self._model, self._key_name).delete() -448 else: -449 entity_key = db.Key.from_path(self._model.kind(), self._key_name) -450 db.delete(entity_key) -
451 -452 @db.non_transactional(allow_existing=True) -
453 - def locked_get(self): -
454 """Retrieve Credential from datastore. -455 -456 Returns: -457 oauth2client.Credentials -458 """ -459 credentials = None -460 if self._cache: -461 json = self._cache.get(self._key_name) -462 if json: -463 credentials = Credentials.new_from_json(json) -464 if credentials is None: -465 entity = self._get_entity() -466 if entity is not None: -467 credentials = getattr(entity, self._property_name) -468 if self._cache: -469 self._cache.set(self._key_name, credentials.to_json()) -470 -471 if credentials and hasattr(credentials, 'set_store'): -472 credentials.set_store(self) -473 return credentials -
474 -475 @db.non_transactional(allow_existing=True) -
476 - def locked_put(self, credentials): -
477 """Write a Credentials to the datastore. -478 -479 Args: -480 credentials: Credentials, the credentials to store. -481 """ -482 entity = self._model.get_or_insert(self._key_name) -483 setattr(entity, self._property_name, credentials) -484 entity.put() -485 if self._cache: -486 self._cache.set(self._key_name, credentials.to_json()) -
487 -488 @db.non_transactional(allow_existing=True) -
489 - def locked_delete(self): -
490 """Delete Credential from datastore.""" -491 -492 if self._cache: -493 self._cache.delete(self._key_name) -494 -495 self._delete_entity() -
496 -
497 -498 -class CredentialsModel(db.Model): -
499 """Storage for OAuth 2.0 Credentials -500 -501 Storage of the model is keyed by the user.user_id(). -502 """ -503 credentials = CredentialsProperty() -
504 -505 -506 if ndb is not None: -
507 - class CredentialsNDBModel(ndb.Model): -
508 """NDB Model for storage of OAuth 2.0 Credentials -509 -510 Since this model uses the same kind as CredentialsModel and has a property -511 which can serialize and deserialize Credentials correctly, it can be used -512 interchangeably with a CredentialsModel to access, insert and delete the -513 same entities. This simply provides an NDB model for interacting with the -514 same data the DB model interacts with. -515 -516 Storage of the model is keyed by the user.user_id(). -517 """ -518 credentials = CredentialsNDBProperty() -519 -520 @classmethod -
521 - def _get_kind(cls): -
522 """Return the kind name for this class.""" -523 return 'CredentialsModel' -
524 -
525 -526 -def _build_state_value(request_handler, user): -
527 """Composes the value for the 'state' parameter. -528 -529 Packs the current request URI and an XSRF token into an opaque string that -530 can be passed to the authentication server via the 'state' parameter. -531 -532 Args: -533 request_handler: webapp.RequestHandler, The request. -534 user: google.appengine.api.users.User, The current user. -535 -536 Returns: -537 The state value as a string. -538 """ -539 uri = request_handler.request.url -540 token = xsrfutil.generate_token(xsrf_secret_key(), user.user_id(), -541 action_id=str(uri)) -542 return uri + ':' + token -
543 -
544 -545 -def _parse_state_value(state, user): -
546 """Parse the value of the 'state' parameter. -547 -548 Parses the value and validates the XSRF token in the state parameter. -549 -550 Args: -551 state: string, The value of the state parameter. -552 user: google.appengine.api.users.User, The current user. -553 -554 Raises: -555 InvalidXsrfTokenError: if the XSRF token is invalid. -556 -557 Returns: -558 The redirect URI. -559 """ -560 uri, token = state.rsplit(':', 1) -561 if not xsrfutil.validate_token(xsrf_secret_key(), token, user.user_id(), -562 action_id=uri): -563 raise InvalidXsrfTokenError() -564 -565 return uri -
566 -
567 -568 -class OAuth2Decorator(object): -
569 """Utility for making OAuth 2.0 easier. -570 -571 Instantiate and then use with oauth_required or oauth_aware -572 as decorators on webapp.RequestHandler methods. -573 -574 Example: -575 -576 decorator = OAuth2Decorator( -577 client_id='837...ent.com', -578 client_secret='Qh...wwI', -579 scope='https://www.googleapis.com/auth/plus') -580 -581 -582 class MainHandler(webapp.RequestHandler): -583 -584 @decorator.oauth_required -585 def get(self): -586 http = decorator.http() -587 # http is authorized with the user's Credentials and can be used -588 # in API calls -589 -590 """ -591 -
592 - def set_credentials(self, credentials): -
593 self._tls.credentials = credentials -
594 -
595 - def get_credentials(self): -
596 """A thread local Credentials object. -597 -598 Returns: -599 A client.Credentials object, or None if credentials hasn't been set in -600 this thread yet, which may happen when calling has_credentials inside -601 oauth_aware. -602 """ -603 return getattr(self._tls, 'credentials', None) -
604 -605 credentials = property(get_credentials, set_credentials) -606 -
607 - def set_flow(self, flow): -
608 self._tls.flow = flow -
609 -
610 - def get_flow(self): -
611 """A thread local Flow object. -612 -613 Returns: -614 A credentials.Flow object, or None if the flow hasn't been set in this -615 thread yet, which happens in _create_flow() since Flows are created -616 lazily. -617 """ -618 return getattr(self._tls, 'flow', None) -
619 -620 flow = property(get_flow, set_flow) -621 -622 -623 @util.positional(4) -
624 - def __init__(self, client_id, client_secret, scope, -625 auth_uri=GOOGLE_AUTH_URI, -626 token_uri=GOOGLE_TOKEN_URI, -627 revoke_uri=GOOGLE_REVOKE_URI, -628 user_agent=None, -629 message=None, -630 callback_path='/oauth2callback', -631 token_response_param=None, -632 _storage_class=StorageByKeyName, -633 _credentials_class=CredentialsModel, -634 _credentials_property_name='credentials', -635 **kwargs): -
636 -637 """Constructor for OAuth2Decorator -638 -639 Args: -640 client_id: string, client identifier. -641 client_secret: string client secret. -642 scope: string or iterable of strings, scope(s) of the credentials being -643 requested. -644 auth_uri: string, URI for authorization endpoint. For convenience -645 defaults to Google's endpoints but any OAuth 2.0 provider can be used. -646 token_uri: string, URI for token endpoint. For convenience -647 defaults to Google's endpoints but any OAuth 2.0 provider can be used. -648 revoke_uri: string, URI for revoke endpoint. For convenience -649 defaults to Google's endpoints but any OAuth 2.0 provider can be used. -650 user_agent: string, User agent of your application, default to None. -651 message: Message to display if there are problems with the OAuth 2.0 -652 configuration. The message may contain HTML and will be presented on the -653 web interface for any method that uses the decorator. -654 callback_path: string, The absolute path to use as the callback URI. Note -655 that this must match up with the URI given when registering the -656 application in the APIs Console. -657 token_response_param: string. If provided, the full JSON response -658 to the access token request will be encoded and included in this query -659 parameter in the callback URI. This is useful with providers (e.g. -660 wordpress.com) that include extra fields that the client may want. -661 _storage_class: "Protected" keyword argument not typically provided to -662 this constructor. A storage class to aid in storing a Credentials object -663 for a user in the datastore. Defaults to StorageByKeyName. -664 _credentials_class: "Protected" keyword argument not typically provided to -665 this constructor. A db or ndb Model class to hold credentials. Defaults -666 to CredentialsModel. -667 _credentials_property_name: "Protected" keyword argument not typically -668 provided to this constructor. A string indicating the name of the field -669 on the _credentials_class where a Credentials object will be stored. -670 Defaults to 'credentials'. -671 **kwargs: dict, Keyword arguments are passed along as kwargs to -672 the OAuth2WebServerFlow constructor. -673 -674 """ -675 self._tls = threading.local() -676 self.flow = None -677 self.credentials = None -678 self._client_id = client_id -679 self._client_secret = client_secret -680 self._scope = util.scopes_to_string(scope) -681 self._auth_uri = auth_uri -682 self._token_uri = token_uri -683 self._revoke_uri = revoke_uri -684 self._user_agent = user_agent -685 self._kwargs = kwargs -686 self._message = message -687 self._in_error = False -688 self._callback_path = callback_path -689 self._token_response_param = token_response_param -690 self._storage_class = _storage_class -691 self._credentials_class = _credentials_class -692 self._credentials_property_name = _credentials_property_name -
693 -
694 - def _display_error_message(self, request_handler): -
695 request_handler.response.out.write('<html><body>') -696 request_handler.response.out.write(_safe_html(self._message)) -697 request_handler.response.out.write('</body></html>') -
698 -
699 - def oauth_required(self, method): -
700 """Decorator that starts the OAuth 2.0 dance. -701 -702 Starts the OAuth dance for the logged in user if they haven't already -703 granted access for this application. -704 -705 Args: -706 method: callable, to be decorated method of a webapp.RequestHandler -707 instance. -708 """ -709 -710 def check_oauth(request_handler, *args, **kwargs): -711 if self._in_error: -712 self._display_error_message(request_handler) -713 return -714 -715 user = users.get_current_user() -716 # Don't use @login_decorator as this could be used in a POST request. -717 if not user: -718 request_handler.redirect(users.create_login_url( -719 request_handler.request.uri)) -720 return -721 -722 self._create_flow(request_handler) -723 -724 # Store the request URI in 'state' so we can use it later -725 self.flow.params['state'] = _build_state_value(request_handler, user) -726 self.credentials = self._storage_class( -727 self._credentials_class, None, -728 self._credentials_property_name, user=user).get() -729 -730 if not self.has_credentials(): -731 return request_handler.redirect(self.authorize_url()) -732 try: -733 resp = method(request_handler, *args, **kwargs) -734 except AccessTokenRefreshError: -735 return request_handler.redirect(self.authorize_url()) -736 finally: -737 self.credentials = None -738 return resp -
739 -740 return check_oauth -
741 -
742 - def _create_flow(self, request_handler): -
743 """Create the Flow object. -744 -745 The Flow is calculated lazily since we don't know where this app is -746 running until it receives a request, at which point redirect_uri can be -747 calculated and then the Flow object can be constructed. -748 -749 Args: -750 request_handler: webapp.RequestHandler, the request handler. -751 """ -752 if self.flow is None: -753 redirect_uri = request_handler.request.relative_url( -754 self._callback_path) # Usually /oauth2callback -755 self.flow = OAuth2WebServerFlow(self._client_id, self._client_secret, -756 self._scope, redirect_uri=redirect_uri, -757 user_agent=self._user_agent, -758 auth_uri=self._auth_uri, -759 token_uri=self._token_uri, -760 revoke_uri=self._revoke_uri, -761 **self._kwargs) -
762 -
763 - def oauth_aware(self, method): -
764 """Decorator that sets up for OAuth 2.0 dance, but doesn't do it. -765 -766 Does all the setup for the OAuth dance, but doesn't initiate it. -767 This decorator is useful if you want to create a page that knows -768 whether or not the user has granted access to this application. -769 From within a method decorated with @oauth_aware the has_credentials() -770 and authorize_url() methods can be called. -771 -772 Args: -773 method: callable, to be decorated method of a webapp.RequestHandler -774 instance. -775 """ -776 -777 def setup_oauth(request_handler, *args, **kwargs): -778 if self._in_error: -779 self._display_error_message(request_handler) -780 return -781 -782 user = users.get_current_user() -783 # Don't use @login_decorator as this could be used in a POST request. -784 if not user: -785 request_handler.redirect(users.create_login_url( -786 request_handler.request.uri)) -787 return -788 -789 self._create_flow(request_handler) -790 -791 self.flow.params['state'] = _build_state_value(request_handler, user) -792 self.credentials = self._storage_class( -793 self._credentials_class, None, -794 self._credentials_property_name, user=user).get() -795 try: -796 resp = method(request_handler, *args, **kwargs) -797 finally: -798 self.credentials = None -799 return resp -
800 return setup_oauth -801 -802 -
803 - def has_credentials(self): -
804 """True if for the logged in user there are valid access Credentials. -805 -806 Must only be called from with a webapp.RequestHandler subclassed method -807 that had been decorated with either @oauth_required or @oauth_aware. -808 """ -809 return self.credentials is not None and not self.credentials.invalid -
810 -
811 - def authorize_url(self): -
812 """Returns the URL to start the OAuth dance. -813 -814 Must only be called from with a webapp.RequestHandler subclassed method -815 that had been decorated with either @oauth_required or @oauth_aware. -816 """ -817 url = self.flow.step1_get_authorize_url() -818 return str(url) -
819 -
820 - def http(self, *args, **kwargs): -
821 """Returns an authorized http instance. -822 -823 Must only be called from within an @oauth_required decorated method, or -824 from within an @oauth_aware decorated method where has_credentials() -825 returns True. -826 -827 Args: -828 *args: Positional arguments passed to httplib2.Http constructor. -829 **kwargs: Positional arguments passed to httplib2.Http constructor. -830 """ -831 return self.credentials.authorize(httplib2.Http(*args, **kwargs)) -
832 -833 @property -
834 - def callback_path(self): -
835 """The absolute path where the callback will occur. -836 -837 Note this is the absolute path, not the absolute URI, that will be -838 calculated by the decorator at runtime. See callback_handler() for how this -839 should be used. -840 -841 Returns: -842 The callback path as a string. -843 """ -844 return self._callback_path -
845 -846 -
847 - def callback_handler(self): -
848 """RequestHandler for the OAuth 2.0 redirect callback. -849 -850 Usage: -851 app = webapp.WSGIApplication([ -852 ('/index', MyIndexHandler), -853 ..., -854 (decorator.callback_path, decorator.callback_handler()) -855 ]) -856 -857 Returns: -858 A webapp.RequestHandler that handles the redirect back from the -859 server during the OAuth 2.0 dance. -860 """ -861 decorator = self -862 -863 class OAuth2Handler(webapp.RequestHandler): -864 """Handler for the redirect_uri of the OAuth 2.0 dance.""" -865 -866 @login_required -867 def get(self): -868 error = self.request.get('error') -869 if error: -870 errormsg = self.request.get('error_description', error) -871 self.response.out.write( -872 'The authorization request failed: %s' % _safe_html(errormsg)) -873 else: -874 user = users.get_current_user() -875 decorator._create_flow(self) -876 credentials = decorator.flow.step2_exchange(self.request.params) -877 decorator._storage_class( -878 decorator._credentials_class, None, -879 decorator._credentials_property_name, user=user).put(credentials) -880 redirect_uri = _parse_state_value(str(self.request.get('state')), -881 user) -882 -883 if decorator._token_response_param and credentials.token_response: -884 resp_json = json.dumps(credentials.token_response) -885 redirect_uri = util._add_query_parameter( -886 redirect_uri, decorator._token_response_param, resp_json) -887 -888 self.redirect(redirect_uri) -
889 -890 return OAuth2Handler -891 -
892 - def callback_application(self): -
893 """WSGI application for handling the OAuth 2.0 redirect callback. -894 -895 If you need finer grained control use `callback_handler` which returns just -896 the webapp.RequestHandler. -897 -898 Returns: -899 A webapp.WSGIApplication that handles the redirect back from the -900 server during the OAuth 2.0 dance. -901 """ -902 return webapp.WSGIApplication([ -903 (self.callback_path, self.callback_handler()) -904 ]) -
905 -
906 -907 -class OAuth2DecoratorFromClientSecrets(OAuth2Decorator): -
908 """An OAuth2Decorator that builds from a clientsecrets file. -909 -910 Uses a clientsecrets file as the source for all the information when -911 constructing an OAuth2Decorator. -912 -913 Example: -914 -915 decorator = OAuth2DecoratorFromClientSecrets( -916 os.path.join(os.path.dirname(__file__), 'client_secrets.json') -917 scope='https://www.googleapis.com/auth/plus') -918 -919 -920 class MainHandler(webapp.RequestHandler): -921 -922 @decorator.oauth_required -923 def get(self): -924 http = decorator.http() -925 # http is authorized with the user's Credentials and can be used -926 # in API calls -927 """ -928 -929 @util.positional(3) -
930 - def __init__(self, filename, scope, message=None, cache=None, **kwargs): -
931 """Constructor -932 -933 Args: -934 filename: string, File name of client secrets. -935 scope: string or iterable of strings, scope(s) of the credentials being -936 requested. -937 message: string, A friendly string to display to the user if the -938 clientsecrets file is missing or invalid. The message may contain HTML -939 and will be presented on the web interface for any method that uses the -940 decorator. -941 cache: An optional cache service client that implements get() and set() -942 methods. See clientsecrets.loadfile() for details. -943 **kwargs: dict, Keyword arguments are passed along as kwargs to -944 the OAuth2WebServerFlow constructor. -945 """ -946 client_type, client_info = clientsecrets.loadfile(filename, cache=cache) -947 if client_type not in [ -948 clientsecrets.TYPE_WEB, clientsecrets.TYPE_INSTALLED]: -949 raise InvalidClientSecretsError( -950 "OAuth2Decorator doesn't support this OAuth 2.0 flow.") -951 constructor_kwargs = dict(kwargs) -952 constructor_kwargs.update({ -953 'auth_uri': client_info['auth_uri'], -954 'token_uri': client_info['token_uri'], -955 'message': message, -956 }) -957 revoke_uri = client_info.get('revoke_uri') -958 if revoke_uri is not None: -959 constructor_kwargs['revoke_uri'] = revoke_uri -960 super(OAuth2DecoratorFromClientSecrets, self).__init__( -961 client_info['client_id'], client_info['client_secret'], -962 scope, **constructor_kwargs) -963 if message is not None: -964 self._message = message -965 else: -966 self._message = 'Please configure your application for OAuth 2.0.' -
967 -
968 -969 @util.positional(2) -970 -def oauth2decorator_from_clientsecrets(filename, scope, -971 message=None, cache=None): -
972 """Creates an OAuth2Decorator populated from a clientsecrets file. -973 -974 Args: -975 filename: string, File name of client secrets. -976 scope: string or list of strings, scope(s) of the credentials being -977 requested. -978 message: string, A friendly string to display to the user if the -979 clientsecrets file is missing or invalid. The message may contain HTML and -980 will be presented on the web interface for any method that uses the -981 decorator. -982 cache: An optional cache service client that implements get() and set() -983 methods. See clientsecrets.loadfile() for details. -984 -985 Returns: An OAuth2Decorator -986 -987 """ -988 return OAuth2DecoratorFromClientSecrets(filename, scope, -989 message=message, cache=cache) -
990 -
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.appengine.AppAssertionCredentials-class.html b/docs/epy/oauth2client.appengine.AppAssertionCredentials-class.html deleted file mode 100644 index d86d523..0000000 --- a/docs/epy/oauth2client.appengine.AppAssertionCredentials-class.html +++ /dev/null @@ -1,639 +0,0 @@ - - - - - oauth2client.appengine.AppAssertionCredentials - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module appengine :: - Class AppAssertionCredentials - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class AppAssertionCredentials

source code

-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-Credentials object for App Engine Assertion Grants
-
-This object will allow an App Engine application to identify itself to Google
-and other OAuth 2.0 servers that can verify assertions. It can be used for the
-purpose of accessing data stored under an account assigned to the App Engine
-application itself.
-
-This credential does not require a flow to instantiate because it represents
-a two legged flow, and therefore has all of the required information to
-generate and refresh its own access tokens.
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-   - - - - - - -
__init__(self, - scope, - **kwargs)
- Constructor for AppAssertionCredentials
- source code - -
- -
-   - - - - - - -
_refresh(self, - http_request)
- Refreshes the access_token.
- source code - -
- -
-   - - - - - - -
serialization_data(self)
- Get the fields and their values identifying the current credentials.
- source code - -
- -
-   - - - - - - -
create_scoped_required(self)
- Whether this Credentials object is scopeless.
- source code - -
- -
-   - - - - - - -
create_scoped(self, - scopes)
- Create a Credentials object for the given scopes.
- source code - -
- -
- -

Inherited from client.OAuth2Credentials: - __getstate__, - __setstate__, - access_token_expired, - apply, - authorize, - get_access_token, - refresh, - revoke, - set_store, - to_json -

- -

Inherited from client.Credentials (private): - _to_json -

-

Inherited from object: - __delattr__, - __format__, - __getattribute__, - __hash__, - __new__, - __reduce__, - __reduce_ex__, - __repr__, - __setattr__, - __sizeof__, - __str__, - __subclasshook__ -

-
- - - - - - - - - - - - -
- - - - - -
Class Methods[hide private]
-
-   - - - - - - -
from_json(cls, - json_data)
- Instantiate a Credentials object from a JSON description of it.
- source code - -
- -
-

Inherited from client.Credentials: - new_from_json -

-
- - - - - - - - - -
- - - - - -
Static Methods[hide private]
-
-

Inherited from client.GoogleCredentials: - from_stream, - get_application_default -

-
- - - - - - - - - -
- - - - - -
Class Variables[hide private]
-
-

Inherited from client.Credentials: - NON_SERIALIZED_MEMBERS -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from object: - __class__ -

-
- - - - - - -
- - - - - -
Method Details[hide private]
-
- -
- -
- - -
-

__init__(self, - scope, - **kwargs) -
(Constructor) -

-
source code  -
- -
-Constructor for AppAssertionCredentials
-
-Args:
-  scope: string or iterable of strings, scope(s) of the credentials being
-    requested.
-  **kwargs: optional keyword args, including:
-    service_account_id: service account id of the application. If None or
-      unspecified, the default service account for the app is used.
-
-
-
-
Decorators:
-
    -
  • @util.positional(2)
  • -
-
Overrides: - object.__init__ -
-
-
-
- -
- -
- - -
-

from_json(cls, - json_data) -
Class Method -

-
source code  -
- -
-Instantiate a Credentials object from a JSON description of it. The JSON
-should have been produced by calling .to_json() on the object.
-
-Args:
-  data: dict, A deserialized JSON object.
-
-Returns:
-  An instance of a Credentials subclass.
-
-
-
-
Overrides: - client.Credentials.from_json -
(inherited documentation)
- -
-
-
- -
- -
- - -
-

_refresh(self, - http_request) -

-
source code  -
- -
-Refreshes the access_token.
-
-Since the underlying App Engine app_identity implementation does its own
-caching we can skip all the storage hoops and just to a refresh using the
-API.
-
-Args:
-  http_request: callable, a callable that matches the method signature of
-    httplib2.Http.request, used to make the refresh request.
-
-Raises:
-  AccessTokenRefreshError: When the refresh fails.
-
-
-
-
Overrides: - client.OAuth2Credentials._refresh -
-
-
-
- -
- -
- - -
-

serialization_data(self) -

-
source code  -
- -
-Get the fields and their values identifying the current credentials.
-
-
-
-
Decorators:
-
    -
  • @property
  • -
-
Overrides: - client.GoogleCredentials.serialization_data -
(inherited documentation)
- -
-
-
- -
- -
- - -
-

create_scoped_required(self) -

-
source code  -
- -
-Whether this Credentials object is scopeless.
-
-create_scoped(scopes) method needs to be called in order to create
-a Credentials object for API calls.
-
-
-
-
Overrides: - client.GoogleCredentials.create_scoped_required -
(inherited documentation)
- -
-
-
- -
- -
- - -
-

create_scoped(self, - scopes) -

-
source code  -
- -
-Create a Credentials object for the given scopes.
-
-The Credentials type is preserved.
-
-
-
-
Overrides: - client.GoogleCredentials.create_scoped -
(inherited documentation)
- -
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.appengine.CredentialsModel-class.html b/docs/epy/oauth2client.appengine.CredentialsModel-class.html deleted file mode 100644 index f7d491e..0000000 --- a/docs/epy/oauth2client.appengine.CredentialsModel-class.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - oauth2client.appengine.CredentialsModel - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module appengine :: - Class CredentialsModel - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class CredentialsModel

source code

-
-
- - - - -
-
-
-
-Storage for OAuth 2.0 Credentials
-
-Storage of the model is keyed by the user.user_id().
-
-
- - - - - - - - - - -
- - - - - -
Class Variables[hide private]
-
-   - - credentials = CredentialsProperty() -
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.appengine.CredentialsNDBModel-class.html b/docs/epy/oauth2client.appengine.CredentialsNDBModel-class.html deleted file mode 100644 index a49f521..0000000 --- a/docs/epy/oauth2client.appengine.CredentialsNDBModel-class.html +++ /dev/null @@ -1,188 +0,0 @@ - - - - - oauth2client.appengine.CredentialsNDBModel - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module appengine :: - Class CredentialsNDBModel - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class CredentialsNDBModel

source code

-
-
- - - - - -
-
-
-
-NDB Model for storage of OAuth 2.0 Credentials
-
-Since this model uses the same kind as CredentialsModel and has a property
-which can serialize and deserialize Credentials correctly, it can be used
-interchangeably with a CredentialsModel to access, insert and delete the
-same entities. This simply provides an NDB model for interacting with the
-same data the DB model interacts with.
-
-Storage of the model is keyed by the user.user_id().
-
-
- - - - - - - - - - -
- - - - - -
Class Methods[hide private]
-
-   - - - - - - -
_get_kind(cls)
- Return the kind name for this class.
- source code - -
- -
- - - - - - - - - -
- - - - - -
Class Variables[hide private]
-
-   - - credentials = CredentialsNDBProperty() -
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.appengine.CredentialsNDBProperty-class.html b/docs/epy/oauth2client.appengine.CredentialsNDBProperty-class.html deleted file mode 100644 index ad9dd45..0000000 --- a/docs/epy/oauth2client.appengine.CredentialsNDBProperty-class.html +++ /dev/null @@ -1,305 +0,0 @@ - - - - - oauth2client.appengine.CredentialsNDBProperty - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module appengine :: - Class CredentialsNDBProperty - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class CredentialsNDBProperty

source code

-
-
- - - - -
-
-
-
-App Engine NDB datastore Property for Credentials.
-
-Serves the same purpose as the DB CredentialsProperty, but for NDB models.
-Since CredentialsProperty stores data as a blob and this inherits from
-BlobProperty, the data in the datastore will be the same as in the DB case.
-
-Utility property that allows easy storage and retrieval of Credentials and
-subclasses.
-
-
- - - - - - - - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-   - - - - - - -
_validate(self, - value)
- Validates a value as a proper credentials object.
- source code - -
- -
-   - - - - - - -
_to_base_type(self, - value)
- Converts our validated value to a JSON serialized string.
- source code - -
- -
-   - - - - - - -
_from_base_type(self, - value)
- Converts our stored JSON string back to the desired type.
- source code - -
- -
- - - - - - -
- - - - - -
Method Details[hide private]
-
- -
- -
- - -
-

_validate(self, - value) -

-
source code  -
- -
-Validates a value as a proper credentials object.
-
-Args:
-  value: A value to be set on the property.
-
-Raises:
-  TypeError if the value is not an instance of Credentials.
-
-
-
-
-
-
- -
- -
- - -
-

_to_base_type(self, - value) -

-
source code  -
- -
-Converts our validated value to a JSON serialized string.
-
-Args:
-  value: A value to be set in the datastore.
-
-Returns:
-  A JSON serialized version of the credential, else '' if value is None.
-
-
-
-
-
-
- -
- -
- - -
-

_from_base_type(self, - value) -

-
source code  -
- -
-Converts our stored JSON string back to the desired type.
-
-Args:
-  value: A value from the datastore to be converted to the desired type.
-
-Returns:
-  A deserialized Credentials (or subclass) object, else None if the
-      value can't be parsed.
-
-
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.appengine.CredentialsProperty-class.html b/docs/epy/oauth2client.appengine.CredentialsProperty-class.html deleted file mode 100644 index f4a97c7..0000000 --- a/docs/epy/oauth2client.appengine.CredentialsProperty-class.html +++ /dev/null @@ -1,219 +0,0 @@ - - - - - oauth2client.appengine.CredentialsProperty - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module appengine :: - Class CredentialsProperty - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class CredentialsProperty

source code

-
-
- - - - - - - -
-
-
-
-App Engine datastore Property for Credentials.
-
-Utility property that allows easy storage and retrieval of
-oath2client.Credentials
-
-
- - - - - - - - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-   - - - - - - -
get_value_for_datastore(self, - model_instance) - source code - -
- -
-   - - - - - - -
make_value_from_datastore(self, - value) - source code - -
- -
-   - - - - - - -
validate(self, - value) - source code - -
- -
- - - - - - - - - -
- - - - - -
Class Variables[hide private]
-
-   - - data_type = Credentials -
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.appengine.FlowNDBProperty-class.html b/docs/epy/oauth2client.appengine.FlowNDBProperty-class.html deleted file mode 100644 index 6d872b4..0000000 --- a/docs/epy/oauth2client.appengine.FlowNDBProperty-class.html +++ /dev/null @@ -1,210 +0,0 @@ - - - - - oauth2client.appengine.FlowNDBProperty - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module appengine :: - Class FlowNDBProperty - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class FlowNDBProperty

source code

-
-
- - - - -
-
-
-
-App Engine NDB datastore Property for Flow.
-
-Serves the same purpose as the DB FlowProperty, but for NDB models. Since
-PickleProperty inherits from BlobProperty, the underlying representation of
-the data in the datastore will be the same as in the DB case.
-
-Utility property that allows easy storage and retrieval of an
-oauth2client.Flow
-
-
- - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-   - - - - - - -
_validate(self, - value)
- Validates a value as a proper Flow object.
- source code - -
- -
- - - - - - -
- - - - - -
Method Details[hide private]
-
- -
- -
- - -
-

_validate(self, - value) -

-
source code  -
- -
-Validates a value as a proper Flow object.
-
-Args:
-  value: A value to be set on the property.
-
-Raises:
-  TypeError if the value is not an instance of Flow.
-
-
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.appengine.FlowProperty-class.html b/docs/epy/oauth2client.appengine.FlowProperty-class.html deleted file mode 100644 index 2fd558a..0000000 --- a/docs/epy/oauth2client.appengine.FlowProperty-class.html +++ /dev/null @@ -1,237 +0,0 @@ - - - - - oauth2client.appengine.FlowProperty - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module appengine :: - Class FlowProperty - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class FlowProperty

source code

-
-
- - - - - - - - -
-
-
-
-App Engine datastore Property for Flow.
-
-Utility property that allows easy storage and retrieval of an
-oauth2client.Flow
-
-
- - - - - - - - - - - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-   - - - - - - -
get_value_for_datastore(self, - model_instance) - source code - -
- -
-   - - - - - - -
make_value_from_datastore(self, - value) - source code - -
- -
-   - - - - - - -
validate(self, - value) - source code - -
- -
-   - - - - - - -
empty(self, - value) - source code - -
- -
- - - - - - - - - -
- - - - - -
Class Variables[hide private]
-
-   - - data_type = Flow -
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.appengine.InvalidClientSecretsError-class.html b/docs/epy/oauth2client.appengine.InvalidClientSecretsError-class.html deleted file mode 100644 index bfc3cb3..0000000 --- a/docs/epy/oauth2client.appengine.InvalidClientSecretsError-class.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - oauth2client.appengine.InvalidClientSecretsError - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module appengine :: - Class InvalidClientSecretsError - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class InvalidClientSecretsError

source code

-
-
- - - - - - - - - - - - - - - - - - - -
-
-
-
-The client_secrets.json file is malformed or missing required fields.
-
-
- - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-

Inherited from exceptions.Exception: - __init__, - __new__ -

-

Inherited from exceptions.BaseException: - __delattr__, - __getattribute__, - __getitem__, - __getslice__, - __reduce__, - __repr__, - __setattr__, - __setstate__, - __str__, - __unicode__ -

-

Inherited from object: - __format__, - __hash__, - __reduce_ex__, - __sizeof__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from exceptions.BaseException: - args, - message -

-

Inherited from object: - __class__ -

-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.appengine.InvalidXsrfTokenError-class.html b/docs/epy/oauth2client.appengine.InvalidXsrfTokenError-class.html deleted file mode 100644 index d8f5ca9..0000000 --- a/docs/epy/oauth2client.appengine.InvalidXsrfTokenError-class.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - oauth2client.appengine.InvalidXsrfTokenError - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module appengine :: - Class InvalidXsrfTokenError - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class InvalidXsrfTokenError

source code

-
-
- - - - - - - - - - - - - - - - - - - -
-
-
-
-The XSRF token is invalid or expired.
-
-
- - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-

Inherited from exceptions.Exception: - __init__, - __new__ -

-

Inherited from exceptions.BaseException: - __delattr__, - __getattribute__, - __getitem__, - __getslice__, - __reduce__, - __repr__, - __setattr__, - __setstate__, - __str__, - __unicode__ -

-

Inherited from object: - __format__, - __hash__, - __reduce_ex__, - __sizeof__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from exceptions.BaseException: - args, - message -

-

Inherited from object: - __class__ -

-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.appengine.OAuth2Decorator-class.html b/docs/epy/oauth2client.appengine.OAuth2Decorator-class.html deleted file mode 100644 index 9e2ca70..0000000 --- a/docs/epy/oauth2client.appengine.OAuth2Decorator-class.html +++ /dev/null @@ -1,941 +0,0 @@ - - - - - oauth2client.appengine.OAuth2Decorator - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module appengine :: - Class OAuth2Decorator - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class OAuth2Decorator

source code

-
-
- - - - - - - - - - - - - - - - - - -
-
-
-
-Utility for making OAuth 2.0 easier.
-
-Instantiate and then use with oauth_required or oauth_aware
-as decorators on webapp.RequestHandler methods.
-
-Example:
-
-  decorator = OAuth2Decorator(
-      client_id='837...ent.com',
-      client_secret='Qh...wwI',
-      scope='https://www.googleapis.com/auth/plus')
-
-
-  class MainHandler(webapp.RequestHandler):
-
-    @decorator.oauth_required
-    def get(self):
-      http = decorator.http()
-      # http is authorized with the user's Credentials and can be used
-      # in API calls
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-   - - - - - - -
set_credentials(self, - credentials) - source code - -
- -
-   - - - - - - -
get_credentials(self)
- A thread local Credentials object.
- source code - -
- -
-   - - - - - - -
set_flow(self, - flow) - source code - -
- -
-   - - - - - - -
get_flow(self)
- A thread local Flow object.
- source code - -
- -
-   - - - - - - -
__init__(self, - client_id, - client_secret, - scope, - auth_uri=GOOGLE_AUTH_URI, - token_uri=GOOGLE_TOKEN_URI, - revoke_uri=GOOGLE_REVOKE_URI, - user_agent=None, - message=None, - callback_path='/oauth2callback', - token_response_param=None, - _storage_class=StorageByKeyName, - _credentials_class=CredentialsModel, - _credentials_property_name='credentials', - **kwargs)
- Constructor for OAuth2Decorator
- source code - -
- -
-   - - - - - - -
_display_error_message(self, - request_handler) - source code - -
- -
-   - - - - - - -
oauth_required(self, - method)
- Decorator that starts the OAuth 2.0 dance.
- source code - -
- -
-   - - - - - - -
_create_flow(self, - request_handler)
- Create the Flow object.
- source code - -
- -
-   - - - - - - -
oauth_aware(self, - method)
- Decorator that sets up for OAuth 2.0 dance, but doesn't do it.
- source code - -
- -
-   - - - - - - -
has_credentials(self)
- True if for the logged in user there are valid access Credentials.
- source code - -
- -
-   - - - - - - -
authorize_url(self)
- Returns the URL to start the OAuth dance.
- source code - -
- -
-   - - - - - - -
http(self, - *args, - **kwargs)
- Returns an authorized http instance.
- source code - -
- -
-   - - - - - - -
callback_path(self)
- The absolute path where the callback will occur.
- source code - -
- -
-   - - - - - - -
callback_handler(self)
- RequestHandler for the OAuth 2.0 redirect callback.
- source code - -
- -
-   - - - - - - -
callback_application(self)
- WSGI application for handling the OAuth 2.0 redirect callback.
- source code - -
- -
-

Inherited from object: - __delattr__, - __format__, - __getattribute__, - __hash__, - __new__, - __reduce__, - __reduce_ex__, - __repr__, - __setattr__, - __sizeof__, - __str__, - __subclasshook__ -

-
- - - - - - - - - - - - -
- - - - - -
Class Variables[hide private]
-
-   - - credentials = property(get_credentials, set_credentials) -
-   - - flow = property(get_flow, set_flow) -
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from object: - __class__ -

-
- - - - - - -
- - - - - -
Method Details[hide private]
-
- -
- -
- - -
-

get_credentials(self) -

-
source code  -
- -
-A thread local Credentials object.
-
-Returns:
-  A client.Credentials object, or None if credentials hasn't been set in
-  this thread yet, which may happen when calling has_credentials inside
-  oauth_aware.
-
-
-
-
-
-
- -
- -
- - -
-

get_flow(self) -

-
source code  -
- -
-A thread local Flow object.
-
-Returns:
-  A credentials.Flow object, or None if the flow hasn't been set in this
-  thread yet, which happens in _create_flow() since Flows are created
-  lazily.
-
-
-
-
-
-
- -
- -
- - -
-

__init__(self, - client_id, - client_secret, - scope, - auth_uri=GOOGLE_AUTH_URI, - token_uri=GOOGLE_TOKEN_URI, - revoke_uri=GOOGLE_REVOKE_URI, - user_agent=None, - message=None, - callback_path='/oauth2callback', - token_response_param=None, - _storage_class=StorageByKeyName, - _credentials_class=CredentialsModel, - _credentials_property_name='credentials', - **kwargs) -
(Constructor) -

-
source code  -
- -
-Constructor for OAuth2Decorator
-
-Args:
-  client_id: string, client identifier.
-  client_secret: string client secret.
-  scope: string or iterable of strings, scope(s) of the credentials being
-    requested.
-  auth_uri: string, URI for authorization endpoint. For convenience
-    defaults to Google's endpoints but any OAuth 2.0 provider can be used.
-  token_uri: string, URI for token endpoint. For convenience
-    defaults to Google's endpoints but any OAuth 2.0 provider can be used.
-  revoke_uri: string, URI for revoke endpoint. For convenience
-    defaults to Google's endpoints but any OAuth 2.0 provider can be used.
-  user_agent: string, User agent of your application, default to None.
-  message: Message to display if there are problems with the OAuth 2.0
-    configuration. The message may contain HTML and will be presented on the
-    web interface for any method that uses the decorator.
-  callback_path: string, The absolute path to use as the callback URI. Note
-    that this must match up with the URI given when registering the
-    application in the APIs Console.
-  token_response_param: string. If provided, the full JSON response
-    to the access token request will be encoded and included in this query
-    parameter in the callback URI. This is useful with providers (e.g.
-    wordpress.com) that include extra fields that the client may want.
-  _storage_class: "Protected" keyword argument not typically provided to
-    this constructor. A storage class to aid in storing a Credentials object
-    for a user in the datastore. Defaults to StorageByKeyName.
-  _credentials_class: "Protected" keyword argument not typically provided to
-    this constructor. A db or ndb Model class to hold credentials. Defaults
-    to CredentialsModel.
-  _credentials_property_name: "Protected" keyword argument not typically
-    provided to this constructor. A string indicating the name of the field
-    on the _credentials_class where a Credentials object will be stored.
-    Defaults to 'credentials'.
-  **kwargs: dict, Keyword arguments are passed along as kwargs to
-    the OAuth2WebServerFlow constructor.
-
-
-
-
Decorators:
-
    -
  • @util.positional(4)
  • -
-
Overrides: - object.__init__ -
-
-
-
- -
- -
- - -
-

oauth_required(self, - method) -

-
source code  -
- -
-Decorator that starts the OAuth 2.0 dance.
-
-Starts the OAuth dance for the logged in user if they haven't already
-granted access for this application.
-
-Args:
-  method: callable, to be decorated method of a webapp.RequestHandler
-    instance.
-
-
-
-
-
-
- -
- -
- - -
-

_create_flow(self, - request_handler) -

-
source code  -
- -
-Create the Flow object.
-
-The Flow is calculated lazily since we don't know where this app is
-running until it receives a request, at which point redirect_uri can be
-calculated and then the Flow object can be constructed.
-
-Args:
-  request_handler: webapp.RequestHandler, the request handler.
-
-
-
-
-
-
- -
- -
- - -
-

oauth_aware(self, - method) -

-
source code  -
- -
-Decorator that sets up for OAuth 2.0 dance, but doesn't do it.
-
-Does all the setup for the OAuth dance, but doesn't initiate it.
-This decorator is useful if you want to create a page that knows
-whether or not the user has granted access to this application.
-From within a method decorated with @oauth_aware the has_credentials()
-and authorize_url() methods can be called.
-
-Args:
-  method: callable, to be decorated method of a webapp.RequestHandler
-    instance.
-
-
-
-
-
-
- -
- -
- - -
-

has_credentials(self) -

-
source code  -
- -
-True if for the logged in user there are valid access Credentials.
-
-Must only be called from with a webapp.RequestHandler subclassed method
-that had been decorated with either @oauth_required or @oauth_aware.
-
-
-
-
-
-
- -
- -
- - -
-

authorize_url(self) -

-
source code  -
- -
-Returns the URL to start the OAuth dance.
-
-Must only be called from with a webapp.RequestHandler subclassed method
-that had been decorated with either @oauth_required or @oauth_aware.
-
-
-
-
-
-
- -
- -
- - -
-

http(self, - *args, - **kwargs) -

-
source code  -
- -
-Returns an authorized http instance.
-
-Must only be called from within an @oauth_required decorated method, or
-from within an @oauth_aware decorated method where has_credentials()
-returns True.
-
-Args:
-    *args: Positional arguments passed to httplib2.Http constructor.
-    **kwargs: Positional arguments passed to httplib2.Http constructor.
-
-
-
-
-
-
- -
- -
- - -
-

callback_path(self) -

-
source code  -
- -
-The absolute path where the callback will occur.
-
-Note this is the absolute path, not the absolute URI, that will be
-calculated by the decorator at runtime. See callback_handler() for how this
-should be used.
-
-Returns:
-  The callback path as a string.
-
-
-
-
Decorators:
-
    -
  • @property
  • -
-
-
-
- -
- -
- - -
-

callback_handler(self) -

-
source code  -
- -
-RequestHandler for the OAuth 2.0 redirect callback.
-
-Usage:
-   app = webapp.WSGIApplication([
-     ('/index', MyIndexHandler),
-     ...,
-     (decorator.callback_path, decorator.callback_handler())
-   ])
-
-Returns:
-  A webapp.RequestHandler that handles the redirect back from the
-  server during the OAuth 2.0 dance.
-
-
-
-
-
-
- -
- -
- - -
-

callback_application(self) -

-
source code  -
- -
-WSGI application for handling the OAuth 2.0 redirect callback.
-
-If you need finer grained control use `callback_handler` which returns just
-the webapp.RequestHandler.
-
-Returns:
-  A webapp.WSGIApplication that handles the redirect back from the
-  server during the OAuth 2.0 dance.
-
-
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.appengine.OAuth2DecoratorFromClientSecrets-class.html b/docs/epy/oauth2client.appengine.OAuth2DecoratorFromClientSecrets-class.html deleted file mode 100644 index 33bb2f4..0000000 --- a/docs/epy/oauth2client.appengine.OAuth2DecoratorFromClientSecrets-class.html +++ /dev/null @@ -1,346 +0,0 @@ - - - - - oauth2client.appengine.OAuth2DecoratorFromClientSecrets - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module appengine :: - Class OAuth2DecoratorFromClientSecrets - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class OAuth2DecoratorFromClientSecrets

source code

-
-
- - - - - - - - - - - - - - - - - - - -
-
-
-
-An OAuth2Decorator that builds from a clientsecrets file.
-
-Uses a clientsecrets file as the source for all the information when
-constructing an OAuth2Decorator.
-
-Example:
-
-  decorator = OAuth2DecoratorFromClientSecrets(
-    os.path.join(os.path.dirname(__file__), 'client_secrets.json')
-    scope='https://www.googleapis.com/auth/plus')
-
-
-  class MainHandler(webapp.RequestHandler):
-
-    @decorator.oauth_required
-    def get(self):
-      http = decorator.http()
-      # http is authorized with the user's Credentials and can be used
-      # in API calls
-
-
- - - - - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-   - - - - - - -
__init__(self, - filename, - scope, - message=None, - cache=None, - **kwargs)
- Constructor
- source code - -
- -
-

Inherited from OAuth2Decorator: - authorize_url, - callback_application, - callback_handler, - callback_path, - get_credentials, - get_flow, - has_credentials, - http, - oauth_aware, - oauth_required, - set_credentials, - set_flow -

-

Inherited from OAuth2Decorator (private): - _create_flow, - _display_error_message -

-

Inherited from object: - __delattr__, - __format__, - __getattribute__, - __hash__, - __new__, - __reduce__, - __reduce_ex__, - __repr__, - __setattr__, - __sizeof__, - __str__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Class Variables[hide private]
-
-

Inherited from OAuth2Decorator: - credentials, - flow -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from object: - __class__ -

-
- - - - - - -
- - - - - -
Method Details[hide private]
-
- -
- -
- - -
-

__init__(self, - filename, - scope, - message=None, - cache=None, - **kwargs) -
(Constructor) -

-
source code  -
- -
-Constructor
-
-Args:
-  filename: string, File name of client secrets.
-  scope: string or iterable of strings, scope(s) of the credentials being
-    requested.
-  message: string, A friendly string to display to the user if the
-    clientsecrets file is missing or invalid. The message may contain HTML
-    and will be presented on the web interface for any method that uses the
-    decorator.
-  cache: An optional cache service client that implements get() and set()
-    methods. See clientsecrets.loadfile() for details.
-  **kwargs: dict, Keyword arguments are passed along as kwargs to
-    the OAuth2WebServerFlow constructor.
-
-
-
-
Decorators:
-
    -
  • @util.positional(3)
  • -
-
Overrides: - object.__init__ -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.appengine.SiteXsrfSecretKey-class.html b/docs/epy/oauth2client.appengine.SiteXsrfSecretKey-class.html deleted file mode 100644 index ff552d4..0000000 --- a/docs/epy/oauth2client.appengine.SiteXsrfSecretKey-class.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - oauth2client.appengine.SiteXsrfSecretKey - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module appengine :: - Class SiteXsrfSecretKey - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class SiteXsrfSecretKey

source code

-
-
- - - - -
-
-
-
-Storage for the sites XSRF secret key.
-
-There will only be one instance stored of this model, the one used for the
-site.
-
-
- - - - - - - - - - -
- - - - - -
Class Variables[hide private]
-
-   - - secret = db.StringProperty() -
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.appengine.SiteXsrfSecretKeyNDB-class.html b/docs/epy/oauth2client.appengine.SiteXsrfSecretKeyNDB-class.html deleted file mode 100644 index 85ecc82..0000000 --- a/docs/epy/oauth2client.appengine.SiteXsrfSecretKeyNDB-class.html +++ /dev/null @@ -1,187 +0,0 @@ - - - - - oauth2client.appengine.SiteXsrfSecretKeyNDB - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module appengine :: - Class SiteXsrfSecretKeyNDB - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class SiteXsrfSecretKeyNDB

source code

-
-
- - - - - -
-
-
-
-NDB Model for storage for the sites XSRF secret key.
-
-Since this model uses the same kind as SiteXsrfSecretKey, it can be used
-interchangeably. This simply provides an NDB model for interacting with the
-same data the DB model interacts with.
-
-There should only be one instance stored of this model, the one used for the
-site.
-
-
- - - - - - - - - - -
- - - - - -
Class Methods[hide private]
-
-   - - - - - - -
_get_kind(cls)
- Return the kind name for this class.
- source code - -
- -
- - - - - - - - - -
- - - - - -
Class Variables[hide private]
-
-   - - secret = ndb.StringProperty() -
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.appengine.StorageByKeyName-class.html b/docs/epy/oauth2client.appengine.StorageByKeyName-class.html deleted file mode 100644 index 5430dc2..0000000 --- a/docs/epy/oauth2client.appengine.StorageByKeyName-class.html +++ /dev/null @@ -1,562 +0,0 @@ - - - - - oauth2client.appengine.StorageByKeyName - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module appengine :: - Class StorageByKeyName - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class StorageByKeyName

source code

-
-
- - - - - - - - - - - - - -
-
-
-
-Store and retrieve a credential to and from the App Engine datastore.
-
-This Storage helper presumes the Credentials have been stored as a
-CredentialsProperty or CredentialsNDBProperty on a datastore model class, and
-that entities are stored by key_name.
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-   - - - - - - -
__init__(self, - model, - key_name, - property_name, - cache=None, - user=None)
- Constructor for Storage.
- source code - -
- -
-   - - - - - - -
_is_ndb(self)
- Determine whether the model of the instance is an NDB model.
- source code - -
- -
-   - - - - - - -
_get_entity(self)
- Retrieve entity from datastore.
- source code - -
- -
-   - - - - - - -
_delete_entity(self)
- Delete entity from datastore.
- source code - -
- -
-   - - - - - - -
locked_get(self)
- Retrieve Credential from datastore.
- source code - -
- -
-   - - - - - - -
locked_put(self, - credentials)
- Write a Credentials to the datastore.
- source code - -
- -
-   - - - - - - -
locked_delete(self)
- Delete Credential from datastore.
- source code - -
- -
-

Inherited from client.Storage: - acquire_lock, - delete, - get, - put, - release_lock -

-

Inherited from object: - __delattr__, - __format__, - __getattribute__, - __hash__, - __new__, - __reduce__, - __reduce_ex__, - __repr__, - __setattr__, - __sizeof__, - __str__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from object: - __class__ -

-
- - - - - - -
- - - - - -
Method Details[hide private]
-
- -
- -
- - -
-

__init__(self, - model, - key_name, - property_name, - cache=None, - user=None) -
(Constructor) -

-
source code  -
- -
-Constructor for Storage.
-
-Args:
-  model: db.Model or ndb.Model, model class
-  key_name: string, key name for the entity that has the credentials
-  property_name: string, name of the property that is a CredentialsProperty
-    or CredentialsNDBProperty.
-  cache: memcache, a write-through cache to put in front of the datastore.
-    If the model you are using is an NDB model, using a cache will be
-    redundant since the model uses an instance cache and memcache for you.
-  user: users.User object, optional. Can be used to grab user ID as a
-    key_name if no key name is specified.
-
-
-
-
Decorators:
-
    -
  • @util.positional(4)
  • -
-
Overrides: - object.__init__ -
-
-
-
- -
- -
- - -
-

_is_ndb(self) -

-
source code  -
- -
-Determine whether the model of the instance is an NDB model.
-
-Returns:
-  Boolean indicating whether or not the model is an NDB or DB model.
-
-
-
-
-
-
- -
- -
- - -
-

_get_entity(self) -

-
source code  -
- -
-Retrieve entity from datastore.
-
-Uses a different model method for db or ndb models.
-
-Returns:
-  Instance of the model corresponding to the current storage object
-      and stored using the key name of the storage object.
-
-
-
-
-
-
- -
- -
- - -
-

_delete_entity(self) -

-
source code  -
- -
-Delete entity from datastore.
-
-Attempts to delete using the key_name stored on the object, whether or not
-the given key is in the datastore.
-
-
-
-
-
-
- -
- -
- - -
-

locked_get(self) -

-
source code  -
- -
-Retrieve Credential from datastore.
-
-Returns:
-  oauth2client.Credentials
-
-
-
-
Decorators:
-
    -
  • @db.non_transactional(allow_existing= True)
  • -
-
Overrides: - client.Storage.locked_get -
-
-
-
- -
- -
- - -
-

locked_put(self, - credentials) -

-
source code  -
- -
-Write a Credentials to the datastore.
-
-Args:
-  credentials: Credentials, the credentials to store.
-
-
-
-
Decorators:
-
    -
  • @db.non_transactional(allow_existing= True)
  • -
-
Overrides: - client.Storage.locked_put -
-
-
-
- -
- -
- - -
-

locked_delete(self) -

-
source code  -
- -
-Delete Credential from datastore.
-
-
-
-
Decorators:
-
    -
  • @db.non_transactional(allow_existing= True)
  • -
-
Overrides: - client.Storage.locked_delete -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.client-module.html b/docs/epy/oauth2client.client-module.html deleted file mode 100644 index d13270f..0000000 --- a/docs/epy/oauth2client.client-module.html +++ /dev/null @@ -1,1347 +0,0 @@ - - - - - oauth2client.client - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module client - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Module client

source code

-
-An OAuth 2.0 client.
-
-Tools for interacting with OAuth 2.0 protected resources.
-
-
- -
-

Author: - jcgregorio@google.com (Joe Gregorio) -

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
Classes[hide private]
-
-   - - Error
- Base error for this module. -
-   - - FlowExchangeError
- Error trying to exchange an authorization grant for an access token. -
-   - - AccessTokenRefreshError
- Error trying to refresh an expired access token. -
-   - - TokenRevokeError
- Error trying to revoke a token. -
-   - - UnknownClientSecretsFlowError
- The client secrets file called for an unknown type of OAuth 2.0 flow. -
-   - - AccessTokenCredentialsError
- Having only the access_token means no refresh is possible. -
-   - - VerifyJwtTokenError
- Could not retrieve certificates for validation. -
-   - - NonAsciiHeaderError
- Header names and values must be ASCII strings. -
-   - - ApplicationDefaultCredentialsError
- Error retrieving the Application Default Credentials. -
-   - - OAuth2DeviceCodeError
- Error trying to retrieve a device code. -
-   - - CryptoUnavailableError
- Raised when a crypto library is required, but none is available. -
-   - - MemoryCache
- httplib2 Cache implementation which only caches locally. -
-   - - Credentials
- Base class for all Credentials objects. -
-   - - Flow
- Base class for all Flow objects. -
-   - - Storage
- Base class for all Storage objects. -
-   - - OAuth2Credentials
- Credentials object for OAuth 2.0. -
-   - - AccessTokenCredentials
- Credentials object for OAuth 2.0. -
-   - - GoogleCredentials
- Application Default Credentials for use in calling Google APIs. -
-   - - AssertionCredentials
- Abstract Credentials object used for OAuth 2.0 assertion grants. -
-   - - SignedJwtAssertionCredentials
- Credentials object used for OAuth 2.0 Signed JWT assertion grants. -
-   - - DeviceFlowInfo
- Intermediate information the OAuth2 for devices flow. -
-   - - OAuth2WebServerFlow
- Does the Web Server Flow for OAuth 2.0. -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
Functions[hide private]
-
-   - - - - - - -
_abstract() - source code - -
- -
-   - - - - - - -
clean_headers(headers)
- Forces header keys and values to be strings, i.e not unicode.
- source code - -
- -
-   - - - - - - -
_update_query_params(uri, - params)
- Updates a URI with new query parameters.
- source code - -
- -
-   - - - - - - -
_get_environment(urlopen=None)
- Detect the environment the code is being run on.
- source code - -
- -
-   - - - - - - -
save_to_well_known_file(credentials, - well_known_file=None)
- Save the provided GoogleCredentials to the well known file.
- source code - -
- -
-   - - - - - - -
_get_environment_variable_file() - source code - -
- -
-   - - - - - - -
_get_well_known_file()
- Get the well known file produced by command 'gcloud auth login'.
- source code - -
- -
-   - - - - - - -
_get_application_default_credential_from_file(application_default_credential_filename)
- Build the Application Default Credentials from file.
- source code - -
- -
-   - - - - - - -
_raise_exception_for_missing_fields(missing_fields) - source code - -
- -
-   - - - - - - -
_raise_exception_for_reading_json(credential_file, - extra_help, - error) - source code - -
- -
-   - - - - - - -
_get_application_default_credential_GAE() - source code - -
- -
-   - - - - - - -
_get_application_default_credential_GCE() - source code - -
- -
-   - - - - - - -
_RequireCryptoOrDie()
- Ensure we have a crypto library, or throw CryptoUnavailableError.
- source code - -
- -
-   - - - - - - -
verify_id_token(id_token, - audience, - http=None, - cert_uri=ID_TOKEN_VERIFICATION_CERTS)
- Verifies a signed JWT id_token.
- source code - -
- -
-   - - - - - - -
_urlsafe_b64decode(b64string) - source code - -
- -
-   - - - - - - -
_extract_id_token(id_token)
- Extract the JSON payload from a JWT.
- source code - -
- -
-   - - - - - - -
_parse_exchange_token_response(content)
- Parses response of an exchange token request.
- source code - -
- -
-   - - - - - - -
credentials_from_code(client_id, - client_secret, - scope, - code, - redirect_uri='postmessage', - http=None, - user_agent=None, - token_uri=GOOGLE_TOKEN_URI, - auth_uri=GOOGLE_AUTH_URI, - revoke_uri=GOOGLE_REVOKE_URI, - device_uri=GOOGLE_DEVICE_URI)
- Exchanges an authorization code for an OAuth2Credentials object.
- source code - -
- -
-   - - - - - - -
credentials_from_clientsecrets_and_code(filename, - scope, - code, - message=None, - redirect_uri='postmessage', - http=None, - cache=None, - device_uri=None)
- Returns OAuth2Credentials from a clientsecrets file and an auth code.
- source code - -
- -
-   - - - - - - -
flow_from_clientsecrets(filename, - scope, - redirect_uri=None, - message=None, - cache=None, - login_hint=None, - device_uri=None)
- Create a Flow from a clientsecrets file.
- source code - -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
Variables[hide private]
-
-   - - HAS_CRYPTO = True -
-   - - HAS_OPENSSL = True -
-   - - logger = logging.getLogger(__name__) -
-   - - EXPIRY_FORMAT = '%Y-%m-%dT%H:%M:%SZ' -
-   - - ID_TOKEN_VERIFICATION_CERTS = 'https://www.googleapis.com/oaut... -
-   - - ID_TOKEN_VERIFICATON_CERTS = 'https://www.googleapis.com/oauth... -
-   - - OOB_CALLBACK_URN = 'urn:ietf:wg:oauth:2.0:oob' -
-   - - REFRESH_STATUS_CODES = [401] -
-   - - AUTHORIZED_USER = 'authorized_user' -
-   - - SERVICE_ACCOUNT = 'service_account' -
-   - - GOOGLE_APPLICATION_CREDENTIALS = 'GOOGLE_APPLICATION_CREDENTIALS' -
-   - - ADC_HELP_MSG = 'The Application Default Credentials are not av... -
-   - - AccessTokenInfo = collections.namedtuple('AccessTokenInfo', ['... -
-   - - _env_name = None -
-   - - _cached_http = httplib2.Http(MemoryCache()) -
- - - - - - -
- - - - - -
Function Details[hide private]
-
- -
- -
- - -
-

clean_headers(headers) -

-
source code  -
- -
-Forces header keys and values to be strings, i.e not unicode.
-
-The httplib module just concats the header keys and values in a way that may
-make the message header a unicode string, which, if it then tries to
-contatenate to a binary request body may result in a unicode decode error.
-
-Args:
-  headers: dict, A dictionary of headers.
-
-Returns:
-  The same dictionary but with all the keys converted to strings.
-
-
-
-
-
-
- -
- -
- - -
-

_update_query_params(uri, - params) -

-
source code  -
- -
-Updates a URI with new query parameters.
-
-Args:
-  uri: string, A valid URI, with potential existing query parameters.
-  params: dict, A dictionary of query parameters.
-
-Returns:
-  The same URI but with the new query parameters added.
-
-
-
-
-
-
- -
- -
- - -
-

save_to_well_known_file(credentials, - well_known_file=None) -

-
source code  -
- -
-Save the provided GoogleCredentials to the well known file.
-
-Args:
-  credentials:
-    the credentials to be saved to the well known file;
-    it should be an instance of GoogleCredentials
-  well_known_file:
-    the name of the file where the credentials are to be saved;
-    this parameter is supposed to be used for testing only
-
-
-
-
-
-
- -
- -
- - -
-

_RequireCryptoOrDie() -

-
source code  -
- -
-Ensure we have a crypto library, or throw CryptoUnavailableError.
-
-The oauth2client.crypt module requires either PyCrypto or PyOpenSSL
-to be available in order to function, but these are optional
-dependencies.
-
-
-
-
-
-
- -
- -
- - -
-

verify_id_token(id_token, - audience, - http=None, - cert_uri=ID_TOKEN_VERIFICATION_CERTS) -

-
source code  -
- -
-Verifies a signed JWT id_token.
-
-This function requires PyOpenSSL and because of that it does not work on
-App Engine.
-
-Args:
-  id_token: string, A Signed JWT.
-  audience: string, The audience 'aud' that the token should be for.
-  http: httplib2.Http, instance to use to make the HTTP request. Callers
-    should supply an instance that has caching enabled.
-  cert_uri: string, URI of the certificates in JSON format to
-    verify the JWT against.
-
-Returns:
-  The deserialized JSON in the JWT.
-
-Raises:
-  oauth2client.crypt.AppIdentityError: if the JWT fails to verify.
-  CryptoUnavailableError: if no crypto library is available.
-
-
-
-
Decorators:
-
    -
  • @util.positional(2)
  • -
-
-
-
- -
- -
- - -
-

_extract_id_token(id_token) -

-
source code  -
- -
-Extract the JSON payload from a JWT.
-
-Does the extraction w/o checking the signature.
-
-Args:
-  id_token: string, OAuth 2.0 id_token.
-
-Returns:
-  object, The deserialized JSON payload.
-
-
-
-
-
-
- -
- -
- - -
-

_parse_exchange_token_response(content) -

-
source code  -
- -
-Parses response of an exchange token request.
-
-Most providers return JSON but some (e.g. Facebook) return a
-url-encoded string.
-
-Args:
-  content: The body of a response
-
-Returns:
-  Content as a dictionary object. Note that the dict could be empty,
-  i.e. {}. That basically indicates a failure.
-
-
-
-
-
-
- -
- -
- - -
-

credentials_from_code(client_id, - client_secret, - scope, - code, - redirect_uri='postmessage', - http=None, - user_agent=None, - token_uri=GOOGLE_TOKEN_URI, - auth_uri=GOOGLE_AUTH_URI, - revoke_uri=GOOGLE_REVOKE_URI, - device_uri=GOOGLE_DEVICE_URI) -

-
source code  -
- -
-Exchanges an authorization code for an OAuth2Credentials object.
-
-Args:
-  client_id: string, client identifier.
-  client_secret: string, client secret.
-  scope: string or iterable of strings, scope(s) to request.
-  code: string, An authroization code, most likely passed down from
-    the client
-  redirect_uri: string, this is generally set to 'postmessage' to match the
-    redirect_uri that the client specified
-  http: httplib2.Http, optional http instance to use to do the fetch
-  token_uri: string, URI for token endpoint. For convenience
-    defaults to Google's endpoints but any OAuth 2.0 provider can be used.
-  auth_uri: string, URI for authorization endpoint. For convenience
-    defaults to Google's endpoints but any OAuth 2.0 provider can be used.
-  revoke_uri: string, URI for revoke endpoint. For convenience
-    defaults to Google's endpoints but any OAuth 2.0 provider can be used.
-  device_uri: string, URI for device authorization endpoint. For convenience
-    defaults to Google's endpoints but any OAuth 2.0 provider can be used.
-
-Returns:
-  An OAuth2Credentials object.
-
-Raises:
-  FlowExchangeError if the authorization code cannot be exchanged for an
-   access token
-
-
-
-
Decorators:
-
    -
  • @util.positional(4)
  • -
-
-
-
- -
- -
- - -
-

credentials_from_clientsecrets_and_code(filename, - scope, - code, - message=None, - redirect_uri='postmessage', - http=None, - cache=None, - device_uri=None) -

-
source code  -
- -
-Returns OAuth2Credentials from a clientsecrets file and an auth code.
-
-Will create the right kind of Flow based on the contents of the clientsecrets
-file or will raise InvalidClientSecretsError for unknown types of Flows.
-
-Args:
-  filename: string, File name of clientsecrets.
-  scope: string or iterable of strings, scope(s) to request.
-  code: string, An authorization code, most likely passed down from
-    the client
-  message: string, A friendly string to display to the user if the
-    clientsecrets file is missing or invalid. If message is provided then
-    sys.exit will be called in the case of an error. If message in not
-    provided then clientsecrets.InvalidClientSecretsError will be raised.
-  redirect_uri: string, this is generally set to 'postmessage' to match the
-    redirect_uri that the client specified
-  http: httplib2.Http, optional http instance to use to do the fetch
-  cache: An optional cache service client that implements get() and set()
-    methods. See clientsecrets.loadfile() for details.
-  device_uri: string, OAuth 2.0 device authorization endpoint
-
-Returns:
-  An OAuth2Credentials object.
-
-Raises:
-  FlowExchangeError if the authorization code cannot be exchanged for an
-   access token
-  UnknownClientSecretsFlowError if the file describes an unknown kind of Flow.
-  clientsecrets.InvalidClientSecretsError if the clientsecrets file is
-    invalid.
-
-
-
-
Decorators:
-
    -
  • @util.positional(3)
  • -
-
-
-
- -
- -
- - -
-

flow_from_clientsecrets(filename, - scope, - redirect_uri=None, - message=None, - cache=None, - login_hint=None, - device_uri=None) -

-
source code  -
- -
-Create a Flow from a clientsecrets file.
-
-Will create the right kind of Flow based on the contents of the clientsecrets
-file or will raise InvalidClientSecretsError for unknown types of Flows.
-
-Args:
-  filename: string, File name of client secrets.
-  scope: string or iterable of strings, scope(s) to request.
-  redirect_uri: string, Either the string 'urn:ietf:wg:oauth:2.0:oob' for
-    a non-web-based application, or a URI that handles the callback from
-    the authorization server.
-  message: string, A friendly string to display to the user if the
-    clientsecrets file is missing or invalid. If message is provided then
-    sys.exit will be called in the case of an error. If message in not
-    provided then clientsecrets.InvalidClientSecretsError will be raised.
-  cache: An optional cache service client that implements get() and set()
-    methods. See clientsecrets.loadfile() for details.
-  login_hint: string, Either an email address or domain. Passing this hint
-    will either pre-fill the email box on the sign-in form or select the
-    proper multi-login session, thereby simplifying the login flow.
-  device_uri: string, URI for device authorization endpoint. For convenience
-    defaults to Google's endpoints but any OAuth 2.0 provider can be used.
-
-Returns:
-  A Flow object.
-
-Raises:
-  UnknownClientSecretsFlowError if the file describes an unknown kind of Flow.
-  clientsecrets.InvalidClientSecretsError if the clientsecrets file is
-    invalid.
-
-
-
-
Decorators:
-
    -
  • @util.positional(2)
  • -
-
-
-
-
- - - - - - -
- - - - - -
Variables Details[hide private]
-
- -
- -
-

ID_TOKEN_VERIFICATION_CERTS

- -
-
-
-
Value:
-
-'https://www.googleapis.com/oauth2/v1/certs'
-
-
-
-
-
- -
- -
-

ID_TOKEN_VERIFICATON_CERTS

- -
-
-
-
Value:
-
-'https://www.googleapis.com/oauth2/v1/certs'
-
-
-
-
-
- -
- -
-

ADC_HELP_MSG

- -
-
-
-
Value:
-
-'The Application Default Credentials are not available. They are avail\
-able ' 'if running in Google Compute Engine. Otherwise, the environmen\
-t variable '+ GOOGLE_APPLICATION_CREDENTIALS+ ' must be defined pointi\
-ng to a file defining the credentials. See ' 'https://developers.googl\
-e.com/accounts/docs/application-default-credentials' ' for more inform\
-ation.'
-
-
-
-
-
- -
- -
-

AccessTokenInfo

- -
-
-
-
Value:
-
-collections.namedtuple('AccessTokenInfo', ['access_token', 'expires_in\
-'])
-
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.client-pysrc.html b/docs/epy/oauth2client.client-pysrc.html deleted file mode 100644 index 5cdb39d..0000000 --- a/docs/epy/oauth2client.client-pysrc.html +++ /dev/null @@ -1,2332 +0,0 @@ - - - - - oauth2client.client - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module client - - - - - - -
[hide private]
[frames] | no frames]
-
-

Source Code for Module oauth2client.client

-
-   1  # Copyright 2014 Google Inc. All rights reserved. 
-   2  # 
-   3  # Licensed under the Apache License, Version 2.0 (the "License"); 
-   4  # you may not use this file except in compliance with the License. 
-   5  # You may obtain a copy of the License at 
-   6  # 
-   7  #      http://www.apache.org/licenses/LICENSE-2.0 
-   8  # 
-   9  # Unless required by applicable law or agreed to in writing, software 
-  10  # distributed under the License is distributed on an "AS IS" BASIS, 
-  11  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
-  12  # See the License for the specific language governing permissions and 
-  13  # limitations under the License. 
-  14   
-  15  """An OAuth 2.0 client. 
-  16   
-  17  Tools for interacting with OAuth 2.0 protected resources. 
-  18  """ 
-  19   
-  20  __author__ = 'jcgregorio@google.com (Joe Gregorio)' 
-  21   
-  22  import base64 
-  23  import collections 
-  24  import copy 
-  25  import datetime 
-  26  import json 
-  27  import logging 
-  28  import os 
-  29  import sys 
-  30  import time 
-  31  import six 
-  32  from six.moves import urllib 
-  33   
-  34  import httplib2 
-  35  from oauth2client import clientsecrets 
-  36  from oauth2client import GOOGLE_AUTH_URI 
-  37  from oauth2client import GOOGLE_DEVICE_URI 
-  38  from oauth2client import GOOGLE_REVOKE_URI 
-  39  from oauth2client import GOOGLE_TOKEN_URI 
-  40  from oauth2client import util 
-  41   
-  42  HAS_OPENSSL = False 
-  43  HAS_CRYPTO = False 
-  44  try: 
-  45    from oauth2client import crypt 
-  46    HAS_CRYPTO = True 
-  47    if crypt.OpenSSLVerifier is not None: 
-  48      HAS_OPENSSL = True 
-  49  except ImportError: 
-  50    pass 
-  51   
-  52  logger = logging.getLogger(__name__) 
-  53   
-  54  # Expiry is stored in RFC3339 UTC format 
-  55  EXPIRY_FORMAT = '%Y-%m-%dT%H:%M:%SZ' 
-  56   
-  57  # Which certs to use to validate id_tokens received. 
-  58  ID_TOKEN_VERIFICATION_CERTS = 'https://www.googleapis.com/oauth2/v1/certs' 
-  59  # This symbol previously had a typo in the name; we keep the old name 
-  60  # around for now, but will remove it in the future. 
-  61  ID_TOKEN_VERIFICATON_CERTS = ID_TOKEN_VERIFICATION_CERTS 
-  62   
-  63  # Constant to use for the out of band OAuth 2.0 flow. 
-  64  OOB_CALLBACK_URN = 'urn:ietf:wg:oauth:2.0:oob' 
-  65   
-  66  # Google Data client libraries may need to set this to [401, 403]. 
-  67  REFRESH_STATUS_CODES = [401] 
-  68   
-  69  # The value representing user credentials. 
-  70  AUTHORIZED_USER = 'authorized_user' 
-  71   
-  72  # The value representing service account credentials. 
-  73  SERVICE_ACCOUNT = 'service_account' 
-  74   
-  75  # The environment variable pointing the file with local 
-  76  # Application Default Credentials. 
-  77  GOOGLE_APPLICATION_CREDENTIALS = 'GOOGLE_APPLICATION_CREDENTIALS' 
-  78   
-  79  # The error message we show users when we can't find the Application 
-  80  # Default Credentials. 
-  81  ADC_HELP_MSG = ( 
-  82      'The Application Default Credentials are not available. They are available ' 
-  83      'if running in Google Compute Engine. Otherwise, the environment variable ' 
-  84      + GOOGLE_APPLICATION_CREDENTIALS + 
-  85      ' must be defined pointing to a file defining the credentials. See ' 
-  86      'https://developers.google.com/accounts/docs/application-default-credentials'  # pylint:disable=line-too-long 
-  87      ' for more information.') 
-  88   
-  89  # The access token along with the seconds in which it expires. 
-  90  AccessTokenInfo = collections.namedtuple( 
-  91      'AccessTokenInfo', ['access_token', 'expires_in']) 
-
92 - 93 - 94 -class Error(Exception): -
95 """Base error for this module.""" -
96 -
97 - 98 -class FlowExchangeError(Error): -
99 """Error trying to exchange an authorization grant for an access token.""" -
100 -
101 - 102 -class AccessTokenRefreshError(Error): -
103 """Error trying to refresh an expired access token.""" -
104 -
105 - 106 -class TokenRevokeError(Error): -
107 """Error trying to revoke a token.""" -
108 -
109 - 110 -class UnknownClientSecretsFlowError(Error): -
111 """The client secrets file called for an unknown type of OAuth 2.0 flow. """ -
112 -
113 - 114 -class AccessTokenCredentialsError(Error): -
115 """Having only the access_token means no refresh is possible.""" -
116 -
117 - 118 -class VerifyJwtTokenError(Error): -
119 """Could not retrieve certificates for validation.""" -
120 -
121 - 122 -class NonAsciiHeaderError(Error): -
123 """Header names and values must be ASCII strings.""" -
124 -
125 - 126 -class ApplicationDefaultCredentialsError(Error): -
127 """Error retrieving the Application Default Credentials.""" -
128 -
129 - 130 -class OAuth2DeviceCodeError(Error): -
131 """Error trying to retrieve a device code.""" -
132 -
133 - 134 -class CryptoUnavailableError(Error, NotImplementedError): -
135 """Raised when a crypto library is required, but none is available.""" -
136 -
137 - 138 -def _abstract(): -
139 raise NotImplementedError('You need to override this function') -
140 -
141 - 142 -class MemoryCache(object): -
143 """httplib2 Cache implementation which only caches locally.""" - 144 -
145 - def __init__(self): -
146 self.cache = {} -
147 -
148 - def get(self, key): -
149 return self.cache.get(key) -
150 -
151 - def set(self, key, value): -
152 self.cache[key] = value -
153 -
154 - def delete(self, key): -
155 self.cache.pop(key, None) -
156 -
157 - 158 -class Credentials(object): -
159 """Base class for all Credentials objects. - 160 - 161 Subclasses must define an authorize() method that applies the credentials to - 162 an HTTP transport. - 163 - 164 Subclasses must also specify a classmethod named 'from_json' that takes a JSON - 165 string as input and returns an instantiated Credentials object. - 166 """ - 167 - 168 NON_SERIALIZED_MEMBERS = ['store'] - 169 - 170 -
171 - def authorize(self, http): -
172 """Take an httplib2.Http instance (or equivalent) and authorizes it. - 173 - 174 Authorizes it for the set of credentials, usually by replacing - 175 http.request() with a method that adds in the appropriate headers and then - 176 delegates to the original Http.request() method. - 177 - 178 Args: - 179 http: httplib2.Http, an http object to be used to make the refresh - 180 request. - 181 """ - 182 _abstract() -
183 - 184 -
185 - def refresh(self, http): -
186 """Forces a refresh of the access_token. - 187 - 188 Args: - 189 http: httplib2.Http, an http object to be used to make the refresh - 190 request. - 191 """ - 192 _abstract() -
193 - 194 -
195 - def revoke(self, http): -
196 """Revokes a refresh_token and makes the credentials void. - 197 - 198 Args: - 199 http: httplib2.Http, an http object to be used to make the revoke - 200 request. - 201 """ - 202 _abstract() -
203 - 204 -
205 - def apply(self, headers): -
206 """Add the authorization to the headers. - 207 - 208 Args: - 209 headers: dict, the headers to add the Authorization header to. - 210 """ - 211 _abstract() -
212 -
213 - def _to_json(self, strip): -
214 """Utility function that creates JSON repr. of a Credentials object. - 215 - 216 Args: - 217 strip: array, An array of names of members to not include in the JSON. - 218 - 219 Returns: - 220 string, a JSON representation of this instance, suitable to pass to - 221 from_json(). - 222 """ - 223 t = type(self) - 224 d = copy.copy(self.__dict__) - 225 for member in strip: - 226 if member in d: - 227 del d[member] - 228 if (d.get('token_expiry') and - 229 isinstance(d['token_expiry'], datetime.datetime)): - 230 d['token_expiry'] = d['token_expiry'].strftime(EXPIRY_FORMAT) - 231 # Add in information we will need later to reconsistitue this instance. - 232 d['_class'] = t.__name__ - 233 d['_module'] = t.__module__ - 234 for key, val in d.items(): - 235 if isinstance(val, bytes): - 236 d[key] = val.decode('utf-8') - 237 return json.dumps(d) -
238 -
239 - def to_json(self): -
240 """Creating a JSON representation of an instance of Credentials. - 241 - 242 Returns: - 243 string, a JSON representation of this instance, suitable to pass to - 244 from_json(). - 245 """ - 246 return self._to_json(Credentials.NON_SERIALIZED_MEMBERS) -
247 - 248 @classmethod -
249 - def new_from_json(cls, s): -
250 """Utility class method to instantiate a Credentials subclass from a JSON - 251 representation produced by to_json(). - 252 - 253 Args: - 254 s: string, JSON from to_json(). - 255 - 256 Returns: - 257 An instance of the subclass of Credentials that was serialized with - 258 to_json(). - 259 """ - 260 if six.PY3 and isinstance(s, bytes): - 261 s = s.decode('utf-8') - 262 data = json.loads(s) - 263 # Find and call the right classmethod from_json() to restore the object. - 264 module = data['_module'] - 265 try: - 266 m = __import__(module) - 267 except ImportError: - 268 # In case there's an object from the old package structure, update it - 269 module = module.replace('.googleapiclient', '') - 270 m = __import__(module) - 271 - 272 m = __import__(module, fromlist=module.split('.')[:-1]) - 273 kls = getattr(m, data['_class']) - 274 from_json = getattr(kls, 'from_json') - 275 return from_json(s) -
276 - 277 @classmethod -
278 - def from_json(cls, unused_data): -
279 """Instantiate a Credentials object from a JSON description of it. - 280 - 281 The JSON should have been produced by calling .to_json() on the object. - 282 - 283 Args: - 284 unused_data: dict, A deserialized JSON object. - 285 - 286 Returns: - 287 An instance of a Credentials subclass. - 288 """ - 289 return Credentials() -
290 -
291 - 292 -class Flow(object): -
293 """Base class for all Flow objects.""" - 294 pass -
295 -
296 - 297 -class Storage(object): -
298 """Base class for all Storage objects. - 299 - 300 Store and retrieve a single credential. This class supports locking - 301 such that multiple processes and threads can operate on a single - 302 store. - 303 """ - 304 -
305 - def acquire_lock(self): -
306 """Acquires any lock necessary to access this Storage. - 307 - 308 This lock is not reentrant. - 309 """ - 310 pass -
311 -
312 - def release_lock(self): -
313 """Release the Storage lock. - 314 - 315 Trying to release a lock that isn't held will result in a - 316 RuntimeError. - 317 """ - 318 pass -
319 -
320 - def locked_get(self): -
321 """Retrieve credential. - 322 - 323 The Storage lock must be held when this is called. - 324 - 325 Returns: - 326 oauth2client.client.Credentials - 327 """ - 328 _abstract() -
329 -
330 - def locked_put(self, credentials): -
331 """Write a credential. - 332 - 333 The Storage lock must be held when this is called. - 334 - 335 Args: - 336 credentials: Credentials, the credentials to store. - 337 """ - 338 _abstract() -
339 -
340 - def locked_delete(self): -
341 """Delete a credential. - 342 - 343 The Storage lock must be held when this is called. - 344 """ - 345 _abstract() -
346 -
347 - def get(self): -
348 """Retrieve credential. - 349 - 350 The Storage lock must *not* be held when this is called. - 351 - 352 Returns: - 353 oauth2client.client.Credentials - 354 """ - 355 self.acquire_lock() - 356 try: - 357 return self.locked_get() - 358 finally: - 359 self.release_lock() -
360 -
361 - def put(self, credentials): -
362 """Write a credential. - 363 - 364 The Storage lock must be held when this is called. - 365 - 366 Args: - 367 credentials: Credentials, the credentials to store. - 368 """ - 369 self.acquire_lock() - 370 try: - 371 self.locked_put(credentials) - 372 finally: - 373 self.release_lock() -
374 -
375 - def delete(self): -
376 """Delete credential. - 377 - 378 Frees any resources associated with storing the credential. - 379 The Storage lock must *not* be held when this is called. - 380 - 381 Returns: - 382 None - 383 """ - 384 self.acquire_lock() - 385 try: - 386 return self.locked_delete() - 387 finally: - 388 self.release_lock() -
389 -
390 - 391 -def clean_headers(headers): -
392 """Forces header keys and values to be strings, i.e not unicode. - 393 - 394 The httplib module just concats the header keys and values in a way that may - 395 make the message header a unicode string, which, if it then tries to - 396 contatenate to a binary request body may result in a unicode decode error. - 397 - 398 Args: - 399 headers: dict, A dictionary of headers. - 400 - 401 Returns: - 402 The same dictionary but with all the keys converted to strings. - 403 """ - 404 clean = {} - 405 try: - 406 for k, v in six.iteritems(headers): - 407 clean[str(k)] = str(v) - 408 except UnicodeEncodeError: - 409 raise NonAsciiHeaderError(k + ': ' + v) - 410 return clean -
411 -
412 - 413 -def _update_query_params(uri, params): -
414 """Updates a URI with new query parameters. - 415 - 416 Args: - 417 uri: string, A valid URI, with potential existing query parameters. - 418 params: dict, A dictionary of query parameters. - 419 - 420 Returns: - 421 The same URI but with the new query parameters added. - 422 """ - 423 parts = urllib.parse.urlparse(uri) - 424 query_params = dict(urllib.parse.parse_qsl(parts.query)) - 425 query_params.update(params) - 426 new_parts = parts._replace(query=urllib.parse.urlencode(query_params)) - 427 return urllib.parse.urlunparse(new_parts) -
428 -
429 - 430 -class OAuth2Credentials(Credentials): -
431 """Credentials object for OAuth 2.0. - 432 - 433 Credentials can be applied to an httplib2.Http object using the authorize() - 434 method, which then adds the OAuth 2.0 access token to each request. - 435 - 436 OAuth2Credentials objects may be safely pickled and unpickled. - 437 """ - 438 - 439 @util.positional(8) -
440 - def __init__(self, access_token, client_id, client_secret, refresh_token, - 441 token_expiry, token_uri, user_agent, revoke_uri=None, - 442 id_token=None, token_response=None): -
443 """Create an instance of OAuth2Credentials. - 444 - 445 This constructor is not usually called by the user, instead - 446 OAuth2Credentials objects are instantiated by the OAuth2WebServerFlow. - 447 - 448 Args: - 449 access_token: string, access token. - 450 client_id: string, client identifier. - 451 client_secret: string, client secret. - 452 refresh_token: string, refresh token. - 453 token_expiry: datetime, when the access_token expires. - 454 token_uri: string, URI of token endpoint. - 455 user_agent: string, The HTTP User-Agent to provide for this application. - 456 revoke_uri: string, URI for revoke endpoint. Defaults to None; a token - 457 can't be revoked if this is None. - 458 id_token: object, The identity of the resource owner. - 459 token_response: dict, the decoded response to the token request. None - 460 if a token hasn't been requested yet. Stored because some providers - 461 (e.g. wordpress.com) include extra fields that clients may want. - 462 - 463 Notes: - 464 store: callable, A callable that when passed a Credential - 465 will store the credential back to where it came from. - 466 This is needed to store the latest access_token if it - 467 has expired and been refreshed. - 468 """ - 469 self.access_token = access_token - 470 self.client_id = client_id - 471 self.client_secret = client_secret - 472 self.refresh_token = refresh_token - 473 self.store = None - 474 self.token_expiry = token_expiry - 475 self.token_uri = token_uri - 476 self.user_agent = user_agent - 477 self.revoke_uri = revoke_uri - 478 self.id_token = id_token - 479 self.token_response = token_response - 480 - 481 # True if the credentials have been revoked or expired and can't be - 482 # refreshed. - 483 self.invalid = False -
484 -
485 - def authorize(self, http): -
486 """Authorize an httplib2.Http instance with these credentials. - 487 - 488 The modified http.request method will add authentication headers to each - 489 request and will refresh access_tokens when a 401 is received on a - 490 request. In addition the http.request method has a credentials property, - 491 http.request.credentials, which is the Credentials object that authorized - 492 it. - 493 - 494 Args: - 495 http: An instance of httplib2.Http - 496 or something that acts like it. - 497 - 498 Returns: - 499 A modified instance of http that was passed in. - 500 - 501 Example: - 502 - 503 h = httplib2.Http() - 504 h = credentials.authorize(h) - 505 - 506 You can't create a new OAuth subclass of httplib2.Authentication - 507 because it never gets passed the absolute URI, which is needed for - 508 signing. So instead we have to overload 'request' with a closure - 509 that adds in the Authorization header and then calls the original - 510 version of 'request()'. - 511 """ - 512 request_orig = http.request - 513 - 514 # The closure that will replace 'httplib2.Http.request'. - 515 @util.positional(1) - 516 def new_request(uri, method='GET', body=None, headers=None, - 517 redirections=httplib2.DEFAULT_MAX_REDIRECTS, - 518 connection_type=None): - 519 if not self.access_token: - 520 logger.info('Attempting refresh to obtain initial access_token') - 521 self._refresh(request_orig) - 522 - 523 # Clone and modify the request headers to add the appropriate - 524 # Authorization header. - 525 if headers is None: - 526 headers = {} - 527 else: - 528 headers = dict(headers) - 529 self.apply(headers) - 530 - 531 if self.user_agent is not None: - 532 if 'user-agent' in headers: - 533 headers['user-agent'] = self.user_agent + ' ' + headers['user-agent'] - 534 else: - 535 headers['user-agent'] = self.user_agent - 536 - 537 resp, content = request_orig(uri, method, body, clean_headers(headers), - 538 redirections, connection_type) - 539 - 540 if resp.status in REFRESH_STATUS_CODES: - 541 logger.info('Refreshing due to a %s', resp.status) - 542 self._refresh(request_orig) - 543 self.apply(headers) - 544 return request_orig(uri, method, body, clean_headers(headers), - 545 redirections, connection_type) - 546 else: - 547 return (resp, content) -
548 - 549 # Replace the request method with our own closure. - 550 http.request = new_request - 551 - 552 # Set credentials as a property of the request method. - 553 setattr(http.request, 'credentials', self) - 554 - 555 return http -
556 -
557 - def refresh(self, http): -
558 """Forces a refresh of the access_token. - 559 - 560 Args: - 561 http: httplib2.Http, an http object to be used to make the refresh - 562 request. - 563 """ - 564 self._refresh(http.request) -
565 -
566 - def revoke(self, http): -
567 """Revokes a refresh_token and makes the credentials void. - 568 - 569 Args: - 570 http: httplib2.Http, an http object to be used to make the revoke - 571 request. - 572 """ - 573 self._revoke(http.request) -
574 -
575 - def apply(self, headers): -
576 """Add the authorization to the headers. - 577 - 578 Args: - 579 headers: dict, the headers to add the Authorization header to. - 580 """ - 581 headers['Authorization'] = 'Bearer ' + self.access_token -
582 -
583 - def to_json(self): -
585 - 586 @classmethod -
587 - def from_json(cls, s): -
588 """Instantiate a Credentials object from a JSON description of it. The JSON - 589 should have been produced by calling .to_json() on the object. - 590 - 591 Args: - 592 data: dict, A deserialized JSON object. - 593 - 594 Returns: - 595 An instance of a Credentials subclass. - 596 """ - 597 if six.PY3 and isinstance(s, bytes): - 598 s = s.decode('utf-8') - 599 data = json.loads(s) - 600 if (data.get('token_expiry') and - 601 not isinstance(data['token_expiry'], datetime.datetime)): - 602 try: - 603 data['token_expiry'] = datetime.datetime.strptime( - 604 data['token_expiry'], EXPIRY_FORMAT) - 605 except ValueError: - 606 data['token_expiry'] = None - 607 retval = cls( - 608 data['access_token'], - 609 data['client_id'], - 610 data['client_secret'], - 611 data['refresh_token'], - 612 data['token_expiry'], - 613 data['token_uri'], - 614 data['user_agent'], - 615 revoke_uri=data.get('revoke_uri', None), - 616 id_token=data.get('id_token', None), - 617 token_response=data.get('token_response', None)) - 618 retval.invalid = data['invalid'] - 619 return retval -
620 - 621 @property -
622 - def access_token_expired(self): -
623 """True if the credential is expired or invalid. - 624 - 625 If the token_expiry isn't set, we assume the token doesn't expire. - 626 """ - 627 if self.invalid: - 628 return True - 629 - 630 if not self.token_expiry: - 631 return False - 632 - 633 now = datetime.datetime.utcnow() - 634 if now >= self.token_expiry: - 635 logger.info('access_token is expired. Now: %s, token_expiry: %s', - 636 now, self.token_expiry) - 637 return True - 638 return False -
639 -
640 - def get_access_token(self, http=None): -
641 """Return the access token and its expiration information. - 642 - 643 If the token does not exist, get one. - 644 If the token expired, refresh it. - 645 """ - 646 if not self.access_token or self.access_token_expired: - 647 if not http: - 648 http = httplib2.Http() - 649 self.refresh(http) - 650 return AccessTokenInfo(access_token=self.access_token, - 651 expires_in=self._expires_in()) -
652 -
653 - def set_store(self, store): -
654 """Set the Storage for the credential. - 655 - 656 Args: - 657 store: Storage, an implementation of Storage object. - 658 This is needed to store the latest access_token if it - 659 has expired and been refreshed. This implementation uses - 660 locking to check for updates before updating the - 661 access_token. - 662 """ - 663 self.store = store -
664 -
665 - def _expires_in(self): -
666 """Return the number of seconds until this token expires. - 667 - 668 If token_expiry is in the past, this method will return 0, meaning the - 669 token has already expired. - 670 If token_expiry is None, this method will return None. Note that returning - 671 0 in such a case would not be fair: the token may still be valid; - 672 we just don't know anything about it. - 673 """ - 674 if self.token_expiry: - 675 now = datetime.datetime.utcnow() - 676 if self.token_expiry > now: - 677 time_delta = self.token_expiry - now - 678 # TODO(orestica): return time_delta.total_seconds() - 679 # once dropping support for Python 2.6 - 680 return time_delta.days * 86400 + time_delta.seconds - 681 else: - 682 return 0 -
683 -
684 - def _updateFromCredential(self, other): -
685 """Update this Credential from another instance.""" - 686 self.__dict__.update(other.__getstate__()) -
687 -
688 - def __getstate__(self): -
689 """Trim the state down to something that can be pickled.""" - 690 d = copy.copy(self.__dict__) - 691 del d['store'] - 692 return d -
693 -
694 - def __setstate__(self, state): -
695 """Reconstitute the state of the object from being pickled.""" - 696 self.__dict__.update(state) - 697 self.store = None -
698 -
700 """Generate the body that will be used in the refresh request.""" - 701 body = urllib.parse.urlencode({ - 702 'grant_type': 'refresh_token', - 703 'client_id': self.client_id, - 704 'client_secret': self.client_secret, - 705 'refresh_token': self.refresh_token, - 706 }) - 707 return body -
708 -
710 """Generate the headers that will be used in the refresh request.""" - 711 headers = { - 712 'content-type': 'application/x-www-form-urlencoded', - 713 } - 714 - 715 if self.user_agent is not None: - 716 headers['user-agent'] = self.user_agent - 717 - 718 return headers -
719 -
720 - def _refresh(self, http_request): -
721 """Refreshes the access_token. - 722 - 723 This method first checks by reading the Storage object if available. - 724 If a refresh is still needed, it holds the Storage lock until the - 725 refresh is completed. - 726 - 727 Args: - 728 http_request: callable, a callable that matches the method signature of - 729 httplib2.Http.request, used to make the refresh request. - 730 - 731 Raises: - 732 AccessTokenRefreshError: When the refresh fails. - 733 """ - 734 if not self.store: - 735 self._do_refresh_request(http_request) - 736 else: - 737 self.store.acquire_lock() - 738 try: - 739 new_cred = self.store.locked_get() - 740 if (new_cred and not new_cred.invalid and - 741 new_cred.access_token != self.access_token): - 742 logger.info('Updated access_token read from Storage') - 743 self._updateFromCredential(new_cred) - 744 else: - 745 self._do_refresh_request(http_request) - 746 finally: - 747 self.store.release_lock() -
748 -
749 - def _do_refresh_request(self, http_request): -
750 """Refresh the access_token using the refresh_token. - 751 - 752 Args: - 753 http_request: callable, a callable that matches the method signature of - 754 httplib2.Http.request, used to make the refresh request. - 755 - 756 Raises: - 757 AccessTokenRefreshError: When the refresh fails. - 758 """ - 759 body = self._generate_refresh_request_body() - 760 headers = self._generate_refresh_request_headers() - 761 - 762 logger.info('Refreshing access_token') - 763 resp, content = http_request( - 764 self.token_uri, method='POST', body=body, headers=headers) - 765 if six.PY3 and isinstance(content, bytes): - 766 content = content.decode('utf-8') - 767 if resp.status == 200: - 768 d = json.loads(content) - 769 self.token_response = d - 770 self.access_token = d['access_token'] - 771 self.refresh_token = d.get('refresh_token', self.refresh_token) - 772 if 'expires_in' in d: - 773 self.token_expiry = datetime.timedelta( - 774 seconds=int(d['expires_in'])) + datetime.datetime.utcnow() - 775 else: - 776 self.token_expiry = None - 777 # On temporary refresh errors, the user does not actually have to - 778 # re-authorize, so we unflag here. - 779 self.invalid = False - 780 if self.store: - 781 self.store.locked_put(self) - 782 else: - 783 # An {'error':...} response body means the token is expired or revoked, - 784 # so we flag the credentials as such. - 785 logger.info('Failed to retrieve access token: %s', content) - 786 error_msg = 'Invalid response %s.' % resp['status'] - 787 try: - 788 d = json.loads(content) - 789 if 'error' in d: - 790 error_msg = d['error'] - 791 if 'error_description' in d: - 792 error_msg += ': ' + d['error_description'] - 793 self.invalid = True - 794 if self.store: - 795 self.store.locked_put(self) - 796 except (TypeError, ValueError): - 797 pass - 798 raise AccessTokenRefreshError(error_msg) -
799 -
800 - def _revoke(self, http_request): -
801 """Revokes the refresh_token and deletes the store if available. - 802 - 803 Args: - 804 http_request: callable, a callable that matches the method signature of - 805 httplib2.Http.request, used to make the revoke request. - 806 """ - 807 self._do_revoke(http_request, self.refresh_token) -
808 -
809 - def _do_revoke(self, http_request, token): -
810 """Revokes the credentials and deletes the store if available. - 811 - 812 Args: - 813 http_request: callable, a callable that matches the method signature of - 814 httplib2.Http.request, used to make the refresh request. - 815 token: A string used as the token to be revoked. Can be either an - 816 access_token or refresh_token. - 817 - 818 Raises: - 819 TokenRevokeError: If the revoke request does not return with a 200 OK. - 820 """ - 821 logger.info('Revoking token') - 822 query_params = {'token': token} - 823 token_revoke_uri = _update_query_params(self.revoke_uri, query_params) - 824 resp, content = http_request(token_revoke_uri) - 825 if resp.status == 200: - 826 self.invalid = True - 827 else: - 828 error_msg = 'Invalid response %s.' % resp.status - 829 try: - 830 d = json.loads(content) - 831 if 'error' in d: - 832 error_msg = d['error'] - 833 except (TypeError, ValueError): - 834 pass - 835 raise TokenRevokeError(error_msg) - 836 - 837 if self.store: - 838 self.store.delete() -
839 -
840 - 841 -class AccessTokenCredentials(OAuth2Credentials): -
842 """Credentials object for OAuth 2.0. - 843 - 844 Credentials can be applied to an httplib2.Http object using the - 845 authorize() method, which then signs each request from that object - 846 with the OAuth 2.0 access token. This set of credentials is for the - 847 use case where you have acquired an OAuth 2.0 access_token from - 848 another place such as a JavaScript client or another web - 849 application, and wish to use it from Python. Because only the - 850 access_token is present it can not be refreshed and will in time - 851 expire. - 852 - 853 AccessTokenCredentials objects may be safely pickled and unpickled. - 854 - 855 Usage: - 856 credentials = AccessTokenCredentials('<an access token>', - 857 'my-user-agent/1.0') - 858 http = httplib2.Http() - 859 http = credentials.authorize(http) - 860 - 861 Exceptions: - 862 AccessTokenCredentialsExpired: raised when the access_token expires or is - 863 revoked. - 864 """ - 865 -
866 - def __init__(self, access_token, user_agent, revoke_uri=None): -
867 """Create an instance of OAuth2Credentials - 868 - 869 This is one of the few types if Credentials that you should contrust, - 870 Credentials objects are usually instantiated by a Flow. - 871 - 872 Args: - 873 access_token: string, access token. - 874 user_agent: string, The HTTP User-Agent to provide for this application. - 875 revoke_uri: string, URI for revoke endpoint. Defaults to None; a token - 876 can't be revoked if this is None. - 877 """ - 878 super(AccessTokenCredentials, self).__init__( - 879 access_token, - 880 None, - 881 None, - 882 None, - 883 None, - 884 None, - 885 user_agent, - 886 revoke_uri=revoke_uri) -
887 - 888 - 889 @classmethod -
890 - def from_json(cls, s): -
891 if six.PY3 and isinstance(s, bytes): - 892 s = s.decode('utf-8') - 893 data = json.loads(s) - 894 retval = AccessTokenCredentials( - 895 data['access_token'], - 896 data['user_agent']) - 897 return retval -
898 -
899 - def _refresh(self, http_request): -
900 raise AccessTokenCredentialsError( - 901 'The access_token is expired or invalid and can\'t be refreshed.') -
902 -
903 - def _revoke(self, http_request): -
904 """Revokes the access_token and deletes the store if available. - 905 - 906 Args: - 907 http_request: callable, a callable that matches the method signature of - 908 httplib2.Http.request, used to make the revoke request. - 909 """ - 910 self._do_revoke(http_request, self.access_token) -
911 - 912 - 913 _env_name = None -
914 - 915 - 916 -def _get_environment(urlopen=None): -
917 """Detect the environment the code is being run on.""" - 918 - 919 global _env_name - 920 - 921 if _env_name: - 922 return _env_name - 923 - 924 server_software = os.environ.get('SERVER_SOFTWARE', '') - 925 if server_software.startswith('Google App Engine/'): - 926 _env_name = 'GAE_PRODUCTION' - 927 elif server_software.startswith('Development/'): - 928 _env_name = 'GAE_LOCAL' - 929 else: - 930 try: - 931 if urlopen is None: - 932 urlopen = urllib.request.urlopen - 933 response = urlopen('http://metadata.google.internal') - 934 if any('Metadata-Flavor: Google' in h for h in response.info().headers): - 935 _env_name = 'GCE_PRODUCTION' - 936 else: - 937 _env_name = 'UNKNOWN' - 938 except urllib.error.URLError: - 939 _env_name = 'UNKNOWN' - 940 - 941 return _env_name -
942 -
943 - 944 -class GoogleCredentials(OAuth2Credentials): -
945 """Application Default Credentials for use in calling Google APIs. - 946 - 947 The Application Default Credentials are being constructed as a function of - 948 the environment where the code is being run. - 949 More details can be found on this page: - 950 https://developers.google.com/accounts/docs/application-default-credentials - 951 - 952 Here is an example of how to use the Application Default Credentials for a - 953 service that requires authentication: - 954 - 955 <code> - 956 from __future__ import print_function # unnecessary in python3 - 957 from googleapiclient.discovery import build - 958 from oauth2client.client import GoogleCredentials - 959 - 960 PROJECT = 'bamboo-machine-422' # replace this with one of your projects - 961 ZONE = 'us-central1-a' # replace this with the zone you care about - 962 - 963 credentials = GoogleCredentials.get_application_default() - 964 service = build('compute', 'v1', credentials=credentials) - 965 - 966 request = service.instances().list(project=PROJECT, zone=ZONE) - 967 response = request.execute() - 968 - 969 print(response) - 970 </code> - 971 - 972 A service that does not require authentication does not need credentials - 973 to be passed in: - 974 - 975 <code> - 976 from googleapiclient.discovery import build - 977 - 978 service = build('discovery', 'v1') - 979 - 980 request = service.apis().list() - 981 response = request.execute() - 982 - 983 print(response) - 984 </code> - 985 """ - 986 -
987 - def __init__(self, access_token, client_id, client_secret, refresh_token, - 988 token_expiry, token_uri, user_agent, - 989 revoke_uri=GOOGLE_REVOKE_URI): -
990 """Create an instance of GoogleCredentials. - 991 - 992 This constructor is not usually called by the user, instead - 993 GoogleCredentials objects are instantiated by - 994 GoogleCredentials.from_stream() or - 995 GoogleCredentials.get_application_default(). - 996 - 997 Args: - 998 access_token: string, access token. - 999 client_id: string, client identifier. -1000 client_secret: string, client secret. -1001 refresh_token: string, refresh token. -1002 token_expiry: datetime, when the access_token expires. -1003 token_uri: string, URI of token endpoint. -1004 user_agent: string, The HTTP User-Agent to provide for this application. -1005 revoke_uri: string, URI for revoke endpoint. -1006 Defaults to GOOGLE_REVOKE_URI; a token can't be revoked if this is None. -1007 """ -1008 super(GoogleCredentials, self).__init__( -1009 access_token, client_id, client_secret, refresh_token, token_expiry, -1010 token_uri, user_agent, revoke_uri=revoke_uri) -
1011 -
1012 - def create_scoped_required(self): -
1013 """Whether this Credentials object is scopeless. -1014 -1015 create_scoped(scopes) method needs to be called in order to create -1016 a Credentials object for API calls. -1017 """ -1018 return False -
1019 -
1020 - def create_scoped(self, scopes): -
1021 """Create a Credentials object for the given scopes. -1022 -1023 The Credentials type is preserved. -1024 """ -1025 return self -
1026 -1027 @property -
1028 - def serialization_data(self): -
1029 """Get the fields and their values identifying the current credentials.""" -1030 return { -1031 'type': 'authorized_user', -1032 'client_id': self.client_id, -1033 'client_secret': self.client_secret, -1034 'refresh_token': self.refresh_token -1035 } -
1036 -1037 @staticmethod -
1039 """Get the Application Default Credentials for the current environment. -1040 -1041 Exceptions: -1042 ApplicationDefaultCredentialsError: raised when the credentials fail -1043 to be retrieved. -1044 """ -1045 -1046 env_name = _get_environment() -1047 -1048 if env_name in ('GAE_PRODUCTION', 'GAE_LOCAL'): -1049 # if we are running inside Google App Engine -1050 # there is no need to look for credentials in local files -1051 application_default_credential_filename = None -1052 well_known_file = None -1053 else: -1054 application_default_credential_filename = _get_environment_variable_file() -1055 well_known_file = _get_well_known_file() -1056 if not os.path.isfile(well_known_file): -1057 well_known_file = None -1058 -1059 if application_default_credential_filename: -1060 try: -1061 return _get_application_default_credential_from_file( -1062 application_default_credential_filename) -1063 except (ApplicationDefaultCredentialsError, ValueError) as error: -1064 extra_help = (' (pointed to by ' + GOOGLE_APPLICATION_CREDENTIALS + -1065 ' environment variable)') -1066 _raise_exception_for_reading_json( -1067 application_default_credential_filename, extra_help, error) -1068 elif well_known_file: -1069 try: -1070 return _get_application_default_credential_from_file(well_known_file) -1071 except (ApplicationDefaultCredentialsError, ValueError) as error: -1072 extra_help = (' (produced automatically when running' -1073 ' "gcloud auth login" command)') -1074 _raise_exception_for_reading_json(well_known_file, extra_help, error) -1075 elif env_name in ('GAE_PRODUCTION', 'GAE_LOCAL'): -1076 return _get_application_default_credential_GAE() -1077 elif env_name == 'GCE_PRODUCTION': -1078 return _get_application_default_credential_GCE() -1079 else: -1080 raise ApplicationDefaultCredentialsError(ADC_HELP_MSG) -
1081 -1082 @staticmethod -
1083 - def from_stream(credential_filename): -
1084 """Create a Credentials object by reading the information from a given file. -1085 -1086 It returns an object of type GoogleCredentials. -1087 -1088 Args: -1089 credential_filename: the path to the file from where the credentials -1090 are to be read -1091 -1092 Exceptions: -1093 ApplicationDefaultCredentialsError: raised when the credentials fail -1094 to be retrieved. -1095 """ -1096 -1097 if credential_filename and os.path.isfile(credential_filename): -1098 try: -1099 return _get_application_default_credential_from_file( -1100 credential_filename) -1101 except (ApplicationDefaultCredentialsError, ValueError) as error: -1102 extra_help = ' (provided as parameter to the from_stream() method)' -1103 _raise_exception_for_reading_json(credential_filename, -1104 extra_help, -1105 error) -1106 else: -1107 raise ApplicationDefaultCredentialsError( -1108 'The parameter passed to the from_stream() ' -1109 'method should point to a file.') -
1110 -
1111 -1112 -def save_to_well_known_file(credentials, well_known_file=None): -
1113 """Save the provided GoogleCredentials to the well known file. -1114 -1115 Args: -1116 credentials: -1117 the credentials to be saved to the well known file; -1118 it should be an instance of GoogleCredentials -1119 well_known_file: -1120 the name of the file where the credentials are to be saved; -1121 this parameter is supposed to be used for testing only -1122 """ -1123 # TODO(orestica): move this method to tools.py -1124 # once the argparse import gets fixed (it is not present in Python 2.6) -1125 -1126 if well_known_file is None: -1127 well_known_file = _get_well_known_file() -1128 -1129 credentials_data = credentials.serialization_data -1130 -1131 with open(well_known_file, 'w') as f: -1132 json.dump(credentials_data, f, sort_keys=True, indent=2, separators=(',', ': ')) -
1133 -
1136 application_default_credential_filename = ( -1137 os.environ.get(GOOGLE_APPLICATION_CREDENTIALS, -1138 None)) -1139 -1140 if application_default_credential_filename: -1141 if os.path.isfile(application_default_credential_filename): -1142 return application_default_credential_filename -1143 else: -1144 raise ApplicationDefaultCredentialsError( -1145 'File ' + application_default_credential_filename + ' (pointed by ' + -1146 GOOGLE_APPLICATION_CREDENTIALS + -1147 ' environment variable) does not exist!') -
1148 -
1149 -1150 -def _get_well_known_file(): -
1151 """Get the well known file produced by command 'gcloud auth login'.""" -1152 # TODO(orestica): Revisit this method once gcloud provides a better way -1153 # of pinpointing the exact location of the file. -1154 -1155 WELL_KNOWN_CREDENTIALS_FILE = 'application_default_credentials.json' -1156 CLOUDSDK_CONFIG_DIRECTORY = 'gcloud' -1157 -1158 if os.name == 'nt': -1159 try: -1160 default_config_path = os.path.join(os.environ['APPDATA'], -1161 CLOUDSDK_CONFIG_DIRECTORY) -1162 except KeyError: -1163 # This should never happen unless someone is really messing with things. -1164 drive = os.environ.get('SystemDrive', 'C:') -1165 default_config_path = os.path.join(drive, '\\', CLOUDSDK_CONFIG_DIRECTORY) -1166 else: -1167 default_config_path = os.path.join(os.path.expanduser('~'), -1168 '.config', -1169 CLOUDSDK_CONFIG_DIRECTORY) -1170 -1171 default_config_path = os.path.join(default_config_path, -1172 WELL_KNOWN_CREDENTIALS_FILE) -1173 -1174 return default_config_path -
1175 -
1176 -1177 -def _get_application_default_credential_from_file( -1178 application_default_credential_filename): -
1179 """Build the Application Default Credentials from file.""" -1180 -1181 from oauth2client import service_account -1182 -1183 # read the credentials from the file -1184 with open(application_default_credential_filename) as ( -1185 application_default_credential): -1186 client_credentials = json.load(application_default_credential) -1187 -1188 credentials_type = client_credentials.get('type') -1189 if credentials_type == AUTHORIZED_USER: -1190 required_fields = set(['client_id', 'client_secret', 'refresh_token']) -1191 elif credentials_type == SERVICE_ACCOUNT: -1192 required_fields = set(['client_id', 'client_email', 'private_key_id', -1193 'private_key']) -1194 else: -1195 raise ApplicationDefaultCredentialsError( -1196 "'type' field should be defined (and have one of the '" + -1197 AUTHORIZED_USER + "' or '" + SERVICE_ACCOUNT + "' values)") -1198 -1199 missing_fields = required_fields.difference(client_credentials.keys()) -1200 -1201 if missing_fields: -1202 _raise_exception_for_missing_fields(missing_fields) -1203 -1204 if client_credentials['type'] == AUTHORIZED_USER: -1205 return GoogleCredentials( -1206 access_token=None, -1207 client_id=client_credentials['client_id'], -1208 client_secret=client_credentials['client_secret'], -1209 refresh_token=client_credentials['refresh_token'], -1210 token_expiry=None, -1211 token_uri=GOOGLE_TOKEN_URI, -1212 user_agent='Python client library') -1213 else: # client_credentials['type'] == SERVICE_ACCOUNT -1214 return service_account._ServiceAccountCredentials( -1215 service_account_id=client_credentials['client_id'], -1216 service_account_email=client_credentials['client_email'], -1217 private_key_id=client_credentials['private_key_id'], -1218 private_key_pkcs8_text=client_credentials['private_key'], -1219 scopes=[]) -
1220 -
1221 -1222 -def _raise_exception_for_missing_fields(missing_fields): -
1223 raise ApplicationDefaultCredentialsError( -1224 'The following field(s) must be defined: ' + ', '.join(missing_fields)) -
1225 -
1226 -1227 -def _raise_exception_for_reading_json(credential_file, -1228 extra_help, -1229 error): -
1230 raise ApplicationDefaultCredentialsError( -1231 'An error was encountered while reading json file: '+ -1232 credential_file + extra_help + ': ' + str(error)) -
1233 -
1236 from oauth2client.appengine import AppAssertionCredentials -1237 -1238 return AppAssertionCredentials([]) -
1239 -
1242 from oauth2client.gce import AppAssertionCredentials -1243 -1244 return AppAssertionCredentials([]) -
1245 -
1246 -1247 -class AssertionCredentials(GoogleCredentials): -
1248 """Abstract Credentials object used for OAuth 2.0 assertion grants. -1249 -1250 This credential does not require a flow to instantiate because it -1251 represents a two legged flow, and therefore has all of the required -1252 information to generate and refresh its own access tokens. It must -1253 be subclassed to generate the appropriate assertion string. -1254 -1255 AssertionCredentials objects may be safely pickled and unpickled. -1256 """ -1257 -1258 @util.positional(2) -
1259 - def __init__(self, assertion_type, user_agent=None, -1260 token_uri=GOOGLE_TOKEN_URI, -1261 revoke_uri=GOOGLE_REVOKE_URI, -1262 **unused_kwargs): -
1263 """Constructor for AssertionFlowCredentials. -1264 -1265 Args: -1266 assertion_type: string, assertion type that will be declared to the auth -1267 server -1268 user_agent: string, The HTTP User-Agent to provide for this application. -1269 token_uri: string, URI for token endpoint. For convenience -1270 defaults to Google's endpoints but any OAuth 2.0 provider can be used. -1271 revoke_uri: string, URI for revoke endpoint. -1272 """ -1273 super(AssertionCredentials, self).__init__( -1274 None, -1275 None, -1276 None, -1277 None, -1278 None, -1279 token_uri, -1280 user_agent, -1281 revoke_uri=revoke_uri) -1282 self.assertion_type = assertion_type -
1283 -
1285 assertion = self._generate_assertion() -1286 -1287 body = urllib.parse.urlencode({ -1288 'assertion': assertion, -1289 'grant_type': 'urn:ietf:params:oauth:grant-type:jwt-bearer', -1290 }) -1291 -1292 return body -
1293 -
1294 - def _generate_assertion(self): -
1295 """Generate the assertion string that will be used in the access token -1296 request. -1297 """ -1298 _abstract() -
1299 -
1300 - def _revoke(self, http_request): -
1301 """Revokes the access_token and deletes the store if available. -1302 -1303 Args: -1304 http_request: callable, a callable that matches the method signature of -1305 httplib2.Http.request, used to make the revoke request. -1306 """ -1307 self._do_revoke(http_request, self.access_token) -
1308 -
1309 -1310 -def _RequireCryptoOrDie(): -
1311 """Ensure we have a crypto library, or throw CryptoUnavailableError. -1312 -1313 The oauth2client.crypt module requires either PyCrypto or PyOpenSSL -1314 to be available in order to function, but these are optional -1315 dependencies. -1316 """ -1317 if not HAS_CRYPTO: -1318 raise CryptoUnavailableError('No crypto library available') -
1319 -
1320 -1321 -class SignedJwtAssertionCredentials(AssertionCredentials): -
1322 """Credentials object used for OAuth 2.0 Signed JWT assertion grants. -1323 -1324 This credential does not require a flow to instantiate because it -1325 represents a two legged flow, and therefore has all of the required -1326 information to generate and refresh its own access tokens. -1327 -1328 SignedJwtAssertionCredentials requires either PyOpenSSL, or PyCrypto -1329 2.6 or later. For App Engine you may also consider using -1330 AppAssertionCredentials. -1331 """ -1332 -1333 MAX_TOKEN_LIFETIME_SECS = 3600 # 1 hour in seconds -1334 -1335 @util.positional(4) -
1336 - def __init__(self, -1337 service_account_name, -1338 private_key, -1339 scope, -1340 private_key_password='notasecret', -1341 user_agent=None, -1342 token_uri=GOOGLE_TOKEN_URI, -1343 revoke_uri=GOOGLE_REVOKE_URI, -1344 **kwargs): -
1345 """Constructor for SignedJwtAssertionCredentials. -1346 -1347 Args: -1348 service_account_name: string, id for account, usually an email address. -1349 private_key: string, private key in PKCS12 or PEM format. -1350 scope: string or iterable of strings, scope(s) of the credentials being -1351 requested. -1352 private_key_password: string, password for private_key, unused if -1353 private_key is in PEM format. -1354 user_agent: string, HTTP User-Agent to provide for this application. -1355 token_uri: string, URI for token endpoint. For convenience -1356 defaults to Google's endpoints but any OAuth 2.0 provider can be used. -1357 revoke_uri: string, URI for revoke endpoint. -1358 kwargs: kwargs, Additional parameters to add to the JWT token, for -1359 example sub=joe@xample.org. -1360 -1361 Raises: -1362 CryptoUnavailableError if no crypto library is available. -1363 """ -1364 _RequireCryptoOrDie() -1365 super(SignedJwtAssertionCredentials, self).__init__( -1366 None, -1367 user_agent=user_agent, -1368 token_uri=token_uri, -1369 revoke_uri=revoke_uri, -1370 ) -1371 -1372 self.scope = util.scopes_to_string(scope) -1373 -1374 # Keep base64 encoded so it can be stored in JSON. -1375 self.private_key = base64.b64encode(private_key) -1376 if isinstance(self.private_key, six.text_type): -1377 self.private_key = self.private_key.encode('utf-8') -1378 -1379 self.private_key_password = private_key_password -1380 self.service_account_name = service_account_name -1381 self.kwargs = kwargs -
1382 -1383 @classmethod -
1384 - def from_json(cls, s): -
1385 data = json.loads(s) -1386 retval = SignedJwtAssertionCredentials( -1387 data['service_account_name'], -1388 base64.b64decode(data['private_key']), -1389 data['scope'], -1390 private_key_password=data['private_key_password'], -1391 user_agent=data['user_agent'], -1392 token_uri=data['token_uri'], -1393 **data['kwargs'] -1394 ) -1395 retval.invalid = data['invalid'] -1396 retval.access_token = data['access_token'] -1397 return retval -
1398 -
1399 - def _generate_assertion(self): -
1400 """Generate the assertion that will be used in the request.""" -1401 now = int(time.time()) -1402 payload = { -1403 'aud': self.token_uri, -1404 'scope': self.scope, -1405 'iat': now, -1406 'exp': now + SignedJwtAssertionCredentials.MAX_TOKEN_LIFETIME_SECS, -1407 'iss': self.service_account_name -1408 } -1409 payload.update(self.kwargs) -1410 logger.debug(str(payload)) -1411 -1412 private_key = base64.b64decode(self.private_key) -1413 return crypt.make_signed_jwt(crypt.Signer.from_string( -1414 private_key, self.private_key_password), payload) -
1415 -1416 # Only used in verify_id_token(), which is always calling to the same URI -1417 # for the certs. -1418 _cached_http = httplib2.Http(MemoryCache()) -
1419 -1420 @util.positional(2) -1421 -def verify_id_token(id_token, audience, http=None, -1422 cert_uri=ID_TOKEN_VERIFICATION_CERTS): -
1423 """Verifies a signed JWT id_token. -1424 -1425 This function requires PyOpenSSL and because of that it does not work on -1426 App Engine. -1427 -1428 Args: -1429 id_token: string, A Signed JWT. -1430 audience: string, The audience 'aud' that the token should be for. -1431 http: httplib2.Http, instance to use to make the HTTP request. Callers -1432 should supply an instance that has caching enabled. -1433 cert_uri: string, URI of the certificates in JSON format to -1434 verify the JWT against. -1435 -1436 Returns: -1437 The deserialized JSON in the JWT. -1438 -1439 Raises: -1440 oauth2client.crypt.AppIdentityError: if the JWT fails to verify. -1441 CryptoUnavailableError: if no crypto library is available. -1442 """ -1443 _RequireCryptoOrDie() -1444 if http is None: -1445 http = _cached_http -1446 -1447 resp, content = http.request(cert_uri) -1448 -1449 if resp.status == 200: -1450 certs = json.loads(content.decode('utf-8')) -1451 return crypt.verify_signed_jwt_with_certs(id_token, certs, audience) -1452 else: -1453 raise VerifyJwtTokenError('Status code: %d' % resp.status) -
1454 -
1455 -1456 -def _urlsafe_b64decode(b64string): -
1457 # Guard against unicode strings, which base64 can't handle. -1458 if isinstance(b64string, six.text_type): -1459 b64string = b64string.encode('ascii') -1460 padded = b64string + b'=' * (4 - len(b64string) % 4) -1461 return base64.urlsafe_b64decode(padded) -
1462 -
1463 -1464 -def _extract_id_token(id_token): -
1465 """Extract the JSON payload from a JWT. -1466 -1467 Does the extraction w/o checking the signature. -1468 -1469 Args: -1470 id_token: string, OAuth 2.0 id_token. -1471 -1472 Returns: -1473 object, The deserialized JSON payload. -1474 """ -1475 segments = id_token.split('.') -1476 -1477 if len(segments) != 3: -1478 raise VerifyJwtTokenError( -1479 'Wrong number of segments in token: %s' % id_token) -1480 -1481 return json.loads(_urlsafe_b64decode(segments[1]).decode('utf-8')) -
1482 -
1483 -1484 -def _parse_exchange_token_response(content): -
1485 """Parses response of an exchange token request. -1486 -1487 Most providers return JSON but some (e.g. Facebook) return a -1488 url-encoded string. -1489 -1490 Args: -1491 content: The body of a response -1492 -1493 Returns: -1494 Content as a dictionary object. Note that the dict could be empty, -1495 i.e. {}. That basically indicates a failure. -1496 """ -1497 resp = {} -1498 try: -1499 resp = json.loads(content.decode('utf-8')) -1500 except Exception: -1501 # different JSON libs raise different exceptions, -1502 # so we just do a catch-all here -1503 resp = dict(urllib.parse.parse_qsl(content)) -1504 -1505 # some providers respond with 'expires', others with 'expires_in' -1506 if resp and 'expires' in resp: -1507 resp['expires_in'] = resp.pop('expires') -1508 -1509 return resp -
1510 -
1511 -1512 @util.positional(4) -1513 -def credentials_from_code(client_id, client_secret, scope, code, -1514 redirect_uri='postmessage', http=None, -1515 user_agent=None, token_uri=GOOGLE_TOKEN_URI, -1516 auth_uri=GOOGLE_AUTH_URI, -1517 revoke_uri=GOOGLE_REVOKE_URI, -1518 device_uri=GOOGLE_DEVICE_URI): -
1519 """Exchanges an authorization code for an OAuth2Credentials object. -1520 -1521 Args: -1522 client_id: string, client identifier. -1523 client_secret: string, client secret. -1524 scope: string or iterable of strings, scope(s) to request. -1525 code: string, An authroization code, most likely passed down from -1526 the client -1527 redirect_uri: string, this is generally set to 'postmessage' to match the -1528 redirect_uri that the client specified -1529 http: httplib2.Http, optional http instance to use to do the fetch -1530 token_uri: string, URI for token endpoint. For convenience -1531 defaults to Google's endpoints but any OAuth 2.0 provider can be used. -1532 auth_uri: string, URI for authorization endpoint. For convenience -1533 defaults to Google's endpoints but any OAuth 2.0 provider can be used. -1534 revoke_uri: string, URI for revoke endpoint. For convenience -1535 defaults to Google's endpoints but any OAuth 2.0 provider can be used. -1536 device_uri: string, URI for device authorization endpoint. For convenience -1537 defaults to Google's endpoints but any OAuth 2.0 provider can be used. -1538 -1539 Returns: -1540 An OAuth2Credentials object. -1541 -1542 Raises: -1543 FlowExchangeError if the authorization code cannot be exchanged for an -1544 access token -1545 """ -1546 flow = OAuth2WebServerFlow(client_id, client_secret, scope, -1547 redirect_uri=redirect_uri, user_agent=user_agent, -1548 auth_uri=auth_uri, token_uri=token_uri, -1549 revoke_uri=revoke_uri, device_uri=device_uri) -1550 -1551 credentials = flow.step2_exchange(code, http=http) -1552 return credentials -
1553 -
1554 -1555 @util.positional(3) -1556 -def credentials_from_clientsecrets_and_code(filename, scope, code, -1557 message = None, -1558 redirect_uri='postmessage', -1559 http=None, -1560 cache=None, -1561 device_uri=None): -
1562 """Returns OAuth2Credentials from a clientsecrets file and an auth code. -1563 -1564 Will create the right kind of Flow based on the contents of the clientsecrets -1565 file or will raise InvalidClientSecretsError for unknown types of Flows. -1566 -1567 Args: -1568 filename: string, File name of clientsecrets. -1569 scope: string or iterable of strings, scope(s) to request. -1570 code: string, An authorization code, most likely passed down from -1571 the client -1572 message: string, A friendly string to display to the user if the -1573 clientsecrets file is missing or invalid. If message is provided then -1574 sys.exit will be called in the case of an error. If message in not -1575 provided then clientsecrets.InvalidClientSecretsError will be raised. -1576 redirect_uri: string, this is generally set to 'postmessage' to match the -1577 redirect_uri that the client specified -1578 http: httplib2.Http, optional http instance to use to do the fetch -1579 cache: An optional cache service client that implements get() and set() -1580 methods. See clientsecrets.loadfile() for details. -1581 device_uri: string, OAuth 2.0 device authorization endpoint -1582 -1583 Returns: -1584 An OAuth2Credentials object. -1585 -1586 Raises: -1587 FlowExchangeError if the authorization code cannot be exchanged for an -1588 access token -1589 UnknownClientSecretsFlowError if the file describes an unknown kind of Flow. -1590 clientsecrets.InvalidClientSecretsError if the clientsecrets file is -1591 invalid. -1592 """ -1593 flow = flow_from_clientsecrets(filename, scope, message=message, cache=cache, -1594 redirect_uri=redirect_uri, -1595 device_uri=device_uri) -1596 credentials = flow.step2_exchange(code, http=http) -1597 return credentials -
1598 -
1599 -1600 -class DeviceFlowInfo(collections.namedtuple('DeviceFlowInfo', ( -1601 'device_code', 'user_code', 'interval', 'verification_url', -1602 'user_code_expiry'))): -
1603 """Intermediate information the OAuth2 for devices flow.""" -1604 -1605 @classmethod -
1606 - def FromResponse(cls, response): -
1607 """Create a DeviceFlowInfo from a server response. -1608 -1609 The response should be a dict containing entries as described -1610 here: -1611 http://tools.ietf.org/html/draft-ietf-oauth-v2-05#section-3.7.1 -1612 """ -1613 # device_code, user_code, and verification_url are required. -1614 kwargs = { -1615 'device_code': response['device_code'], -1616 'user_code': response['user_code'], -1617 } -1618 # The response may list the verification address as either -1619 # verification_url or verification_uri, so we check for both. -1620 verification_url = response.get( -1621 'verification_url', response.get('verification_uri')) -1622 if verification_url is None: -1623 raise OAuth2DeviceCodeError( -1624 'No verification_url provided in server response') -1625 kwargs['verification_url'] = verification_url -1626 # expires_in and interval are optional. -1627 kwargs.update({ -1628 'interval': response.get('interval'), -1629 'user_code_expiry': None, -1630 }) -1631 if 'expires_in' in response: -1632 kwargs['user_code_expiry'] = datetime.datetime.now() + datetime.timedelta( -1633 seconds=int(response['expires_in'])) -1634 -1635 return cls(**kwargs) -
1636 -
1637 -class OAuth2WebServerFlow(Flow): -
1638 """Does the Web Server Flow for OAuth 2.0. -1639 -1640 OAuth2WebServerFlow objects may be safely pickled and unpickled. -1641 """ -1642 -1643 @util.positional(4) -
1644 - def __init__(self, client_id, client_secret, scope, -1645 redirect_uri=None, -1646 user_agent=None, -1647 auth_uri=GOOGLE_AUTH_URI, -1648 token_uri=GOOGLE_TOKEN_URI, -1649 revoke_uri=GOOGLE_REVOKE_URI, -1650 login_hint=None, -1651 device_uri=GOOGLE_DEVICE_URI, -1652 **kwargs): -
1653 """Constructor for OAuth2WebServerFlow. -1654 -1655 The kwargs argument is used to set extra query parameters on the -1656 auth_uri. For example, the access_type and approval_prompt -1657 query parameters can be set via kwargs. -1658 -1659 Args: -1660 client_id: string, client identifier. -1661 client_secret: string client secret. -1662 scope: string or iterable of strings, scope(s) of the credentials being -1663 requested. -1664 redirect_uri: string, Either the string 'urn:ietf:wg:oauth:2.0:oob' for -1665 a non-web-based application, or a URI that handles the callback from -1666 the authorization server. -1667 user_agent: string, HTTP User-Agent to provide for this application. -1668 auth_uri: string, URI for authorization endpoint. For convenience -1669 defaults to Google's endpoints but any OAuth 2.0 provider can be used. -1670 token_uri: string, URI for token endpoint. For convenience -1671 defaults to Google's endpoints but any OAuth 2.0 provider can be used. -1672 revoke_uri: string, URI for revoke endpoint. For convenience -1673 defaults to Google's endpoints but any OAuth 2.0 provider can be used. -1674 login_hint: string, Either an email address or domain. Passing this hint -1675 will either pre-fill the email box on the sign-in form or select the -1676 proper multi-login session, thereby simplifying the login flow. -1677 device_uri: string, URI for device authorization endpoint. For convenience -1678 defaults to Google's endpoints but any OAuth 2.0 provider can be used. -1679 **kwargs: dict, The keyword arguments are all optional and required -1680 parameters for the OAuth calls. -1681 """ -1682 self.client_id = client_id -1683 self.client_secret = client_secret -1684 self.scope = util.scopes_to_string(scope) -1685 self.redirect_uri = redirect_uri -1686 self.login_hint = login_hint -1687 self.user_agent = user_agent -1688 self.auth_uri = auth_uri -1689 self.token_uri = token_uri -1690 self.revoke_uri = revoke_uri -1691 self.device_uri = device_uri -1692 self.params = { -1693 'access_type': 'offline', -1694 'response_type': 'code', -1695 } -1696 self.params.update(kwargs) -
1697 -1698 @util.positional(1) -
1699 - def step1_get_authorize_url(self, redirect_uri=None): -
1700 """Returns a URI to redirect to the provider. -1701 -1702 Args: -1703 redirect_uri: string, Either the string 'urn:ietf:wg:oauth:2.0:oob' for -1704 a non-web-based application, or a URI that handles the callback from -1705 the authorization server. This parameter is deprecated, please move to -1706 passing the redirect_uri in via the constructor. -1707 -1708 Returns: -1709 A URI as a string to redirect the user to begin the authorization flow. -1710 """ -1711 if redirect_uri is not None: -1712 logger.warning(( -1713 'The redirect_uri parameter for ' -1714 'OAuth2WebServerFlow.step1_get_authorize_url is deprecated. Please ' -1715 'move to passing the redirect_uri in via the constructor.')) -1716 self.redirect_uri = redirect_uri -1717 -1718 if self.redirect_uri is None: -1719 raise ValueError('The value of redirect_uri must not be None.') -1720 -1721 query_params = { -1722 'client_id': self.client_id, -1723 'redirect_uri': self.redirect_uri, -1724 'scope': self.scope, -1725 } -1726 if self.login_hint is not None: -1727 query_params['login_hint'] = self.login_hint -1728 query_params.update(self.params) -1729 return _update_query_params(self.auth_uri, query_params) -
1730 -1731 @util.positional(1) -
1732 - def step1_get_device_and_user_codes(self, http=None): -
1733 """Returns a user code and the verification URL where to enter it -1734 -1735 Returns: -1736 A user code as a string for the user to authorize the application -1737 An URL as a string where the user has to enter the code -1738 """ -1739 if self.device_uri is None: -1740 raise ValueError('The value of device_uri must not be None.') -1741 -1742 body = urllib.urlencode({ -1743 'client_id': self.client_id, -1744 'scope': self.scope, -1745 }) -1746 headers = { -1747 'content-type': 'application/x-www-form-urlencoded', -1748 } -1749 -1750 if self.user_agent is not None: -1751 headers['user-agent'] = self.user_agent -1752 -1753 if http is None: -1754 http = httplib2.Http() -1755 -1756 resp, content = http.request(self.device_uri, method='POST', body=body, -1757 headers=headers) -1758 if resp.status == 200: -1759 try: -1760 flow_info = json.loads(content) -1761 except ValueError as e: -1762 raise OAuth2DeviceCodeError( -1763 'Could not parse server response as JSON: "%s", error: "%s"' % ( -1764 content, e)) -1765 return DeviceFlowInfo.FromResponse(flow_info) -1766 else: -1767 error_msg = 'Invalid response %s.' % resp.status -1768 try: -1769 d = json.loads(content) -1770 if 'error' in d: -1771 error_msg += ' Error: %s' % d['error'] -1772 except ValueError: -1773 # Couldn't decode a JSON response, stick with the default message. -1774 pass -1775 raise OAuth2DeviceCodeError(error_msg) -
1776 -1777 @util.positional(2) -
1778 - def step2_exchange(self, code=None, http=None, device_flow_info=None): -
1779 """Exchanges a code for OAuth2Credentials. -1780 -1781 Args: -1782 -1783 code: string, a dict-like object, or None. For a non-device -1784 flow, this is either the response code as a string, or a -1785 dictionary of query parameters to the redirect_uri. For a -1786 device flow, this should be None. -1787 http: httplib2.Http, optional http instance to use when fetching -1788 credentials. -1789 device_flow_info: DeviceFlowInfo, return value from step1 in the -1790 case of a device flow. -1791 -1792 Returns: -1793 An OAuth2Credentials object that can be used to authorize requests. -1794 -1795 Raises: -1796 FlowExchangeError: if a problem occurred exchanging the code for a -1797 refresh_token. -1798 ValueError: if code and device_flow_info are both provided or both -1799 missing. -1800 -1801 """ -1802 if code is None and device_flow_info is None: -1803 raise ValueError('No code or device_flow_info provided.') -1804 if code is not None and device_flow_info is not None: -1805 raise ValueError('Cannot provide both code and device_flow_info.') -1806 -1807 if code is None: -1808 code = device_flow_info.device_code -1809 elif not isinstance(code, basestring): -1810 if 'code' not in code: -1811 raise FlowExchangeError(code.get( -1812 'error', 'No code was supplied in the query parameters.')) -1813 code = code['code'] -1814 -1815 post_data = { -1816 'client_id': self.client_id, -1817 'client_secret': self.client_secret, -1818 'code': code, -1819 'scope': self.scope, -1820 } -1821 if device_flow_info is not None: -1822 post_data['grant_type'] = 'http://oauth.net/grant_type/device/1.0' -1823 else: -1824 post_data['grant_type'] = 'authorization_code' -1825 post_data['redirect_uri'] = self.redirect_uri -1826 body = urllib.parse.urlencode(post_data) -1827 headers = { -1828 'content-type': 'application/x-www-form-urlencoded', -1829 } -1830 -1831 if self.user_agent is not None: -1832 headers['user-agent'] = self.user_agent -1833 -1834 if http is None: -1835 http = httplib2.Http() -1836 -1837 resp, content = http.request(self.token_uri, method='POST', body=body, -1838 headers=headers) -1839 d = _parse_exchange_token_response(content) -1840 if resp.status == 200 and 'access_token' in d: -1841 access_token = d['access_token'] -1842 refresh_token = d.get('refresh_token', None) -1843 if not refresh_token: -1844 logger.info( -1845 'Received token response with no refresh_token. Consider ' -1846 "reauthenticating with approval_prompt='force'.") -1847 token_expiry = None -1848 if 'expires_in' in d: -1849 token_expiry = datetime.datetime.utcnow() + datetime.timedelta( -1850 seconds=int(d['expires_in'])) -1851 -1852 extracted_id_token = None -1853 if 'id_token' in d: -1854 extracted_id_token = _extract_id_token(d['id_token']) -1855 -1856 logger.info('Successfully retrieved access token') -1857 return OAuth2Credentials(access_token, self.client_id, -1858 self.client_secret, refresh_token, token_expiry, -1859 self.token_uri, self.user_agent, -1860 revoke_uri=self.revoke_uri, -1861 id_token=extracted_id_token, -1862 token_response=d) -1863 else: -1864 logger.info('Failed to retrieve access token: %s', content) -1865 if 'error' in d: -1866 # you never know what those providers got to say -1867 error_msg = str(d['error']) -1868 else: -1869 error_msg = 'Invalid response: %s.' % str(resp.status) -1870 raise FlowExchangeError(error_msg) -
1871 -
1872 -1873 @util.positional(2) -1874 -def flow_from_clientsecrets(filename, scope, redirect_uri=None, -1875 message=None, cache=None, login_hint=None, -1876 device_uri=None): -
1877 """Create a Flow from a clientsecrets file. -1878 -1879 Will create the right kind of Flow based on the contents of the clientsecrets -1880 file or will raise InvalidClientSecretsError for unknown types of Flows. -1881 -1882 Args: -1883 filename: string, File name of client secrets. -1884 scope: string or iterable of strings, scope(s) to request. -1885 redirect_uri: string, Either the string 'urn:ietf:wg:oauth:2.0:oob' for -1886 a non-web-based application, or a URI that handles the callback from -1887 the authorization server. -1888 message: string, A friendly string to display to the user if the -1889 clientsecrets file is missing or invalid. If message is provided then -1890 sys.exit will be called in the case of an error. If message in not -1891 provided then clientsecrets.InvalidClientSecretsError will be raised. -1892 cache: An optional cache service client that implements get() and set() -1893 methods. See clientsecrets.loadfile() for details. -1894 login_hint: string, Either an email address or domain. Passing this hint -1895 will either pre-fill the email box on the sign-in form or select the -1896 proper multi-login session, thereby simplifying the login flow. -1897 device_uri: string, URI for device authorization endpoint. For convenience -1898 defaults to Google's endpoints but any OAuth 2.0 provider can be used. -1899 -1900 Returns: -1901 A Flow object. -1902 -1903 Raises: -1904 UnknownClientSecretsFlowError if the file describes an unknown kind of Flow. -1905 clientsecrets.InvalidClientSecretsError if the clientsecrets file is -1906 invalid. -1907 """ -1908 try: -1909 client_type, client_info = clientsecrets.loadfile(filename, cache=cache) -1910 if client_type in (clientsecrets.TYPE_WEB, clientsecrets.TYPE_INSTALLED): -1911 constructor_kwargs = { -1912 'redirect_uri': redirect_uri, -1913 'auth_uri': client_info['auth_uri'], -1914 'token_uri': client_info['token_uri'], -1915 'login_hint': login_hint, -1916 } -1917 revoke_uri = client_info.get('revoke_uri') -1918 if revoke_uri is not None: -1919 constructor_kwargs['revoke_uri'] = revoke_uri -1920 if device_uri is not None: -1921 constructor_kwargs['device_uri'] = device_uri -1922 return OAuth2WebServerFlow( -1923 client_info['client_id'], client_info['client_secret'], -1924 scope, **constructor_kwargs) -1925 -1926 except clientsecrets.InvalidClientSecretsError: -1927 if message: -1928 sys.exit(message) -1929 else: -1930 raise -1931 else: -1932 raise UnknownClientSecretsFlowError( -1933 'This OAuth 2.0 flow is unsupported: %r' % client_type) -
1934 -
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.client.AccessTokenCredentials-class.html b/docs/epy/oauth2client.client.AccessTokenCredentials-class.html deleted file mode 100644 index e05cf83..0000000 --- a/docs/epy/oauth2client.client.AccessTokenCredentials-class.html +++ /dev/null @@ -1,523 +0,0 @@ - - - - - oauth2client.client.AccessTokenCredentials - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module client :: - Class AccessTokenCredentials - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class AccessTokenCredentials

source code

-
-
- - - - - - - - - - - - - - - - - - - -
-
-
-
-Credentials object for OAuth 2.0.
-
-Credentials can be applied to an httplib2.Http object using the
-authorize() method, which then signs each request from that object
-with the OAuth 2.0 access token. This set of credentials is for the
-use case where you have acquired an OAuth 2.0 access_token from
-another place such as a JavaScript client or another web
-application, and wish to use it from Python. Because only the
-access_token is present it can not be refreshed and will in time
-expire.
-
-AccessTokenCredentials objects may be safely pickled and unpickled.
-
-Usage:
-  credentials = AccessTokenCredentials('<an access token>',
-    'my-user-agent/1.0')
-  http = httplib2.Http()
-  http = credentials.authorize(http)
-
-Exceptions:
-  AccessTokenCredentialsExpired: raised when the access_token expires or is
-    revoked.
-
-
- - - - - - - - - - - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-   - - - - - - -
__init__(self, - access_token, - user_agent, - revoke_uri=None)
- Create an instance of OAuth2Credentials
- source code - -
- -
-   - - - - - - -
_refresh(self, - http_request)
- Refreshes the access_token.
- source code - -
- -
-   - - - - - - -
_revoke(self, - http_request)
- Revokes the access_token and deletes the store if available.
- source code - -
- -
-

Inherited from OAuth2Credentials: - __getstate__, - __setstate__, - access_token_expired, - apply, - authorize, - get_access_token, - refresh, - revoke, - set_store, - to_json -

- -

Inherited from Credentials (private): - _to_json -

-

Inherited from object: - __delattr__, - __format__, - __getattribute__, - __hash__, - __new__, - __reduce__, - __reduce_ex__, - __repr__, - __setattr__, - __sizeof__, - __str__, - __subclasshook__ -

-
- - - - - - - - - - - - -
- - - - - -
Class Methods[hide private]
-
-   - - - - - - -
from_json(cls, - s)
- Instantiate a Credentials object from a JSON description of it.
- source code - -
- -
-

Inherited from Credentials: - new_from_json -

-
- - - - - - - - - -
- - - - - -
Class Variables[hide private]
-
-

Inherited from Credentials: - NON_SERIALIZED_MEMBERS -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from object: - __class__ -

-
- - - - - - -
- - - - - -
Method Details[hide private]
-
- -
- -
- - -
-

__init__(self, - access_token, - user_agent, - revoke_uri=None) -
(Constructor) -

-
source code  -
- -
-Create an instance of OAuth2Credentials
-
-This is one of the few types if Credentials that you should contrust,
-Credentials objects are usually instantiated by a Flow.
-
-Args:
-  access_token: string, access token.
-  user_agent: string, The HTTP User-Agent to provide for this application.
-  revoke_uri: string, URI for revoke endpoint. Defaults to None; a token
-    can't be revoked if this is None.
-
-
-
-
Overrides: - object.__init__ -
-
-
-
- -
- -
- - -
-

from_json(cls, - s) -
Class Method -

-
source code  -
- -
-Instantiate a Credentials object from a JSON description of it. The JSON
-should have been produced by calling .to_json() on the object.
-
-Args:
-  data: dict, A deserialized JSON object.
-
-Returns:
-  An instance of a Credentials subclass.
-
-
-
-
Overrides: - Credentials.from_json -
(inherited documentation)
- -
-
-
- -
- -
- - -
-

_refresh(self, - http_request) -

-
source code  -
- -
-Refreshes the access_token.
-
-This method first checks by reading the Storage object if available.
-If a refresh is still needed, it holds the Storage lock until the
-refresh is completed.
-
-Args:
-  http_request: callable, a callable that matches the method signature of
-    httplib2.Http.request, used to make the refresh request.
-
-Raises:
-  AccessTokenRefreshError: When the refresh fails.
-
-
-
-
Overrides: - OAuth2Credentials._refresh -
(inherited documentation)
- -
-
-
- -
- -
- - -
-

_revoke(self, - http_request) -

-
source code  -
- -
-Revokes the access_token and deletes the store if available.
-
-Args:
-  http_request: callable, a callable that matches the method signature of
-    httplib2.Http.request, used to make the revoke request.
-
-
-
-
Overrides: - OAuth2Credentials._revoke -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.client.AccessTokenCredentialsError-class.html b/docs/epy/oauth2client.client.AccessTokenCredentialsError-class.html deleted file mode 100644 index 702c4ad..0000000 --- a/docs/epy/oauth2client.client.AccessTokenCredentialsError-class.html +++ /dev/null @@ -1,209 +0,0 @@ - - - - - oauth2client.client.AccessTokenCredentialsError - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module client :: - Class AccessTokenCredentialsError - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class AccessTokenCredentialsError

source code

-
-
- - - - - - - - - - - - - - - - - - - - -
-
-
-
-Having only the access_token means no refresh is possible.
-
-
- - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-

Inherited from exceptions.Exception: - __init__, - __new__ -

-

Inherited from exceptions.BaseException: - __delattr__, - __getattribute__, - __getitem__, - __getslice__, - __reduce__, - __repr__, - __setattr__, - __setstate__, - __str__, - __unicode__ -

-

Inherited from object: - __format__, - __hash__, - __reduce_ex__, - __sizeof__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from exceptions.BaseException: - args, - message -

-

Inherited from object: - __class__ -

-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.client.AccessTokenRefreshError-class.html b/docs/epy/oauth2client.client.AccessTokenRefreshError-class.html deleted file mode 100644 index 30d0422..0000000 --- a/docs/epy/oauth2client.client.AccessTokenRefreshError-class.html +++ /dev/null @@ -1,209 +0,0 @@ - - - - - oauth2client.client.AccessTokenRefreshError - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module client :: - Class AccessTokenRefreshError - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class AccessTokenRefreshError

source code

-
-
- - - - - - - - - - - - - - - - - - - - -
-
-
-
-Error trying to refresh an expired access token.
-
-
- - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-

Inherited from exceptions.Exception: - __init__, - __new__ -

-

Inherited from exceptions.BaseException: - __delattr__, - __getattribute__, - __getitem__, - __getslice__, - __reduce__, - __repr__, - __setattr__, - __setstate__, - __str__, - __unicode__ -

-

Inherited from object: - __format__, - __hash__, - __reduce_ex__, - __sizeof__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from exceptions.BaseException: - args, - message -

-

Inherited from object: - __class__ -

-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.client.ApplicationDefaultCredentialsError-class.html b/docs/epy/oauth2client.client.ApplicationDefaultCredentialsError-class.html deleted file mode 100644 index 78bca82..0000000 --- a/docs/epy/oauth2client.client.ApplicationDefaultCredentialsError-class.html +++ /dev/null @@ -1,209 +0,0 @@ - - - - - oauth2client.client.ApplicationDefaultCredentialsError - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module client :: - Class ApplicationDefaultCredentialsError - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class ApplicationDefaultCredentialsError

source code

-
-
- - - - - - - - - - - - - - - - - - - - -
-
-
-
-Error retrieving the Application Default Credentials.
-
-
- - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-

Inherited from exceptions.Exception: - __init__, - __new__ -

-

Inherited from exceptions.BaseException: - __delattr__, - __getattribute__, - __getitem__, - __getslice__, - __reduce__, - __repr__, - __setattr__, - __setstate__, - __str__, - __unicode__ -

-

Inherited from object: - __format__, - __hash__, - __reduce_ex__, - __sizeof__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from exceptions.BaseException: - args, - message -

-

Inherited from object: - __class__ -

-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.client.AssertionCredentials-class.html b/docs/epy/oauth2client.client.AssertionCredentials-class.html deleted file mode 100644 index 609cd68..0000000 --- a/docs/epy/oauth2client.client.AssertionCredentials-class.html +++ /dev/null @@ -1,508 +0,0 @@ - - - - - oauth2client.client.AssertionCredentials - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module client :: - Class AssertionCredentials - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class AssertionCredentials

source code

-
-
- - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-Abstract Credentials object used for OAuth 2.0 assertion grants.
-
-This credential does not require a flow to instantiate because it
-represents a two legged flow, and therefore has all of the required
-information to generate and refresh its own access tokens. It must
-be subclassed to generate the appropriate assertion string.
-
-AssertionCredentials objects may be safely pickled and unpickled.
-
-
- - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-   - - - - - - -
__init__(self, - assertion_type, - user_agent=None, - token_uri=GOOGLE_TOKEN_URI, - revoke_uri=GOOGLE_REVOKE_URI, - **unused_kwargs)
- Constructor for AssertionFlowCredentials.
- source code - -
- -
-   - - - - - - -
_generate_refresh_request_body(self)
- Generate the body that will be used in the refresh request.
- source code - -
- -
-   - - - - - - -
_generate_assertion(self)
- Generate the assertion string that will be used in the access token -request.
- source code - -
- -
-   - - - - - - -
_revoke(self, - http_request)
- Revokes the access_token and deletes the store if available.
- source code - -
- -
-

Inherited from GoogleCredentials: - create_scoped, - create_scoped_required, - serialization_data -

-

Inherited from OAuth2Credentials: - __getstate__, - __setstate__, - access_token_expired, - apply, - authorize, - get_access_token, - refresh, - revoke, - set_store, - to_json -

- -

Inherited from Credentials (private): - _to_json -

-

Inherited from object: - __delattr__, - __format__, - __getattribute__, - __hash__, - __new__, - __reduce__, - __reduce_ex__, - __repr__, - __setattr__, - __sizeof__, - __str__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Class Methods[hide private]
-
-

Inherited from OAuth2Credentials: - from_json -

-

Inherited from Credentials: - new_from_json -

-
- - - - - - - - - -
- - - - - -
Static Methods[hide private]
-
-

Inherited from GoogleCredentials: - from_stream, - get_application_default -

-
- - - - - - - - - -
- - - - - -
Class Variables[hide private]
-
-

Inherited from Credentials: - NON_SERIALIZED_MEMBERS -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from object: - __class__ -

-
- - - - - - -
- - - - - -
Method Details[hide private]
-
- -
- -
- - -
-

__init__(self, - assertion_type, - user_agent=None, - token_uri=GOOGLE_TOKEN_URI, - revoke_uri=GOOGLE_REVOKE_URI, - **unused_kwargs) -
(Constructor) -

-
source code  -
- -
-Constructor for AssertionFlowCredentials.
-
-Args:
-  assertion_type: string, assertion type that will be declared to the auth
-    server
-  user_agent: string, The HTTP User-Agent to provide for this application.
-  token_uri: string, URI for token endpoint. For convenience
-    defaults to Google's endpoints but any OAuth 2.0 provider can be used.
-  revoke_uri: string, URI for revoke endpoint.
-
-
-
-
Decorators:
-
    -
  • @util.positional(2)
  • -
-
Overrides: - object.__init__ -
-
-
-
- -
- -
- - -
-

_generate_refresh_request_body(self) -

-
source code  -
- -
-Generate the body that will be used in the refresh request.
-
-
-
-
Overrides: - OAuth2Credentials._generate_refresh_request_body -
(inherited documentation)
- -
-
-
- -
- -
- - -
-

_revoke(self, - http_request) -

-
source code  -
- -
-Revokes the access_token and deletes the store if available.
-
-Args:
-  http_request: callable, a callable that matches the method signature of
-    httplib2.Http.request, used to make the revoke request.
-
-
-
-
Overrides: - OAuth2Credentials._revoke -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.client.Credentials-class.html b/docs/epy/oauth2client.client.Credentials-class.html deleted file mode 100644 index 0be0f6c..0000000 --- a/docs/epy/oauth2client.client.Credentials-class.html +++ /dev/null @@ -1,631 +0,0 @@ - - - - - oauth2client.client.Credentials - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module client :: - Class Credentials - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class Credentials

source code

-
-
- - - - - - - - - - - -
-
-
-
-Base class for all Credentials objects.
-
-Subclasses must define an authorize() method that applies the credentials to
-an HTTP transport.
-
-Subclasses must also specify a classmethod named 'from_json' that takes a JSON
-string as input and returns an instantiated Credentials object.
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-   - - - - - - -
authorize(self, - http)
- Take an httplib2.Http instance (or equivalent) and authorizes it.
- source code - -
- -
-   - - - - - - -
refresh(self, - http)
- Forces a refresh of the access_token.
- source code - -
- -
-   - - - - - - -
revoke(self, - http)
- Revokes a refresh_token and makes the credentials void.
- source code - -
- -
-   - - - - - - -
apply(self, - headers)
- Add the authorization to the headers.
- source code - -
- -
-   - - - - - - -
_to_json(self, - strip)
- Utility function that creates JSON repr.
- source code - -
- -
-   - - - - - - -
to_json(self)
- Creating a JSON representation of an instance of Credentials.
- source code - -
- -
-

Inherited from object: - __delattr__, - __format__, - __getattribute__, - __hash__, - __init__, - __new__, - __reduce__, - __reduce_ex__, - __repr__, - __setattr__, - __sizeof__, - __str__, - __subclasshook__ -

-
- - - - - - - - - - - - -
- - - - - -
Class Methods[hide private]
-
-   - - - - - - -
new_from_json(cls, - s)
- Utility class method to instantiate a Credentials subclass from a JSON -representation produced by to_json().
- source code - -
- -
-   - - - - - - -
from_json(cls, - unused_data)
- Instantiate a Credentials object from a JSON description of it.
- source code - -
- -
- - - - - - - - - -
- - - - - -
Class Variables[hide private]
-
-   - - NON_SERIALIZED_MEMBERS = ['store'] -
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from object: - __class__ -

-
- - - - - - -
- - - - - -
Method Details[hide private]
-
- -
- -
- - -
-

authorize(self, - http) -

-
source code  -
- -
-Take an httplib2.Http instance (or equivalent) and authorizes it.
-
-Authorizes it for the set of credentials, usually by replacing
-http.request() with a method that adds in the appropriate headers and then
-delegates to the original Http.request() method.
-
-Args:
-  http: httplib2.Http, an http object to be used to make the refresh
-    request.
-
-
-
-
-
-
- -
- -
- - -
-

refresh(self, - http) -

-
source code  -
- -
-Forces a refresh of the access_token.
-
-Args:
-  http: httplib2.Http, an http object to be used to make the refresh
-    request.
-
-
-
-
-
-
- -
- -
- - -
-

revoke(self, - http) -

-
source code  -
- -
-Revokes a refresh_token and makes the credentials void.
-
-Args:
-  http: httplib2.Http, an http object to be used to make the revoke
-    request.
-
-
-
-
-
-
- -
- -
- - -
-

apply(self, - headers) -

-
source code  -
- -
-Add the authorization to the headers.
-
-Args:
-  headers: dict, the headers to add the Authorization header to.
-
-
-
-
-
-
- -
- -
- - -
-

_to_json(self, - strip) -

-
source code  -
- -
-Utility function that creates JSON repr. of a Credentials object.
-
-Args:
-  strip: array, An array of names of members to not include in the JSON.
-
-Returns:
-   string, a JSON representation of this instance, suitable to pass to
-   from_json().
-
-
-
-
-
-
- -
- -
- - -
-

to_json(self) -

-
source code  -
- -
-Creating a JSON representation of an instance of Credentials.
-
-Returns:
-   string, a JSON representation of this instance, suitable to pass to
-   from_json().
-
-
-
-
-
-
- -
- -
- - -
-

new_from_json(cls, - s) -
Class Method -

-
source code  -
- -
-Utility class method to instantiate a Credentials subclass from a JSON
-representation produced by to_json().
-
-Args:
-  s: string, JSON from to_json().
-
-Returns:
-  An instance of the subclass of Credentials that was serialized with
-  to_json().
-
-
-
-
-
-
- -
- -
- - -
-

from_json(cls, - unused_data) -
Class Method -

-
source code  -
- -
-Instantiate a Credentials object from a JSON description of it.
-
-The JSON should have been produced by calling .to_json() on the object.
-
-Args:
-  unused_data: dict, A deserialized JSON object.
-
-Returns:
-  An instance of a Credentials subclass.
-
-
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.client.CryptoUnavailableError-class.html b/docs/epy/oauth2client.client.CryptoUnavailableError-class.html deleted file mode 100644 index 4750ba7..0000000 --- a/docs/epy/oauth2client.client.CryptoUnavailableError-class.html +++ /dev/null @@ -1,212 +0,0 @@ - - - - - oauth2client.client.CryptoUnavailableError - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module client :: - Class CryptoUnavailableError - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class CryptoUnavailableError

source code

-
-
- - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-Raised when a crypto library is required, but none is available.
-
-
- - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-

Inherited from exceptions.NotImplementedError: - __init__, - __new__ -

-

Inherited from exceptions.BaseException: - __delattr__, - __getattribute__, - __getitem__, - __getslice__, - __reduce__, - __repr__, - __setattr__, - __setstate__, - __str__, - __unicode__ -

-

Inherited from object: - __format__, - __hash__, - __reduce_ex__, - __sizeof__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from exceptions.BaseException: - args, - message -

-

Inherited from object: - __class__ -

-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.client.DeviceFlowInfo-class.html b/docs/epy/oauth2client.client.DeviceFlowInfo-class.html deleted file mode 100644 index aa4ea86..0000000 --- a/docs/epy/oauth2client.client.DeviceFlowInfo-class.html +++ /dev/null @@ -1,193 +0,0 @@ - - - - - oauth2client.client.DeviceFlowInfo - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module client :: - Class DeviceFlowInfo - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class DeviceFlowInfo

source code

-
-Intermediate information the OAuth2 for devices flow.
-
-
- - - - - - - - - - -
- - - - - -
Class Methods[hide private]
-
-   - - - - - - -
FromResponse(cls, - response)
- Create a DeviceFlowInfo from a server response.
- source code - -
- -
- - - - - - -
- - - - - -
Method Details[hide private]
-
- -
- -
- - -
-

FromResponse(cls, - response) -
Class Method -

-
source code  -
- -
-Create a DeviceFlowInfo from a server response.
-
-The response should be a dict containing entries as described
-here:
-  http://tools.ietf.org/html/draft-ietf-oauth-v2-05#section-3.7.1
-
-
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.client.Error-class.html b/docs/epy/oauth2client.client.Error-class.html deleted file mode 100644 index 6629a1d..0000000 --- a/docs/epy/oauth2client.client.Error-class.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - oauth2client.client.Error - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module client :: - Class Error - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class Error

source code

-
-
- - - - - - - - - - - - - - - - - - - -
-
-
-
-Base error for this module.
-
-
- - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-

Inherited from exceptions.Exception: - __init__, - __new__ -

-

Inherited from exceptions.BaseException: - __delattr__, - __getattribute__, - __getitem__, - __getslice__, - __reduce__, - __repr__, - __setattr__, - __setstate__, - __str__, - __unicode__ -

-

Inherited from object: - __format__, - __hash__, - __reduce_ex__, - __sizeof__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from exceptions.BaseException: - args, - message -

-

Inherited from object: - __class__ -

-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.client.Flow-class.html b/docs/epy/oauth2client.client.Flow-class.html deleted file mode 100644 index 2a87c9d..0000000 --- a/docs/epy/oauth2client.client.Flow-class.html +++ /dev/null @@ -1,180 +0,0 @@ - - - - - oauth2client.client.Flow - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module client :: - Class Flow - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class Flow

source code

-
-
- - - -
-
-
-
-Base class for all Flow objects.
-
-
- - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-

Inherited from object: - __delattr__, - __format__, - __getattribute__, - __hash__, - __init__, - __new__, - __reduce__, - __reduce_ex__, - __repr__, - __setattr__, - __sizeof__, - __str__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from object: - __class__ -

-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.client.FlowExchangeError-class.html b/docs/epy/oauth2client.client.FlowExchangeError-class.html deleted file mode 100644 index 95dac34..0000000 --- a/docs/epy/oauth2client.client.FlowExchangeError-class.html +++ /dev/null @@ -1,209 +0,0 @@ - - - - - oauth2client.client.FlowExchangeError - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module client :: - Class FlowExchangeError - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class FlowExchangeError

source code

-
-
- - - - - - - - - - - - - - - - - - - - -
-
-
-
-Error trying to exchange an authorization grant for an access token.
-
-
- - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-

Inherited from exceptions.Exception: - __init__, - __new__ -

-

Inherited from exceptions.BaseException: - __delattr__, - __getattribute__, - __getitem__, - __getslice__, - __reduce__, - __repr__, - __setattr__, - __setstate__, - __str__, - __unicode__ -

-

Inherited from object: - __format__, - __hash__, - __reduce_ex__, - __sizeof__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from exceptions.BaseException: - args, - message -

-

Inherited from object: - __class__ -

-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.client.GoogleCredentials-class.html b/docs/epy/oauth2client.client.GoogleCredentials-class.html deleted file mode 100644 index c6995e7..0000000 --- a/docs/epy/oauth2client.client.GoogleCredentials-class.html +++ /dev/null @@ -1,651 +0,0 @@ - - - - - oauth2client.client.GoogleCredentials - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module client :: - Class GoogleCredentials - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class GoogleCredentials

source code

-
-
- - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-Application Default Credentials for use in calling Google APIs.
-
-The Application Default Credentials are being constructed as a function of
-the environment where the code is being run.
-More details can be found on this page:
-https://developers.google.com/accounts/docs/application-default-credentials
-
-Here is an example of how to use the Application Default Credentials for a
-service that requires authentication:
-
-<code>
-from __future__ import print_function  # unnecessary in python3
-from googleapiclient.discovery import build
-from oauth2client.client import GoogleCredentials
-
-PROJECT = 'bamboo-machine-422'  # replace this with one of your projects
-ZONE = 'us-central1-a'          # replace this with the zone you care about
-
-credentials = GoogleCredentials.get_application_default()
-service = build('compute', 'v1', credentials=credentials)
-
-request = service.instances().list(project=PROJECT, zone=ZONE)
-response = request.execute()
-
-print(response)
-</code>
-
-A service that does not require authentication does not need credentials
-to be passed in:
-
-<code>
-from googleapiclient.discovery import build
-
-service = build('discovery', 'v1')
-
-request = service.apis().list()
-response = request.execute()
-
-print(response)
-</code>
-
-
- - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-   - - - - - - -
__init__(self, - access_token, - client_id, - client_secret, - refresh_token, - token_expiry, - token_uri, - user_agent, - revoke_uri=GOOGLE_REVOKE_URI)
- Create an instance of GoogleCredentials.
- source code - -
- -
-   - - - - - - -
create_scoped_required(self)
- Whether this Credentials object is scopeless.
- source code - -
- -
-   - - - - - - -
create_scoped(self, - scopes)
- Create a Credentials object for the given scopes.
- source code - -
- -
-   - - - - - - -
serialization_data(self)
- Get the fields and their values identifying the current credentials.
- source code - -
- -
-

Inherited from OAuth2Credentials: - __getstate__, - __setstate__, - access_token_expired, - apply, - authorize, - get_access_token, - refresh, - revoke, - set_store, - to_json -

- -

Inherited from Credentials (private): - _to_json -

-

Inherited from object: - __delattr__, - __format__, - __getattribute__, - __hash__, - __new__, - __reduce__, - __reduce_ex__, - __repr__, - __setattr__, - __sizeof__, - __str__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Class Methods[hide private]
-
-

Inherited from OAuth2Credentials: - from_json -

-

Inherited from Credentials: - new_from_json -

-
- - - - - - - - - - - - -
- - - - - -
Static Methods[hide private]
-
-   - - - - - - -
get_application_default()
- Get the Application Default Credentials for the current environment.
- source code - -
- -
-   - - - - - - -
from_stream(credential_filename)
- Create a Credentials object by reading the information from a given file.
- source code - -
- -
- - - - - - - - - -
- - - - - -
Class Variables[hide private]
-
-

Inherited from Credentials: - NON_SERIALIZED_MEMBERS -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from object: - __class__ -

-
- - - - - - -
- - - - - -
Method Details[hide private]
-
- -
- -
- - -
-

__init__(self, - access_token, - client_id, - client_secret, - refresh_token, - token_expiry, - token_uri, - user_agent, - revoke_uri=GOOGLE_REVOKE_URI) -
(Constructor) -

-
source code  -
- -
-Create an instance of GoogleCredentials.
-
-This constructor is not usually called by the user, instead
-GoogleCredentials objects are instantiated by
-GoogleCredentials.from_stream() or
-GoogleCredentials.get_application_default().
-
-Args:
-  access_token: string, access token.
-  client_id: string, client identifier.
-  client_secret: string, client secret.
-  refresh_token: string, refresh token.
-  token_expiry: datetime, when the access_token expires.
-  token_uri: string, URI of token endpoint.
-  user_agent: string, The HTTP User-Agent to provide for this application.
-  revoke_uri: string, URI for revoke endpoint.
-    Defaults to GOOGLE_REVOKE_URI; a token can't be revoked if this is None.
-
-
-
-
Overrides: - object.__init__ -
-
-
-
- -
- -
- - -
-

create_scoped_required(self) -

-
source code  -
- -
-Whether this Credentials object is scopeless.
-
-create_scoped(scopes) method needs to be called in order to create
-a Credentials object for API calls.
-
-
-
-
-
-
- -
- -
- - -
-

create_scoped(self, - scopes) -

-
source code  -
- -
-Create a Credentials object for the given scopes.
-
-The Credentials type is preserved.
-
-
-
-
-
-
- -
- -
- - -
-

serialization_data(self) -

-
source code  -
- -
-Get the fields and their values identifying the current credentials.
-
-
-
-
Decorators:
-
    -
  • @property
  • -
-
-
-
- -
- -
- - -
-

get_application_default() -
Static Method -

-
source code  -
- -
-Get the Application Default Credentials for the current environment.
-
-Exceptions:
-  ApplicationDefaultCredentialsError: raised when the credentials fail
-                                      to be retrieved.
-
-
-
-
-
-
- -
- -
- - -
-

from_stream(credential_filename) -
Static Method -

-
source code  -
- -
-Create a Credentials object by reading the information from a given file.
-
-It returns an object of type GoogleCredentials.
-
-Args:
-  credential_filename: the path to the file from where the credentials
-    are to be read
-
-Exceptions:
-  ApplicationDefaultCredentialsError: raised when the credentials fail
-                                      to be retrieved.
-
-
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.client.MemoryCache-class.html b/docs/epy/oauth2client.client.MemoryCache-class.html deleted file mode 100644 index 207adac..0000000 --- a/docs/epy/oauth2client.client.MemoryCache-class.html +++ /dev/null @@ -1,298 +0,0 @@ - - - - - oauth2client.client.MemoryCache - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module client :: - Class MemoryCache - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class MemoryCache

source code

-
-
- - - - - - - -
-
-
-
-httplib2 Cache implementation which only caches locally.
-
-
- - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-   - - - - - - -
__init__(self)
- x.__init__(...) initializes x; see help(type(x)) for signature
- source code - -
- -
-   - - - - - - -
get(self, - key) - source code - -
- -
-   - - - - - - -
set(self, - key, - value) - source code - -
- -
-   - - - - - - -
delete(self, - key) - source code - -
- -
-

Inherited from object: - __delattr__, - __format__, - __getattribute__, - __hash__, - __new__, - __reduce__, - __reduce_ex__, - __repr__, - __setattr__, - __sizeof__, - __str__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from object: - __class__ -

-
- - - - - - -
- - - - - -
Method Details[hide private]
-
- -
- -
- - -
-

__init__(self) -
(Constructor) -

-
source code  -
- -
-x.__init__(...) initializes x; see help(type(x)) for signature
-
-
-
-
Overrides: - object.__init__ -
(inherited documentation)
- -
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.client.NonAsciiHeaderError-class.html b/docs/epy/oauth2client.client.NonAsciiHeaderError-class.html deleted file mode 100644 index 9b45b38..0000000 --- a/docs/epy/oauth2client.client.NonAsciiHeaderError-class.html +++ /dev/null @@ -1,209 +0,0 @@ - - - - - oauth2client.client.NonAsciiHeaderError - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module client :: - Class NonAsciiHeaderError - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class NonAsciiHeaderError

source code

-
-
- - - - - - - - - - - - - - - - - - - - -
-
-
-
-Header names and values must be ASCII strings.
-
-
- - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-

Inherited from exceptions.Exception: - __init__, - __new__ -

-

Inherited from exceptions.BaseException: - __delattr__, - __getattribute__, - __getitem__, - __getslice__, - __reduce__, - __repr__, - __setattr__, - __setstate__, - __str__, - __unicode__ -

-

Inherited from object: - __format__, - __hash__, - __reduce_ex__, - __sizeof__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from exceptions.BaseException: - args, - message -

-

Inherited from object: - __class__ -

-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.client.OAuth2Credentials-class.html b/docs/epy/oauth2client.client.OAuth2Credentials-class.html deleted file mode 100644 index 9ea979b..0000000 --- a/docs/epy/oauth2client.client.OAuth2Credentials-class.html +++ /dev/null @@ -1,1138 +0,0 @@ - - - - - oauth2client.client.OAuth2Credentials - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module client :: - Class OAuth2Credentials - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class OAuth2Credentials

source code

-
-
- - - - - - - - - - - - - - - - - - -
-
-
-
-Credentials object for OAuth 2.0.
-
-Credentials can be applied to an httplib2.Http object using the authorize()
-method, which then adds the OAuth 2.0 access token to each request.
-
-OAuth2Credentials objects may be safely pickled and unpickled.
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-   - - - - - - -
__init__(self, - access_token, - client_id, - client_secret, - refresh_token, - token_expiry, - token_uri, - user_agent, - revoke_uri=None, - id_token=None, - token_response=None)
- Create an instance of OAuth2Credentials.
- source code - -
- -
-   - - - - - - -
authorize(self, - http)
- Authorize an httplib2.Http instance with these credentials.
- source code - -
- -
-   - - - - - - -
refresh(self, - http)
- Forces a refresh of the access_token.
- source code - -
- -
-   - - - - - - -
revoke(self, - http)
- Revokes a refresh_token and makes the credentials void.
- source code - -
- -
-   - - - - - - -
apply(self, - headers)
- Add the authorization to the headers.
- source code - -
- -
-   - - - - - - -
to_json(self)
- Creating a JSON representation of an instance of Credentials.
- source code - -
- -
-   - - - - - - -
access_token_expired(self)
- True if the credential is expired or invalid.
- source code - -
- -
-   - - - - - - -
get_access_token(self, - http=None)
- Return the access token and its expiration information.
- source code - -
- -
-   - - - - - - -
set_store(self, - store)
- Set the Storage for the credential.
- source code - -
- -
-   - - - - - - -
_expires_in(self)
- Return the number of seconds until this token expires.
- source code - -
- -
-   - - - - - - -
_updateFromCredential(self, - other)
- Update this Credential from another instance.
- source code - -
- -
-   - - - - - - -
__getstate__(self)
- Trim the state down to something that can be pickled.
- source code - -
- -
-   - - - - - - -
__setstate__(self, - state)
- Reconstitute the state of the object from being pickled.
- source code - -
- -
-   - - - - - - -
_generate_refresh_request_body(self)
- Generate the body that will be used in the refresh request.
- source code - -
- -
-   - - - - - - -
_generate_refresh_request_headers(self)
- Generate the headers that will be used in the refresh request.
- source code - -
- -
-   - - - - - - -
_refresh(self, - http_request)
- Refreshes the access_token.
- source code - -
- -
-   - - - - - - -
_do_refresh_request(self, - http_request)
- Refresh the access_token using the refresh_token.
- source code - -
- -
-   - - - - - - -
_revoke(self, - http_request)
- Revokes the refresh_token and deletes the store if available.
- source code - -
- -
-   - - - - - - -
_do_revoke(self, - http_request, - token)
- Revokes the credentials and deletes the store if available.
- source code - -
- -
-

Inherited from Credentials (private): - _to_json -

-

Inherited from object: - __delattr__, - __format__, - __getattribute__, - __hash__, - __new__, - __reduce__, - __reduce_ex__, - __repr__, - __setattr__, - __sizeof__, - __str__, - __subclasshook__ -

-
- - - - - - - - - - - - -
- - - - - -
Class Methods[hide private]
-
-   - - - - - - -
from_json(cls, - s)
- Instantiate a Credentials object from a JSON description of it.
- source code - -
- -
-

Inherited from Credentials: - new_from_json -

-
- - - - - - - - - -
- - - - - -
Class Variables[hide private]
-
-

Inherited from Credentials: - NON_SERIALIZED_MEMBERS -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from object: - __class__ -

-
- - - - - - -
- - - - - -
Method Details[hide private]
-
- -
- -
- - -
-

__init__(self, - access_token, - client_id, - client_secret, - refresh_token, - token_expiry, - token_uri, - user_agent, - revoke_uri=None, - id_token=None, - token_response=None) -
(Constructor) -

-
source code  -
- -
-Create an instance of OAuth2Credentials.
-
-This constructor is not usually called by the user, instead
-OAuth2Credentials objects are instantiated by the OAuth2WebServerFlow.
-
-Args:
-  access_token: string, access token.
-  client_id: string, client identifier.
-  client_secret: string, client secret.
-  refresh_token: string, refresh token.
-  token_expiry: datetime, when the access_token expires.
-  token_uri: string, URI of token endpoint.
-  user_agent: string, The HTTP User-Agent to provide for this application.
-  revoke_uri: string, URI for revoke endpoint. Defaults to None; a token
-    can't be revoked if this is None.
-  id_token: object, The identity of the resource owner.
-  token_response: dict, the decoded response to the token request. None
-    if a token hasn't been requested yet. Stored because some providers
-    (e.g. wordpress.com) include extra fields that clients may want.
-
-Notes:
-  store: callable, A callable that when passed a Credential
-    will store the credential back to where it came from.
-    This is needed to store the latest access_token if it
-    has expired and been refreshed.
-
-
-
-
Decorators:
-
    -
  • @util.positional(8)
  • -
-
Overrides: - object.__init__ -
-
-
-
- -
- -
- - -
-

authorize(self, - http) -

-
source code  -
- -
-Authorize an httplib2.Http instance with these credentials.
-
-The modified http.request method will add authentication headers to each
-request and will refresh access_tokens when a 401 is received on a
-request. In addition the http.request method has a credentials property,
-http.request.credentials, which is the Credentials object that authorized
-it.
-
-Args:
-   http: An instance of httplib2.Http
-     or something that acts like it.
-
-Returns:
-   A modified instance of http that was passed in.
-
-Example:
-
-  h = httplib2.Http()
-  h = credentials.authorize(h)
-
-You can't create a new OAuth subclass of httplib2.Authentication
-because it never gets passed the absolute URI, which is needed for
-signing. So instead we have to overload 'request' with a closure
-that adds in the Authorization header and then calls the original
-version of 'request()'.
-
-
-
-
Overrides: - Credentials.authorize -
-
-
-
- -
- -
- - -
-

refresh(self, - http) -

-
source code  -
- -
-Forces a refresh of the access_token.
-
-Args:
-  http: httplib2.Http, an http object to be used to make the refresh
-    request.
-
-
-
-
Overrides: - Credentials.refresh -
-
-
-
- -
- -
- - -
-

revoke(self, - http) -

-
source code  -
- -
-Revokes a refresh_token and makes the credentials void.
-
-Args:
-  http: httplib2.Http, an http object to be used to make the revoke
-    request.
-
-
-
-
Overrides: - Credentials.revoke -
-
-
-
- -
- -
- - -
-

apply(self, - headers) -

-
source code  -
- -
-Add the authorization to the headers.
-
-Args:
-  headers: dict, the headers to add the Authorization header to.
-
-
-
-
Overrides: - Credentials.apply -
-
-
-
- -
- -
- - -
-

to_json(self) -

-
source code  -
- -
-Creating a JSON representation of an instance of Credentials.
-
-Returns:
-   string, a JSON representation of this instance, suitable to pass to
-   from_json().
-
-
-
-
Overrides: - Credentials.to_json -
(inherited documentation)
- -
-
-
- -
- -
- - -
-

from_json(cls, - s) -
Class Method -

-
source code  -
- -
-Instantiate a Credentials object from a JSON description of it. The JSON
-should have been produced by calling .to_json() on the object.
-
-Args:
-  data: dict, A deserialized JSON object.
-
-Returns:
-  An instance of a Credentials subclass.
-
-
-
-
Overrides: - Credentials.from_json -
-
-
-
- -
- -
- - -
-

access_token_expired(self) -

-
source code  -
- -
-True if the credential is expired or invalid.
-
-If the token_expiry isn't set, we assume the token doesn't expire.
-
-
-
-
Decorators:
-
    -
  • @property
  • -
-
-
-
- -
- -
- - -
-

get_access_token(self, - http=None) -

-
source code  -
- -
-Return the access token and its expiration information.
-
-If the token does not exist, get one.
-If the token expired, refresh it.
-
-
-
-
-
-
- -
- -
- - -
-

set_store(self, - store) -

-
source code  -
- -
-Set the Storage for the credential.
-
-Args:
-  store: Storage, an implementation of Storage object.
-    This is needed to store the latest access_token if it
-    has expired and been refreshed. This implementation uses
-    locking to check for updates before updating the
-    access_token.
-
-
-
-
-
-
- -
- -
- - -
-

_expires_in(self) -

-
source code  -
- -
-Return the number of seconds until this token expires.
-
-If token_expiry is in the past, this method will return 0, meaning the
-token has already expired.
-If token_expiry is None, this method will return None. Note that returning
-0 in such a case would not be fair: the token may still be valid;
-we just don't know anything about it.
-
-
-
-
-
-
- -
- -
- - -
-

_refresh(self, - http_request) -

-
source code  -
- -
-Refreshes the access_token.
-
-This method first checks by reading the Storage object if available.
-If a refresh is still needed, it holds the Storage lock until the
-refresh is completed.
-
-Args:
-  http_request: callable, a callable that matches the method signature of
-    httplib2.Http.request, used to make the refresh request.
-
-Raises:
-  AccessTokenRefreshError: When the refresh fails.
-
-
-
-
-
-
- -
- -
- - -
-

_do_refresh_request(self, - http_request) -

-
source code  -
- -
-Refresh the access_token using the refresh_token.
-
-Args:
-  http_request: callable, a callable that matches the method signature of
-    httplib2.Http.request, used to make the refresh request.
-
-Raises:
-  AccessTokenRefreshError: When the refresh fails.
-
-
-
-
-
-
- -
- -
- - -
-

_revoke(self, - http_request) -

-
source code  -
- -
-Revokes the refresh_token and deletes the store if available.
-
-Args:
-  http_request: callable, a callable that matches the method signature of
-    httplib2.Http.request, used to make the revoke request.
-
-
-
-
-
-
- -
- -
- - -
-

_do_revoke(self, - http_request, - token) -

-
source code  -
- -
-Revokes the credentials and deletes the store if available.
-
-Args:
-  http_request: callable, a callable that matches the method signature of
-    httplib2.Http.request, used to make the refresh request.
-  token: A string used as the token to be revoked. Can be either an
-    access_token or refresh_token.
-
-Raises:
-  TokenRevokeError: If the revoke request does not return with a 200 OK.
-
-
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.client.OAuth2DeviceCodeError-class.html b/docs/epy/oauth2client.client.OAuth2DeviceCodeError-class.html deleted file mode 100644 index 7acb20d..0000000 --- a/docs/epy/oauth2client.client.OAuth2DeviceCodeError-class.html +++ /dev/null @@ -1,209 +0,0 @@ - - - - - oauth2client.client.OAuth2DeviceCodeError - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module client :: - Class OAuth2DeviceCodeError - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class OAuth2DeviceCodeError

source code

-
-
- - - - - - - - - - - - - - - - - - - - -
-
-
-
-Error trying to retrieve a device code.
-
-
- - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-

Inherited from exceptions.Exception: - __init__, - __new__ -

-

Inherited from exceptions.BaseException: - __delattr__, - __getattribute__, - __getitem__, - __getslice__, - __reduce__, - __repr__, - __setattr__, - __setstate__, - __str__, - __unicode__ -

-

Inherited from object: - __format__, - __hash__, - __reduce_ex__, - __sizeof__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from exceptions.BaseException: - args, - message -

-

Inherited from object: - __class__ -

-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.client.OAuth2WebServerFlow-class.html b/docs/epy/oauth2client.client.OAuth2WebServerFlow-class.html deleted file mode 100644 index 012a35f..0000000 --- a/docs/epy/oauth2client.client.OAuth2WebServerFlow-class.html +++ /dev/null @@ -1,473 +0,0 @@ - - - - - oauth2client.client.OAuth2WebServerFlow - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module client :: - Class OAuth2WebServerFlow - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class OAuth2WebServerFlow

source code

-
-
- - - - - - - - -
-
-
-
-Does the Web Server Flow for OAuth 2.0.
-
-OAuth2WebServerFlow objects may be safely pickled and unpickled.
-
-
- - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-   - - - - - - -
__init__(self, - client_id, - client_secret, - scope, - redirect_uri=None, - user_agent=None, - auth_uri=GOOGLE_AUTH_URI, - token_uri=GOOGLE_TOKEN_URI, - revoke_uri=GOOGLE_REVOKE_URI, - login_hint=None, - device_uri=GOOGLE_DEVICE_URI, - **kwargs)
- Constructor for OAuth2WebServerFlow.
- source code - -
- -
-   - - - - - - -
step1_get_authorize_url(self, - redirect_uri=None)
- Returns a URI to redirect to the provider.
- source code - -
- -
-   - - - - - - -
step1_get_device_and_user_codes(self, - http=None)
- Returns a user code and the verification URL where to enter it
- source code - -
- -
-   - - - - - - -
step2_exchange(self, - code=None, - http=None, - device_flow_info=None)
- Exchanges a code for OAuth2Credentials.
- source code - -
- -
-

Inherited from object: - __delattr__, - __format__, - __getattribute__, - __hash__, - __new__, - __reduce__, - __reduce_ex__, - __repr__, - __setattr__, - __sizeof__, - __str__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from object: - __class__ -

-
- - - - - - -
- - - - - -
Method Details[hide private]
-
- -
- -
- - -
-

__init__(self, - client_id, - client_secret, - scope, - redirect_uri=None, - user_agent=None, - auth_uri=GOOGLE_AUTH_URI, - token_uri=GOOGLE_TOKEN_URI, - revoke_uri=GOOGLE_REVOKE_URI, - login_hint=None, - device_uri=GOOGLE_DEVICE_URI, - **kwargs) -
(Constructor) -

-
source code  -
- -
-Constructor for OAuth2WebServerFlow.
-
-The kwargs argument is used to set extra query parameters on the
-auth_uri. For example, the access_type and approval_prompt
-query parameters can be set via kwargs.
-
-Args:
-  client_id: string, client identifier.
-  client_secret: string client secret.
-  scope: string or iterable of strings, scope(s) of the credentials being
-    requested.
-  redirect_uri: string, Either the string 'urn:ietf:wg:oauth:2.0:oob' for
-    a non-web-based application, or a URI that handles the callback from
-    the authorization server.
-  user_agent: string, HTTP User-Agent to provide for this application.
-  auth_uri: string, URI for authorization endpoint. For convenience
-    defaults to Google's endpoints but any OAuth 2.0 provider can be used.
-  token_uri: string, URI for token endpoint. For convenience
-    defaults to Google's endpoints but any OAuth 2.0 provider can be used.
-  revoke_uri: string, URI for revoke endpoint. For convenience
-    defaults to Google's endpoints but any OAuth 2.0 provider can be used.
-  login_hint: string, Either an email address or domain. Passing this hint
-    will either pre-fill the email box on the sign-in form or select the
-    proper multi-login session, thereby simplifying the login flow.
-  device_uri: string, URI for device authorization endpoint. For convenience
-    defaults to Google's endpoints but any OAuth 2.0 provider can be used.
-  **kwargs: dict, The keyword arguments are all optional and required
-                    parameters for the OAuth calls.
-
-
-
-
Decorators:
-
    -
  • @util.positional(4)
  • -
-
Overrides: - object.__init__ -
-
-
-
- -
- -
- - -
-

step1_get_authorize_url(self, - redirect_uri=None) -

-
source code  -
- -
-Returns a URI to redirect to the provider.
-
-Args:
-  redirect_uri: string, Either the string 'urn:ietf:wg:oauth:2.0:oob' for
-    a non-web-based application, or a URI that handles the callback from
-    the authorization server. This parameter is deprecated, please move to
-    passing the redirect_uri in via the constructor.
-
-Returns:
-  A URI as a string to redirect the user to begin the authorization flow.
-
-
-
-
Decorators:
-
    -
  • @util.positional(1)
  • -
-
-
-
- -
- -
- - -
-

step1_get_device_and_user_codes(self, - http=None) -

-
source code  -
- -
-Returns a user code and the verification URL where to enter it
-
-Returns:
-  A user code as a string for the user to authorize the application
-  An URL as a string where the user has to enter the code
-
-
-
-
Decorators:
-
    -
  • @util.positional(1)
  • -
-
-
-
- -
- -
- - -
-

step2_exchange(self, - code=None, - http=None, - device_flow_info=None) -

-
source code  -
- -
-Exchanges a code for OAuth2Credentials.
-
-Args:
-
-  code: string, a dict-like object, or None. For a non-device
-      flow, this is either the response code as a string, or a
-      dictionary of query parameters to the redirect_uri. For a
-      device flow, this should be None.
-  http: httplib2.Http, optional http instance to use when fetching
-      credentials.
-  device_flow_info: DeviceFlowInfo, return value from step1 in the
-      case of a device flow.
-
-Returns:
-  An OAuth2Credentials object that can be used to authorize requests.
-
-Raises:
-  FlowExchangeError: if a problem occurred exchanging the code for a
-      refresh_token.
-  ValueError: if code and device_flow_info are both provided or both
-      missing.
-
-
-
-
Decorators:
-
    -
  • @util.positional(2)
  • -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.client.SignedJwtAssertionCredentials-class.html b/docs/epy/oauth2client.client.SignedJwtAssertionCredentials-class.html deleted file mode 100644 index 6cb7de4..0000000 --- a/docs/epy/oauth2client.client.SignedJwtAssertionCredentials-class.html +++ /dev/null @@ -1,520 +0,0 @@ - - - - - oauth2client.client.SignedJwtAssertionCredentials - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module client :: - Class SignedJwtAssertionCredentials - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class SignedJwtAssertionCredentials

source code

-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-Credentials object used for OAuth 2.0 Signed JWT assertion grants.
-
-This credential does not require a flow to instantiate because it
-represents a two legged flow, and therefore has all of the required
-information to generate and refresh its own access tokens.
-
-SignedJwtAssertionCredentials requires either PyOpenSSL, or PyCrypto
-2.6 or later. For App Engine you may also consider using
-AppAssertionCredentials.
-
-
- - - - - - - - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-   - - - - - - -
__init__(self, - service_account_name, - private_key, - scope, - private_key_password='notasecret', - user_agent=None, - token_uri=GOOGLE_TOKEN_URI, - revoke_uri=GOOGLE_REVOKE_URI, - **kwargs)
- Constructor for SignedJwtAssertionCredentials.
- source code - -
- -
-   - - - - - - -
_generate_assertion(self)
- Generate the assertion that will be used in the request.
- source code - -
- -
- -

Inherited from GoogleCredentials: - create_scoped, - create_scoped_required, - serialization_data -

-

Inherited from OAuth2Credentials: - __getstate__, - __setstate__, - access_token_expired, - apply, - authorize, - get_access_token, - refresh, - revoke, - set_store, - to_json -

- -

Inherited from Credentials (private): - _to_json -

-

Inherited from object: - __delattr__, - __format__, - __getattribute__, - __hash__, - __new__, - __reduce__, - __reduce_ex__, - __repr__, - __setattr__, - __sizeof__, - __str__, - __subclasshook__ -

-
- - - - - - - - - - - - -
- - - - - -
Class Methods[hide private]
-
-   - - - - - - -
from_json(cls, - s)
- Instantiate a Credentials object from a JSON description of it.
- source code - -
- -
-

Inherited from Credentials: - new_from_json -

-
- - - - - - - - - -
- - - - - -
Static Methods[hide private]
-
-

Inherited from GoogleCredentials: - from_stream, - get_application_default -

-
- - - - - - - - - - - - -
- - - - - -
Class Variables[hide private]
-
-   - - MAX_TOKEN_LIFETIME_SECS = 3600 -
-

Inherited from Credentials: - NON_SERIALIZED_MEMBERS -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from object: - __class__ -

-
- - - - - - -
- - - - - -
Method Details[hide private]
-
- -
- -
- - -
-

__init__(self, - service_account_name, - private_key, - scope, - private_key_password='notasecret', - user_agent=None, - token_uri=GOOGLE_TOKEN_URI, - revoke_uri=GOOGLE_REVOKE_URI, - **kwargs) -
(Constructor) -

-
source code  -
- -
-Constructor for SignedJwtAssertionCredentials.
-
-Args:
-  service_account_name: string, id for account, usually an email address.
-  private_key: string, private key in PKCS12 or PEM format.
-  scope: string or iterable of strings, scope(s) of the credentials being
-    requested.
-  private_key_password: string, password for private_key, unused if
-    private_key is in PEM format.
-  user_agent: string, HTTP User-Agent to provide for this application.
-  token_uri: string, URI for token endpoint. For convenience
-    defaults to Google's endpoints but any OAuth 2.0 provider can be used.
-  revoke_uri: string, URI for revoke endpoint.
-  kwargs: kwargs, Additional parameters to add to the JWT token, for
-    example sub=joe@xample.org.
-
-Raises:
-  CryptoUnavailableError if no crypto library is available.
-
-
-
-
Decorators:
-
    -
  • @util.positional(4)
  • -
-
Overrides: - object.__init__ -
-
-
-
- -
- -
- - -
-

from_json(cls, - s) -
Class Method -

-
source code  -
- -
-Instantiate a Credentials object from a JSON description of it. The JSON
-should have been produced by calling .to_json() on the object.
-
-Args:
-  data: dict, A deserialized JSON object.
-
-Returns:
-  An instance of a Credentials subclass.
-
-
-
-
Overrides: - Credentials.from_json -
(inherited documentation)
- -
-
-
- -
- -
- - -
-

_generate_assertion(self) -

-
source code  -
- -
-Generate the assertion that will be used in the request.
-
-
-
-
Overrides: - AssertionCredentials._generate_assertion -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.client.Storage-class.html b/docs/epy/oauth2client.client.Storage-class.html deleted file mode 100644 index e74778b..0000000 --- a/docs/epy/oauth2client.client.Storage-class.html +++ /dev/null @@ -1,560 +0,0 @@ - - - - - oauth2client.client.Storage - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module client :: - Class Storage - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class Storage

source code

-
-
- - - - - - - - - - - -
-
-
-
-Base class for all Storage objects.
-
-Store and retrieve a single credential. This class supports locking
-such that multiple processes and threads can operate on a single
-store.
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-   - - - - - - -
acquire_lock(self)
- Acquires any lock necessary to access this Storage.
- source code - -
- -
-   - - - - - - -
release_lock(self)
- Release the Storage lock.
- source code - -
- -
-   - - - - - - -
locked_get(self)
- Retrieve credential.
- source code - -
- -
-   - - - - - - -
locked_put(self, - credentials)
- Write a credential.
- source code - -
- -
-   - - - - - - -
locked_delete(self)
- Delete a credential.
- source code - -
- -
-   - - - - - - -
get(self)
- Retrieve credential.
- source code - -
- -
-   - - - - - - -
put(self, - credentials)
- Write a credential.
- source code - -
- -
-   - - - - - - -
delete(self)
- Delete credential.
- source code - -
- -
-

Inherited from object: - __delattr__, - __format__, - __getattribute__, - __hash__, - __init__, - __new__, - __reduce__, - __reduce_ex__, - __repr__, - __setattr__, - __sizeof__, - __str__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from object: - __class__ -

-
- - - - - - -
- - - - - -
Method Details[hide private]
-
- -
- -
- - -
-

acquire_lock(self) -

-
source code  -
- -
-Acquires any lock necessary to access this Storage.
-
-This lock is not reentrant.
-
-
-
-
-
-
- -
- -
- - -
-

release_lock(self) -

-
source code  -
- -
-Release the Storage lock.
-
-Trying to release a lock that isn't held will result in a
-RuntimeError.
-
-
-
-
-
-
- -
- -
- - -
-

locked_get(self) -

-
source code  -
- -
-Retrieve credential.
-
-The Storage lock must be held when this is called.
-
-Returns:
-  oauth2client.client.Credentials
-
-
-
-
-
-
- -
- -
- - -
-

locked_put(self, - credentials) -

-
source code  -
- -
-Write a credential.
-
-The Storage lock must be held when this is called.
-
-Args:
-  credentials: Credentials, the credentials to store.
-
-
-
-
-
-
- -
- -
- - -
-

locked_delete(self) -

-
source code  -
- -
-Delete a credential.
-
-The Storage lock must be held when this is called.
-
-
-
-
-
-
- -
- -
- - -
-

get(self) -

-
source code  -
- -
-Retrieve credential.
-
-The Storage lock must *not* be held when this is called.
-
-Returns:
-  oauth2client.client.Credentials
-
-
-
-
-
-
- -
- -
- - -
-

put(self, - credentials) -

-
source code  -
- -
-Write a credential.
-
-The Storage lock must be held when this is called.
-
-Args:
-  credentials: Credentials, the credentials to store.
-
-
-
-
-
-
- -
- -
- - -
-

delete(self) -

-
source code  -
- -
-Delete credential.
-
-Frees any resources associated with storing the credential.
-The Storage lock must *not* be held when this is called.
-
-Returns:
-  None
-
-
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.client.TokenRevokeError-class.html b/docs/epy/oauth2client.client.TokenRevokeError-class.html deleted file mode 100644 index 63cf9e0..0000000 --- a/docs/epy/oauth2client.client.TokenRevokeError-class.html +++ /dev/null @@ -1,209 +0,0 @@ - - - - - oauth2client.client.TokenRevokeError - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module client :: - Class TokenRevokeError - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class TokenRevokeError

source code

-
-
- - - - - - - - - - - - - - - - - - - - -
-
-
-
-Error trying to revoke a token.
-
-
- - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-

Inherited from exceptions.Exception: - __init__, - __new__ -

-

Inherited from exceptions.BaseException: - __delattr__, - __getattribute__, - __getitem__, - __getslice__, - __reduce__, - __repr__, - __setattr__, - __setstate__, - __str__, - __unicode__ -

-

Inherited from object: - __format__, - __hash__, - __reduce_ex__, - __sizeof__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from exceptions.BaseException: - args, - message -

-

Inherited from object: - __class__ -

-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.client.UnknownClientSecretsFlowError-class.html b/docs/epy/oauth2client.client.UnknownClientSecretsFlowError-class.html deleted file mode 100644 index 897d8ff..0000000 --- a/docs/epy/oauth2client.client.UnknownClientSecretsFlowError-class.html +++ /dev/null @@ -1,209 +0,0 @@ - - - - - oauth2client.client.UnknownClientSecretsFlowError - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module client :: - Class UnknownClientSecretsFlowError - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class UnknownClientSecretsFlowError

source code

-
-
- - - - - - - - - - - - - - - - - - - - -
-
-
-
-The client secrets file called for an unknown type of OAuth 2.0 flow. 
-
-
- - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-

Inherited from exceptions.Exception: - __init__, - __new__ -

-

Inherited from exceptions.BaseException: - __delattr__, - __getattribute__, - __getitem__, - __getslice__, - __reduce__, - __repr__, - __setattr__, - __setstate__, - __str__, - __unicode__ -

-

Inherited from object: - __format__, - __hash__, - __reduce_ex__, - __sizeof__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from exceptions.BaseException: - args, - message -

-

Inherited from object: - __class__ -

-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.client.VerifyJwtTokenError-class.html b/docs/epy/oauth2client.client.VerifyJwtTokenError-class.html deleted file mode 100644 index b0c102f..0000000 --- a/docs/epy/oauth2client.client.VerifyJwtTokenError-class.html +++ /dev/null @@ -1,209 +0,0 @@ - - - - - oauth2client.client.VerifyJwtTokenError - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module client :: - Class VerifyJwtTokenError - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class VerifyJwtTokenError

source code

-
-
- - - - - - - - - - - - - - - - - - - - -
-
-
-
-Could not retrieve certificates for validation.
-
-
- - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-

Inherited from exceptions.Exception: - __init__, - __new__ -

-

Inherited from exceptions.BaseException: - __delattr__, - __getattribute__, - __getitem__, - __getslice__, - __reduce__, - __repr__, - __setattr__, - __setstate__, - __str__, - __unicode__ -

-

Inherited from object: - __format__, - __hash__, - __reduce_ex__, - __sizeof__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from exceptions.BaseException: - args, - message -

-

Inherited from object: - __class__ -

-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.clientsecrets-module.html b/docs/epy/oauth2client.clientsecrets-module.html deleted file mode 100644 index eaa6e76..0000000 --- a/docs/epy/oauth2client.clientsecrets-module.html +++ /dev/null @@ -1,404 +0,0 @@ - - - - - oauth2client.clientsecrets - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module clientsecrets - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Module clientsecrets

source code

-
-Utilities for reading OAuth 2.0 client secret files.
-
-A client_secrets.json file contains all the information needed to interact with
-an OAuth 2.0 protected service.
-
-
- -
-

Author: - jcgregorio@google.com (Joe Gregorio) -

-
- - - - - - - - - - - -
- - - - - -
Classes[hide private]
-
-   - - Error
- Base error for this module. -
-   - - InvalidClientSecretsError
- Format of ClientSecrets file is invalid. -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - -
Functions[hide private]
-
-   - - - - - - -
_validate_clientsecrets(obj) - source code - -
- -
-   - - - - - - -
load(fp) - source code - -
- -
-   - - - - - - -
loads(s) - source code - -
- -
-   - - - - - - -
_loadfile(filename) - source code - -
- -
-   - - - - - - -
loadfile(filename, - cache=None)
- Loading of client_secrets JSON file, optionally backed by a cache.
- source code - -
- -
- - - - - - - - - - - - - - - -
- - - - - -
Variables[hide private]
-
-   - - TYPE_WEB = 'web' -
-   - - TYPE_INSTALLED = 'installed' -
-   - - VALID_CLIENT = {TYPE_WEB: {'required': ['client_id', 'client_s... -
- - - - - - -
- - - - - -
Function Details[hide private]
-
- -
- -
- - -
-

loadfile(filename, - cache=None) -

-
source code  -
- -
-Loading of client_secrets JSON file, optionally backed by a cache.
-
-Typical cache storage would be App Engine memcache service,
-but you can pass in any other cache client that implements
-these methods:
-  - get(key, namespace=ns)
-  - set(key, value, namespace=ns)
-
-Usage:
-  # without caching
-  client_type, client_info = loadfile('secrets.json')
-  # using App Engine memcache service
-  from google.appengine.api import memcache
-  client_type, client_info = loadfile('secrets.json', cache=memcache)
-
-Args:
-  filename: string, Path to a client_secrets.json file on a filesystem.
-  cache: An optional cache service client that implements get() and set()
-    methods. If not specified, the file is always being loaded from
-    a filesystem.
-
-Raises:
-  InvalidClientSecretsError: In case of a validation error or some
-    I/O failure. Can happen only on cache miss.
-
-Returns:
-  (client_type, client_info) tuple, as _loadfile() normally would.
-  JSON contents is validated only during first load. Cache hits are not
-  validated.
-
-
-
-
-
-
-
- - - - - - -
- - - - - -
Variables Details[hide private]
-
- -
- -
-

VALID_CLIENT

- -
-
-
-
Value:
-
-{TYPE_WEB: {'required': ['client_id', 'client_secret', 'redirect_uris'\
-, 'auth_uri', 'token_uri',], 'string': ['client_id', 'client_secret',]\
-,}, TYPE_INSTALLED: {'required': ['client_id', 'client_secret', 'redir\
-ect_uris', 'auth_uri', 'token_uri',], 'string': ['client_id', 'client_\
-secret',],},}
-
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.clientsecrets-pysrc.html b/docs/epy/oauth2client.clientsecrets-pysrc.html deleted file mode 100644 index 1e2c816..0000000 --- a/docs/epy/oauth2client.clientsecrets-pysrc.html +++ /dev/null @@ -1,274 +0,0 @@ - - - - - oauth2client.clientsecrets - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module clientsecrets - - - - - - -
[hide private]
[frames] | no frames]
-
-

Source Code for Module oauth2client.clientsecrets

-
-  1  # Copyright 2014 Google Inc. All rights reserved. 
-  2  # 
-  3  # Licensed under the Apache License, Version 2.0 (the "License"); 
-  4  # you may not use this file except in compliance with the License. 
-  5  # You may obtain a copy of the License at 
-  6  # 
-  7  #      http://www.apache.org/licenses/LICENSE-2.0 
-  8  # 
-  9  # Unless required by applicable law or agreed to in writing, software 
- 10  # distributed under the License is distributed on an "AS IS" BASIS, 
- 11  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
- 12  # See the License for the specific language governing permissions and 
- 13  # limitations under the License. 
- 14   
- 15  """Utilities for reading OAuth 2.0 client secret files. 
- 16   
- 17  A client_secrets.json file contains all the information needed to interact with 
- 18  an OAuth 2.0 protected service. 
- 19  """ 
- 20   
- 21  __author__ = 'jcgregorio@google.com (Joe Gregorio)' 
- 22   
- 23  import json 
- 24  import six 
- 25   
- 26   
- 27  # Properties that make a client_secrets.json file valid. 
- 28  TYPE_WEB = 'web' 
- 29  TYPE_INSTALLED = 'installed' 
- 30   
- 31  VALID_CLIENT = { 
- 32      TYPE_WEB: { 
- 33          'required': [ 
- 34              'client_id', 
- 35              'client_secret', 
- 36              'redirect_uris', 
- 37              'auth_uri', 
- 38              'token_uri', 
- 39          ], 
- 40          'string': [ 
- 41              'client_id', 
- 42              'client_secret', 
- 43          ], 
- 44      }, 
- 45      TYPE_INSTALLED: { 
- 46          'required': [ 
- 47              'client_id', 
- 48              'client_secret', 
- 49              'redirect_uris', 
- 50              'auth_uri', 
- 51              'token_uri', 
- 52          ], 
- 53          'string': [ 
- 54              'client_id', 
- 55              'client_secret', 
- 56          ], 
- 57      }, 
- 58  } 
- 59   
- 60   
-
61 -class Error(Exception): -
62 """Base error for this module.""" - 63 pass -
64 - 65 -
66 -class InvalidClientSecretsError(Error): -
67 """Format of ClientSecrets file is invalid.""" - 68 pass -
69 - 70 -
71 -def _validate_clientsecrets(obj): -
72 if obj is None or len(obj) != 1: - 73 raise InvalidClientSecretsError('Invalid file format.') - 74 client_type = tuple(obj)[0] - 75 if client_type not in VALID_CLIENT: - 76 raise InvalidClientSecretsError('Unknown client type: %s.' % (client_type,)) - 77 client_info = obj[client_type] - 78 for prop_name in VALID_CLIENT[client_type]['required']: - 79 if prop_name not in client_info: - 80 raise InvalidClientSecretsError( - 81 'Missing property "%s" in a client type of "%s".' % (prop_name, - 82 client_type)) - 83 for prop_name in VALID_CLIENT[client_type]['string']: - 84 if client_info[prop_name].startswith('[['): - 85 raise InvalidClientSecretsError( - 86 'Property "%s" is not configured.' % prop_name) - 87 return client_type, client_info -
88 - 89 -
90 -def load(fp): -
91 obj = json.load(fp) - 92 return _validate_clientsecrets(obj) -
93 - 94 -
95 -def loads(s): -
96 obj = json.loads(s) - 97 return _validate_clientsecrets(obj) -
98 - 99 -
100 -def _loadfile(filename): -
101 try: -102 with open(filename, 'r') as fp: -103 obj = json.load(fp) -104 except IOError: -105 raise InvalidClientSecretsError('File not found: "%s"' % filename) -106 return _validate_clientsecrets(obj) -
107 -108 -
109 -def loadfile(filename, cache=None): -
110 """Loading of client_secrets JSON file, optionally backed by a cache. -111 -112 Typical cache storage would be App Engine memcache service, -113 but you can pass in any other cache client that implements -114 these methods: -115 - get(key, namespace=ns) -116 - set(key, value, namespace=ns) -117 -118 Usage: -119 # without caching -120 client_type, client_info = loadfile('secrets.json') -121 # using App Engine memcache service -122 from google.appengine.api import memcache -123 client_type, client_info = loadfile('secrets.json', cache=memcache) -124 -125 Args: -126 filename: string, Path to a client_secrets.json file on a filesystem. -127 cache: An optional cache service client that implements get() and set() -128 methods. If not specified, the file is always being loaded from -129 a filesystem. -130 -131 Raises: -132 InvalidClientSecretsError: In case of a validation error or some -133 I/O failure. Can happen only on cache miss. -134 -135 Returns: -136 (client_type, client_info) tuple, as _loadfile() normally would. -137 JSON contents is validated only during first load. Cache hits are not -138 validated. -139 """ -140 _SECRET_NAMESPACE = 'oauth2client:secrets#ns' -141 -142 if not cache: -143 return _loadfile(filename) -144 -145 obj = cache.get(filename, namespace=_SECRET_NAMESPACE) -146 if obj is None: -147 client_type, client_info = _loadfile(filename) -148 obj = {client_type: client_info} -149 cache.set(filename, obj, namespace=_SECRET_NAMESPACE) -150 -151 return next(six.iteritems(obj)) -
152 -
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.clientsecrets.Error-class.html b/docs/epy/oauth2client.clientsecrets.Error-class.html deleted file mode 100644 index 9d770e5..0000000 --- a/docs/epy/oauth2client.clientsecrets.Error-class.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - oauth2client.clientsecrets.Error - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module clientsecrets :: - Class Error - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class Error

source code

-
-
- - - - - - - - - - - - - - - - - - - -
-
-
-
-Base error for this module.
-
-
- - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-

Inherited from exceptions.Exception: - __init__, - __new__ -

-

Inherited from exceptions.BaseException: - __delattr__, - __getattribute__, - __getitem__, - __getslice__, - __reduce__, - __repr__, - __setattr__, - __setstate__, - __str__, - __unicode__ -

-

Inherited from object: - __format__, - __hash__, - __reduce_ex__, - __sizeof__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from exceptions.BaseException: - args, - message -

-

Inherited from object: - __class__ -

-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.clientsecrets.InvalidClientSecretsError-class.html b/docs/epy/oauth2client.clientsecrets.InvalidClientSecretsError-class.html deleted file mode 100644 index 9244853..0000000 --- a/docs/epy/oauth2client.clientsecrets.InvalidClientSecretsError-class.html +++ /dev/null @@ -1,209 +0,0 @@ - - - - - oauth2client.clientsecrets.InvalidClientSecretsError - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module clientsecrets :: - Class InvalidClientSecretsError - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class InvalidClientSecretsError

source code

-
-
- - - - - - - - - - - - - - - - - - - - -
-
-
-
-Format of ClientSecrets file is invalid.
-
-
- - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-

Inherited from exceptions.Exception: - __init__, - __new__ -

-

Inherited from exceptions.BaseException: - __delattr__, - __getattribute__, - __getitem__, - __getslice__, - __reduce__, - __repr__, - __setattr__, - __setstate__, - __str__, - __unicode__ -

-

Inherited from object: - __format__, - __hash__, - __reduce_ex__, - __sizeof__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from exceptions.BaseException: - args, - message -

-

Inherited from object: - __class__ -

-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.crypt-module.html b/docs/epy/oauth2client.crypt-module.html deleted file mode 100644 index 3f70fe0..0000000 --- a/docs/epy/oauth2client.crypt-module.html +++ /dev/null @@ -1,462 +0,0 @@ - - - - - oauth2client.crypt - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module crypt - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Module crypt

source code

-
-Crypto-related routines for oauth2client.
-
-
- - - - - - - - - - -
- - - - - -
Classes[hide private]
-
-   - - AppIdentityError -
- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
Functions[hide private]
-
-   - - - - - - -
_parse_pem_key(raw_key_input)
- Identify and extract PEM keys.
- source code - -
- -
-   - - - - - - -
_urlsafe_b64encode(raw_bytes) - source code - -
- -
-   - - - - - - -
_urlsafe_b64decode(b64string) - source code - -
- -
-   - - - - - - -
_json_encode(data) - source code - -
- -
-   - - - - - - -
make_signed_jwt(signer, - payload)
- Make a signed JWT.
- source code - -
- -
-   - - - - - - -
verify_signed_jwt_with_certs(jwt, - certs, - audience)
- Verify a JWT against public certs.
- source code - -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
Variables[hide private]
-
-   - - CLOCK_SKEW_SECS = 300 -
-   - - AUTH_TOKEN_LIFETIME_SECS = 300 -
-   - - MAX_TOKEN_LIFETIME_SECS = 86400 -
-   - - logger = logging.getLogger(__name__) -
-   - - OpenSSLVerifier = None -
-   - - OpenSSLSigner = None -
-   - - PyCryptoVerifier = None -
-   - - PyCryptoSigner = None -
-   - - Signer = None -
-   - - Verifier = None -
- - - - - - -
- - - - - -
Function Details[hide private]
-
- -
- -
- - -
-

_parse_pem_key(raw_key_input) -

-
source code  -
- -
-Identify and extract PEM keys.
-
-Determines whether the given key is in the format of PEM key, and extracts
-the relevant part of the key if it is.
-
-Args:
-  raw_key_input: The contents of a private key file (either PEM or PKCS12).
-
-Returns:
-  string, The actual key if the contents are from a PEM file, or else None.
-
-
-
-
-
-
- -
- -
- - -
-

make_signed_jwt(signer, - payload) -

-
source code  -
- -
-Make a signed JWT.
-
-See http://self-issued.info/docs/draft-jones-json-web-token.html.
-
-Args:
-  signer: crypt.Signer, Cryptographic signer.
-  payload: dict, Dictionary of data to convert to JSON and then sign.
-
-Returns:
-  string, The JWT for the payload.
-
-
-
-
-
-
- -
- -
- - -
-

verify_signed_jwt_with_certs(jwt, - certs, - audience) -

-
source code  -
- -
-Verify a JWT against public certs.
-
-See http://self-issued.info/docs/draft-jones-json-web-token.html.
-
-Args:
-  jwt: string, A JWT.
-  certs: dict, Dictionary where values of public keys in PEM format.
-  audience: string, The audience, 'aud', that this JWT should contain. If
-    None then the JWT's 'aud' parameter is not verified.
-
-Returns:
-  dict, The deserialized JSON payload in the JWT.
-
-Raises:
-  AppIdentityError if any checks are failed.
-
-
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.crypt-pysrc.html b/docs/epy/oauth2client.crypt-pysrc.html deleted file mode 100644 index 5736e7d..0000000 --- a/docs/epy/oauth2client.crypt-pysrc.html +++ /dev/null @@ -1,545 +0,0 @@ - - - - - oauth2client.crypt - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module crypt - - - - - - -
[hide private]
[frames] | no frames]
-
-

Source Code for Module oauth2client.crypt

-
-  1  # -*- coding: utf-8 -*- 
-  2  # 
-  3  # Copyright 2014 Google Inc. All rights reserved. 
-  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  """Crypto-related routines for oauth2client.""" 
- 17   
- 18  import base64 
- 19  import json 
- 20  import logging 
- 21  import sys 
- 22  import time 
- 23   
- 24  import six 
- 25   
- 26   
- 27  CLOCK_SKEW_SECS = 300  # 5 minutes in seconds 
- 28  AUTH_TOKEN_LIFETIME_SECS = 300  # 5 minutes in seconds 
- 29  MAX_TOKEN_LIFETIME_SECS = 86400  # 1 day in seconds 
- 30   
- 31   
- 32  logger = logging.getLogger(__name__) 
-
33 - 34 - 35 -class AppIdentityError(Exception): -
36 pass -
37 - 38 - 39 try: - 40 from OpenSSL import crypto -
41 - 42 - class OpenSSLVerifier(object): -
43 """Verifies the signature on a message.""" - 44 -
45 - def __init__(self, pubkey): -
46 """Constructor. - 47 - 48 Args: - 49 pubkey, OpenSSL.crypto.PKey, The public key to verify with. - 50 """ - 51 self._pubkey = pubkey -
52 -
53 - def verify(self, message, signature): -
54 """Verifies a message against a signature. - 55 - 56 Args: - 57 message: string, The message to verify. - 58 signature: string, The signature on the message. - 59 - 60 Returns: - 61 True if message was signed by the private key associated with the public - 62 key that this object was constructed with. - 63 """ - 64 try: - 65 if isinstance(message, six.text_type): - 66 message = message.encode('utf-8') - 67 crypto.verify(self._pubkey, signature, message, 'sha256') - 68 return True - 69 except: - 70 return False -
71 - 72 @staticmethod -
73 - def from_string(key_pem, is_x509_cert): -
74 """Construct a Verified instance from a string. - 75 - 76 Args: - 77 key_pem: string, public key in PEM format. - 78 is_x509_cert: bool, True if key_pem is an X509 cert, otherwise it is - 79 expected to be an RSA key in PEM format. - 80 - 81 Returns: - 82 Verifier instance. - 83 - 84 Raises: - 85 OpenSSL.crypto.Error if the key_pem can't be parsed. - 86 """ - 87 if is_x509_cert: - 88 pubkey = crypto.load_certificate(crypto.FILETYPE_PEM, key_pem) - 89 else: - 90 pubkey = crypto.load_privatekey(crypto.FILETYPE_PEM, key_pem) - 91 return OpenSSLVerifier(pubkey) -
92 -
93 - 94 - class OpenSSLSigner(object): -
95 """Signs messages with a private key.""" - 96 -
97 - def __init__(self, pkey): -
98 """Constructor. - 99 -100 Args: -101 pkey, OpenSSL.crypto.PKey (or equiv), The private key to sign with. -102 """ -103 self._key = pkey -
104 -
105 - def sign(self, message): -
106 """Signs a message. -107 -108 Args: -109 message: bytes, Message to be signed. -110 -111 Returns: -112 string, The signature of the message for the given key. -113 """ -114 if isinstance(message, six.text_type): -115 message = message.encode('utf-8') -116 return crypto.sign(self._key, message, 'sha256') -
117 -118 @staticmethod -
119 - def from_string(key, password=b'notasecret'): -
120 """Construct a Signer instance from a string. -121 -122 Args: -123 key: string, private key in PKCS12 or PEM format. -124 password: string, password for the private key file. -125 -126 Returns: -127 Signer instance. -128 -129 Raises: -130 OpenSSL.crypto.Error if the key can't be parsed. -131 """ -132 parsed_pem_key = _parse_pem_key(key) -133 if parsed_pem_key: -134 pkey = crypto.load_privatekey(crypto.FILETYPE_PEM, parsed_pem_key) -135 else: -136 if isinstance(password, six.text_type): -137 password = password.encode('utf-8') -138 pkey = crypto.load_pkcs12(key, password).get_privatekey() -139 return OpenSSLSigner(pkey) -
140 -141 except ImportError: -142 OpenSSLVerifier = None -143 OpenSSLSigner = None -144 -145 -146 try: -147 from Crypto.PublicKey import RSA -148 from Crypto.Hash import SHA256 -149 from Crypto.Signature import PKCS1_v1_5 -150 from Crypto.Util.asn1 import DerSequence -
151 -152 -153 - class PyCryptoVerifier(object): -
154 """Verifies the signature on a message.""" -155 -
156 - def __init__(self, pubkey): -
157 """Constructor. -158 -159 Args: -160 pubkey, OpenSSL.crypto.PKey (or equiv), The public key to verify with. -161 """ -162 self._pubkey = pubkey -
163 -
164 - def verify(self, message, signature): -
165 """Verifies a message against a signature. -166 -167 Args: -168 message: string, The message to verify. -169 signature: string, The signature on the message. -170 -171 Returns: -172 True if message was signed by the private key associated with the public -173 key that this object was constructed with. -174 """ -175 try: -176 return PKCS1_v1_5.new(self._pubkey).verify( -177 SHA256.new(message), signature) -178 except: -179 return False -
180 -181 @staticmethod -
182 - def from_string(key_pem, is_x509_cert): -
183 """Construct a Verified instance from a string. -184 -185 Args: -186 key_pem: string, public key in PEM format. -187 is_x509_cert: bool, True if key_pem is an X509 cert, otherwise it is -188 expected to be an RSA key in PEM format. -189 -190 Returns: -191 Verifier instance. -192 """ -193 if is_x509_cert: -194 if isinstance(key_pem, six.text_type): -195 key_pem = key_pem.encode('ascii') -196 pemLines = key_pem.replace(b' ', b'').split() -197 certDer = _urlsafe_b64decode(b''.join(pemLines[1:-1])) -198 certSeq = DerSequence() -199 certSeq.decode(certDer) -200 tbsSeq = DerSequence() -201 tbsSeq.decode(certSeq[0]) -202 pubkey = RSA.importKey(tbsSeq[6]) -203 else: -204 pubkey = RSA.importKey(key_pem) -205 return PyCryptoVerifier(pubkey) -
206 -
207 -208 - class PyCryptoSigner(object): -
209 """Signs messages with a private key.""" -210 -
211 - def __init__(self, pkey): -
212 """Constructor. -213 -214 Args: -215 pkey, OpenSSL.crypto.PKey (or equiv), The private key to sign with. -216 """ -217 self._key = pkey -
218 -
219 - def sign(self, message): -
220 """Signs a message. -221 -222 Args: -223 message: string, Message to be signed. -224 -225 Returns: -226 string, The signature of the message for the given key. -227 """ -228 if isinstance(message, six.text_type): -229 message = message.encode('utf-8') -230 return PKCS1_v1_5.new(self._key).sign(SHA256.new(message)) -
231 -232 @staticmethod -
233 - def from_string(key, password='notasecret'): -
234 """Construct a Signer instance from a string. -235 -236 Args: -237 key: string, private key in PEM format. -238 password: string, password for private key file. Unused for PEM files. -239 -240 Returns: -241 Signer instance. -242 -243 Raises: -244 NotImplementedError if they key isn't in PEM format. -245 """ -246 parsed_pem_key = _parse_pem_key(key) -247 if parsed_pem_key: -248 pkey = RSA.importKey(parsed_pem_key) -249 else: -250 raise NotImplementedError( -251 'PKCS12 format is not supported by the PyCrypto library. ' -252 'Try converting to a "PEM" ' -253 '(openssl pkcs12 -in xxxxx.p12 -nodes -nocerts > privatekey.pem) ' -254 'or using PyOpenSSL if native code is an option.') -255 return PyCryptoSigner(pkey) -
256 -257 except ImportError: -258 PyCryptoVerifier = None -259 PyCryptoSigner = None -260 -261 -262 if OpenSSLSigner: -263 Signer = OpenSSLSigner -264 Verifier = OpenSSLVerifier -265 elif PyCryptoSigner: -266 Signer = PyCryptoSigner -267 Verifier = PyCryptoVerifier -268 else: -269 raise ImportError('No encryption library found. Please install either ' -270 'PyOpenSSL, or PyCrypto 2.6 or later') -
271 -272 -273 -def _parse_pem_key(raw_key_input): -
274 """Identify and extract PEM keys. -275 -276 Determines whether the given key is in the format of PEM key, and extracts -277 the relevant part of the key if it is. -278 -279 Args: -280 raw_key_input: The contents of a private key file (either PEM or PKCS12). -281 -282 Returns: -283 string, The actual key if the contents are from a PEM file, or else None. -284 """ -285 offset = raw_key_input.find(b'-----BEGIN ') -286 if offset != -1: -287 return raw_key_input[offset:] -
288 -
289 -290 -def _urlsafe_b64encode(raw_bytes): -
291 if isinstance(raw_bytes, six.text_type): -292 raw_bytes = raw_bytes.encode('utf-8') -293 return base64.urlsafe_b64encode(raw_bytes).decode('ascii').rstrip('=') -
294 -
295 -296 -def _urlsafe_b64decode(b64string): -
297 # Guard against unicode strings, which base64 can't handle. -298 if isinstance(b64string, six.text_type): -299 b64string = b64string.encode('ascii') -300 padded = b64string + b'=' * (4 - len(b64string) % 4) -301 return base64.urlsafe_b64decode(padded) -
302 -
303 -304 -def _json_encode(data): -
305 return json.dumps(data, separators=(',', ':')) -
306 -
307 -308 -def make_signed_jwt(signer, payload): -
309 """Make a signed JWT. -310 -311 See http://self-issued.info/docs/draft-jones-json-web-token.html. -312 -313 Args: -314 signer: crypt.Signer, Cryptographic signer. -315 payload: dict, Dictionary of data to convert to JSON and then sign. -316 -317 Returns: -318 string, The JWT for the payload. -319 """ -320 header = {'typ': 'JWT', 'alg': 'RS256'} -321 -322 segments = [ -323 _urlsafe_b64encode(_json_encode(header)), -324 _urlsafe_b64encode(_json_encode(payload)), -325 ] -326 signing_input = '.'.join(segments) -327 -328 signature = signer.sign(signing_input) -329 segments.append(_urlsafe_b64encode(signature)) -330 -331 logger.debug(str(segments)) -332 -333 return '.'.join(segments) -
334 -
335 -336 -def verify_signed_jwt_with_certs(jwt, certs, audience): -
337 """Verify a JWT against public certs. -338 -339 See http://self-issued.info/docs/draft-jones-json-web-token.html. -340 -341 Args: -342 jwt: string, A JWT. -343 certs: dict, Dictionary where values of public keys in PEM format. -344 audience: string, The audience, 'aud', that this JWT should contain. If -345 None then the JWT's 'aud' parameter is not verified. -346 -347 Returns: -348 dict, The deserialized JSON payload in the JWT. -349 -350 Raises: -351 AppIdentityError if any checks are failed. -352 """ -353 segments = jwt.split('.') -354 -355 if len(segments) != 3: -356 raise AppIdentityError('Wrong number of segments in token: %s' % jwt) -357 signed = '%s.%s' % (segments[0], segments[1]) -358 -359 signature = _urlsafe_b64decode(segments[2]) -360 -361 # Parse token. -362 json_body = _urlsafe_b64decode(segments[1]) -363 try: -364 parsed = json.loads(json_body.decode('utf-8')) -365 except: -366 raise AppIdentityError('Can\'t parse token: %s' % json_body) -367 -368 # Check signature. -369 verified = False -370 for pem in certs.values(): -371 verifier = Verifier.from_string(pem, True) -372 if verifier.verify(signed, signature): -373 verified = True -374 break -375 if not verified: -376 raise AppIdentityError('Invalid token signature: %s' % jwt) -377 -378 # Check creation timestamp. -379 iat = parsed.get('iat') -380 if iat is None: -381 raise AppIdentityError('No iat field in token: %s' % json_body) -382 earliest = iat - CLOCK_SKEW_SECS -383 -384 # Check expiration timestamp. -385 now = int(time.time()) -386 exp = parsed.get('exp') -387 if exp is None: -388 raise AppIdentityError('No exp field in token: %s' % json_body) -389 if exp >= now + MAX_TOKEN_LIFETIME_SECS: -390 raise AppIdentityError('exp field too far in future: %s' % json_body) -391 latest = exp + CLOCK_SKEW_SECS -392 -393 if now < earliest: -394 raise AppIdentityError('Token used too early, %d < %d: %s' % -395 (now, earliest, json_body)) -396 if now > latest: -397 raise AppIdentityError('Token used too late, %d > %d: %s' % -398 (now, latest, json_body)) -399 -400 # Check audience. -401 if audience is not None: -402 aud = parsed.get('aud') -403 if aud is None: -404 raise AppIdentityError('No aud field in token: %s' % json_body) -405 if aud != audience: -406 raise AppIdentityError('Wrong recipient, %s != %s: %s' % -407 (aud, audience, json_body)) -408 -409 return parsed -
410 -
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.crypt.AppIdentityError-class.html b/docs/epy/oauth2client.crypt.AppIdentityError-class.html deleted file mode 100644 index 16c2139..0000000 --- a/docs/epy/oauth2client.crypt.AppIdentityError-class.html +++ /dev/null @@ -1,203 +0,0 @@ - - - - - oauth2client.crypt.AppIdentityError - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module crypt :: - Class AppIdentityError - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class AppIdentityError

source code

-
-
- - - - - - - - - - - - - - - - - - - -
-
-
- - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-

Inherited from exceptions.Exception: - __init__, - __new__ -

-

Inherited from exceptions.BaseException: - __delattr__, - __getattribute__, - __getitem__, - __getslice__, - __reduce__, - __repr__, - __setattr__, - __setstate__, - __str__, - __unicode__ -

-

Inherited from object: - __format__, - __hash__, - __reduce_ex__, - __sizeof__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from exceptions.BaseException: - args, - message -

-

Inherited from object: - __class__ -

-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.django_orm-module.html b/docs/epy/oauth2client.django_orm-module.html deleted file mode 100644 index 6c50cf7..0000000 --- a/docs/epy/oauth2client.django_orm-module.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - oauth2client.django_orm - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module django_orm - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Module django_orm

source code

-
-OAuth 2.0 utilities for Django.
-
-Utilities for using OAuth 2.0 in conjunction with
-the Django datastore.
-
-
- -
-

Author: - jcgregorio@google.com (Joe Gregorio) -

-
- - - - - - - - - - - - - - -
- - - - - -
Classes[hide private]
-
-   - - CredentialsField -
-   - - FlowField -
-   - - Storage
- Store and retrieve a single credential to and from -the datastore. -
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.django_orm-pysrc.html b/docs/epy/oauth2client.django_orm-pysrc.html deleted file mode 100644 index fad01cb..0000000 --- a/docs/epy/oauth2client.django_orm-pysrc.html +++ /dev/null @@ -1,302 +0,0 @@ - - - - - oauth2client.django_orm - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module django_orm - - - - - - -
[hide private]
[frames] | no frames]
-
-

Source Code for Module oauth2client.django_orm

-
-  1  # Copyright 2014 Google Inc. All rights reserved. 
-  2  # 
-  3  # Licensed under the Apache License, Version 2.0 (the "License"); 
-  4  # you may not use this file except in compliance with the License. 
-  5  # You may obtain a copy of the License at 
-  6  # 
-  7  #      http://www.apache.org/licenses/LICENSE-2.0 
-  8  # 
-  9  # Unless required by applicable law or agreed to in writing, software 
- 10  # distributed under the License is distributed on an "AS IS" BASIS, 
- 11  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
- 12  # See the License for the specific language governing permissions and 
- 13  # limitations under the License. 
- 14   
- 15  """OAuth 2.0 utilities for Django. 
- 16   
- 17  Utilities for using OAuth 2.0 in conjunction with 
- 18  the Django datastore. 
- 19  """ 
- 20   
- 21  __author__ = 'jcgregorio@google.com (Joe Gregorio)' 
- 22   
- 23  import oauth2client 
- 24  import base64 
- 25  import pickle 
- 26   
- 27  from django.db import models 
- 28  from oauth2client.client import Storage as BaseStorage 
- 29   
-
30 -class CredentialsField(models.Field): -
31 - 32 __metaclass__ = models.SubfieldBase - 33 -
34 - def __init__(self, *args, **kwargs): -
35 if 'null' not in kwargs: - 36 kwargs['null'] = True - 37 super(CredentialsField, self).__init__(*args, **kwargs) -
38 -
39 - def get_internal_type(self): -
40 return "TextField" -
41 -
42 - def to_python(self, value): -
43 if value is None: - 44 return None - 45 if isinstance(value, oauth2client.client.Credentials): - 46 return value - 47 return pickle.loads(base64.b64decode(value)) -
48 -
49 - def get_db_prep_value(self, value, connection, prepared=False): -
50 if value is None: - 51 return None - 52 return base64.b64encode(pickle.dumps(value)) -
53 - 54 -
55 -class FlowField(models.Field): -
56 - 57 __metaclass__ = models.SubfieldBase - 58 -
59 - def __init__(self, *args, **kwargs): -
60 if 'null' not in kwargs: - 61 kwargs['null'] = True - 62 super(FlowField, self).__init__(*args, **kwargs) -
63 -
64 - def get_internal_type(self): -
65 return "TextField" -
66 -
67 - def to_python(self, value): -
68 if value is None: - 69 return None - 70 if isinstance(value, oauth2client.client.Flow): - 71 return value - 72 return pickle.loads(base64.b64decode(value)) -
73 -
74 - def get_db_prep_value(self, value, connection, prepared=False): -
75 if value is None: - 76 return None - 77 return base64.b64encode(pickle.dumps(value)) -
78 - 79 -
80 -class Storage(BaseStorage): -
81 """Store and retrieve a single credential to and from - 82 the datastore. - 83 - 84 This Storage helper presumes the Credentials - 85 have been stored as a CredenialsField - 86 on a db model class. - 87 """ - 88 -
89 - def __init__(self, model_class, key_name, key_value, property_name): -
90 """Constructor for Storage. - 91 - 92 Args: - 93 model: db.Model, model class - 94 key_name: string, key name for the entity that has the credentials - 95 key_value: string, key value for the entity that has the credentials - 96 property_name: string, name of the property that is an CredentialsProperty - 97 """ - 98 self.model_class = model_class - 99 self.key_name = key_name -100 self.key_value = key_value -101 self.property_name = property_name -
102 -
103 - def locked_get(self): -
104 """Retrieve Credential from datastore. -105 -106 Returns: -107 oauth2client.Credentials -108 """ -109 credential = None -110 -111 query = {self.key_name: self.key_value} -112 entities = self.model_class.objects.filter(**query) -113 if len(entities) > 0: -114 credential = getattr(entities[0], self.property_name) -115 if credential and hasattr(credential, 'set_store'): -116 credential.set_store(self) -117 return credential -
118 -
119 - def locked_put(self, credentials, overwrite=False): -
120 """Write a Credentials to the datastore. -121 -122 Args: -123 credentials: Credentials, the credentials to store. -124 overwrite: Boolean, indicates whether you would like these credentials to -125 overwrite any existing stored credentials. -126 """ -127 args = {self.key_name: self.key_value} -128 -129 if overwrite: -130 entity, unused_is_new = self.model_class.objects.get_or_create(**args) -131 else: -132 entity = self.model_class(**args) -133 -134 setattr(entity, self.property_name, credentials) -135 entity.save() -
136 -
137 - def locked_delete(self): -
138 """Delete Credentials from the datastore.""" -139 -140 query = {self.key_name: self.key_value} -141 entities = self.model_class.objects.filter(**query).delete() -
142 -
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.django_orm.CredentialsField-class.html b/docs/epy/oauth2client.django_orm.CredentialsField-class.html deleted file mode 100644 index 74105a7..0000000 --- a/docs/epy/oauth2client.django_orm.CredentialsField-class.html +++ /dev/null @@ -1,231 +0,0 @@ - - - - - oauth2client.django_orm.CredentialsField - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module django_orm :: - Class CredentialsField - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class CredentialsField

source code

-
-
- - - - - - - - -
-
-
- - - - - - - - - - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-   - - - - - - -
__init__(self, - *args, - **kwargs) - source code - -
- -
-   - - - - - - -
get_internal_type(self) - source code - -
- -
-   - - - - - - -
to_python(self, - value) - source code - -
- -
-   - - - - - - -
get_db_prep_value(self, - value, - connection, - prepared=False) - source code - -
- -
- - - - - - - - - -
- - - - - -
Class Variables[hide private]
-
-   - - __metaclass__ = models.SubfieldBase -
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.django_orm.FlowField-class.html b/docs/epy/oauth2client.django_orm.FlowField-class.html deleted file mode 100644 index 99e5e8e..0000000 --- a/docs/epy/oauth2client.django_orm.FlowField-class.html +++ /dev/null @@ -1,231 +0,0 @@ - - - - - oauth2client.django_orm.FlowField - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module django_orm :: - Class FlowField - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class FlowField

source code

-
-
- - - - - - - - -
-
-
- - - - - - - - - - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-   - - - - - - -
__init__(self, - *args, - **kwargs) - source code - -
- -
-   - - - - - - -
get_internal_type(self) - source code - -
- -
-   - - - - - - -
to_python(self, - value) - source code - -
- -
-   - - - - - - -
get_db_prep_value(self, - value, - connection, - prepared=False) - source code - -
- -
- - - - - - - - - -
- - - - - -
Class Variables[hide private]
-
-   - - __metaclass__ = models.SubfieldBase -
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.django_orm.Storage-class.html b/docs/epy/oauth2client.django_orm.Storage-class.html deleted file mode 100644 index 92b7453..0000000 --- a/docs/epy/oauth2client.django_orm.Storage-class.html +++ /dev/null @@ -1,415 +0,0 @@ - - - - - oauth2client.django_orm.Storage - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module django_orm :: - Class Storage - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class Storage

source code

-
-
- - - - - - - - - - - - - -
-
-
-
-Store and retrieve a single credential to and from
-the datastore.
-
-This Storage helper presumes the Credentials
-have been stored as a CredenialsField
-on a db model class.
-
-
- - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-   - - - - - - -
__init__(self, - model_class, - key_name, - key_value, - property_name)
- Constructor for Storage.
- source code - -
- -
-   - - - - - - -
locked_get(self)
- Retrieve Credential from datastore.
- source code - -
- -
-   - - - - - - -
locked_put(self, - credentials, - overwrite=False)
- Write a Credentials to the datastore.
- source code - -
- -
-   - - - - - - -
locked_delete(self)
- Delete Credentials from the datastore.
- source code - -
- -
-

Inherited from client.Storage: - acquire_lock, - delete, - get, - put, - release_lock -

-

Inherited from object: - __delattr__, - __format__, - __getattribute__, - __hash__, - __new__, - __reduce__, - __reduce_ex__, - __repr__, - __setattr__, - __sizeof__, - __str__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from object: - __class__ -

-
- - - - - - -
- - - - - -
Method Details[hide private]
-
- -
- -
- - -
-

__init__(self, - model_class, - key_name, - key_value, - property_name) -
(Constructor) -

-
source code  -
- -
-Constructor for Storage.
-
-Args:
-  model: db.Model, model class
-  key_name: string, key name for the entity that has the credentials
-  key_value: string, key value for the entity that has the credentials
-  property_name: string, name of the property that is an CredentialsProperty
-
-
-
-
Overrides: - object.__init__ -
-
-
-
- -
- -
- - -
-

locked_get(self) -

-
source code  -
- -
-Retrieve Credential from datastore.
-
-Returns:
-  oauth2client.Credentials
-
-
-
-
Overrides: - client.Storage.locked_get -
-
-
-
- -
- -
- - -
-

locked_put(self, - credentials, - overwrite=False) -

-
source code  -
- -
-Write a Credentials to the datastore.
-
-Args:
-  credentials: Credentials, the credentials to store.
-  overwrite: Boolean, indicates whether you would like these credentials to
-                      overwrite any existing stored credentials.
-
-
-
-
Overrides: - client.Storage.locked_put -
-
-
-
- -
- -
- - -
-

locked_delete(self) -

-
source code  -
- -
-Delete Credentials from the datastore.
-
-
-
-
Overrides: - client.Storage.locked_delete -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.file-module.html b/docs/epy/oauth2client.file-module.html deleted file mode 100644 index b061388..0000000 --- a/docs/epy/oauth2client.file-module.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - oauth2client.file - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module file - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Module file

source code

-
-Utilities for OAuth.
-
-Utilities for making it easier to work with OAuth 2.0
-credentials.
-
-
- -
-

Author: - jcgregorio@google.com (Joe Gregorio) -

-
- - - - - - - - - - - -
- - - - - -
Classes[hide private]
-
-   - - CredentialsFileSymbolicLinkError
- Credentials files must not be symbolic links. -
-   - - Storage
- Store and retrieve a single credential to and from a file. -
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.file-pysrc.html b/docs/epy/oauth2client.file-pysrc.html deleted file mode 100644 index 67b0171..0000000 --- a/docs/epy/oauth2client.file-pysrc.html +++ /dev/null @@ -1,252 +0,0 @@ - - - - - oauth2client.file - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module file - - - - - - -
[hide private]
[frames] | no frames]
-
-

Source Code for Module oauth2client.file

-
-  1  # Copyright 2014 Google Inc. All rights reserved. 
-  2  # 
-  3  # Licensed under the Apache License, Version 2.0 (the "License"); 
-  4  # you may not use this file except in compliance with the License. 
-  5  # You may obtain a copy of the License at 
-  6  # 
-  7  #      http://www.apache.org/licenses/LICENSE-2.0 
-  8  # 
-  9  # Unless required by applicable law or agreed to in writing, software 
- 10  # distributed under the License is distributed on an "AS IS" BASIS, 
- 11  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
- 12  # See the License for the specific language governing permissions and 
- 13  # limitations under the License. 
- 14   
- 15  """Utilities for OAuth. 
- 16   
- 17  Utilities for making it easier to work with OAuth 2.0 
- 18  credentials. 
- 19  """ 
- 20   
- 21  __author__ = 'jcgregorio@google.com (Joe Gregorio)' 
- 22   
- 23  import os 
- 24  import threading 
- 25   
- 26  from oauth2client.client import Credentials 
- 27  from oauth2client.client import Storage as BaseStorage 
- 28   
- 29   
-
30 -class CredentialsFileSymbolicLinkError(Exception): -
31 """Credentials files must not be symbolic links.""" -
32 - 33 -
34 -class Storage(BaseStorage): -
35 """Store and retrieve a single credential to and from a file.""" - 36 -
37 - def __init__(self, filename): -
38 self._filename = filename - 39 self._lock = threading.Lock() -
40 -
41 - def _validate_file(self): -
42 if os.path.islink(self._filename): - 43 raise CredentialsFileSymbolicLinkError( - 44 'File: %s is a symbolic link.' % self._filename) -
45 -
46 - def acquire_lock(self): -
47 """Acquires any lock necessary to access this Storage. - 48 - 49 This lock is not reentrant.""" - 50 self._lock.acquire() -
51 -
52 - def release_lock(self): -
53 """Release the Storage lock. - 54 - 55 Trying to release a lock that isn't held will result in a - 56 RuntimeError. - 57 """ - 58 self._lock.release() -
59 -
60 - def locked_get(self): -
61 """Retrieve Credential from file. - 62 - 63 Returns: - 64 oauth2client.client.Credentials - 65 - 66 Raises: - 67 CredentialsFileSymbolicLinkError if the file is a symbolic link. - 68 """ - 69 credentials = None - 70 self._validate_file() - 71 try: - 72 f = open(self._filename, 'rb') - 73 content = f.read() - 74 f.close() - 75 except IOError: - 76 return credentials - 77 - 78 try: - 79 credentials = Credentials.new_from_json(content) - 80 credentials.set_store(self) - 81 except ValueError: - 82 pass - 83 - 84 return credentials -
85 -
86 - def _create_file_if_needed(self): -
87 """Create an empty file if necessary. - 88 - 89 This method will not initialize the file. Instead it implements a - 90 simple version of "touch" to ensure the file has been created. - 91 """ - 92 if not os.path.exists(self._filename): - 93 old_umask = os.umask(0o177) - 94 try: - 95 open(self._filename, 'a+b').close() - 96 finally: - 97 os.umask(old_umask) -
98 -
99 - def locked_put(self, credentials): -
100 """Write Credentials to file. -101 -102 Args: -103 credentials: Credentials, the credentials to store. -104 -105 Raises: -106 CredentialsFileSymbolicLinkError if the file is a symbolic link. -107 """ -108 -109 self._create_file_if_needed() -110 self._validate_file() -111 f = open(self._filename, 'w') -112 f.write(credentials.to_json()) -113 f.close() -
114 -
115 - def locked_delete(self): -
116 """Delete Credentials file. -117 -118 Args: -119 credentials: Credentials, the credentials to store. -120 """ -121 -122 os.unlink(self._filename) -
123 -
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.file.CredentialsFileSymbolicLinkError-class.html b/docs/epy/oauth2client.file.CredentialsFileSymbolicLinkError-class.html deleted file mode 100644 index e046e30..0000000 --- a/docs/epy/oauth2client.file.CredentialsFileSymbolicLinkError-class.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - oauth2client.file.CredentialsFileSymbolicLinkError - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module file :: - Class CredentialsFileSymbolicLinkError - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class CredentialsFileSymbolicLinkError

source code

-
-
- - - - - - - - - - - - - - - - - - - -
-
-
-
-Credentials files must not be symbolic links.
-
-
- - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-

Inherited from exceptions.Exception: - __init__, - __new__ -

-

Inherited from exceptions.BaseException: - __delattr__, - __getattribute__, - __getitem__, - __getslice__, - __reduce__, - __repr__, - __setattr__, - __setstate__, - __str__, - __unicode__ -

-

Inherited from object: - __format__, - __hash__, - __reduce_ex__, - __sizeof__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from exceptions.BaseException: - args, - message -

-

Inherited from object: - __class__ -

-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.file.Storage-class.html b/docs/epy/oauth2client.file.Storage-class.html deleted file mode 100644 index 26a5daf..0000000 --- a/docs/epy/oauth2client.file.Storage-class.html +++ /dev/null @@ -1,549 +0,0 @@ - - - - - oauth2client.file.Storage - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module file :: - Class Storage - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class Storage

source code

-
-
- - - - - - - - - - - - - -
-
-
-
-Store and retrieve a single credential to and from a file.
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-   - - - - - - -
__init__(self, - filename)
- x.__init__(...) initializes x; see help(type(x)) for signature
- source code - -
- -
-   - - - - - - -
_validate_file(self) - source code - -
- -
-   - - - - - - -
acquire_lock(self)
- Acquires any lock necessary to access this Storage.
- source code - -
- -
-   - - - - - - -
release_lock(self)
- Release the Storage lock.
- source code - -
- -
-   - - - - - - -
locked_get(self)
- Retrieve Credential from file.
- source code - -
- -
-   - - - - - - -
_create_file_if_needed(self)
- Create an empty file if necessary.
- source code - -
- -
-   - - - - - - -
locked_put(self, - credentials)
- Write Credentials to file.
- source code - -
- -
-   - - - - - - -
locked_delete(self)
- Delete Credentials file.
- source code - -
- -
-

Inherited from client.Storage: - delete, - get, - put -

-

Inherited from object: - __delattr__, - __format__, - __getattribute__, - __hash__, - __new__, - __reduce__, - __reduce_ex__, - __repr__, - __setattr__, - __sizeof__, - __str__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from object: - __class__ -

-
- - - - - - -
- - - - - -
Method Details[hide private]
-
- -
- -
- - -
-

__init__(self, - filename) -
(Constructor) -

-
source code  -
- -
-x.__init__(...) initializes x; see help(type(x)) for signature
-
-
-
-
Overrides: - object.__init__ -
(inherited documentation)
- -
-
-
- -
- -
- - -
-

acquire_lock(self) -

-
source code  -
- -
-Acquires any lock necessary to access this Storage.
-
-This lock is not reentrant.
-
-
-
-
Overrides: - client.Storage.acquire_lock -
-
-
-
- -
- -
- - -
-

release_lock(self) -

-
source code  -
- -
-Release the Storage lock.
-
-Trying to release a lock that isn't held will result in a
-RuntimeError.
-
-
-
-
Overrides: - client.Storage.release_lock -
-
-
-
- -
- -
- - -
-

locked_get(self) -

-
source code  -
- -
-Retrieve Credential from file.
-
-Returns:
-  oauth2client.client.Credentials
-
-Raises:
-  CredentialsFileSymbolicLinkError if the file is a symbolic link.
-
-
-
-
Overrides: - client.Storage.locked_get -
-
-
-
- -
- -
- - -
-

_create_file_if_needed(self) -

-
source code  -
- -
-Create an empty file if necessary.
-
-This method will not initialize the file. Instead it implements a
-simple version of "touch" to ensure the file has been created.
-
-
-
-
-
-
- -
- -
- - -
-

locked_put(self, - credentials) -

-
source code  -
- -
-Write Credentials to file.
-
-Args:
-  credentials: Credentials, the credentials to store.
-
-Raises:
-  CredentialsFileSymbolicLinkError if the file is a symbolic link.
-
-
-
-
Overrides: - client.Storage.locked_put -
-
-
-
- -
- -
- - -
-

locked_delete(self) -

-
source code  -
- -
-Delete Credentials file.
-
-Args:
-  credentials: Credentials, the credentials to store.
-
-
-
-
Overrides: - client.Storage.locked_delete -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.gce-module.html b/docs/epy/oauth2client.gce-module.html deleted file mode 100644 index a99cc96..0000000 --- a/docs/epy/oauth2client.gce-module.html +++ /dev/null @@ -1,212 +0,0 @@ - - - - - oauth2client.gce - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module gce - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Module gce

source code

-
-Utilities for Google Compute Engine
-
-Utilities for making it easier to use OAuth 2.0 on Google Compute Engine.
-
-
- -
-

Author: - jcgregorio@google.com (Joe Gregorio) -

-
- - - - - - - - -
- - - - - -
Classes[hide private]
-
-   - - AppAssertionCredentials
- Credentials object for Compute Engine Assertion Grants -
- - - - - - - - - - - - -
- - - - - -
Variables[hide private]
-
-   - - logger = logging.getLogger(__name__) -
-   - - META = 'http://metadata.google.internal/0.1/meta-data/service-... -
- - - - - - -
- - - - - -
Variables Details[hide private]
-
- -
- -
-

META

- -
-
-
-
Value:
-
-'http://metadata.google.internal/0.1/meta-data/service-accounts/' 'def\
-ault/acquire{?scope}'
-
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.gce-pysrc.html b/docs/epy/oauth2client.gce-pysrc.html deleted file mode 100644 index 0af8b6a..0000000 --- a/docs/epy/oauth2client.gce-pysrc.html +++ /dev/null @@ -1,246 +0,0 @@ - - - - - oauth2client.gce - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module gce - - - - - - -
[hide private]
[frames] | no frames]
-
-

Source Code for Module oauth2client.gce

-
-  1  # Copyright 2014 Google Inc. All rights reserved. 
-  2  # 
-  3  # Licensed under the Apache License, Version 2.0 (the "License"); 
-  4  # you may not use this file except in compliance with the License. 
-  5  # You may obtain a copy of the License at 
-  6  # 
-  7  #      http://www.apache.org/licenses/LICENSE-2.0 
-  8  # 
-  9  # Unless required by applicable law or agreed to in writing, software 
- 10  # distributed under the License is distributed on an "AS IS" BASIS, 
- 11  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
- 12  # See the License for the specific language governing permissions and 
- 13  # limitations under the License. 
- 14   
- 15  """Utilities for Google Compute Engine 
- 16   
- 17  Utilities for making it easier to use OAuth 2.0 on Google Compute Engine. 
- 18  """ 
- 19   
- 20  __author__ = 'jcgregorio@google.com (Joe Gregorio)' 
- 21   
- 22  import json 
- 23  import logging 
- 24  from six.moves import urllib 
- 25   
- 26  from oauth2client import util 
- 27  from oauth2client.client import AccessTokenRefreshError 
- 28  from oauth2client.client import AssertionCredentials 
- 29   
- 30  logger = logging.getLogger(__name__) 
- 31   
- 32  # URI Template for the endpoint that returns access_tokens. 
- 33  META = ('http://metadata.google.internal/0.1/meta-data/service-accounts/' 
- 34          'default/acquire{?scope}') 
-
35 - 36 - 37 -class AppAssertionCredentials(AssertionCredentials): -
38 """Credentials object for Compute Engine Assertion Grants - 39 - 40 This object will allow a Compute Engine instance to identify itself to - 41 Google and other OAuth 2.0 servers that can verify assertions. It can be used - 42 for the purpose of accessing data stored under an account assigned to the - 43 Compute Engine instance itself. - 44 - 45 This credential does not require a flow to instantiate because it represents - 46 a two legged flow, and therefore has all of the required information to - 47 generate and refresh its own access tokens. - 48 """ - 49 - 50 @util.positional(2) -
51 - def __init__(self, scope, **kwargs): -
52 """Constructor for AppAssertionCredentials - 53 - 54 Args: - 55 scope: string or iterable of strings, scope(s) of the credentials being - 56 requested. - 57 """ - 58 self.scope = util.scopes_to_string(scope) - 59 self.kwargs = kwargs - 60 - 61 # Assertion type is no longer used, but still in the parent class signature. - 62 super(AppAssertionCredentials, self).__init__(None) -
63 - 64 @classmethod -
65 - def from_json(cls, json_data): -
66 data = json.loads(json_data) - 67 return AppAssertionCredentials(data['scope']) -
68 -
69 - def _refresh(self, http_request): -
70 """Refreshes the access_token. - 71 - 72 Skip all the storage hoops and just refresh using the API. - 73 - 74 Args: - 75 http_request: callable, a callable that matches the method signature of - 76 httplib2.Http.request, used to make the refresh request. - 77 - 78 Raises: - 79 AccessTokenRefreshError: When the refresh fails. - 80 """ - 81 query = '?scope=%s' % urllib.parse.quote(self.scope, '') - 82 uri = META.replace('{?scope}', query) - 83 response, content = http_request(uri) - 84 if response.status == 200: - 85 try: - 86 d = json.loads(content) - 87 except Exception as e: - 88 raise AccessTokenRefreshError(str(e)) - 89 self.access_token = d['accessToken'] - 90 else: - 91 if response.status == 404: - 92 content += (' This can occur if a VM was created' - 93 ' with no service account or scopes.') - 94 raise AccessTokenRefreshError(content) -
95 - 96 @property -
97 - def serialization_data(self): -
98 raise NotImplementedError( - 99 'Cannot serialize credentials for GCE service accounts.') -
100 -
101 - def create_scoped_required(self): -
102 return not self.scope -
103 -
104 - def create_scoped(self, scopes): -
105 return AppAssertionCredentials(scopes, **self.kwargs) -
106 -
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.gce.AppAssertionCredentials-class.html b/docs/epy/oauth2client.gce.AppAssertionCredentials-class.html deleted file mode 100644 index f62ce72..0000000 --- a/docs/epy/oauth2client.gce.AppAssertionCredentials-class.html +++ /dev/null @@ -1,634 +0,0 @@ - - - - - oauth2client.gce.AppAssertionCredentials - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module gce :: - Class AppAssertionCredentials - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class AppAssertionCredentials

source code

-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-Credentials object for Compute Engine Assertion Grants
-
-This object will allow a Compute Engine instance to identify itself to
-Google and other OAuth 2.0 servers that can verify assertions. It can be used
-for the purpose of accessing data stored under an account assigned to the
-Compute Engine instance itself.
-
-This credential does not require a flow to instantiate because it represents
-a two legged flow, and therefore has all of the required information to
-generate and refresh its own access tokens.
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-   - - - - - - -
__init__(self, - scope, - **kwargs)
- Constructor for AppAssertionCredentials
- source code - -
- -
-   - - - - - - -
_refresh(self, - http_request)
- Refreshes the access_token.
- source code - -
- -
-   - - - - - - -
serialization_data(self)
- Get the fields and their values identifying the current credentials.
- source code - -
- -
-   - - - - - - -
create_scoped_required(self)
- Whether this Credentials object is scopeless.
- source code - -
- -
-   - - - - - - -
create_scoped(self, - scopes)
- Create a Credentials object for the given scopes.
- source code - -
- -
- -

Inherited from client.OAuth2Credentials: - __getstate__, - __setstate__, - access_token_expired, - apply, - authorize, - get_access_token, - refresh, - revoke, - set_store, - to_json -

- -

Inherited from client.Credentials (private): - _to_json -

-

Inherited from object: - __delattr__, - __format__, - __getattribute__, - __hash__, - __new__, - __reduce__, - __reduce_ex__, - __repr__, - __setattr__, - __sizeof__, - __str__, - __subclasshook__ -

-
- - - - - - - - - - - - -
- - - - - -
Class Methods[hide private]
-
-   - - - - - - -
from_json(cls, - json_data)
- Instantiate a Credentials object from a JSON description of it.
- source code - -
- -
-

Inherited from client.Credentials: - new_from_json -

-
- - - - - - - - - -
- - - - - -
Static Methods[hide private]
-
-

Inherited from client.GoogleCredentials: - from_stream, - get_application_default -

-
- - - - - - - - - -
- - - - - -
Class Variables[hide private]
-
-

Inherited from client.Credentials: - NON_SERIALIZED_MEMBERS -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from object: - __class__ -

-
- - - - - - -
- - - - - -
Method Details[hide private]
-
- -
- -
- - -
-

__init__(self, - scope, - **kwargs) -
(Constructor) -

-
source code  -
- -
-Constructor for AppAssertionCredentials
-
-Args:
-  scope: string or iterable of strings, scope(s) of the credentials being
-    requested.
-
-
-
-
Decorators:
-
    -
  • @util.positional(2)
  • -
-
Overrides: - object.__init__ -
-
-
-
- -
- -
- - -
-

from_json(cls, - json_data) -
Class Method -

-
source code  -
- -
-Instantiate a Credentials object from a JSON description of it. The JSON
-should have been produced by calling .to_json() on the object.
-
-Args:
-  data: dict, A deserialized JSON object.
-
-Returns:
-  An instance of a Credentials subclass.
-
-
-
-
Overrides: - client.Credentials.from_json -
(inherited documentation)
- -
-
-
- -
- -
- - -
-

_refresh(self, - http_request) -

-
source code  -
- -
-Refreshes the access_token.
-
-Skip all the storage hoops and just refresh using the API.
-
-Args:
-  http_request: callable, a callable that matches the method signature of
-    httplib2.Http.request, used to make the refresh request.
-
-Raises:
-  AccessTokenRefreshError: When the refresh fails.
-
-
-
-
Overrides: - client.OAuth2Credentials._refresh -
-
-
-
- -
- -
- - -
-

serialization_data(self) -

-
source code  -
- -
-Get the fields and their values identifying the current credentials.
-
-
-
-
Decorators:
-
    -
  • @property
  • -
-
Overrides: - client.GoogleCredentials.serialization_data -
(inherited documentation)
- -
-
-
- -
- -
- - -
-

create_scoped_required(self) -

-
source code  -
- -
-Whether this Credentials object is scopeless.
-
-create_scoped(scopes) method needs to be called in order to create
-a Credentials object for API calls.
-
-
-
-
Overrides: - client.GoogleCredentials.create_scoped_required -
(inherited documentation)
- -
-
-
- -
- -
- - -
-

create_scoped(self, - scopes) -

-
source code  -
- -
-Create a Credentials object for the given scopes.
-
-The Credentials type is preserved.
-
-
-
-
Overrides: - client.GoogleCredentials.create_scoped -
(inherited documentation)
- -
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.keyring_storage-module.html b/docs/epy/oauth2client.keyring_storage-module.html deleted file mode 100644 index 6afddaf..0000000 --- a/docs/epy/oauth2client.keyring_storage-module.html +++ /dev/null @@ -1,141 +0,0 @@ - - - - - oauth2client.keyring_storage - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module keyring_storage - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Module keyring_storage

source code

-
-A keyring based Storage.
-
-A Storage for Credentials that uses the keyring module.
-
-
- -
-

Author: - jcgregorio@google.com (Joe Gregorio) -

-
- - - - - - - - -
- - - - - -
Classes[hide private]
-
-   - - Storage
- Store and retrieve a single credential to and from the keyring. -
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.keyring_storage-pysrc.html b/docs/epy/oauth2client.keyring_storage-pysrc.html deleted file mode 100644 index 77a371e..0000000 --- a/docs/epy/oauth2client.keyring_storage-pysrc.html +++ /dev/null @@ -1,235 +0,0 @@ - - - - - oauth2client.keyring_storage - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module keyring_storage - - - - - - -
[hide private]
[frames] | no frames]
-
-

Source Code for Module oauth2client.keyring_storage

-
-  1  # Copyright 2014 Google Inc. All rights reserved. 
-  2  # 
-  3  # Licensed under the Apache License, Version 2.0 (the "License"); 
-  4  # you may not use this file except in compliance with the License. 
-  5  # You may obtain a copy of the License at 
-  6  # 
-  7  #      http://www.apache.org/licenses/LICENSE-2.0 
-  8  # 
-  9  # Unless required by applicable law or agreed to in writing, software 
- 10  # distributed under the License is distributed on an "AS IS" BASIS, 
- 11  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
- 12  # See the License for the specific language governing permissions and 
- 13  # limitations under the License. 
- 14   
- 15  """A keyring based Storage. 
- 16   
- 17  A Storage for Credentials that uses the keyring module. 
- 18  """ 
- 19   
- 20  __author__ = 'jcgregorio@google.com (Joe Gregorio)' 
- 21   
- 22  import threading 
- 23   
- 24  import keyring 
- 25   
- 26  from oauth2client.client import Credentials 
- 27  from oauth2client.client import Storage as BaseStorage 
- 28   
- 29   
-
30 -class Storage(BaseStorage): -
31 """Store and retrieve a single credential to and from the keyring. - 32 - 33 To use this module you must have the keyring module installed. See - 34 <http://pypi.python.org/pypi/keyring/>. This is an optional module and is not - 35 installed with oauth2client by default because it does not work on all the - 36 platforms that oauth2client supports, such as Google App Engine. - 37 - 38 The keyring module <http://pypi.python.org/pypi/keyring/> is a cross-platform - 39 library for access the keyring capabilities of the local system. The user will - 40 be prompted for their keyring password when this module is used, and the - 41 manner in which the user is prompted will vary per platform. - 42 - 43 Usage: - 44 from oauth2client.keyring_storage import Storage - 45 - 46 s = Storage('name_of_application', 'user1') - 47 credentials = s.get() - 48 - 49 """ - 50 -
51 - def __init__(self, service_name, user_name): -
52 """Constructor. - 53 - 54 Args: - 55 service_name: string, The name of the service under which the credentials - 56 are stored. - 57 user_name: string, The name of the user to store credentials for. - 58 """ - 59 self._service_name = service_name - 60 self._user_name = user_name - 61 self._lock = threading.Lock() -
62 -
63 - def acquire_lock(self): -
64 """Acquires any lock necessary to access this Storage. - 65 - 66 This lock is not reentrant.""" - 67 self._lock.acquire() -
68 -
69 - def release_lock(self): -
70 """Release the Storage lock. - 71 - 72 Trying to release a lock that isn't held will result in a - 73 RuntimeError. - 74 """ - 75 self._lock.release() -
76 -
77 - def locked_get(self): -
78 """Retrieve Credential from file. - 79 - 80 Returns: - 81 oauth2client.client.Credentials - 82 """ - 83 credentials = None - 84 content = keyring.get_password(self._service_name, self._user_name) - 85 - 86 if content is not None: - 87 try: - 88 credentials = Credentials.new_from_json(content) - 89 credentials.set_store(self) - 90 except ValueError: - 91 pass - 92 - 93 return credentials -
94 -
95 - def locked_put(self, credentials): -
96 """Write Credentials to file. - 97 - 98 Args: - 99 credentials: Credentials, the credentials to store. -100 """ -101 keyring.set_password(self._service_name, self._user_name, -102 credentials.to_json()) -
103 -
104 - def locked_delete(self): -
105 """Delete Credentials file. -106 -107 Args: -108 credentials: Credentials, the credentials to store. -109 """ -110 keyring.set_password(self._service_name, self._user_name, '') -
111 -
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.keyring_storage.Storage-class.html b/docs/epy/oauth2client.keyring_storage.Storage-class.html deleted file mode 100644 index 2ddf9b9..0000000 --- a/docs/epy/oauth2client.keyring_storage.Storage-class.html +++ /dev/null @@ -1,507 +0,0 @@ - - - - - oauth2client.keyring_storage.Storage - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module keyring_storage :: - Class Storage - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class Storage

source code

-
-
- - - - - - - - - - - - - -
-
-
-
-Store and retrieve a single credential to and from the keyring.
-
-To use this module you must have the keyring module installed. See
-<http://pypi.python.org/pypi/keyring/>. This is an optional module and is not
-installed with oauth2client by default because it does not work on all the
-platforms that oauth2client supports, such as Google App Engine.
-
-The keyring module <http://pypi.python.org/pypi/keyring/> is a cross-platform
-library for access the keyring capabilities of the local system. The user will
-be prompted for their keyring password when this module is used, and the
-manner in which the user is prompted will vary per platform.
-
-Usage:
-  from oauth2client.keyring_storage import Storage
-
-  s = Storage('name_of_application', 'user1')
-  credentials = s.get()
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-   - - - - - - -
__init__(self, - service_name, - user_name)
- Constructor.
- source code - -
- -
-   - - - - - - -
acquire_lock(self)
- Acquires any lock necessary to access this Storage.
- source code - -
- -
-   - - - - - - -
release_lock(self)
- Release the Storage lock.
- source code - -
- -
-   - - - - - - -
locked_get(self)
- Retrieve Credential from file.
- source code - -
- -
-   - - - - - - -
locked_put(self, - credentials)
- Write Credentials to file.
- source code - -
- -
-   - - - - - - -
locked_delete(self)
- Delete Credentials file.
- source code - -
- -
-

Inherited from client.Storage: - delete, - get, - put -

-

Inherited from object: - __delattr__, - __format__, - __getattribute__, - __hash__, - __new__, - __reduce__, - __reduce_ex__, - __repr__, - __setattr__, - __sizeof__, - __str__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from object: - __class__ -

-
- - - - - - -
- - - - - -
Method Details[hide private]
-
- -
- -
- - -
-

__init__(self, - service_name, - user_name) -
(Constructor) -

-
source code  -
- -
-Constructor.
-
-Args:
-  service_name: string, The name of the service under which the credentials
-    are stored.
-  user_name: string, The name of the user to store credentials for.
-
-
-
-
Overrides: - object.__init__ -
-
-
-
- -
- -
- - -
-

acquire_lock(self) -

-
source code  -
- -
-Acquires any lock necessary to access this Storage.
-
-This lock is not reentrant.
-
-
-
-
Overrides: - client.Storage.acquire_lock -
-
-
-
- -
- -
- - -
-

release_lock(self) -

-
source code  -
- -
-Release the Storage lock.
-
-Trying to release a lock that isn't held will result in a
-RuntimeError.
-
-
-
-
Overrides: - client.Storage.release_lock -
-
-
-
- -
- -
- - -
-

locked_get(self) -

-
source code  -
- -
-Retrieve Credential from file.
-
-Returns:
-  oauth2client.client.Credentials
-
-
-
-
Overrides: - client.Storage.locked_get -
-
-
-
- -
- -
- - -
-

locked_put(self, - credentials) -

-
source code  -
- -
-Write Credentials to file.
-
-Args:
-  credentials: Credentials, the credentials to store.
-
-
-
-
Overrides: - client.Storage.locked_put -
-
-
-
- -
- -
- - -
-

locked_delete(self) -

-
source code  -
- -
-Delete Credentials file.
-
-Args:
-  credentials: Credentials, the credentials to store.
-
-
-
-
Overrides: - client.Storage.locked_delete -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.locked_file-module.html b/docs/epy/oauth2client.locked_file-module.html deleted file mode 100644 index 71c377c..0000000 --- a/docs/epy/oauth2client.locked_file-module.html +++ /dev/null @@ -1,257 +0,0 @@ - - - - - oauth2client.locked_file - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module locked_file - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Module locked_file

source code

-
-Locked file interface that should work on Unix and Windows pythons.
-
-This module first tries to use fcntl locking to ensure serialized access
-to a file, then falls back on a lock file if that is unavialable.
-
-Usage:
-    f = LockedFile('filename', 'r+b', 'rb')
-    f.open_and_lock()
-    if f.is_locked():
-      print('Acquired filename with r+b mode')
-      f.file_handle().write('locked data')
-    else:
-      print('Acquired filename with rb mode')
-    f.unlock_and_close()
-
-
- -
-

Author: - cache@google.com (David T McWherter) -

-
- - - - - - - - - - - - - - - - - - - - -
- - - - - -
Classes[hide private]
-
-   - - CredentialsFileSymbolicLinkError
- Credentials files must not be symbolic links. -
-   - - AlreadyLockedException
- Trying to lock a file that has already been locked by the LockedFile. -
-   - - _Opener
- Base class for different locking primitives. -
-   - - _PosixOpener
- Lock files using Posix advisory lock files. -
-   - - LockedFile
- Represent a file that has exclusive access. -
- - - - - - - - - -
- - - - - -
Functions[hide private]
-
-   - - - - - - -
validate_file(filename) - source code - -
- -
- - - - - - - - - - - - - - - -
- - - - - -
Variables[hide private]
-
-   - - logger = logging.getLogger(__name__) -
-   - - _FcntlOpener = None -
-   - - _Win32Opener = None -
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.locked_file-pysrc.html b/docs/epy/oauth2client.locked_file-pysrc.html deleted file mode 100644 index 030c12f..0000000 --- a/docs/epy/oauth2client.locked_file-pysrc.html +++ /dev/null @@ -1,525 +0,0 @@ - - - - - oauth2client.locked_file - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module locked_file - - - - - - -
[hide private]
[frames] | no frames]
-
-

Source Code for Module oauth2client.locked_file

-
-  1  # Copyright 2014 Google Inc. All rights reserved. 
-  2  # 
-  3  # Licensed under the Apache License, Version 2.0 (the "License"); 
-  4  # you may not use this file except in compliance with the License. 
-  5  # You may obtain a copy of the License at 
-  6  # 
-  7  #      http://www.apache.org/licenses/LICENSE-2.0 
-  8  # 
-  9  # Unless required by applicable law or agreed to in writing, software 
- 10  # distributed under the License is distributed on an "AS IS" BASIS, 
- 11  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
- 12  # See the License for the specific language governing permissions and 
- 13  # limitations under the License. 
- 14   
- 15  """Locked file interface that should work on Unix and Windows pythons. 
- 16   
- 17  This module first tries to use fcntl locking to ensure serialized access 
- 18  to a file, then falls back on a lock file if that is unavialable. 
- 19   
- 20  Usage: 
- 21      f = LockedFile('filename', 'r+b', 'rb') 
- 22      f.open_and_lock() 
- 23      if f.is_locked(): 
- 24        print('Acquired filename with r+b mode') 
- 25        f.file_handle().write('locked data') 
- 26      else: 
- 27        print('Acquired filename with rb mode') 
- 28      f.unlock_and_close() 
- 29  """ 
- 30   
- 31  from __future__ import print_function 
- 32   
- 33  __author__ = 'cache@google.com (David T McWherter)' 
- 34   
- 35  import errno 
- 36  import logging 
- 37  import os 
- 38  import time 
- 39   
- 40  from oauth2client import util 
- 41   
- 42  logger = logging.getLogger(__name__) 
-
43 - 44 - 45 -class CredentialsFileSymbolicLinkError(Exception): -
46 """Credentials files must not be symbolic links.""" -
47 -
48 - 49 -class AlreadyLockedException(Exception): -
50 """Trying to lock a file that has already been locked by the LockedFile.""" - 51 pass -
52 -
53 - 54 -def validate_file(filename): -
55 if os.path.islink(filename): - 56 raise CredentialsFileSymbolicLinkError( - 57 'File: %s is a symbolic link.' % filename) -
58 -
59 -class _Opener(object): -
60 """Base class for different locking primitives.""" - 61 -
62 - def __init__(self, filename, mode, fallback_mode): -
63 """Create an Opener. - 64 - 65 Args: - 66 filename: string, The pathname of the file. - 67 mode: string, The preferred mode to access the file with. - 68 fallback_mode: string, The mode to use if locking fails. - 69 """ - 70 self._locked = False - 71 self._filename = filename - 72 self._mode = mode - 73 self._fallback_mode = fallback_mode - 74 self._fh = None - 75 self._lock_fd = None -
76 -
77 - def is_locked(self): -
78 """Was the file locked.""" - 79 return self._locked -
80 -
81 - def file_handle(self): -
82 """The file handle to the file. Valid only after opened.""" - 83 return self._fh -
84 -
85 - def filename(self): -
86 """The filename that is being locked.""" - 87 return self._filename -
88 -
89 - def open_and_lock(self, timeout, delay): -
90 """Open the file and lock it. - 91 - 92 Args: - 93 timeout: float, How long to try to lock for. - 94 delay: float, How long to wait between retries. - 95 """ - 96 pass -
97 -
98 - def unlock_and_close(self): -
99 """Unlock and close the file.""" -100 pass -
101 -
102 -103 -class _PosixOpener(_Opener): -
104 """Lock files using Posix advisory lock files.""" -105 -
106 - def open_and_lock(self, timeout, delay): -
107 """Open the file and lock it. -108 -109 Tries to create a .lock file next to the file we're trying to open. -110 -111 Args: -112 timeout: float, How long to try to lock for. -113 delay: float, How long to wait between retries. -114 -115 Raises: -116 AlreadyLockedException: if the lock is already acquired. -117 IOError: if the open fails. -118 CredentialsFileSymbolicLinkError if the file is a symbolic link. -119 """ -120 if self._locked: -121 raise AlreadyLockedException('File %s is already locked' % -122 self._filename) -123 self._locked = False -124 -125 validate_file(self._filename) -126 try: -127 self._fh = open(self._filename, self._mode) -128 except IOError as e: -129 # If we can't access with _mode, try _fallback_mode and don't lock. -130 if e.errno == errno.EACCES: -131 self._fh = open(self._filename, self._fallback_mode) -132 return -133 -134 lock_filename = self._posix_lockfile(self._filename) -135 start_time = time.time() -136 while True: -137 try: -138 self._lock_fd = os.open(lock_filename, -139 os.O_CREAT|os.O_EXCL|os.O_RDWR) -140 self._locked = True -141 break -142 -143 except OSError as e: -144 if e.errno != errno.EEXIST: -145 raise -146 if (time.time() - start_time) >= timeout: -147 logger.warn('Could not acquire lock %s in %s seconds', -148 lock_filename, timeout) -149 # Close the file and open in fallback_mode. -150 if self._fh: -151 self._fh.close() -152 self._fh = open(self._filename, self._fallback_mode) -153 return -154 time.sleep(delay) -
155 -
156 - def unlock_and_close(self): -
157 """Unlock a file by removing the .lock file, and close the handle.""" -158 if self._locked: -159 lock_filename = self._posix_lockfile(self._filename) -160 os.close(self._lock_fd) -161 os.unlink(lock_filename) -162 self._locked = False -163 self._lock_fd = None -164 if self._fh: -165 self._fh.close() -
166 -
167 - def _posix_lockfile(self, filename): -
168 """The name of the lock file to use for posix locking.""" -169 return '%s.lock' % filename -
170 -171 -172 try: -173 import fcntl -
174 -175 - class _FcntlOpener(_Opener): -
176 """Open, lock, and unlock a file using fcntl.lockf.""" -177 -
178 - def open_and_lock(self, timeout, delay): -
179 """Open the file and lock it. -180 -181 Args: -182 timeout: float, How long to try to lock for. -183 delay: float, How long to wait between retries -184 -185 Raises: -186 AlreadyLockedException: if the lock is already acquired. -187 IOError: if the open fails. -188 CredentialsFileSymbolicLinkError if the file is a symbolic link. -189 """ -190 if self._locked: -191 raise AlreadyLockedException('File %s is already locked' % -192 self._filename) -193 start_time = time.time() -194 -195 validate_file(self._filename) -196 try: -197 self._fh = open(self._filename, self._mode) -198 except IOError as e: -199 # If we can't access with _mode, try _fallback_mode and don't lock. -200 if e.errno in (errno.EPERM, errno.EACCES): -201 self._fh = open(self._filename, self._fallback_mode) -202 return -203 -204 # We opened in _mode, try to lock the file. -205 while True: -206 try: -207 fcntl.lockf(self._fh.fileno(), fcntl.LOCK_EX) -208 self._locked = True -209 return -210 except IOError as e: -211 # If not retrying, then just pass on the error. -212 if timeout == 0: -213 raise e -214 if e.errno != errno.EACCES: -215 raise e -216 # We could not acquire the lock. Try again. -217 if (time.time() - start_time) >= timeout: -218 logger.warn('Could not lock %s in %s seconds', -219 self._filename, timeout) -220 if self._fh: -221 self._fh.close() -222 self._fh = open(self._filename, self._fallback_mode) -223 return -224 time.sleep(delay) -
225 -
226 - def unlock_and_close(self): -
227 """Close and unlock the file using the fcntl.lockf primitive.""" -228 if self._locked: -229 fcntl.lockf(self._fh.fileno(), fcntl.LOCK_UN) -230 self._locked = False -231 if self._fh: -232 self._fh.close() -
233 except ImportError: -234 _FcntlOpener = None -235 -236 -237 try: -238 import pywintypes -239 import win32con -240 import win32file -
241 -242 - class _Win32Opener(_Opener): -
243 """Open, lock, and unlock a file using windows primitives.""" -244 -245 # Error #33: -246 # 'The process cannot access the file because another process' -247 FILE_IN_USE_ERROR = 33 -248 -249 # Error #158: -250 # 'The segment is already unlocked.' -251 FILE_ALREADY_UNLOCKED_ERROR = 158 -252 -
253 - def open_and_lock(self, timeout, delay): -
254 """Open the file and lock it. -255 -256 Args: -257 timeout: float, How long to try to lock for. -258 delay: float, How long to wait between retries -259 -260 Raises: -261 AlreadyLockedException: if the lock is already acquired. -262 IOError: if the open fails. -263 CredentialsFileSymbolicLinkError if the file is a symbolic link. -264 """ -265 if self._locked: -266 raise AlreadyLockedException('File %s is already locked' % -267 self._filename) -268 start_time = time.time() -269 -270 validate_file(self._filename) -271 try: -272 self._fh = open(self._filename, self._mode) -273 except IOError as e: -274 # If we can't access with _mode, try _fallback_mode and don't lock. -275 if e.errno == errno.EACCES: -276 self._fh = open(self._filename, self._fallback_mode) -277 return -278 -279 # We opened in _mode, try to lock the file. -280 while True: -281 try: -282 hfile = win32file._get_osfhandle(self._fh.fileno()) -283 win32file.LockFileEx( -284 hfile, -285 (win32con.LOCKFILE_FAIL_IMMEDIATELY| -286 win32con.LOCKFILE_EXCLUSIVE_LOCK), 0, -0x10000, -287 pywintypes.OVERLAPPED()) -288 self._locked = True -289 return -290 except pywintypes.error as e: -291 if timeout == 0: -292 raise e -293 -294 # If the error is not that the file is already in use, raise. -295 if e[0] != _Win32Opener.FILE_IN_USE_ERROR: -296 raise -297 -298 # We could not acquire the lock. Try again. -299 if (time.time() - start_time) >= timeout: -300 logger.warn('Could not lock %s in %s seconds' % ( -301 self._filename, timeout)) -302 if self._fh: -303 self._fh.close() -304 self._fh = open(self._filename, self._fallback_mode) -305 return -306 time.sleep(delay) -
307 -
308 - def unlock_and_close(self): -
309 """Close and unlock the file using the win32 primitive.""" -310 if self._locked: -311 try: -312 hfile = win32file._get_osfhandle(self._fh.fileno()) -313 win32file.UnlockFileEx(hfile, 0, -0x10000, pywintypes.OVERLAPPED()) -314 except pywintypes.error as e: -315 if e[0] != _Win32Opener.FILE_ALREADY_UNLOCKED_ERROR: -316 raise -317 self._locked = False -318 if self._fh: -319 self._fh.close() -
320 except ImportError: -321 _Win32Opener = None -
322 -323 -324 -class LockedFile(object): -
325 """Represent a file that has exclusive access.""" -326 -327 @util.positional(4) -
328 - def __init__(self, filename, mode, fallback_mode, use_native_locking=True): -
329 """Construct a LockedFile. -330 -331 Args: -332 filename: string, The path of the file to open. -333 mode: string, The mode to try to open the file with. -334 fallback_mode: string, The mode to use if locking fails. -335 use_native_locking: bool, Whether or not fcntl/win32 locking is used. -336 """ -337 opener = None -338 if not opener and use_native_locking: -339 if _Win32Opener: -340 opener = _Win32Opener(filename, mode, fallback_mode) -341 if _FcntlOpener: -342 opener = _FcntlOpener(filename, mode, fallback_mode) -343 -344 if not opener: -345 opener = _PosixOpener(filename, mode, fallback_mode) -346 -347 self._opener = opener -
348 -
349 - def filename(self): -
350 """Return the filename we were constructed with.""" -351 return self._opener._filename -
352 -
353 - def file_handle(self): -
354 """Return the file_handle to the opened file.""" -355 return self._opener.file_handle() -
356 -
357 - def is_locked(self): -
358 """Return whether we successfully locked the file.""" -359 return self._opener.is_locked() -
360 -
361 - def open_and_lock(self, timeout=0, delay=0.05): -
362 """Open the file, trying to lock it. -363 -364 Args: -365 timeout: float, The number of seconds to try to acquire the lock. -366 delay: float, The number of seconds to wait between retry attempts. -367 -368 Raises: -369 AlreadyLockedException: if the lock is already acquired. -370 IOError: if the open fails. -371 """ -372 self._opener.open_and_lock(timeout, delay) -
373 -
374 - def unlock_and_close(self): -
375 """Unlock and close a file.""" -376 self._opener.unlock_and_close() -
377 -
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.locked_file.AlreadyLockedException-class.html b/docs/epy/oauth2client.locked_file.AlreadyLockedException-class.html deleted file mode 100644 index de5515a..0000000 --- a/docs/epy/oauth2client.locked_file.AlreadyLockedException-class.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - oauth2client.locked_file.AlreadyLockedException - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module locked_file :: - Class AlreadyLockedException - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class AlreadyLockedException

source code

-
-
- - - - - - - - - - - - - - - - - - - -
-
-
-
-Trying to lock a file that has already been locked by the LockedFile.
-
-
- - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-

Inherited from exceptions.Exception: - __init__, - __new__ -

-

Inherited from exceptions.BaseException: - __delattr__, - __getattribute__, - __getitem__, - __getslice__, - __reduce__, - __repr__, - __setattr__, - __setstate__, - __str__, - __unicode__ -

-

Inherited from object: - __format__, - __hash__, - __reduce_ex__, - __sizeof__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from exceptions.BaseException: - args, - message -

-

Inherited from object: - __class__ -

-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.locked_file.CredentialsFileSymbolicLinkError-class.html b/docs/epy/oauth2client.locked_file.CredentialsFileSymbolicLinkError-class.html deleted file mode 100644 index 6a8de69..0000000 --- a/docs/epy/oauth2client.locked_file.CredentialsFileSymbolicLinkError-class.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - oauth2client.locked_file.CredentialsFileSymbolicLinkError - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module locked_file :: - Class CredentialsFileSymbolicLinkError - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class CredentialsFileSymbolicLinkError

source code

-
-
- - - - - - - - - - - - - - - - - - - -
-
-
-
-Credentials files must not be symbolic links.
-
-
- - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-

Inherited from exceptions.Exception: - __init__, - __new__ -

-

Inherited from exceptions.BaseException: - __delattr__, - __getattribute__, - __getitem__, - __getslice__, - __reduce__, - __repr__, - __setattr__, - __setstate__, - __str__, - __unicode__ -

-

Inherited from object: - __format__, - __hash__, - __reduce_ex__, - __sizeof__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from exceptions.BaseException: - args, - message -

-

Inherited from object: - __class__ -

-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.locked_file.LockedFile-class.html b/docs/epy/oauth2client.locked_file.LockedFile-class.html deleted file mode 100644 index 53452f7..0000000 --- a/docs/epy/oauth2client.locked_file.LockedFile-class.html +++ /dev/null @@ -1,384 +0,0 @@ - - - - - oauth2client.locked_file.LockedFile - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module locked_file :: - Class LockedFile - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class LockedFile

source code

-
-
- - - - - - - - - -
-
-
-
-Represent a file that has exclusive access.
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-   - - - - - - -
__init__(self, - filename, - mode, - fallback_mode, - use_native_locking=True)
- Construct a LockedFile.
- source code - -
- -
-   - - - - - - -
filename(self)
- Return the filename we were constructed with.
- source code - -
- -
-   - - - - - - -
file_handle(self)
- Return the file_handle to the opened file.
- source code - -
- -
-   - - - - - - -
is_locked(self)
- Return whether we successfully locked the file.
- source code - -
- -
-   - - - - - - -
open_and_lock(self, - timeout=0, - delay=0.05)
- Open the file, trying to lock it.
- source code - -
- -
-   - - - - - - -
unlock_and_close(self)
- Unlock and close a file.
- source code - -
- -
-

Inherited from object: - __delattr__, - __format__, - __getattribute__, - __hash__, - __new__, - __reduce__, - __reduce_ex__, - __repr__, - __setattr__, - __sizeof__, - __str__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from object: - __class__ -

-
- - - - - - -
- - - - - -
Method Details[hide private]
-
- -
- -
- - -
-

__init__(self, - filename, - mode, - fallback_mode, - use_native_locking=True) -
(Constructor) -

-
source code  -
- -
-Construct a LockedFile.
-
-Args:
-  filename: string, The path of the file to open.
-  mode: string, The mode to try to open the file with.
-  fallback_mode: string, The mode to use if locking fails.
-  use_native_locking: bool, Whether or not fcntl/win32 locking is used.
-
-
-
-
Decorators:
-
    -
  • @util.positional(4)
  • -
-
Overrides: - object.__init__ -
-
-
-
- -
- -
- - -
-

open_and_lock(self, - timeout=0, - delay=0.05) -

-
source code  -
- -
-Open the file, trying to lock it.
-
-Args:
-  timeout: float, The number of seconds to try to acquire the lock.
-  delay: float, The number of seconds to wait between retry attempts.
-
-Raises:
-  AlreadyLockedException: if the lock is already acquired.
-  IOError: if the open fails.
-
-
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.locked_file._Opener-class.html b/docs/epy/oauth2client.locked_file._Opener-class.html deleted file mode 100644 index ce66634..0000000 --- a/docs/epy/oauth2client.locked_file._Opener-class.html +++ /dev/null @@ -1,395 +0,0 @@ - - - - - oauth2client.locked_file._Opener - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module locked_file :: - Class _Opener - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class _Opener

source code

-
-
- - - - - - - - - -
-
-
-
-Base class for different locking primitives.
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-   - - - - - - -
__init__(self, - filename, - mode, - fallback_mode)
- Create an Opener.
- source code - -
- -
-   - - - - - - -
is_locked(self)
- Was the file locked.
- source code - -
- -
-   - - - - - - -
file_handle(self)
- The file handle to the file.
- source code - -
- -
-   - - - - - - -
filename(self)
- The filename that is being locked.
- source code - -
- -
-   - - - - - - -
open_and_lock(self, - timeout, - delay)
- Open the file and lock it.
- source code - -
- -
-   - - - - - - -
unlock_and_close(self)
- Unlock and close the file.
- source code - -
- -
-

Inherited from object: - __delattr__, - __format__, - __getattribute__, - __hash__, - __new__, - __reduce__, - __reduce_ex__, - __repr__, - __setattr__, - __sizeof__, - __str__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from object: - __class__ -

-
- - - - - - -
- - - - - -
Method Details[hide private]
-
- -
- -
- - -
-

__init__(self, - filename, - mode, - fallback_mode) -
(Constructor) -

-
source code  -
- -
-Create an Opener.
-
-Args:
-  filename: string, The pathname of the file.
-  mode: string, The preferred mode to access the file with.
-  fallback_mode: string, The mode to use if locking fails.
-
-
-
-
Overrides: - object.__init__ -
-
-
-
- -
- -
- - -
-

file_handle(self) -

-
source code  -
- -
-The file handle to the file. Valid only after opened.
-
-
-
-
-
-
- -
- -
- - -
-

open_and_lock(self, - timeout, - delay) -

-
source code  -
- -
-Open the file and lock it.
-
-Args:
-  timeout: float, How long to try to lock for.
-  delay: float, How long to wait between retries.
-
-
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.locked_file._PosixOpener-class.html b/docs/epy/oauth2client.locked_file._PosixOpener-class.html deleted file mode 100644 index df36174..0000000 --- a/docs/epy/oauth2client.locked_file._PosixOpener-class.html +++ /dev/null @@ -1,328 +0,0 @@ - - - - - oauth2client.locked_file._PosixOpener - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module locked_file :: - Class _PosixOpener - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class _PosixOpener

source code

-
-
- - - - - - - - - - -
-
-
-
-Lock files using Posix advisory lock files.
-
-
- - - - - - - - - - - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-   - - - - - - -
open_and_lock(self, - timeout, - delay)
- Open the file and lock it.
- source code - -
- -
-   - - - - - - -
unlock_and_close(self)
- Unlock a file by removing the .lock file, and close the handle.
- source code - -
- -
-   - - - - - - -
_posix_lockfile(self, - filename)
- The name of the lock file to use for posix locking.
- source code - -
- -
-

Inherited from _Opener: - __init__, - file_handle, - filename, - is_locked -

-

Inherited from object: - __delattr__, - __format__, - __getattribute__, - __hash__, - __new__, - __reduce__, - __reduce_ex__, - __repr__, - __setattr__, - __sizeof__, - __str__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from object: - __class__ -

-
- - - - - - -
- - - - - -
Method Details[hide private]
-
- -
- -
- - -
-

open_and_lock(self, - timeout, - delay) -

-
source code  -
- -
-Open the file and lock it.
-
-Tries to create a .lock file next to the file we're trying to open.
-
-Args:
-  timeout: float, How long to try to lock for.
-  delay: float, How long to wait between retries.
-
-Raises:
-  AlreadyLockedException: if the lock is already acquired.
-  IOError: if the open fails.
-  CredentialsFileSymbolicLinkError if the file is a symbolic link.
-
-
-
-
Overrides: - _Opener.open_and_lock -
-
-
-
- -
- -
- - -
-

unlock_and_close(self) -

-
source code  -
- -
-Unlock a file by removing the .lock file, and close the handle.
-
-
-
-
Overrides: - _Opener.unlock_and_close -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.multistore_file-module.html b/docs/epy/oauth2client.multistore_file-module.html deleted file mode 100644 index 158cd04..0000000 --- a/docs/epy/oauth2client.multistore_file-module.html +++ /dev/null @@ -1,545 +0,0 @@ - - - - - oauth2client.multistore_file - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module multistore_file - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Module multistore_file

source code

-
-Multi-credential file store with lock support.
-
-This module implements a JSON credential store where multiple
-credentials can be stored in one file. That file supports locking
-both in a single process and across processes.
-
-The credential themselves are keyed off of:
-* client_id
-* user_agent
-* scope
-
-The format of the stored data is like so:
-{
-  'file_version': 1,
-  'data': [
-    {
-      'key': {
-        'clientId': '<client id>',
-        'userAgent': '<user agent>',
-        'scope': '<scope>'
-      },
-      'credential': {
-        # JSON serialized Credentials.
-      }
-    }
-  ]
-}
-
-
- -
-

Author: - jbeda@google.com (Joe Beda) -

-
- - - - - - - - - - - - - - -
- - - - - -
Classes[hide private]
-
-   - - Error
- Base error for this module. -
-   - - NewerCredentialStoreError
- The credential store is a newer version that supported. -
-   - - _MultiStore
- A file backed store for multiple credentials. -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - -
Functions[hide private]
-
-   - - - - - - -
get_credential_storage(filename, - client_id, - user_agent, - scope, - warn_on_readonly=True)
- Get a Storage instance for a credential.
- source code - -
- -
-   - - - - - - -
get_credential_storage_custom_string_key(filename, - key_string, - warn_on_readonly=True)
- Get a Storage instance for a credential using a single string as a key.
- source code - -
- -
-   - - - - - - -
get_credential_storage_custom_key(filename, - key_dict, - warn_on_readonly=True)
- Get a Storage instance for a credential using a dictionary as a key.
- source code - -
- -
-   - - - - - - -
get_all_credential_keys(filename, - warn_on_readonly=True)
- Gets all the registered credential keys in the given Multistore.
- source code - -
- -
-   - - - - - - -
_get_multistore(filename, - warn_on_readonly=True)
- A helper method to initialize the multistore with proper locking.
- source code - -
- -
- - - - - - - - - - - - - - - -
- - - - - -
Variables[hide private]
-
-   - - logger = logging.getLogger(__name__) -
-   - - _multistores = {} -
-   - - _multistores_lock = threading.Lock() -
- - - - - - -
- - - - - -
Function Details[hide private]
-
- -
- -
- - -
-

get_credential_storage(filename, - client_id, - user_agent, - scope, - warn_on_readonly=True) -

-
source code  -
- -
-Get a Storage instance for a credential.
-
-Args:
-  filename: The JSON file storing a set of credentials
-  client_id: The client_id for the credential
-  user_agent: The user agent for the credential
-  scope: string or iterable of strings, Scope(s) being requested
-  warn_on_readonly: if True, log a warning if the store is readonly
-
-Returns:
-  An object derived from client.Storage for getting/setting the
-  credential.
-
-
-
-
Decorators:
-
    -
  • @util.positional(4)
  • -
-
-
-
- -
- -
- - -
-

get_credential_storage_custom_string_key(filename, - key_string, - warn_on_readonly=True) -

-
source code  -
- -
-Get a Storage instance for a credential using a single string as a key.
-
-Allows you to provide a string as a custom key that will be used for
-credential storage and retrieval.
-
-Args:
-  filename: The JSON file storing a set of credentials
-  key_string: A string to use as the key for storing this credential.
-  warn_on_readonly: if True, log a warning if the store is readonly
-
-Returns:
-  An object derived from client.Storage for getting/setting the
-  credential.
-
-
-
-
Decorators:
-
    -
  • @util.positional(2)
  • -
-
-
-
- -
- -
- - -
-

get_credential_storage_custom_key(filename, - key_dict, - warn_on_readonly=True) -

-
source code  -
- -
-Get a Storage instance for a credential using a dictionary as a key.
-
-Allows you to provide a dictionary as a custom key that will be used for
-credential storage and retrieval.
-
-Args:
-  filename: The JSON file storing a set of credentials
-  key_dict: A dictionary to use as the key for storing this credential. There
-    is no ordering of the keys in the dictionary. Logically equivalent
-    dictionaries will produce equivalent storage keys.
-  warn_on_readonly: if True, log a warning if the store is readonly
-
-Returns:
-  An object derived from client.Storage for getting/setting the
-  credential.
-
-
-
-
Decorators:
-
    -
  • @util.positional(2)
  • -
-
-
-
- -
- -
- - -
-

get_all_credential_keys(filename, - warn_on_readonly=True) -

-
source code  -
- -
-Gets all the registered credential keys in the given Multistore.
-
-Args:
-  filename: The JSON file storing a set of credentials
-  warn_on_readonly: if True, log a warning if the store is readonly
-
-Returns:
-  A list of the credential keys present in the file.  They are returned as
-  dictionaries that can be passed into get_credential_storage_custom_key to
-  get the actual credentials.
-
-
-
-
Decorators:
-
    -
  • @util.positional(1)
  • -
-
-
-
- -
- -
- - -
-

_get_multistore(filename, - warn_on_readonly=True) -

-
source code  -
- -
-A helper method to initialize the multistore with proper locking.
-
-Args:
-  filename: The JSON file storing a set of credentials
-  warn_on_readonly: if True, log a warning if the store is readonly
-
-Returns:
-  A multistore object
-
-
-
-
Decorators:
-
    -
  • @util.positional(1)
  • -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.multistore_file-pysrc.html b/docs/epy/oauth2client.multistore_file-pysrc.html deleted file mode 100644 index 763eeaf..0000000 --- a/docs/epy/oauth2client.multistore_file-pysrc.html +++ /dev/null @@ -1,647 +0,0 @@ - - - - - oauth2client.multistore_file - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module multistore_file - - - - - - -
[hide private]
[frames] | no frames]
-
-

Source Code for Module oauth2client.multistore_file

-
-  1  # Copyright 2014 Google Inc. All rights reserved. 
-  2  # 
-  3  # Licensed under the Apache License, Version 2.0 (the "License"); 
-  4  # you may not use this file except in compliance with the License. 
-  5  # You may obtain a copy of the License at 
-  6  # 
-  7  #      http://www.apache.org/licenses/LICENSE-2.0 
-  8  # 
-  9  # Unless required by applicable law or agreed to in writing, software 
- 10  # distributed under the License is distributed on an "AS IS" BASIS, 
- 11  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
- 12  # See the License for the specific language governing permissions and 
- 13  # limitations under the License. 
- 14   
- 15  """Multi-credential file store with lock support. 
- 16   
- 17  This module implements a JSON credential store where multiple 
- 18  credentials can be stored in one file. That file supports locking 
- 19  both in a single process and across processes. 
- 20   
- 21  The credential themselves are keyed off of: 
- 22  * client_id 
- 23  * user_agent 
- 24  * scope 
- 25   
- 26  The format of the stored data is like so: 
- 27  { 
- 28    'file_version': 1, 
- 29    'data': [ 
- 30      { 
- 31        'key': { 
- 32          'clientId': '<client id>', 
- 33          'userAgent': '<user agent>', 
- 34          'scope': '<scope>' 
- 35        }, 
- 36        'credential': { 
- 37          # JSON serialized Credentials. 
- 38        } 
- 39      } 
- 40    ] 
- 41  } 
- 42  """ 
- 43   
- 44  __author__ = 'jbeda@google.com (Joe Beda)' 
- 45   
- 46  import json 
- 47  import logging 
- 48  import os 
- 49  import threading 
- 50   
- 51  from oauth2client.client import Credentials 
- 52  from oauth2client.client import Storage as BaseStorage 
- 53  from oauth2client import util 
- 54  from oauth2client.locked_file import LockedFile 
- 55   
- 56  logger = logging.getLogger(__name__) 
- 57   
- 58  # A dict from 'filename'->_MultiStore instances 
- 59  _multistores = {} 
- 60  _multistores_lock = threading.Lock() 
-
61 - 62 - 63 -class Error(Exception): -
64 """Base error for this module.""" - 65 pass -
66 -
67 - 68 -class NewerCredentialStoreError(Error): -
69 """The credential store is a newer version that supported.""" - 70 pass -
71 -
72 - 73 @util.positional(4) - 74 -def get_credential_storage(filename, client_id, user_agent, scope, - 75 warn_on_readonly=True): -
76 """Get a Storage instance for a credential. - 77 - 78 Args: - 79 filename: The JSON file storing a set of credentials - 80 client_id: The client_id for the credential - 81 user_agent: The user agent for the credential - 82 scope: string or iterable of strings, Scope(s) being requested - 83 warn_on_readonly: if True, log a warning if the store is readonly - 84 - 85 Returns: - 86 An object derived from client.Storage for getting/setting the - 87 credential. - 88 """ - 89 # Recreate the legacy key with these specific parameters - 90 key = {'clientId': client_id, 'userAgent': user_agent, - 91 'scope': util.scopes_to_string(scope)} - 92 return get_credential_storage_custom_key( - 93 filename, key, warn_on_readonly=warn_on_readonly) -
94 -
95 - 96 @util.positional(2) - 97 -def get_credential_storage_custom_string_key( - 98 filename, key_string, warn_on_readonly=True): -
99 """Get a Storage instance for a credential using a single string as a key. -100 -101 Allows you to provide a string as a custom key that will be used for -102 credential storage and retrieval. -103 -104 Args: -105 filename: The JSON file storing a set of credentials -106 key_string: A string to use as the key for storing this credential. -107 warn_on_readonly: if True, log a warning if the store is readonly -108 -109 Returns: -110 An object derived from client.Storage for getting/setting the -111 credential. -112 """ -113 # Create a key dictionary that can be used -114 key_dict = {'key': key_string} -115 return get_credential_storage_custom_key( -116 filename, key_dict, warn_on_readonly=warn_on_readonly) -
117 -
118 -119 @util.positional(2) -120 -def get_credential_storage_custom_key( -121 filename, key_dict, warn_on_readonly=True): -
122 """Get a Storage instance for a credential using a dictionary as a key. -123 -124 Allows you to provide a dictionary as a custom key that will be used for -125 credential storage and retrieval. -126 -127 Args: -128 filename: The JSON file storing a set of credentials -129 key_dict: A dictionary to use as the key for storing this credential. There -130 is no ordering of the keys in the dictionary. Logically equivalent -131 dictionaries will produce equivalent storage keys. -132 warn_on_readonly: if True, log a warning if the store is readonly -133 -134 Returns: -135 An object derived from client.Storage for getting/setting the -136 credential. -137 """ -138 multistore = _get_multistore(filename, warn_on_readonly=warn_on_readonly) -139 key = util.dict_to_tuple_key(key_dict) -140 return multistore._get_storage(key) -
141 -
142 -143 @util.positional(1) -144 -def get_all_credential_keys(filename, warn_on_readonly=True): -
145 """Gets all the registered credential keys in the given Multistore. -146 -147 Args: -148 filename: The JSON file storing a set of credentials -149 warn_on_readonly: if True, log a warning if the store is readonly -150 -151 Returns: -152 A list of the credential keys present in the file. They are returned as -153 dictionaries that can be passed into get_credential_storage_custom_key to -154 get the actual credentials. -155 """ -156 multistore = _get_multistore(filename, warn_on_readonly=warn_on_readonly) -157 multistore._lock() -158 try: -159 return multistore._get_all_credential_keys() -160 finally: -161 multistore._unlock() -
162 -
163 -164 @util.positional(1) -165 -def _get_multistore(filename, warn_on_readonly=True): -
166 """A helper method to initialize the multistore with proper locking. -167 -168 Args: -169 filename: The JSON file storing a set of credentials -170 warn_on_readonly: if True, log a warning if the store is readonly -171 -172 Returns: -173 A multistore object -174 """ -175 filename = os.path.expanduser(filename) -176 _multistores_lock.acquire() -177 try: -178 multistore = _multistores.setdefault( -179 filename, _MultiStore(filename, warn_on_readonly=warn_on_readonly)) -180 finally: -181 _multistores_lock.release() -182 return multistore -
183 -
184 -185 -class _MultiStore(object): -
186 """A file backed store for multiple credentials.""" -187 -188 @util.positional(2) -
189 - def __init__(self, filename, warn_on_readonly=True): -
190 """Initialize the class. -191 -192 This will create the file if necessary. -193 """ -194 self._file = LockedFile(filename, 'r+', 'r') -195 self._thread_lock = threading.Lock() -196 self._read_only = False -197 self._warn_on_readonly = warn_on_readonly -198 -199 self._create_file_if_needed() -200 -201 # Cache of deserialized store. This is only valid after the -202 # _MultiStore is locked or _refresh_data_cache is called. This is -203 # of the form of: -204 # -205 # ((key, value), (key, value)...) -> OAuth2Credential -206 # -207 # If this is None, then the store hasn't been read yet. -208 self._data = None -
209 -
210 - class _Storage(BaseStorage): -
211 """A Storage object that knows how to read/write a single credential.""" -212 -
213 - def __init__(self, multistore, key): -
214 self._multistore = multistore -215 self._key = key -
216 -
217 - def acquire_lock(self): -
218 """Acquires any lock necessary to access this Storage. -219 -220 This lock is not reentrant. -221 """ -222 self._multistore._lock() -
223 -
224 - def release_lock(self): -
225 """Release the Storage lock. -226 -227 Trying to release a lock that isn't held will result in a -228 RuntimeError. -229 """ -230 self._multistore._unlock() -
231 -
232 - def locked_get(self): -
233 """Retrieve credential. -234 -235 The Storage lock must be held when this is called. -236 -237 Returns: -238 oauth2client.client.Credentials -239 """ -240 credential = self._multistore._get_credential(self._key) -241 if credential: -242 credential.set_store(self) -243 return credential -
244 -
245 - def locked_put(self, credentials): -
246 """Write a credential. -247 -248 The Storage lock must be held when this is called. -249 -250 Args: -251 credentials: Credentials, the credentials to store. -252 """ -253 self._multistore._update_credential(self._key, credentials) -
254 -
255 - def locked_delete(self): -
256 """Delete a credential. -257 -258 The Storage lock must be held when this is called. -259 -260 Args: -261 credentials: Credentials, the credentials to store. -262 """ -263 self._multistore._delete_credential(self._key) -
264 -
265 - def _create_file_if_needed(self): -
266 """Create an empty file if necessary. -267 -268 This method will not initialize the file. Instead it implements a -269 simple version of "touch" to ensure the file has been created. -270 """ -271 if not os.path.exists(self._file.filename()): -272 old_umask = os.umask(0o177) -273 try: -274 open(self._file.filename(), 'a+b').close() -275 finally: -276 os.umask(old_umask) -
277 -
278 - def _lock(self): -
279 """Lock the entire multistore.""" -280 self._thread_lock.acquire() -281 self._file.open_and_lock() -282 if not self._file.is_locked(): -283 self._read_only = True -284 if self._warn_on_readonly: -285 logger.warn('The credentials file (%s) is not writable. Opening in ' -286 'read-only mode. Any refreshed credentials will only be ' -287 'valid for this run.', self._file.filename()) -288 if os.path.getsize(self._file.filename()) == 0: -289 logger.debug('Initializing empty multistore file') -290 # The multistore is empty so write out an empty file. -291 self._data = {} -292 self._write() -293 elif not self._read_only or self._data is None: -294 # Only refresh the data if we are read/write or we haven't -295 # cached the data yet. If we are readonly, we assume is isn't -296 # changing out from under us and that we only have to read it -297 # once. This prevents us from whacking any new access keys that -298 # we have cached in memory but were unable to write out. -299 self._refresh_data_cache() -
300 -
301 - def _unlock(self): -
302 """Release the lock on the multistore.""" -303 self._file.unlock_and_close() -304 self._thread_lock.release() -
305 -
306 - def _locked_json_read(self): -
307 """Get the raw content of the multistore file. -308 -309 The multistore must be locked when this is called. -310 -311 Returns: -312 The contents of the multistore decoded as JSON. -313 """ -314 assert self._thread_lock.locked() -315 self._file.file_handle().seek(0) -316 return json.load(self._file.file_handle()) -
317 -
318 - def _locked_json_write(self, data): -
319 """Write a JSON serializable data structure to the multistore. -320 -321 The multistore must be locked when this is called. -322 -323 Args: -324 data: The data to be serialized and written. -325 """ -326 assert self._thread_lock.locked() -327 if self._read_only: -328 return -329 self._file.file_handle().seek(0) -330 json.dump(data, self._file.file_handle(), sort_keys=True, indent=2, separators=(',', ': ')) -331 self._file.file_handle().truncate() -
332 -
333 - def _refresh_data_cache(self): -
334 """Refresh the contents of the multistore. -335 -336 The multistore must be locked when this is called. -337 -338 Raises: -339 NewerCredentialStoreError: Raised when a newer client has written the -340 store. -341 """ -342 self._data = {} -343 try: -344 raw_data = self._locked_json_read() -345 except Exception: -346 logger.warn('Credential data store could not be loaded. ' -347 'Will ignore and overwrite.') -348 return -349 -350 version = 0 -351 try: -352 version = raw_data['file_version'] -353 except Exception: -354 logger.warn('Missing version for credential data store. It may be ' -355 'corrupt or an old version. Overwriting.') -356 if version > 1: -357 raise NewerCredentialStoreError( -358 'Credential file has file_version of %d. ' -359 'Only file_version of 1 is supported.' % version) -360 -361 credentials = [] -362 try: -363 credentials = raw_data['data'] -364 except (TypeError, KeyError): -365 pass -366 -367 for cred_entry in credentials: -368 try: -369 (key, credential) = self._decode_credential_from_json(cred_entry) -370 self._data[key] = credential -371 except: -372 # If something goes wrong loading a credential, just ignore it -373 logger.info('Error decoding credential, skipping', exc_info=True) -
374 -
375 - def _decode_credential_from_json(self, cred_entry): -
376 """Load a credential from our JSON serialization. -377 -378 Args: -379 cred_entry: A dict entry from the data member of our format -380 -381 Returns: -382 (key, cred) where the key is the key tuple and the cred is the -383 OAuth2Credential object. -384 """ -385 raw_key = cred_entry['key'] -386 key = util.dict_to_tuple_key(raw_key) -387 credential = None -388 credential = Credentials.new_from_json(json.dumps(cred_entry['credential'])) -389 return (key, credential) -
390 -
391 - def _write(self): -
392 """Write the cached data back out. -393 -394 The multistore must be locked. -395 """ -396 raw_data = {'file_version': 1} -397 raw_creds = [] -398 raw_data['data'] = raw_creds -399 for (cred_key, cred) in self._data.items(): -400 raw_key = dict(cred_key) -401 raw_cred = json.loads(cred.to_json()) -402 raw_creds.append({'key': raw_key, 'credential': raw_cred}) -403 self._locked_json_write(raw_data) -
404 -
405 - def _get_all_credential_keys(self): -
406 """Gets all the registered credential keys in the multistore. -407 -408 Returns: -409 A list of dictionaries corresponding to all the keys currently registered -410 """ -411 return [dict(key) for key in self._data.keys()] -
412 -
413 - def _get_credential(self, key): -
414 """Get a credential from the multistore. -415 -416 The multistore must be locked. -417 -418 Args: -419 key: The key used to retrieve the credential -420 -421 Returns: -422 The credential specified or None if not present -423 """ -424 return self._data.get(key, None) -
425 -
426 - def _update_credential(self, key, cred): -
427 """Update a credential and write the multistore. -428 -429 This must be called when the multistore is locked. -430 -431 Args: -432 key: The key used to retrieve the credential -433 cred: The OAuth2Credential to update/set -434 """ -435 self._data[key] = cred -436 self._write() -
437 -
438 - def _delete_credential(self, key): -
439 """Delete a credential and write the multistore. -440 -441 This must be called when the multistore is locked. -442 -443 Args: -444 key: The key used to retrieve the credential -445 """ -446 try: -447 del self._data[key] -448 except KeyError: -449 pass -450 self._write() -
451 -
452 - def _get_storage(self, key): -
453 """Get a Storage object to get/set a credential. -454 -455 This Storage is a 'view' into the multistore. -456 -457 Args: -458 key: The key used to retrieve the credential -459 -460 Returns: -461 A Storage object that can be used to get/set this cred -462 """ -463 return self._Storage(self, key) -
464 -
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.multistore_file.Error-class.html b/docs/epy/oauth2client.multistore_file.Error-class.html deleted file mode 100644 index e00044d..0000000 --- a/docs/epy/oauth2client.multistore_file.Error-class.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - oauth2client.multistore_file.Error - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module multistore_file :: - Class Error - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class Error

source code

-
-
- - - - - - - - - - - - - - - - - - - -
-
-
-
-Base error for this module.
-
-
- - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-

Inherited from exceptions.Exception: - __init__, - __new__ -

-

Inherited from exceptions.BaseException: - __delattr__, - __getattribute__, - __getitem__, - __getslice__, - __reduce__, - __repr__, - __setattr__, - __setstate__, - __str__, - __unicode__ -

-

Inherited from object: - __format__, - __hash__, - __reduce_ex__, - __sizeof__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from exceptions.BaseException: - args, - message -

-

Inherited from object: - __class__ -

-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.multistore_file.NewerCredentialStoreError-class.html b/docs/epy/oauth2client.multistore_file.NewerCredentialStoreError-class.html deleted file mode 100644 index 0ac415e..0000000 --- a/docs/epy/oauth2client.multistore_file.NewerCredentialStoreError-class.html +++ /dev/null @@ -1,209 +0,0 @@ - - - - - oauth2client.multistore_file.NewerCredentialStoreError - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module multistore_file :: - Class NewerCredentialStoreError - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class NewerCredentialStoreError

source code

-
-
- - - - - - - - - - - - - - - - - - - - -
-
-
-
-The credential store is a newer version that supported.
-
-
- - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-

Inherited from exceptions.Exception: - __init__, - __new__ -

-

Inherited from exceptions.BaseException: - __delattr__, - __getattribute__, - __getitem__, - __getslice__, - __reduce__, - __repr__, - __setattr__, - __setstate__, - __str__, - __unicode__ -

-

Inherited from object: - __format__, - __hash__, - __reduce_ex__, - __sizeof__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from exceptions.BaseException: - args, - message -

-

Inherited from object: - __class__ -

-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.multistore_file._MultiStore-class.html b/docs/epy/oauth2client.multistore_file._MultiStore-class.html deleted file mode 100644 index 7fff4dd..0000000 --- a/docs/epy/oauth2client.multistore_file._MultiStore-class.html +++ /dev/null @@ -1,813 +0,0 @@ - - - - - oauth2client.multistore_file._MultiStore - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module multistore_file :: - Class _MultiStore - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class _MultiStore

source code

-
-
- - - - -
-
-
-
-A file backed store for multiple credentials.
-
-
- - - - - - - - - - -
- - - - - -
Nested Classes[hide private]
-
-   - - _Storage
- A Storage object that knows how to read/write a single credential. -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-   - - - - - - -
__init__(self, - filename, - warn_on_readonly=True)
- Initialize the class.
- source code - -
- -
-   - - - - - - -
_create_file_if_needed(self)
- Create an empty file if necessary.
- source code - -
- -
-   - - - - - - -
_lock(self)
- Lock the entire multistore.
- source code - -
- -
-   - - - - - - -
_unlock(self)
- Release the lock on the multistore.
- source code - -
- -
-   - - - - - - -
_locked_json_read(self)
- Get the raw content of the multistore file.
- source code - -
- -
-   - - - - - - -
_locked_json_write(self, - data)
- Write a JSON serializable data structure to the multistore.
- source code - -
- -
-   - - - - - - -
_refresh_data_cache(self)
- Refresh the contents of the multistore.
- source code - -
- -
-   - - - - - - -
_decode_credential_from_json(self, - cred_entry)
- Load a credential from our JSON serialization.
- source code - -
- -
-   - - - - - - -
_write(self)
- Write the cached data back out.
- source code - -
- -
-   - - - - - - -
_get_all_credential_keys(self)
- Gets all the registered credential keys in the multistore.
- source code - -
- -
-   - - - - - - -
_get_credential(self, - key)
- Get a credential from the multistore.
- source code - -
- -
-   - - - - - - -
_update_credential(self, - key, - cred)
- Update a credential and write the multistore.
- source code - -
- -
-   - - - - - - -
_delete_credential(self, - key)
- Delete a credential and write the multistore.
- source code - -
- -
-   - - - - - - -
_get_storage(self, - key)
- Get a Storage object to get/set a credential.
- source code - -
- -
-

Inherited from object: - __delattr__, - __format__, - __getattribute__, - __hash__, - __new__, - __reduce__, - __reduce_ex__, - __repr__, - __setattr__, - __sizeof__, - __str__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from object: - __class__ -

-
- - - - - - -
- - - - - -
Method Details[hide private]
-
- -
- -
- - -
-

__init__(self, - filename, - warn_on_readonly=True) -
(Constructor) -

-
source code  -
- -
-Initialize the class.
-
-This will create the file if necessary.
-
-
-
-
Decorators:
-
    -
  • @util.positional(2)
  • -
-
Overrides: - object.__init__ -
-
-
-
- -
- -
- - -
-

_create_file_if_needed(self) -

-
source code  -
- -
-Create an empty file if necessary.
-
-This method will not initialize the file. Instead it implements a
-simple version of "touch" to ensure the file has been created.
-
-
-
-
-
-
- -
- -
- - -
-

_locked_json_read(self) -

-
source code  -
- -
-Get the raw content of the multistore file.
-
-The multistore must be locked when this is called.
-
-Returns:
-  The contents of the multistore decoded as JSON.
-
-
-
-
-
-
- -
- -
- - -
-

_locked_json_write(self, - data) -

-
source code  -
- -
-Write a JSON serializable data structure to the multistore.
-
-The multistore must be locked when this is called.
-
-Args:
-  data: The data to be serialized and written.
-
-
-
-
-
-
- -
- -
- - -
-

_refresh_data_cache(self) -

-
source code  -
- -
-Refresh the contents of the multistore.
-
-The multistore must be locked when this is called.
-
-Raises:
-  NewerCredentialStoreError: Raised when a newer client has written the
-    store.
-
-
-
-
-
-
- -
- -
- - -
-

_decode_credential_from_json(self, - cred_entry) -

-
source code  -
- -
-Load a credential from our JSON serialization.
-
-Args:
-  cred_entry: A dict entry from the data member of our format
-
-Returns:
-  (key, cred) where the key is the key tuple and the cred is the
-    OAuth2Credential object.
-
-
-
-
-
-
- -
- -
- - -
-

_write(self) -

-
source code  -
- -
-Write the cached data back out.
-
-The multistore must be locked.
-
-
-
-
-
-
- -
- -
- - -
-

_get_all_credential_keys(self) -

-
source code  -
- -
-Gets all the registered credential keys in the multistore.
-
-Returns:
-  A list of dictionaries corresponding to all the keys currently registered
-
-
-
-
-
-
- -
- -
- - -
-

_get_credential(self, - key) -

-
source code  -
- -
-Get a credential from the multistore.
-
-The multistore must be locked.
-
-Args:
-  key: The key used to retrieve the credential
-
-Returns:
-  The credential specified or None if not present
-
-
-
-
-
-
- -
- -
- - -
-

_update_credential(self, - key, - cred) -

-
source code  -
- -
-Update a credential and write the multistore.
-
-This must be called when the multistore is locked.
-
-Args:
-  key: The key used to retrieve the credential
-  cred: The OAuth2Credential to update/set
-
-
-
-
-
-
- -
- -
- - -
-

_delete_credential(self, - key) -

-
source code  -
- -
-Delete a credential and write the multistore.
-
-This must be called when the multistore is locked.
-
-Args:
-  key: The key used to retrieve the credential
-
-
-
-
-
-
- -
- -
- - -
-

_get_storage(self, - key) -

-
source code  -
- -
-Get a Storage object to get/set a credential.
-
-This Storage is a 'view' into the multistore.
-
-Args:
-  key: The key used to retrieve the credential
-
-Returns:
-  A Storage object that can be used to get/set this cred
-
-
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.multistore_file._MultiStore._Storage-class.html b/docs/epy/oauth2client.multistore_file._MultiStore._Storage-class.html deleted file mode 100644 index 33cacc9..0000000 --- a/docs/epy/oauth2client.multistore_file._MultiStore._Storage-class.html +++ /dev/null @@ -1,494 +0,0 @@ - - - - - oauth2client.multistore_file._MultiStore._Storage - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module multistore_file :: - Class _MultiStore :: - Class _Storage - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class _Storage

source code

-
-
- - - - - - - - - - - - - -
-
-
-
-A Storage object that knows how to read/write a single credential.
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-   - - - - - - -
__init__(self, - multistore, - key)
- x.__init__(...) initializes x; see help(type(x)) for signature
- source code - -
- -
-   - - - - - - -
acquire_lock(self)
- Acquires any lock necessary to access this Storage.
- source code - -
- -
-   - - - - - - -
release_lock(self)
- Release the Storage lock.
- source code - -
- -
-   - - - - - - -
locked_get(self)
- Retrieve credential.
- source code - -
- -
-   - - - - - - -
locked_put(self, - credentials)
- Write a credential.
- source code - -
- -
-   - - - - - - -
locked_delete(self)
- Delete a credential.
- source code - -
- -
-

Inherited from client.Storage: - delete, - get, - put -

-

Inherited from object: - __delattr__, - __format__, - __getattribute__, - __hash__, - __new__, - __reduce__, - __reduce_ex__, - __repr__, - __setattr__, - __sizeof__, - __str__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from object: - __class__ -

-
- - - - - - -
- - - - - -
Method Details[hide private]
-
- -
- -
- - -
-

__init__(self, - multistore, - key) -
(Constructor) -

-
source code  -
- -
-x.__init__(...) initializes x; see help(type(x)) for signature
-
-
-
-
Overrides: - object.__init__ -
(inherited documentation)
- -
-
-
- -
- -
- - -
-

acquire_lock(self) -

-
source code  -
- -
-Acquires any lock necessary to access this Storage.
-
-This lock is not reentrant.
-
-
-
-
Overrides: - client.Storage.acquire_lock -
-
-
-
- -
- -
- - -
-

release_lock(self) -

-
source code  -
- -
-Release the Storage lock.
-
-Trying to release a lock that isn't held will result in a
-RuntimeError.
-
-
-
-
Overrides: - client.Storage.release_lock -
-
-
-
- -
- -
- - -
-

locked_get(self) -

-
source code  -
- -
-Retrieve credential.
-
-The Storage lock must be held when this is called.
-
-Returns:
-  oauth2client.client.Credentials
-
-
-
-
Overrides: - client.Storage.locked_get -
-
-
-
- -
- -
- - -
-

locked_put(self, - credentials) -

-
source code  -
- -
-Write a credential.
-
-The Storage lock must be held when this is called.
-
-Args:
-  credentials: Credentials, the credentials to store.
-
-
-
-
Overrides: - client.Storage.locked_put -
-
-
-
- -
- -
- - -
-

locked_delete(self) -

-
source code  -
- -
-Delete a credential.
-
-The Storage lock must be held when this is called.
-
-Args:
-  credentials: Credentials, the credentials to store.
-
-
-
-
Overrides: - client.Storage.locked_delete -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.old_run-module.html b/docs/epy/oauth2client.old_run-module.html deleted file mode 100644 index d1fc7d8..0000000 --- a/docs/epy/oauth2client.old_run-module.html +++ /dev/null @@ -1,256 +0,0 @@ - - - - - oauth2client.old_run - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module old_run - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Module old_run

source code

-
-This module holds the old run() function which is deprecated, the
-tools.run_flow() function should be used in its place.
-
-
- - - - - - - - - - -
- - - - - -
Functions[hide private]
-
-   - - - - - - -
run(flow, - storage, - http=None)
- Core code for a command-line application.
- source code - -
- -
- - - - - - - - - -
- - - - - -
Variables[hide private]
-
-   - - FLAGS = gflags.FLAGS -
- - - - - - -
- - - - - -
Function Details[hide private]
-
- -
- -
- - -
-

run(flow, - storage, - http=None) -

-
source code  -
- -
-Core code for a command-line application.
-
-The run() function is called from your application and runs through all
-the steps to obtain credentials. It takes a Flow argument and attempts to
-open an authorization server page in the user's default web browser. The
-server asks the user to grant your application access to the user's data.
-If the user grants access, the run() function returns new credentials. The
-new credentials are also stored in the Storage argument, which updates the
-file associated with the Storage object.
-
-It presumes it is run from a command-line application and supports the
-following flags:
-
-  --auth_host_name: Host name to use when running a local web server
-    to handle redirects during OAuth authorization.
-    (default: 'localhost')
-
-  --auth_host_port: Port to use when running a local web server to handle
-  redirects during OAuth authorization.;
-    repeat this option to specify a list of values
-    (default: '[8080, 8090]')
-    (an integer)
-
-  --[no]auth_local_webserver: Run a local web server to handle redirects
-    during OAuth authorization.
-    (default: 'true')
-
-Since it uses flags make sure to initialize the gflags module before
-calling run().
-
-Args:
-  flow: Flow, an OAuth 2.0 Flow to step through.
-  storage: Storage, a Storage to store the credential in.
-  http: An instance of httplib2.Http.request
-       or something that acts like it.
-
-Returns:
-  Credentials, the obtained credential.
-
-
-
-
Decorators:
-
    -
  • @util.positional(2)
  • -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.old_run-pysrc.html b/docs/epy/oauth2client.old_run-pysrc.html deleted file mode 100644 index c2e9aef..0000000 --- a/docs/epy/oauth2client.old_run-pysrc.html +++ /dev/null @@ -1,272 +0,0 @@ - - - - - oauth2client.old_run - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module old_run - - - - - - -
[hide private]
[frames] | no frames]
-
-

Source Code for Module oauth2client.old_run

-
-  1  # Copyright 2014 Google Inc. All rights reserved. 
-  2  # 
-  3  # Licensed under the Apache License, Version 2.0 (the "License"); 
-  4  # you may not use this file except in compliance with the License. 
-  5  # You may obtain a copy of the License at 
-  6  # 
-  7  #      http://www.apache.org/licenses/LICENSE-2.0 
-  8  # 
-  9  # Unless required by applicable law or agreed to in writing, software 
- 10  # distributed under the License is distributed on an "AS IS" BASIS, 
- 11  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
- 12  # See the License for the specific language governing permissions and 
- 13  # limitations under the License. 
- 14   
- 15  """This module holds the old run() function which is deprecated, the 
- 16  tools.run_flow() function should be used in its place.""" 
- 17   
- 18  from __future__ import print_function 
- 19   
- 20  import logging 
- 21  import socket 
- 22  import sys 
- 23  import webbrowser 
- 24   
- 25  import gflags 
- 26   
- 27  from oauth2client import client 
- 28  from oauth2client import util 
- 29  from oauth2client.tools import ClientRedirectHandler 
- 30  from oauth2client.tools import ClientRedirectServer 
- 31   
- 32   
- 33  FLAGS = gflags.FLAGS 
- 34   
- 35  gflags.DEFINE_boolean('auth_local_webserver', True, 
- 36                        ('Run a local web server to handle redirects during ' 
- 37                         'OAuth authorization.')) 
- 38   
- 39  gflags.DEFINE_string('auth_host_name', 'localhost', 
- 40                       ('Host name to use when running a local web server to ' 
- 41                        'handle redirects during OAuth authorization.')) 
- 42   
- 43  gflags.DEFINE_multi_int('auth_host_port', [8080, 8090], 
- 44                          ('Port to use when running a local web server to ' 
- 45                           'handle redirects during OAuth authorization.')) 
-
46 - 47 - 48 @util.positional(2) - 49 -def run(flow, storage, http=None): -
50 """Core code for a command-line application. - 51 - 52 The run() function is called from your application and runs through all - 53 the steps to obtain credentials. It takes a Flow argument and attempts to - 54 open an authorization server page in the user's default web browser. The - 55 server asks the user to grant your application access to the user's data. - 56 If the user grants access, the run() function returns new credentials. The - 57 new credentials are also stored in the Storage argument, which updates the - 58 file associated with the Storage object. - 59 - 60 It presumes it is run from a command-line application and supports the - 61 following flags: - 62 - 63 --auth_host_name: Host name to use when running a local web server - 64 to handle redirects during OAuth authorization. - 65 (default: 'localhost') - 66 - 67 --auth_host_port: Port to use when running a local web server to handle - 68 redirects during OAuth authorization.; - 69 repeat this option to specify a list of values - 70 (default: '[8080, 8090]') - 71 (an integer) - 72 - 73 --[no]auth_local_webserver: Run a local web server to handle redirects - 74 during OAuth authorization. - 75 (default: 'true') - 76 - 77 Since it uses flags make sure to initialize the gflags module before - 78 calling run(). - 79 - 80 Args: - 81 flow: Flow, an OAuth 2.0 Flow to step through. - 82 storage: Storage, a Storage to store the credential in. - 83 http: An instance of httplib2.Http.request - 84 or something that acts like it. - 85 - 86 Returns: - 87 Credentials, the obtained credential. - 88 """ - 89 logging.warning('This function, oauth2client.tools.run(), and the use of ' - 90 'the gflags library are deprecated and will be removed in a future ' - 91 'version of the library.') - 92 if FLAGS.auth_local_webserver: - 93 success = False - 94 port_number = 0 - 95 for port in FLAGS.auth_host_port: - 96 port_number = port - 97 try: - 98 httpd = ClientRedirectServer((FLAGS.auth_host_name, port), - 99 ClientRedirectHandler) -100 except socket.error as e: -101 pass -102 else: -103 success = True -104 break -105 FLAGS.auth_local_webserver = success -106 if not success: -107 print('Failed to start a local webserver listening on either port 8080') -108 print('or port 9090. Please check your firewall settings and locally') -109 print('running programs that may be blocking or using those ports.') -110 print() -111 print('Falling back to --noauth_local_webserver and continuing with') -112 print('authorization.') -113 print() -114 -115 if FLAGS.auth_local_webserver: -116 oauth_callback = 'http://%s:%s/' % (FLAGS.auth_host_name, port_number) -117 else: -118 oauth_callback = client.OOB_CALLBACK_URN -119 flow.redirect_uri = oauth_callback -120 authorize_url = flow.step1_get_authorize_url() -121 -122 if FLAGS.auth_local_webserver: -123 webbrowser.open(authorize_url, new=1, autoraise=True) -124 print('Your browser has been opened to visit:') -125 print() -126 print(' ' + authorize_url) -127 print() -128 print('If your browser is on a different machine then exit and re-run') -129 print('this application with the command-line parameter ') -130 print() -131 print(' --noauth_local_webserver') -132 print() -133 else: -134 print('Go to the following link in your browser:') -135 print() -136 print(' ' + authorize_url) -137 print() -138 -139 code = None -140 if FLAGS.auth_local_webserver: -141 httpd.handle_request() -142 if 'error' in httpd.query_params: -143 sys.exit('Authentication request was rejected.') -144 if 'code' in httpd.query_params: -145 code = httpd.query_params['code'] -146 else: -147 print('Failed to find "code" in the query parameters of the redirect.') -148 sys.exit('Try running with --noauth_local_webserver.') -149 else: -150 code = raw_input('Enter verification code: ').strip() -151 -152 try: -153 credential = flow.step2_exchange(code, http=http) -154 except client.FlowExchangeError as e: -155 sys.exit('Authentication has failed: %s' % e) -156 -157 storage.put(credential) -158 credential.set_store(storage) -159 print('Authentication successful.') -160 -161 return credential -
162 -
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.service_account-module.html b/docs/epy/oauth2client.service_account-module.html deleted file mode 100644 index 77efb4a..0000000 --- a/docs/epy/oauth2client.service_account-module.html +++ /dev/null @@ -1,188 +0,0 @@ - - - - - oauth2client.service_account - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module service_account - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Module service_account

source code

-
-A service account credentials class.
-
-This credentials class is implemented on top of rsa library.
-
-
- - - - - - - - - - -
- - - - - -
Classes[hide private]
-
-   - - _ServiceAccountCredentials
- Class representing a service account (signed JWT) credential. -
- - - - - - - - - - - - -
- - - - - -
Functions[hide private]
-
-   - - - - - - -
_urlsafe_b64encode(data) - source code - -
- -
-   - - - - - - -
_get_private_key(private_key_pkcs8_text)
- Get an RSA private key object from a pkcs8 representation.
- source code - -
- -
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.service_account-pysrc.html b/docs/epy/oauth2client.service_account-pysrc.html deleted file mode 100644 index 611605b..0000000 --- a/docs/epy/oauth2client.service_account-pysrc.html +++ /dev/null @@ -1,276 +0,0 @@ - - - - - oauth2client.service_account - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module service_account - - - - - - -
[hide private]
[frames] | no frames]
-
-

Source Code for Module oauth2client.service_account

-
-  1  # Copyright 2014 Google Inc. All rights reserved. 
-  2  # 
-  3  # Licensed under the Apache License, Version 2.0 (the "License"); 
-  4  # you may not use this file except in compliance with the License. 
-  5  # You may obtain a copy of the License at 
-  6  # 
-  7  #      http://www.apache.org/licenses/LICENSE-2.0 
-  8  # 
-  9  # Unless required by applicable law or agreed to in writing, software 
- 10  # distributed under the License is distributed on an "AS IS" BASIS, 
- 11  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
- 12  # See the License for the specific language governing permissions and 
- 13  # limitations under the License. 
- 14   
- 15  """A service account credentials class. 
- 16   
- 17  This credentials class is implemented on top of rsa library. 
- 18  """ 
- 19   
- 20  import base64 
- 21  import json 
- 22  import time 
- 23   
- 24  from pyasn1.codec.ber import decoder 
- 25  from pyasn1_modules.rfc5208 import PrivateKeyInfo 
- 26  import rsa 
- 27   
- 28  from oauth2client import GOOGLE_REVOKE_URI 
- 29  from oauth2client import GOOGLE_TOKEN_URI 
- 30  from oauth2client import util 
- 31  from oauth2client.client import AssertionCredentials 
-
32 - 33 - 34 -class _ServiceAccountCredentials(AssertionCredentials): -
35 """Class representing a service account (signed JWT) credential.""" - 36 - 37 MAX_TOKEN_LIFETIME_SECS = 3600 # 1 hour in seconds - 38 -
39 - def __init__(self, service_account_id, service_account_email, private_key_id, - 40 private_key_pkcs8_text, scopes, user_agent=None, - 41 token_uri=GOOGLE_TOKEN_URI, revoke_uri=GOOGLE_REVOKE_URI, - 42 **kwargs): -
43 - 44 super(_ServiceAccountCredentials, self).__init__( - 45 None, user_agent=user_agent, token_uri=token_uri, revoke_uri=revoke_uri) - 46 - 47 self._service_account_id = service_account_id - 48 self._service_account_email = service_account_email - 49 self._private_key_id = private_key_id - 50 self._private_key = _get_private_key(private_key_pkcs8_text) - 51 self._private_key_pkcs8_text = private_key_pkcs8_text - 52 self._scopes = util.scopes_to_string(scopes) - 53 self._user_agent = user_agent - 54 self._token_uri = token_uri - 55 self._revoke_uri = revoke_uri - 56 self._kwargs = kwargs -
57 -
58 - def _generate_assertion(self): -
59 """Generate the assertion that will be used in the request.""" - 60 - 61 header = { - 62 'alg': 'RS256', - 63 'typ': 'JWT', - 64 'kid': self._private_key_id - 65 } - 66 - 67 now = int(time.time()) - 68 payload = { - 69 'aud': self._token_uri, - 70 'scope': self._scopes, - 71 'iat': now, - 72 'exp': now + _ServiceAccountCredentials.MAX_TOKEN_LIFETIME_SECS, - 73 'iss': self._service_account_email - 74 } - 75 payload.update(self._kwargs) - 76 - 77 assertion_input = '%s.%s' % ( - 78 _urlsafe_b64encode(header), - 79 _urlsafe_b64encode(payload)) - 80 assertion_input = assertion_input.encode('utf-8') - 81 - 82 # Sign the assertion. - 83 signature = bytes.decode(base64.urlsafe_b64encode(rsa.pkcs1.sign( - 84 assertion_input, self._private_key, 'SHA-256'))).rstrip('=') - 85 - 86 return '%s.%s' % (assertion_input, signature) -
87 -
88 - def sign_blob(self, blob): -
89 # Ensure that it is bytes - 90 try: - 91 blob = blob.encode('utf-8') - 92 except AttributeError: - 93 pass - 94 return (self._private_key_id, - 95 rsa.pkcs1.sign(blob, self._private_key, 'SHA-256')) -
96 - 97 @property -
98 - def service_account_email(self): -
99 return self._service_account_email -
100 -101 @property -
102 - def serialization_data(self): -
103 return { -104 'type': 'service_account', -105 'client_id': self._service_account_id, -106 'client_email': self._service_account_email, -107 'private_key_id': self._private_key_id, -108 'private_key': self._private_key_pkcs8_text -109 } -
110 -
111 - def create_scoped_required(self): -
112 return not self._scopes -
113 -
114 - def create_scoped(self, scopes): -
115 return _ServiceAccountCredentials(self._service_account_id, -116 self._service_account_email, -117 self._private_key_id, -118 self._private_key_pkcs8_text, -119 scopes, -120 user_agent=self._user_agent, -121 token_uri=self._token_uri, -122 revoke_uri=self._revoke_uri, -123 **self._kwargs) -
124 -
125 -126 -def _urlsafe_b64encode(data): -
127 return base64.urlsafe_b64encode( -128 json.dumps(data, separators=(',', ':')).encode('UTF-8')).rstrip(b'=') -
129 -
130 -131 -def _get_private_key(private_key_pkcs8_text): -
132 """Get an RSA private key object from a pkcs8 representation.""" -133 -134 der = rsa.pem.load_pem(private_key_pkcs8_text, 'PRIVATE KEY') -135 asn1_private_key, _ = decoder.decode(der, asn1Spec=PrivateKeyInfo()) -136 return rsa.PrivateKey.load_pkcs1( -137 asn1_private_key.getComponentByName('privateKey').asOctets(), -138 format='DER') -
139 -
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.service_account._ServiceAccountCredentials-class.html b/docs/epy/oauth2client.service_account._ServiceAccountCredentials-class.html deleted file mode 100644 index 5b98374..0000000 --- a/docs/epy/oauth2client.service_account._ServiceAccountCredentials-class.html +++ /dev/null @@ -1,645 +0,0 @@ - - - - - oauth2client.service_account._ServiceAccountCredentials - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module service_account :: - Class _ServiceAccountCredentials - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class _ServiceAccountCredentials

source code

-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-Class representing a service account (signed JWT) credential.
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-   - - - - - - -
__init__(self, - service_account_id, - service_account_email, - private_key_id, - private_key_pkcs8_text, - scopes, - user_agent=None, - token_uri=GOOGLE_TOKEN_URI, - revoke_uri=GOOGLE_REVOKE_URI, - **kwargs)
- Constructor for AssertionFlowCredentials.
- source code - -
- -
-   - - - - - - -
_generate_assertion(self)
- Generate the assertion that will be used in the request.
- source code - -
- -
-   - - - - - - -
sign_blob(self, - blob) - source code - -
- -
-   - - - - - - -
service_account_email(self) - source code - -
- -
-   - - - - - - -
serialization_data(self)
- Get the fields and their values identifying the current credentials.
- source code - -
- -
-   - - - - - - -
create_scoped_required(self)
- Whether this Credentials object is scopeless.
- source code - -
- -
-   - - - - - - -
create_scoped(self, - scopes)
- Create a Credentials object for the given scopes.
- source code - -
- -
- -

Inherited from client.OAuth2Credentials: - __getstate__, - __setstate__, - access_token_expired, - apply, - authorize, - get_access_token, - refresh, - revoke, - set_store, - to_json -

- -

Inherited from client.Credentials (private): - _to_json -

-

Inherited from object: - __delattr__, - __format__, - __getattribute__, - __hash__, - __new__, - __reduce__, - __reduce_ex__, - __repr__, - __setattr__, - __sizeof__, - __str__, - __subclasshook__ -

-
- - - - - - - - - -
- - - - - -
Class Methods[hide private]
-
-

Inherited from client.OAuth2Credentials: - from_json -

-

Inherited from client.Credentials: - new_from_json -

-
- - - - - - - - - -
- - - - - -
Static Methods[hide private]
-
-

Inherited from client.GoogleCredentials: - from_stream, - get_application_default -

-
- - - - - - - - - - - - -
- - - - - -
Class Variables[hide private]
-
-   - - MAX_TOKEN_LIFETIME_SECS = 3600 -
-

Inherited from client.Credentials: - NON_SERIALIZED_MEMBERS -

-
- - - - - - - - - -
- - - - - -
Properties[hide private]
-
-

Inherited from object: - __class__ -

-
- - - - - - -
- - - - - -
Method Details[hide private]
-
- -
- -
- - -
-

__init__(self, - service_account_id, - service_account_email, - private_key_id, - private_key_pkcs8_text, - scopes, - user_agent=None, - token_uri=GOOGLE_TOKEN_URI, - revoke_uri=GOOGLE_REVOKE_URI, - **kwargs) -
(Constructor) -

-
source code  -
- -
-Constructor for AssertionFlowCredentials.
-
-Args:
-  assertion_type: string, assertion type that will be declared to the auth
-    server
-  user_agent: string, The HTTP User-Agent to provide for this application.
-  token_uri: string, URI for token endpoint. For convenience
-    defaults to Google's endpoints but any OAuth 2.0 provider can be used.
-  revoke_uri: string, URI for revoke endpoint.
-
-
-
-
Overrides: - object.__init__ -
(inherited documentation)
- -
-
-
- -
- -
- - -
-

_generate_assertion(self) -

-
source code  -
- -
-Generate the assertion that will be used in the request.
-
-
-
-
Overrides: - client.AssertionCredentials._generate_assertion -
-
-
-
- -
- -
- - -
-

service_account_email(self) -

-
source code  -
- - -
-
Decorators:
-
    -
  • @property
  • -
-
-
-
- -
- -
- - -
-

serialization_data(self) -

-
source code  -
- -
-Get the fields and their values identifying the current credentials.
-
-
-
-
Decorators:
-
    -
  • @property
  • -
-
Overrides: - client.GoogleCredentials.serialization_data -
(inherited documentation)
- -
-
-
- -
- -
- - -
-

create_scoped_required(self) -

-
source code  -
- -
-Whether this Credentials object is scopeless.
-
-create_scoped(scopes) method needs to be called in order to create
-a Credentials object for API calls.
-
-
-
-
Overrides: - client.GoogleCredentials.create_scoped_required -
(inherited documentation)
- -
-
-
- -
- -
- - -
-

create_scoped(self, - scopes) -

-
source code  -
- -
-Create a Credentials object for the given scopes.
-
-The Credentials type is preserved.
-
-
-
-
Overrides: - client.GoogleCredentials.create_scoped -
(inherited documentation)
- -
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.tools-module.html b/docs/epy/oauth2client.tools-module.html deleted file mode 100644 index 27973ac..0000000 --- a/docs/epy/oauth2client.tools-module.html +++ /dev/null @@ -1,416 +0,0 @@ - - - - - oauth2client.tools - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module tools - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Module tools

source code

-
-Command-line tools for authenticating via OAuth 2.0
-
-Do the OAuth 2.0 Web Server dance for a command line application. Stores the
-generated credentials in a common file that is used by other example apps in
-the same directory.
-
-
- -
-

Author: - jcgregorio@google.com (Joe Gregorio) -

-
- - - - - - - - - - - -
- - - - - -
Classes[hide private]
-
-   - - ClientRedirectServer
- A server to handle OAuth 2.0 redirects back to localhost. -
-   - - ClientRedirectHandler
- A handler for OAuth 2.0 redirects back to localhost. -
- - - - - - - - - - - - - - - - - - -
- - - - - -
Functions[hide private]
-
-   - - - - - - -
_CreateArgumentParser() - source code - -
- -
-   - - - - - - -
run_flow(flow, - storage, - flags, - http=None)
- Core code for a command-line application.
- source code - -
- -
-   - - - - - - -
message_if_missing(filename)
- Helpful message to display if the CLIENT_SECRETS file is missing.
- source code - -
- -
-   - - - - - - -
run(*args, - **kwargs) - source code - -
- -
- - - - - - - - - - - - -
- - - - - -
Variables[hide private]
-
-   - - _CLIENT_SECRETS_MESSAGE = """WARNING: Please configure OAuth ... -
-   - - argparser = _CreateArgumentParser() -
- - - - - - -
- - - - - -
Function Details[hide private]
-
- -
- -
- - -
-

run_flow(flow, - storage, - flags, - http=None) -

-
source code  -
- -
-Core code for a command-line application.
-
-The run() function is called from your application and runs through all the
-steps to obtain credentials. It takes a Flow argument and attempts to open an
-authorization server page in the user's default web browser. The server asks
-the user to grant your application access to the user's data. If the user
-grants access, the run() function returns new credentials. The new credentials
-are also stored in the Storage argument, which updates the file associated
-with the Storage object.
-
-It presumes it is run from a command-line application and supports the
-following flags:
-
-  --auth_host_name: Host name to use when running a local web server
-    to handle redirects during OAuth authorization.
-    (default: 'localhost')
-
-  --auth_host_port: Port to use when running a local web server to handle
-    redirects during OAuth authorization.;
-    repeat this option to specify a list of values
-    (default: '[8080, 8090]')
-    (an integer)
-
-  --[no]auth_local_webserver: Run a local web server to handle redirects
-    during OAuth authorization.
-    (default: 'true')
-
-The tools module defines an ArgumentParser the already contains the flag
-definitions that run() requires. You can pass that ArgumentParser to your
-ArgumentParser constructor:
-
-  parser = argparse.ArgumentParser(description=__doc__,
-      formatter_class=argparse.RawDescriptionHelpFormatter,
-      parents=[tools.argparser])
-  flags = parser.parse_args(argv)
-
-Args:
-  flow: Flow, an OAuth 2.0 Flow to step through.
-  storage: Storage, a Storage to store the credential in.
-  flags: argparse.ArgumentParser, the command-line flags.
-  http: An instance of httplib2.Http.request
-       or something that acts like it.
-
-Returns:
-  Credentials, the obtained credential.
-
-
-
-
Decorators:
-
    -
  • @util.positional(3)
  • -
-
-
-
-
- - - - - - -
- - - - - -
Variables Details[hide private]
-
- -
- -
-

_CLIENT_SECRETS_MESSAGE

- -
-
-
-
Value:
-
-"""WARNING: Please configure OAuth 2.0
-
-To make this sample run you will need to populate the client_secrets.j\
-son file
-found at:
-
-   %s
-
-...
-
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.tools-pysrc.html b/docs/epy/oauth2client.tools-pysrc.html deleted file mode 100644 index 909cb2c..0000000 --- a/docs/epy/oauth2client.tools-pysrc.html +++ /dev/null @@ -1,358 +0,0 @@ - - - - - oauth2client.tools - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module tools - - - - - - -
[hide private]
[frames] | no frames]
-
-

Source Code for Module oauth2client.tools

-
-  1  # Copyright 2014 Google Inc. All rights reserved. 
-  2  # 
-  3  # Licensed under the Apache License, Version 2.0 (the "License"); 
-  4  # you may not use this file except in compliance with the License. 
-  5  # You may obtain a copy of the License at 
-  6  # 
-  7  #      http://www.apache.org/licenses/LICENSE-2.0 
-  8  # 
-  9  # Unless required by applicable law or agreed to in writing, software 
- 10  # distributed under the License is distributed on an "AS IS" BASIS, 
- 11  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
- 12  # See the License for the specific language governing permissions and 
- 13  # limitations under the License. 
- 14   
- 15  """Command-line tools for authenticating via OAuth 2.0 
- 16   
- 17  Do the OAuth 2.0 Web Server dance for a command line application. Stores the 
- 18  generated credentials in a common file that is used by other example apps in 
- 19  the same directory. 
- 20  """ 
- 21   
- 22  from __future__ import print_function 
- 23   
- 24  __author__ = 'jcgregorio@google.com (Joe Gregorio)' 
- 25  __all__ = ['argparser', 'run_flow', 'run', 'message_if_missing'] 
- 26   
- 27  import BaseHTTPServer 
- 28  import logging 
- 29  import socket 
- 30  import sys 
- 31  import webbrowser 
- 32   
- 33  from six.moves import urllib 
- 34   
- 35  from oauth2client import client 
- 36  from oauth2client import util 
- 37   
- 38   
- 39  _CLIENT_SECRETS_MESSAGE = """WARNING: Please configure OAuth 2.0 
- 40   
- 41  To make this sample run you will need to populate the client_secrets.json file 
- 42  found at: 
- 43   
- 44     %s 
- 45   
- 46  with information from the APIs Console <https://code.google.com/apis/console>. 
- 47   
- 48  """ 
- 49   
- 50  # argparser is an ArgumentParser that contains command-line options expected 
- 51  # by tools.run(). Pass it in as part of the 'parents' argument to your own 
- 52  # ArgumentParser. 
- 53  argparser = _CreateArgumentParser() 
-
54 - 55 -def _CreateArgumentParser(): -
56 try: - 57 import argparse - 58 except ImportError: - 59 return None - 60 argparser = argparse.ArgumentParser(add_help=False) - 61 argparser.add_argument('--auth_host_name', default='localhost', - 62 help='Hostname when running a local web server.') - 63 argparser.add_argument('--noauth_local_webserver', action='store_true', - 64 default=False, help='Do not run a local web server.') - 65 argparser.add_argument('--auth_host_port', default=[8080, 8090], type=int, - 66 nargs='*', help='Port web server should listen on.') - 67 argparser.add_argument('--logging_level', default='ERROR', - 68 choices=['DEBUG', 'INFO', 'WARNING', 'ERROR', - 69 'CRITICAL'], - 70 help='Set the logging level of detail.') - 71 return argparser -
72 -
73 - 74 -class ClientRedirectServer(BaseHTTPServer.HTTPServer): -
75 """A server to handle OAuth 2.0 redirects back to localhost. - 76 - 77 Waits for a single request and parses the query parameters - 78 into query_params and then stops serving. - 79 """ - 80 query_params = {} -
81 -
82 - 83 -class ClientRedirectHandler(BaseHTTPServer.BaseHTTPRequestHandler): -
84 """A handler for OAuth 2.0 redirects back to localhost. - 85 - 86 Waits for a single request and parses the query parameters - 87 into the servers query_params and then stops serving. - 88 """ - 89 -
90 - def do_GET(self): -
91 """Handle a GET request. - 92 - 93 Parses the query parameters and prints a message - 94 if the flow has completed. Note that we can't detect - 95 if an error occurred. - 96 """ - 97 self.send_response(200) - 98 self.send_header("Content-type", "text/html") - 99 self.end_headers() -100 query = self.path.split('?', 1)[-1] -101 query = dict(urllib.parse.parse_qsl(query)) -102 self.server.query_params = query -103 self.wfile.write("<html><head><title>Authentication Status</title></head>") -104 self.wfile.write("<body><p>The authentication flow has completed.</p>") -105 self.wfile.write("</body></html>") -
106 -
107 - def log_message(self, format, *args): -
108 """Do not log messages to stdout while running as command line program.""" -
109 -
110 -111 @util.positional(3) -112 -def run_flow(flow, storage, flags, http=None): -
113 """Core code for a command-line application. -114 -115 The run() function is called from your application and runs through all the -116 steps to obtain credentials. It takes a Flow argument and attempts to open an -117 authorization server page in the user's default web browser. The server asks -118 the user to grant your application access to the user's data. If the user -119 grants access, the run() function returns new credentials. The new credentials -120 are also stored in the Storage argument, which updates the file associated -121 with the Storage object. -122 -123 It presumes it is run from a command-line application and supports the -124 following flags: -125 -126 --auth_host_name: Host name to use when running a local web server -127 to handle redirects during OAuth authorization. -128 (default: 'localhost') -129 -130 --auth_host_port: Port to use when running a local web server to handle -131 redirects during OAuth authorization.; -132 repeat this option to specify a list of values -133 (default: '[8080, 8090]') -134 (an integer) -135 -136 --[no]auth_local_webserver: Run a local web server to handle redirects -137 during OAuth authorization. -138 (default: 'true') -139 -140 The tools module defines an ArgumentParser the already contains the flag -141 definitions that run() requires. You can pass that ArgumentParser to your -142 ArgumentParser constructor: -143 -144 parser = argparse.ArgumentParser(description=__doc__, -145 formatter_class=argparse.RawDescriptionHelpFormatter, -146 parents=[tools.argparser]) -147 flags = parser.parse_args(argv) -148 -149 Args: -150 flow: Flow, an OAuth 2.0 Flow to step through. -151 storage: Storage, a Storage to store the credential in. -152 flags: argparse.ArgumentParser, the command-line flags. -153 http: An instance of httplib2.Http.request -154 or something that acts like it. -155 -156 Returns: -157 Credentials, the obtained credential. -158 """ -159 logging.getLogger().setLevel(getattr(logging, flags.logging_level)) -160 if not flags.noauth_local_webserver: -161 success = False -162 port_number = 0 -163 for port in flags.auth_host_port: -164 port_number = port -165 try: -166 httpd = ClientRedirectServer((flags.auth_host_name, port), -167 ClientRedirectHandler) -168 except socket.error: -169 pass -170 else: -171 success = True -172 break -173 flags.noauth_local_webserver = not success -174 if not success: -175 print('Failed to start a local webserver listening on either port 8080') -176 print('or port 9090. Please check your firewall settings and locally') -177 print('running programs that may be blocking or using those ports.') -178 print() -179 print('Falling back to --noauth_local_webserver and continuing with') -180 print('authorization.') -181 print() -182 -183 if not flags.noauth_local_webserver: -184 oauth_callback = 'http://%s:%s/' % (flags.auth_host_name, port_number) -185 else: -186 oauth_callback = client.OOB_CALLBACK_URN -187 flow.redirect_uri = oauth_callback -188 authorize_url = flow.step1_get_authorize_url() -189 -190 if not flags.noauth_local_webserver: -191 webbrowser.open(authorize_url, new=1, autoraise=True) -192 print('Your browser has been opened to visit:') -193 print() -194 print(' ' + authorize_url) -195 print() -196 print('If your browser is on a different machine then exit and re-run this') -197 print('application with the command-line parameter ') -198 print() -199 print(' --noauth_local_webserver') -200 print() -201 else: -202 print('Go to the following link in your browser:') -203 print() -204 print(' ' + authorize_url) -205 print() -206 -207 code = None -208 if not flags.noauth_local_webserver: -209 httpd.handle_request() -210 if 'error' in httpd.query_params: -211 sys.exit('Authentication request was rejected.') -212 if 'code' in httpd.query_params: -213 code = httpd.query_params['code'] -214 else: -215 print('Failed to find "code" in the query parameters of the redirect.') -216 sys.exit('Try running with --noauth_local_webserver.') -217 else: -218 code = raw_input('Enter verification code: ').strip() -219 -220 try: -221 credential = flow.step2_exchange(code, http=http) -222 except client.FlowExchangeError as e: -223 sys.exit('Authentication has failed: %s' % e) -224 -225 storage.put(credential) -226 credential.set_store(storage) -227 print('Authentication successful.') -228 -229 return credential -
230 -
231 -232 -def message_if_missing(filename): -
233 """Helpful message to display if the CLIENT_SECRETS file is missing.""" -234 -235 return _CLIENT_SECRETS_MESSAGE % filename -
236 -237 try: -238 from oauth2client.old_run import run -239 from oauth2client.old_run import FLAGS -240 except ImportError: -
241 - def run(*args, **kwargs): -
242 raise NotImplementedError( -243 'The gflags library must be installed to use tools.run(). ' -244 'Please install gflags or preferrably switch to using ' -245 'tools.run_flow().') -
246 -
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.tools.ClientRedirectHandler-class.html b/docs/epy/oauth2client.tools.ClientRedirectHandler-class.html deleted file mode 100644 index 050e6a6..0000000 --- a/docs/epy/oauth2client.tools.ClientRedirectHandler-class.html +++ /dev/null @@ -1,348 +0,0 @@ - - - - - oauth2client.tools.ClientRedirectHandler - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module tools :: - Class ClientRedirectHandler - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class ClientRedirectHandler

source code

-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-A handler for OAuth 2.0 redirects back to localhost.
-
-Waits for a single request and parses the query parameters
-into the servers query_params and then stops serving.
-
-
- - - - - - - - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-   - - - - - - -
do_GET(self)
- Handle a GET request.
- source code - -
- -
-   - - - - - - -
log_message(self, - format, - *args)
- Do not log messages to stdout while running as command line program.
- source code - -
- -
-

Inherited from BaseHTTPServer.BaseHTTPRequestHandler: - address_string, - date_time_string, - end_headers, - handle, - handle_one_request, - log_date_time_string, - log_error, - log_request, - parse_request, - send_error, - send_header, - send_response, - version_string -

-

Inherited from SocketServer.StreamRequestHandler: - finish, - setup -

-

Inherited from SocketServer.BaseRequestHandler: - __init__ -

-
- - - - - - - - - -
- - - - - -
Class Variables[hide private]
-
-

Inherited from BaseHTTPServer.BaseHTTPRequestHandler: - MessageClass, - default_request_version, - error_content_type, - error_message_format, - monthname, - protocol_version, - responses, - server_version, - sys_version, - weekdayname -

-

Inherited from SocketServer.StreamRequestHandler: - disable_nagle_algorithm, - rbufsize, - timeout, - wbufsize -

-
- - - - - - -
- - - - - -
Method Details[hide private]
-
- -
- -
- - -
-

do_GET(self) -

-
source code  -
- -
-Handle a GET request.
-
-Parses the query parameters and prints a message
-if the flow has completed. Note that we can't detect
-if an error occurred.
-
-
-
-
-
-
- -
- -
- - -
-

log_message(self, - format, - *args) -

-
source code  -
- -
-Do not log messages to stdout while running as command line program.
-
-
-
-
Overrides: - BaseHTTPServer.BaseHTTPRequestHandler.log_message -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.tools.ClientRedirectServer-class.html b/docs/epy/oauth2client.tools.ClientRedirectServer-class.html deleted file mode 100644 index c94c329..0000000 --- a/docs/epy/oauth2client.tools.ClientRedirectServer-class.html +++ /dev/null @@ -1,233 +0,0 @@ - - - - - oauth2client.tools.ClientRedirectServer - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module tools :: - Class ClientRedirectServer - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Class ClientRedirectServer

source code

-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
-
-A server to handle OAuth 2.0 redirects back to localhost.
-
-Waits for a single request and parses the query parameters
-into query_params and then stops serving.
-
-
- - - - - - - - - - -
- - - - - -
Instance Methods[hide private]
-
-

Inherited from BaseHTTPServer.HTTPServer: - server_bind -

-

Inherited from SocketServer.TCPServer: - __init__, - close_request, - fileno, - get_request, - server_activate, - server_close, - shutdown_request -

-

Inherited from SocketServer.BaseServer: - finish_request, - handle_error, - handle_request, - handle_timeout, - process_request, - serve_forever, - shutdown, - verify_request -

-

Inherited from SocketServer.BaseServer (private): - _handle_request_noblock -

-
- - - - - - - - - - - - -
- - - - - -
Class Variables[hide private]
-
-   - - query_params = {} -
-

Inherited from BaseHTTPServer.HTTPServer: - allow_reuse_address -

-

Inherited from SocketServer.TCPServer: - address_family, - request_queue_size, - socket_type -

-

Inherited from SocketServer.BaseServer: - timeout -

-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.util-module.html b/docs/epy/oauth2client.util-module.html deleted file mode 100644 index e0c69ba..0000000 --- a/docs/epy/oauth2client.util-module.html +++ /dev/null @@ -1,505 +0,0 @@ - - - - - oauth2client.util - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module util - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Module util

source code

-
-Common utility library.
-
-
- -
-
Authors:
-
- rafek@google.com (Rafe Kaplan), - guido@google.com (Guido van Rossum) -
-
-
- - - - - - - - - - - - - - - - - -
- - - - - -
Functions[hide private]
-
-   - - - - - - -
positional(max_positional_args)
- A decorator to declare that only the first N arguments my be positional.
- source code - -
- -
-   - - - - - - -
scopes_to_string(scopes)
- Converts scope value to a string.
- source code - -
- -
-   - - - - - - -
dict_to_tuple_key(dictionary)
- Converts a dictionary to a tuple that can be used as an immutable key.
- source code - -
- -
-   - - - - - - -
_add_query_parameter(url, - name, - value)
- Adds a query parameter to a url.
- source code - -
- -
- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
Variables[hide private]
-
-   - - logger = logging.getLogger(__name__) -
-   - - POSITIONAL_WARNING = 'WARNING' -
-   - - POSITIONAL_EXCEPTION = 'EXCEPTION' -
-   - - POSITIONAL_IGNORE = 'IGNORE' -
-   - - POSITIONAL_SET = frozenset([POSITIONAL_WARNING, POSITIONAL_EXC... -
-   - - positional_parameters_enforcement = 'WARNING' -
- - - - - - -
- - - - - -
Function Details[hide private]
-
- -
- -
- - -
-

positional(max_positional_args) -

-
source code  -
- -
-A decorator to declare that only the first N arguments my be positional.
-
-This decorator makes it easy to support Python 3 style key-word only
-parameters. For example, in Python 3 it is possible to write:
-
-  def fn(pos1, *, kwonly1=None, kwonly1=None):
-    ...
-
-All named parameters after * must be a keyword:
-
-  fn(10, 'kw1', 'kw2')  # Raises exception.
-  fn(10, kwonly1='kw1')  # Ok.
-
-Example:
-  To define a function like above, do:
-
-    @positional(1)
-    def fn(pos1, kwonly1=None, kwonly2=None):
-      ...
-
-  If no default value is provided to a keyword argument, it becomes a required
-  keyword argument:
-
-    @positional(0)
-    def fn(required_kw):
-      ...
-
-  This must be called with the keyword parameter:
-
-    fn()  # Raises exception.
-    fn(10)  # Raises exception.
-    fn(required_kw=10)  # Ok.
-
-  When defining instance or class methods always remember to account for
-  'self' and 'cls':
-
-    class MyClass(object):
-
-      @positional(2)
-      def my_method(self, pos1, kwonly1=None):
-        ...
-
-      @classmethod
-      @positional(2)
-      def my_method(cls, pos1, kwonly1=None):
-        ...
-
-The positional decorator behavior is controlled by
-util.positional_parameters_enforcement, which may be set to
-POSITIONAL_EXCEPTION, POSITIONAL_WARNING or POSITIONAL_IGNORE to raise an
-exception, log a warning, or do nothing, respectively, if a declaration is
-violated.
-
-Args:
-  max_positional_arguments: Maximum number of positional arguments. All
-    parameters after the this index must be keyword only.
-
-Returns:
-  A decorator that prevents using arguments after max_positional_args from
-  being used as positional parameters.
-
-Raises:
-  TypeError if a key-word only argument is provided as a positional
-  parameter, but only if util.positional_parameters_enforcement is set to
-  POSITIONAL_EXCEPTION.
-
-
-
-
-
-
- -
- -
- - -
-

scopes_to_string(scopes) -

-
source code  -
- -
-Converts scope value to a string.
-
-If scopes is a string then it is simply passed through. If scopes is an
-iterable then a string is returned that is all the individual scopes
-concatenated with spaces.
-
-Args:
-  scopes: string or iterable of strings, the scopes.
-
-Returns:
-  The scopes formatted as a single string.
-
-
-
-
-
-
- -
- -
- - -
-

dict_to_tuple_key(dictionary) -

-
source code  -
- -
-Converts a dictionary to a tuple that can be used as an immutable key.
-
-The resulting key is always sorted so that logically equivalent dictionaries
-always produce an identical tuple for a key.
-
-Args:
-  dictionary: the dictionary to use as the key.
-
-Returns:
-  A tuple representing the dictionary in it's naturally sorted ordering.
-
-
-
-
-
-
- -
- -
- - -
-

_add_query_parameter(url, - name, - value) -

-
source code  -
- -
-Adds a query parameter to a url.
-
-Replaces the current value if it already exists in the URL.
-
-Args:
-  url: string, url to add the query parameter to.
-  name: string, query parameter name.
-  value: string, query parameter value.
-
-Returns:
-  Updated query parameter. Does not update the url if value is None.
-
-
-
-
-
-
-
- - - - - - -
- - - - - -
Variables Details[hide private]
-
- -
- -
-

POSITIONAL_SET

- -
-
-
-
Value:
-
-frozenset([POSITIONAL_WARNING, POSITIONAL_EXCEPTION, POSITIONAL_IGNORE\
-])
-
-
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.util-pysrc.html b/docs/epy/oauth2client.util-pysrc.html deleted file mode 100644 index dda7c7c..0000000 --- a/docs/epy/oauth2client.util-pysrc.html +++ /dev/null @@ -1,323 +0,0 @@ - - - - - oauth2client.util - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module util - - - - - - -
[hide private]
[frames] | no frames]
-
-

Source Code for Module oauth2client.util

-
-  1  #!/usr/bin/env python 
-  2  # 
-  3  # Copyright 2014 Google Inc. All rights reserved. 
-  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  """Common utility library.""" 
- 19   
- 20  __author__ = [ 
- 21      'rafek@google.com (Rafe Kaplan)', 
- 22      'guido@google.com (Guido van Rossum)', 
- 23  ] 
- 24   
- 25  __all__ = [ 
- 26      'positional', 
- 27      'POSITIONAL_WARNING', 
- 28      'POSITIONAL_EXCEPTION', 
- 29      'POSITIONAL_IGNORE', 
- 30  ] 
- 31   
- 32  import inspect 
- 33  import logging 
- 34  import sys 
- 35  import types 
- 36   
- 37  import six 
- 38  from six.moves import urllib 
- 39   
- 40   
- 41  logger = logging.getLogger(__name__) 
- 42   
- 43  POSITIONAL_WARNING = 'WARNING' 
- 44  POSITIONAL_EXCEPTION = 'EXCEPTION' 
- 45  POSITIONAL_IGNORE = 'IGNORE' 
- 46  POSITIONAL_SET = frozenset([POSITIONAL_WARNING, POSITIONAL_EXCEPTION, 
- 47                              POSITIONAL_IGNORE]) 
- 48   
- 49  positional_parameters_enforcement = POSITIONAL_WARNING 
- 50   
-
51 -def positional(max_positional_args): -
52 """A decorator to declare that only the first N arguments my be positional. - 53 - 54 This decorator makes it easy to support Python 3 style key-word only - 55 parameters. For example, in Python 3 it is possible to write: - 56 - 57 def fn(pos1, *, kwonly1=None, kwonly1=None): - 58 ... - 59 - 60 All named parameters after * must be a keyword: - 61 - 62 fn(10, 'kw1', 'kw2') # Raises exception. - 63 fn(10, kwonly1='kw1') # Ok. - 64 - 65 Example: - 66 To define a function like above, do: - 67 - 68 @positional(1) - 69 def fn(pos1, kwonly1=None, kwonly2=None): - 70 ... - 71 - 72 If no default value is provided to a keyword argument, it becomes a required - 73 keyword argument: - 74 - 75 @positional(0) - 76 def fn(required_kw): - 77 ... - 78 - 79 This must be called with the keyword parameter: - 80 - 81 fn() # Raises exception. - 82 fn(10) # Raises exception. - 83 fn(required_kw=10) # Ok. - 84 - 85 When defining instance or class methods always remember to account for - 86 'self' and 'cls': - 87 - 88 class MyClass(object): - 89 - 90 @positional(2) - 91 def my_method(self, pos1, kwonly1=None): - 92 ... - 93 - 94 @classmethod - 95 @positional(2) - 96 def my_method(cls, pos1, kwonly1=None): - 97 ... - 98 - 99 The positional decorator behavior is controlled by -100 util.positional_parameters_enforcement, which may be set to -101 POSITIONAL_EXCEPTION, POSITIONAL_WARNING or POSITIONAL_IGNORE to raise an -102 exception, log a warning, or do nothing, respectively, if a declaration is -103 violated. -104 -105 Args: -106 max_positional_arguments: Maximum number of positional arguments. All -107 parameters after the this index must be keyword only. -108 -109 Returns: -110 A decorator that prevents using arguments after max_positional_args from -111 being used as positional parameters. -112 -113 Raises: -114 TypeError if a key-word only argument is provided as a positional -115 parameter, but only if util.positional_parameters_enforcement is set to -116 POSITIONAL_EXCEPTION. -117 """ -118 def positional_decorator(wrapped): -119 def positional_wrapper(*args, **kwargs): -120 if len(args) > max_positional_args: -121 plural_s = '' -122 if max_positional_args != 1: -123 plural_s = 's' -124 message = '%s() takes at most %d positional argument%s (%d given)' % ( -125 wrapped.__name__, max_positional_args, plural_s, len(args)) -126 if positional_parameters_enforcement == POSITIONAL_EXCEPTION: -127 raise TypeError(message) -128 elif positional_parameters_enforcement == POSITIONAL_WARNING: -129 logger.warning(message) -130 else: # IGNORE -131 pass -132 return wrapped(*args, **kwargs) -
133 return positional_wrapper -134 -135 if isinstance(max_positional_args, six.integer_types): -136 return positional_decorator -137 else: -138 args, _, _, defaults = inspect.getargspec(max_positional_args) -139 return positional(len(args) - len(defaults))(max_positional_args) -140 -141 -
142 -def scopes_to_string(scopes): -
143 """Converts scope value to a string. -144 -145 If scopes is a string then it is simply passed through. If scopes is an -146 iterable then a string is returned that is all the individual scopes -147 concatenated with spaces. -148 -149 Args: -150 scopes: string or iterable of strings, the scopes. -151 -152 Returns: -153 The scopes formatted as a single string. -154 """ -155 try: -156 is_string = isinstance(scopes, basestring) -157 except NameError: -158 is_string = isinstance(scopes, str) -159 if is_string: -160 return scopes -161 else: -162 return ' '.join(scopes) -
163 -164 -
165 -def dict_to_tuple_key(dictionary): -
166 """Converts a dictionary to a tuple that can be used as an immutable key. -167 -168 The resulting key is always sorted so that logically equivalent dictionaries -169 always produce an identical tuple for a key. -170 -171 Args: -172 dictionary: the dictionary to use as the key. -173 -174 Returns: -175 A tuple representing the dictionary in it's naturally sorted ordering. -176 """ -177 return tuple(sorted(dictionary.items())) -
178 -179 -
180 -def _add_query_parameter(url, name, value): -
181 """Adds a query parameter to a url. -182 -183 Replaces the current value if it already exists in the URL. -184 -185 Args: -186 url: string, url to add the query parameter to. -187 name: string, query parameter name. -188 value: string, query parameter value. -189 -190 Returns: -191 Updated query parameter. Does not update the url if value is None. -192 """ -193 if value is None: -194 return url -195 else: -196 parsed = list(urllib.parse.urlparse(url)) -197 q = dict(urllib.parse.parse_qsl(parsed[4])) -198 q[name] = value -199 parsed[4] = urllib.parse.urlencode(q) -200 return urllib.parse.urlunparse(parsed) -
201 -
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.xsrfutil-module.html b/docs/epy/oauth2client.xsrfutil-module.html deleted file mode 100644 index 29ed128..0000000 --- a/docs/epy/oauth2client.xsrfutil-module.html +++ /dev/null @@ -1,326 +0,0 @@ - - - - - oauth2client.xsrfutil - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module xsrfutil - - - - - - -
[hide private]
[frames] | no frames]
-
- -

Module xsrfutil

source code

-
-Helper methods for creating & verifying XSRF tokens.
-
-
- -
-
Authors:
-
- "Doug Coker" <dcoker@google.com>, - "Joe Gregorio" <jcgregorio@google.com> -
-
-
- - - - - - - - - - - - - - -
- - - - - -
Functions[hide private]
-
-   - - - - - - -
_force_bytes(s) - source code - -
- -
-   - - - - - - -
generate_token(key, - user_id, - action_id="", - when=None)
- Generates a URL-safe token for the given user, action, time tuple.
- source code - -
- -
-   - - - - - - -
validate_token(key, - token, - user_id, - action_id="", - current_time=None)
- Validates that the given token authorizes the user for the action.
- source code - -
- -
- - - - - - - - - - - - -
- - - - - -
Variables[hide private]
-
-   - - DELIMITER = b':' -
-   - - DEFAULT_TIMEOUT_SECS = 1* 60* 60 -
- - - - - - -
- - - - - -
Function Details[hide private]
-
- -
- -
- - -
-

generate_token(key, - user_id, - action_id="", - when=None) -

-
source code  -
- -
-Generates a URL-safe token for the given user, action, time tuple.
-
-Args:
-  key: secret key to use.
-  user_id: the user ID of the authenticated user.
-  action_id: a string identifier of the action they requested
-    authorization for.
-  when: the time in seconds since the epoch at which the user was
-    authorized for this action. If not set the current time is used.
-
-Returns:
-  A string XSRF protection token.
-
-
-
-
Decorators:
-
    -
  • @util.positional(2)
  • -
-
-
-
- -
- -
- - -
-

validate_token(key, - token, - user_id, - action_id="", - current_time=None) -

-
source code  -
- -
-Validates that the given token authorizes the user for the action.
-
-Tokens are invalid if the time of issue is too old or if the token
-does not match what generateToken outputs (i.e. the token was forged).
-
-Args:
-  key: secret key to use.
-  token: a string of the token generated by generateToken.
-  user_id: the user ID of the authenticated user.
-  action_id: a string identifier of the action they requested
-    authorization for.
-
-Returns:
-  A boolean - True if the user is authorized for the action, False
-  otherwise.
-
-
-
-
Decorators:
-
    -
  • @util.positional(3)
  • -
-
-
-
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/oauth2client.xsrfutil-pysrc.html b/docs/epy/oauth2client.xsrfutil-pysrc.html deleted file mode 100644 index 5e974f6..0000000 --- a/docs/epy/oauth2client.xsrfutil-pysrc.html +++ /dev/null @@ -1,229 +0,0 @@ - - - - - oauth2client.xsrfutil - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - Package oauth2client :: - Module xsrfutil - - - - - - -
[hide private]
[frames] | no frames]
-
-

Source Code for Module oauth2client.xsrfutil

-
-  1  # 
-  2  # Copyright 2014 the Melange authors. 
-  3  # 
-  4  # Licensed under the Apache License, Version 2.0 (the "License"); 
-  5  # you may not use this file except in compliance with the License. 
-  6  # You may obtain a copy of the License at 
-  7  # 
-  8  #   http://www.apache.org/licenses/LICENSE-2.0 
-  9  # 
- 10  # Unless required by applicable law or agreed to in writing, software 
- 11  # distributed under the License is distributed on an "AS IS" BASIS, 
- 12  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
- 13  # See the License for the specific language governing permissions and 
- 14  # limitations under the License. 
- 15   
- 16  """Helper methods for creating & verifying XSRF tokens.""" 
- 17   
- 18  __authors__ = [ 
- 19      '"Doug Coker" <dcoker@google.com>', 
- 20      '"Joe Gregorio" <jcgregorio@google.com>', 
- 21  ] 
- 22   
- 23   
- 24  import base64 
- 25  import hmac 
- 26  import time 
- 27   
- 28  import six 
- 29  from oauth2client import util 
- 30   
- 31   
- 32  # Delimiter character 
- 33  DELIMITER = b':' 
- 34   
- 35   
- 36  # 1 hour in seconds 
- 37  DEFAULT_TIMEOUT_SECS = 1*60*60 
-
38 - 39 - 40 -def _force_bytes(s): -
41 if isinstance(s, bytes): - 42 return s - 43 s = str(s) - 44 if isinstance(s, six.text_type): - 45 return s.encode('utf-8') - 46 return s -
47 -
48 - 49 @util.positional(2) - 50 -def generate_token(key, user_id, action_id="", when=None): -
51 """Generates a URL-safe token for the given user, action, time tuple. - 52 - 53 Args: - 54 key: secret key to use. - 55 user_id: the user ID of the authenticated user. - 56 action_id: a string identifier of the action they requested - 57 authorization for. - 58 when: the time in seconds since the epoch at which the user was - 59 authorized for this action. If not set the current time is used. - 60 - 61 Returns: - 62 A string XSRF protection token. - 63 """ - 64 when = _force_bytes(when or int(time.time())) - 65 digester = hmac.new(_force_bytes(key)) - 66 digester.update(_force_bytes(user_id)) - 67 digester.update(DELIMITER) - 68 digester.update(_force_bytes(action_id)) - 69 digester.update(DELIMITER) - 70 digester.update(when) - 71 digest = digester.digest() - 72 - 73 token = base64.urlsafe_b64encode(digest + DELIMITER + when) - 74 return token -
75 -
76 - 77 @util.positional(3) - 78 -def validate_token(key, token, user_id, action_id="", current_time=None): -
79 """Validates that the given token authorizes the user for the action. - 80 - 81 Tokens are invalid if the time of issue is too old or if the token - 82 does not match what generateToken outputs (i.e. the token was forged). - 83 - 84 Args: - 85 key: secret key to use. - 86 token: a string of the token generated by generateToken. - 87 user_id: the user ID of the authenticated user. - 88 action_id: a string identifier of the action they requested - 89 authorization for. - 90 - 91 Returns: - 92 A boolean - True if the user is authorized for the action, False - 93 otherwise. - 94 """ - 95 if not token: - 96 return False - 97 try: - 98 decoded = base64.urlsafe_b64decode(token) - 99 token_time = int(decoded.split(DELIMITER)[-1]) -100 except (TypeError, ValueError): -101 return False -102 if current_time is None: -103 current_time = time.time() -104 # If the token is too old it's not valid. -105 if current_time - token_time > DEFAULT_TIMEOUT_SECS: -106 return False -107 -108 # The given token should match the generated one with the same time. -109 expected_token = generate_token(key, user_id, action_id=action_id, -110 when=token_time) -111 if len(token) != len(expected_token): -112 return False -113 -114 # Perform constant time comparison to avoid timing attacks -115 different = 0 -116 for x, y in zip(bytearray(token), bytearray(expected_token)): -117 different |= x ^ y -118 return not different -
119 -
-
- - - - - - - - - - - - - - - - - - - - - - - -
- - - - diff --git a/docs/epy/redirect.html b/docs/epy/redirect.html deleted file mode 100644 index f919c4c..0000000 --- a/docs/epy/redirect.html +++ /dev/null @@ -1,38 +0,0 @@ -Epydoc Redirect Page - - - - - - - - -

Epydoc Auto-redirect page

- -

When javascript is enabled, this page will redirect URLs of -the form redirect.html#dotted.name to the -documentation for the object with the given fully-qualified -dotted name.

-

 

- - - - - diff --git a/docs/epy/toc-everything.html b/docs/epy/toc-everything.html deleted file mode 100644 index 0788ae0..0000000 --- a/docs/epy/toc-everything.html +++ /dev/null @@ -1,300 +0,0 @@ - - - - - Everything - - - - - -

Everything

-
-

All Classes

- oauth2client.appengine.AppAssertionCredentials
oauth2client.appengine.CredentialsModel
oauth2client.appengine.CredentialsNDBModel
oauth2client.appengine.CredentialsNDBProperty
oauth2client.appengine.CredentialsProperty
oauth2client.appengine.FlowNDBProperty
oauth2client.appengine.FlowProperty
oauth2client.appengine.InvalidClientSecretsError
oauth2client.appengine.InvalidXsrfTokenError
oauth2client.appengine.OAuth2Decorator
oauth2client.appengine.OAuth2DecoratorFromClientSecrets
oauth2client.appengine.SiteXsrfSecretKey
oauth2client.appengine.SiteXsrfSecretKeyNDB
oauth2client.appengine.StorageByKeyName
oauth2client.client.AccessTokenCredentials
oauth2client.client.AccessTokenCredentialsError
oauth2client.client.AccessTokenRefreshError
oauth2client.client.ApplicationDefaultCredentialsError
oauth2client.client.AssertionCredentials
oauth2client.client.Credentials
oauth2client.client.CryptoUnavailableError
oauth2client.client.DeviceFlowInfo
oauth2client.client.Error
oauth2client.client.Flow
oauth2client.client.FlowExchangeError
oauth2client.client.GoogleCredentials
oauth2client.client.MemoryCache
oauth2client.client.NonAsciiHeaderError
oauth2client.client.OAuth2Credentials
oauth2client.client.OAuth2DeviceCodeError
oauth2client.client.OAuth2WebServerFlow
oauth2client.client.SignedJwtAssertionCredentials
oauth2client.client.Storage
oauth2client.client.TokenRevokeError
oauth2client.client.UnknownClientSecretsFlowError
oauth2client.client.VerifyJwtTokenError
oauth2client.clientsecrets.Error
oauth2client.clientsecrets.InvalidClientSecretsError
oauth2client.crypt.AppIdentityError
oauth2client.django_orm.CredentialsField
oauth2client.django_orm.FlowField
oauth2client.django_orm.Storage
oauth2client.file.CredentialsFileSymbolicLinkError
oauth2client.file.Storage
oauth2client.gce.AppAssertionCredentials
oauth2client.keyring_storage.Storage
oauth2client.locked_file.AlreadyLockedException
oauth2client.locked_file.CredentialsFileSymbolicLinkError
oauth2client.locked_file.LockedFile
- - oauth2client.multistore_file.Error
oauth2client.multistore_file.NewerCredentialStoreError
- - - - -

All Functions

- - - - - oauth2client.appengine.oauth2decorator_from_clientsecrets
oauth2client.appengine.xsrf_secret_key
- - - - - - - - - - - - - - oauth2client.client.clean_headers
oauth2client.client.credentials_from_clientsecrets_and_code
oauth2client.client.credentials_from_code
oauth2client.client.flow_from_clientsecrets
oauth2client.client.save_to_well_known_file
oauth2client.client.verify_id_token
- - oauth2client.clientsecrets.load
oauth2client.clientsecrets.loadfile
oauth2client.clientsecrets.loads
- - - - oauth2client.crypt.make_signed_jwt
oauth2client.crypt.verify_signed_jwt_with_certs
oauth2client.locked_file.validate_file
- oauth2client.multistore_file.get_all_credential_keys
oauth2client.multistore_file.get_credential_storage
oauth2client.multistore_file.get_credential_storage_custom_key
oauth2client.multistore_file.get_credential_storage_custom_string_key
oauth2client.old_run.run
- - - oauth2client.tools.message_if_missing
oauth2client.tools.run
oauth2client.tools.run_flow
- - oauth2client.util.positional
- - oauth2client.xsrfutil.generate_token
oauth2client.xsrfutil.validate_token

All Variables

- oauth2client.GOOGLE_AUTH_URI
oauth2client.GOOGLE_DEVICE_URI
oauth2client.GOOGLE_REVOKE_URI
oauth2client.GOOGLE_TOKEN_URI
oauth2client.appengine.OAUTH2CLIENT_NAMESPACE
oauth2client.appengine.XSRF_MEMCACHE_ID
oauth2client.appengine.logger
oauth2client.appengine.ndb
oauth2client.client.ADC_HELP_MSG
oauth2client.client.AUTHORIZED_USER
oauth2client.client.AccessTokenInfo
oauth2client.client.EXPIRY_FORMAT
oauth2client.client.GOOGLE_APPLICATION_CREDENTIALS
oauth2client.client.HAS_CRYPTO
oauth2client.client.HAS_OPENSSL
oauth2client.client.ID_TOKEN_VERIFICATION_CERTS
oauth2client.client.ID_TOKEN_VERIFICATON_CERTS
oauth2client.client.OOB_CALLBACK_URN
oauth2client.client.REFRESH_STATUS_CODES
oauth2client.client.SERVICE_ACCOUNT
- - oauth2client.client.logger
oauth2client.clientsecrets.TYPE_INSTALLED
oauth2client.clientsecrets.TYPE_WEB
oauth2client.clientsecrets.VALID_CLIENT
oauth2client.crypt.AUTH_TOKEN_LIFETIME_SECS
oauth2client.crypt.CLOCK_SKEW_SECS
oauth2client.crypt.MAX_TOKEN_LIFETIME_SECS
oauth2client.crypt.OpenSSLSigner
oauth2client.crypt.OpenSSLVerifier
oauth2client.crypt.PyCryptoSigner
oauth2client.crypt.PyCryptoVerifier
oauth2client.crypt.Signer
oauth2client.crypt.Verifier
oauth2client.crypt.logger
oauth2client.gce.META
oauth2client.gce.logger
- - oauth2client.locked_file.logger
- - oauth2client.multistore_file.logger
oauth2client.old_run.FLAGS
- oauth2client.tools.argparser
oauth2client.util.POSITIONAL_EXCEPTION
oauth2client.util.POSITIONAL_IGNORE
- oauth2client.util.POSITIONAL_WARNING
- - oauth2client.xsrfutil.DEFAULT_TIMEOUT_SECS
oauth2client.xsrfutil.DELIMITER

-[hide private] - - - - diff --git a/docs/epy/toc-oauth2client-module.html b/docs/epy/toc-oauth2client-module.html deleted file mode 100644 index 07dfca3..0000000 --- a/docs/epy/toc-oauth2client-module.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - oauth2client - - - - - -

Module oauth2client

-
-

Variables

- GOOGLE_AUTH_URI
GOOGLE_DEVICE_URI
GOOGLE_REVOKE_URI
GOOGLE_TOKEN_URI

-[hide private] - - - - diff --git a/docs/epy/toc-oauth2client.anyjson-module.html b/docs/epy/toc-oauth2client.anyjson-module.html deleted file mode 100644 index d0dbce9..0000000 --- a/docs/epy/toc-oauth2client.anyjson-module.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - anyjson - - - - - -

Module anyjson

-
-
-[hide private] - - - - diff --git a/docs/epy/toc-oauth2client.appengine-module.html b/docs/epy/toc-oauth2client.appengine-module.html deleted file mode 100644 index 3acc0eb..0000000 --- a/docs/epy/toc-oauth2client.appengine-module.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - appengine - - - - - -

Module appengine

-
-

Classes

- AppAssertionCredentials
CredentialsModel
CredentialsNDBModel
CredentialsNDBProperty
CredentialsProperty
FlowNDBProperty
FlowProperty
InvalidClientSecretsError
InvalidXsrfTokenError
OAuth2Decorator
OAuth2DecoratorFromClientSecrets
SiteXsrfSecretKey
SiteXsrfSecretKeyNDB
StorageByKeyName

Functions

- - - - - oauth2decorator_from_clientsecrets
xsrf_secret_key

Variables

- OAUTH2CLIENT_NAMESPACE
XSRF_MEMCACHE_ID
logger
ndb

-[hide private] - - - - diff --git a/docs/epy/toc-oauth2client.client-module.html b/docs/epy/toc-oauth2client.client-module.html deleted file mode 100644 index bd3bdb0..0000000 --- a/docs/epy/toc-oauth2client.client-module.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - client - - - - - -

Module client

-
-

Classes

- AccessTokenCredentials
AccessTokenCredentialsError
AccessTokenRefreshError
ApplicationDefaultCredentialsError
AssertionCredentials
Credentials
CryptoUnavailableError
DeviceFlowInfo
Error
Flow
FlowExchangeError
GoogleCredentials
MemoryCache
NonAsciiHeaderError
OAuth2Credentials
OAuth2DeviceCodeError
OAuth2WebServerFlow
SignedJwtAssertionCredentials
Storage
TokenRevokeError
UnknownClientSecretsFlowError
VerifyJwtTokenError

Functions

- - - - - - - - - - - - - - - clean_headers
credentials_from_clientsecrets_and_code
credentials_from_code
flow_from_clientsecrets
save_to_well_known_file
verify_id_token

Variables

- ADC_HELP_MSG
AUTHORIZED_USER
AccessTokenInfo
EXPIRY_FORMAT
GOOGLE_APPLICATION_CREDENTIALS
HAS_CRYPTO
HAS_OPENSSL
ID_TOKEN_VERIFICATION_CERTS
ID_TOKEN_VERIFICATON_CERTS
OOB_CALLBACK_URN
REFRESH_STATUS_CODES
SERVICE_ACCOUNT
- - logger

-[hide private] - - - - diff --git a/docs/epy/toc-oauth2client.clientsecrets-module.html b/docs/epy/toc-oauth2client.clientsecrets-module.html deleted file mode 100644 index f60223b..0000000 --- a/docs/epy/toc-oauth2client.clientsecrets-module.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - - clientsecrets - - - - - -

Module clientsecrets

-
-

Classes

- Error
InvalidClientSecretsError

Functions

- - - load
loadfile
loads

Variables

- TYPE_INSTALLED
TYPE_WEB
VALID_CLIENT

-[hide private] - - - - diff --git a/docs/epy/toc-oauth2client.crypt-module.html b/docs/epy/toc-oauth2client.crypt-module.html deleted file mode 100644 index 77829f5..0000000 --- a/docs/epy/toc-oauth2client.crypt-module.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - - crypt - - - - - -

Module crypt

-
-

Classes

- AppIdentityError

Functions

- - - - - make_signed_jwt
verify_signed_jwt_with_certs

Variables

- AUTH_TOKEN_LIFETIME_SECS
CLOCK_SKEW_SECS
MAX_TOKEN_LIFETIME_SECS
OpenSSLSigner
OpenSSLVerifier
PyCryptoSigner
PyCryptoVerifier
Signer
Verifier
logger

-[hide private] - - - - diff --git a/docs/epy/toc-oauth2client.django_orm-module.html b/docs/epy/toc-oauth2client.django_orm-module.html deleted file mode 100644 index a32834d..0000000 --- a/docs/epy/toc-oauth2client.django_orm-module.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - django_orm - - - - - -

Module django_orm

-
-

Classes

- CredentialsField
FlowField
Storage

-[hide private] - - - - diff --git a/docs/epy/toc-oauth2client.file-module.html b/docs/epy/toc-oauth2client.file-module.html deleted file mode 100644 index ac6305b..0000000 --- a/docs/epy/toc-oauth2client.file-module.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - file - - - - - -

Module file

-
-

Classes

- CredentialsFileSymbolicLinkError
Storage

-[hide private] - - - - diff --git a/docs/epy/toc-oauth2client.gce-module.html b/docs/epy/toc-oauth2client.gce-module.html deleted file mode 100644 index 8b27668..0000000 --- a/docs/epy/toc-oauth2client.gce-module.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - gce - - - - - -

Module gce

-
-

Classes

- AppAssertionCredentials

Variables

- META
logger

-[hide private] - - - - diff --git a/docs/epy/toc-oauth2client.keyring_storage-module.html b/docs/epy/toc-oauth2client.keyring_storage-module.html deleted file mode 100644 index 1fc9738..0000000 --- a/docs/epy/toc-oauth2client.keyring_storage-module.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - keyring_storage - - - - - -

Module keyring_storage

-
-

Classes

- Storage

-[hide private] - - - - diff --git a/docs/epy/toc-oauth2client.locked_file-module.html b/docs/epy/toc-oauth2client.locked_file-module.html deleted file mode 100644 index 51c5e73..0000000 --- a/docs/epy/toc-oauth2client.locked_file-module.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - locked_file - - - - - -

Module locked_file

-
-

Classes

- AlreadyLockedException
CredentialsFileSymbolicLinkError
LockedFile
- -

Functions

- validate_file

Variables

- - - logger

-[hide private] - - - - diff --git a/docs/epy/toc-oauth2client.multistore_file-module.html b/docs/epy/toc-oauth2client.multistore_file-module.html deleted file mode 100644 index e86c89b..0000000 --- a/docs/epy/toc-oauth2client.multistore_file-module.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - multistore_file - - - - - -

Module multistore_file

-
-

Classes

- Error
NewerCredentialStoreError
-

Functions

- - get_all_credential_keys
get_credential_storage
get_credential_storage_custom_key
get_credential_storage_custom_string_key

Variables

- - - logger

-[hide private] - - - - diff --git a/docs/epy/toc-oauth2client.old_run-module.html b/docs/epy/toc-oauth2client.old_run-module.html deleted file mode 100644 index 5fbd5c3..0000000 --- a/docs/epy/toc-oauth2client.old_run-module.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - old_run - - - - - -

Module old_run

-
-

Functions

- run

Variables

- FLAGS

-[hide private] - - - - diff --git a/docs/epy/toc-oauth2client.service_account-module.html b/docs/epy/toc-oauth2client.service_account-module.html deleted file mode 100644 index 401e3e8..0000000 --- a/docs/epy/toc-oauth2client.service_account-module.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - service_account - - - - - -

Module service_account

-
-

Classes

- -

Functions

- - -
-[hide private] - - - - diff --git a/docs/epy/toc-oauth2client.tools-module.html b/docs/epy/toc-oauth2client.tools-module.html deleted file mode 100644 index 51eac95..0000000 --- a/docs/epy/toc-oauth2client.tools-module.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - tools - - - - - -

Module tools

-
-

Classes

- - -

Functions

- - message_if_missing
run
run_flow

Variables

- - argparser

-[hide private] - - - - diff --git a/docs/epy/toc-oauth2client.util-module.html b/docs/epy/toc-oauth2client.util-module.html deleted file mode 100644 index 335250f..0000000 --- a/docs/epy/toc-oauth2client.util-module.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - util - - - - - -

Module util

-
-

Functions

- - - positional
-

Variables

- POSITIONAL_EXCEPTION
POSITIONAL_IGNORE
- POSITIONAL_WARNING
- logger
- -
-[hide private] - - - - diff --git a/docs/epy/toc-oauth2client.xsrfutil-module.html b/docs/epy/toc-oauth2client.xsrfutil-module.html deleted file mode 100644 index 7b527b5..0000000 --- a/docs/epy/toc-oauth2client.xsrfutil-module.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - xsrfutil - - - - - -

Module xsrfutil

-
-

Functions

- - generate_token
validate_token

Variables

- DEFAULT_TIMEOUT_SECS
DELIMITER

-[hide private] - - - - diff --git a/docs/epy/toc.html b/docs/epy/toc.html deleted file mode 100644 index 96bc5e0..0000000 --- a/docs/epy/toc.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - Table of Contents - - - - - -

Table of Contents

-
- Everything -
-

Modules

- oauth2client
oauth2client.appengine
oauth2client.client
oauth2client.clientsecrets
oauth2client.crypt
oauth2client.django_orm
oauth2client.file
oauth2client.gce
oauth2client.keyring_storage
oauth2client.locked_file
oauth2client.multistore_file
oauth2client.old_run
oauth2client.service_account
oauth2client.tools
oauth2client.util
oauth2client.xsrfutil

- [hide private] - - - - diff --git a/docs/epy/uml_class_diagram_for_oauth2cl.gif b/docs/epy/uml_class_diagram_for_oauth2cl.gif deleted file mode 100644 index 611b29a084dd473d95a7dc1f23c25f0fe46da5a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22645 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 diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_10.gif b/docs/epy/uml_class_diagram_for_oauth2cl_10.gif deleted file mode 100644 index 0cf19ad227c056dd84047130ae002c3408814753..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26165 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 RRW|~vLKCXqNkRdm{{jCZ&z=AP diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_11.gif b/docs/epy/uml_class_diagram_for_oauth2cl_11.gif deleted file mode 100644 index aed9d70ac3ea0d8d74d84fd0e671922456bb76af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17833 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 U?6Acio9wd9J{#?{c?}2vJIu8&?f?J) diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_12.gif b/docs/epy/uml_class_diagram_for_oauth2cl_12.gif deleted file mode 100644 index 4b34bb00e2df1bb24bca7827d3f8a7978d2bf77e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1650 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 K3tA8eaQqLCsw_YN diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_14.gif b/docs/epy/uml_class_diagram_for_oauth2cl_14.gif deleted file mode 100644 index f986b018f2631546d44c1401ec12587a5965d5dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11554 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 NWS@3Ufk1%f{{TJPV2l6& diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_17.gif b/docs/epy/uml_class_diagram_for_oauth2cl_17.gif deleted file mode 100644 index 0739ffe9114a2bdf643f4302dd6b8a56794a52ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11968 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 diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_20.gif b/docs/epy/uml_class_diagram_for_oauth2cl_20.gif deleted file mode 100644 index cba25b379230c4ca99e73039e7b28ae3f8546e7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7245 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 diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_23.gif b/docs/epy/uml_class_diagram_for_oauth2cl_23.gif deleted file mode 100644 index fa6d0f6202238b10c2c5f14de59ed8ee6120231f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 627 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 xD-UB(|^{~zz~7`6Za diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_25.gif b/docs/epy/uml_class_diagram_for_oauth2cl_25.gif deleted file mode 100644 index 54fc5ed97984dc4b445ea53f26067fa0042a20e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25660 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 diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_26.gif b/docs/epy/uml_class_diagram_for_oauth2cl_26.gif deleted file mode 100644 index c246528db210cec53f76c89c9608928acb4b4eb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3406 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 epM_`i__03!e}0RR^Ohy?&V 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 diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_29.gif b/docs/epy/uml_class_diagram_for_oauth2cl_29.gif deleted file mode 100644 index 091db8b026c9d0eddedd84b4c71d3e74005ca84b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11958 zcmd^lg;Ugz^Y{A#xFe6cqa{y3I*$-ZX{5X5=tdgx3OKsq2$61)kPs9p1rZgbQ4tg* z6s1H2mEY(4{2R~C&d$#4%+Bo2zIJwYSKshDM%m*j@EP%F1fU zN@&STmB`EMD#_|$Fj*K(x~hV)nqq~Tn(0+l^J^-V*RI{r)U?r2uh!AA(bKcnyXL5` zWn^UJYNX?AY+P?*a?|ws%^Swv=7wGt76H~KHa0eXHa0CbHum=RIrcY#9ULMYEjyj8 z!knESxVpx=*~YosMSFPM_H>B%^6K>RB6vF|`MRa}yLbEhlL7+LgKma|grtUq^o4|k zhK6Q`dgp}sl!u3BMMU&RL=;B)=S4*o#>SS!2A3oxR3wBACL~lPMhxA#a}STN!$%T{ z#9<<_hD2&fj%`a#c$S*_GBu$&Ev+Lx@nIIeJv)0MJG(cBIFO%IP*BiQP%v0Xepy)f zsHkYTIBm8#^+{>zv(k*$Wn~k0vqvf_CM$BL@7;S|RrRVWZ@D_Zsivm3wsx|%_U(UM zS2*85dEMB!&{)#k+&tIX`o8t$J+dj9;^ zix*#}rp~9PE~ck<=jQfSR#sP6_dk9-`1I-I+qcsnKhBPifBpJ(adGkgD&qemA@Cat z2Y_}!;(sy!4-)|F0&s)#7_?Uo6Jf04&J*obqbUd>qjH0e>SyU3^8W89I%>wV`E}BG z3_ELI@sLNnHXhuhGNCnHqz9ahJ)5O|uQ= zsZqaS{LqXR`!4?vlie+g58Ox7c#V5n9a;qdb6#T8{dc{gpC|7c_qKf)h&kH*@N#jF zqni)ZzGuuaTYagRcJ#?{%>k205Zi#>=cO>O7m;@-X3nD}y&vl&y2}X*9&8x{-t?Sc zh$j1#4*wG6>iMBhZ@A#YZhW%*S{C7*Yuc^ix7E)IK3$i~Oijt`D~8EN5B#|={3#u@ zl)S#aSG|)wY4Tc^_>^jox7TSdiO($XasW9)h}1&VA|E_K))5j|k_&*D)n{xI&-KtWRGJB}QIUB2 z7)@cp7(85nnU5bVK*59+Ch53)UJAY0n5)TM{O9Lgn`GfsI6J~%Tqhb~$Hw~f-bXiMYZZb@J$b_NS1 z0bXH-Y{1-aZhbZe*kM(e0+z6(rs5gf@J zzuFP%bQ9qz)nCx~vNgf%*5$oA2SmVlHXu>08!ZD49WUF+!fSz5akhfqnY49(2*sPHmrC^qrU!hD9>Mn=PI}>Lm&F z>**f+V6d-v$4LQ+q!G6nw8y;{uNl3g?-aDrGWM-JzAe|?LbpBfJlw{wFlHY?=$#2vb;BsCiw`G~=Q{=#Q=J8u1ot1j z6-jn1ZU>l@yomWvLL%;RFK$_5A%HGFX#NwPNj8^C&w@aO76%E+tfw@HR6^3v@UZFy z;A6J{NCshF3TWb?+iR(V5!~qSYXbB!?iPSaX_84TL379e%0LF_Z|ws*7!bgbJiYAHI z6?zX9X2?_zdiQK0zr0s>gz>P7PUO3}@)HDDE!luxaASI^$9#lweuFMA-^8u3O6QzUsmZcj+=#vI5&4V0QFFbTCh>#!J(R4)B64y% zS@pOIk=dww*=Q!s@wl4lFTzGJbtWtBxQ3sh$$+;$!G11JC_9ma{&5>&)dcXE~P9` zD?gff)!A4_=gs~0jR1*X9^>fj9vRDwkCwI{_&d^z${ryJKEj z)T_1Lu`lCSNfMD#;-?^i@9vvdoMia7GHN-|USd0)&$S9{M4fdu$vsF`6q=J9Wt?yOXkq_qJ(anIazOSUQ~8HdS` zwO~Tk@dGjjcXeN<=eo_jp~Y5ROj-1i7^m_j!XyO|J&#E&uW6TVI2gf|Dzj-<3S6%7 zS1YE|7WB}UdMn0bs+6ueI<@BD*tG#xWn()e&n5{Za=jBVP%nJKFA-zt*OS(~_~dZj z_hSwwBIpI-J7OL%Q84qj<|fj}Jeur##b6pl&VlI;HPM*2OVTWjF7zW`+v=arr{_n$ z^Oqd#ITc_bYv#{bQ{Jt6q=St_SsE1DRdq!tBfr+Rc75*rqNE?cAolP+^Fc~7BO)bd z<IQU#?88a{SfWkoqZ83M&7eDv)Eg|8C>Fx5wcLulk`*>g%^jO;HL83Fq`TwkBqw3 zK>jP55gO7G(<$P|1+Jbj-gX?rLg}p}X_qF`2WRf6wx6p#Wi>(!154v(Cs{>o7vN_FLyxS-9_P)Sq zsYe1gvS??MmuK`CeB%$^_d5RS7fwE?wtVyX-QnGn%Iv^u%U)-x8T{fh6{HNb|7Cq8 z_7Or*60xQ=+^DcQ{tl+!s3boj&DJDAwvi@H86zsb{#?G)a}tKv62jM(slMAe;5BD& zdA*42)H8y{%o|@IU#AsIsJjopej{Kq8Y?K)J1^0wgZ zPK!oW&r|n@1z6}%Wp6=m-@McCi>IamMJz&Pi^Pj2qv9$>gQ{=~f~pHe_P?vur)q?M zZQ)vbP%?m9i~tR+GOmyv7Zv7gshYX5?!ZRVn*g zLF-gHM7SFQylsaUTLOd|t}y-5o0q$jBWzeuVA{aqt!W~OLTxK>%?t79JV)J6LA4hrhrUII%OHEgEG^pERfgEdEMlXpsEhR7cE%mQ z+BxW4xW|N6L0?_JnGSQ#oQPK0Bv2--OZ!r<&!<+vtSdRvG!)Zn$yW6gtCTP}9syPE zhPBzF@&Kq@VOkO%bO(m2nnCu#P_<$3F!O*IN_tW*q}vBFeqz}J>n<>V7*DVgKpkd% z(58}+fxvSF@(>v=w*i*Zy}Gf z52wSaG{-^pM?0^00qIuBE&d25VVFscQH;}q8|9;J43U_2NKsl&L19kZ7*$s|fikTQ zd@l4_Mhce{YK7Xi+meD}MdzPi|3Kk=;fwkcUF;vjH&N#tV0BHgPn3CDSezuPxY}4j|3*@Xcv7+!iK3LR49`6g$^F0%`ly)H zHb+$5mdjNzESyW4{7sbi+K87*3 zQ$Zt+T!RmiRf@8f=Hy-}@I`pQe9^q2vV8kZsLwH|3%`lYH#ES0%}w@t0n4dB4^T{a>R;bGtxjhxv^GPR?O7C6xR3h1yIS#Sf<1< zS0>3qA8uQ#bKPWV%JNnevHX&?PZ418@*bPX!hXI4v~wXxs-mlMy6P?`4+$5umr~j* zDTw3^4y&(Cb_ttyl>Izc!@TXIye!W=Y%Q3Rn2X>LAG)yg57&azgo+kV18k(=a!Q?2 zau#b}{(g$Qg<&RP1!?}sPa;;uyy%YQPL32r{+0mbO_+ZD0l*sGByWVOPNEJtDzb(& zH>GOy?}{$Nf$pT{Sb<_Yp;G*1lz*kR3NAT_89d}*ZP!%X)2);p8-!nJ2@1QP3$$KQ zX+8TzU=`+B8NGT-w&~?=oRwiqaS3X?(7Cs>KJ{96#k1J*R6F&T>jpS2yMGx63St=7q3&49TPd|w&?mX&U`ru1_;*0t@tieluFpf27m*tgS zxt3Vj#809e4$}aJ4izVi;vm5lFG^B}uHX${6Uzjyo+y6XZvW%))59=zdco~AnkB3C+q0Z@0ADxOn zo%e-m-A{ON-?bztxe6*iHs~-d()gA-NapH1vHeyUA($C@BcdwIVmM^x>D1-Q&|cJ! z<`MhmICmVJe)ae8V6N@Qf>iS zU5gq+S^2717@M+yu)2YpFve)f@Lny-gAC6@fI23?0z(`hKO^IgJCNVh2kzl+_1i|s-auC z4?}V#D2S@8cWtp+-EtW=*{7TmnpDM_@W9HY5I;A2Y{o+BKRX(T7XgO-BqjrQ@GP5`C)$>=eGmpZxUQ1G5 zMGAmdk9fRQ(R~f^Y;rkqM9~{8BCcsU@$2<5>jO*WQv%a~bvq0vejBfOo2?ULYA6xt zAu(b3II0sRSAtr9m+)^2Uo#oNfI~tnkP;ptvV*`33AOM{l>H{=P^atG)MiCQwGLuAsa)HRx^8w-mW&?D#(Rv9N~- z@!sy!#m&g>NUfKps8{3PY$<=2DeFDee*;ZiR%&=x8cjKBGcA?5P%8bw_itOymtWPN z^zayXW$hEwyNCReA!oPZ`?cvc$I$DVfPj92VLBoEjPjPszq?vI{{&rX~nryV~uGoZ{q6!RLWG40*~vQR&@+um833hjBG{+)AX0M!Y=<)?X> zvQYn4bgo%*8FozwMy*fms3F|NMT+~QZtL=#OA80ARhXI)P1J(^+oEJG?bbt8<3HYe z_rh&vF$4tCHGAkdQ|UawXZAI)>n~C~^jTijvi!it*6p|MXqU#&zW_eSDl;wYn_?(`fxnQ*h%)W+5lnpYlXsJg|@0i7GSU*9H*@pQe6 zTUSNJUKrrx8Q-acffk6cwzlx`gxH}dmy2Kmas>P=Iw3YUAx5?$t?f(PI_Lq*m6;aj z9#$ppN4JGeiEGLO3r>k!sNK*u6z`GjvfxvZ2stm-0{W%f!ZF(gv7_PZcODMv-3DPi zl`xFz6x!2}r;IXgWE3+QRo1*!&A6T(4xgzRsZBw9K`4af-PuHxR5{^F%r`|5GbyN$ zZ0(rhhL8rCSpA5ox<%X!MrkjV)pnH`_K`xez9obimOK;*kTAYCmo$}{RLIuhOxFMH ziV9IT;2 zp~#dN9}W8l&Zs=!Bd@G4?iG6)ZeGfljt3Qwb+37*Cmt7LkBxq8+W%a+buhK{{wTs? zD^#GCY_<_^@$S}4pVhtNFy`$8_&4>1T3Kb@{41~387tF2*nWK^boEfEl zrud(TyLPzS_5KgxIaXiZ$6Bn5lugxY7}T3xX=Id%>EU^CE{{X|9%^Ue`WsnXUb@ho z1c!a)ulaiX@@pm-*gcQk7V@v{!Q5zCJ-9n(lWOy|>D$rLkOkySp(~(SczgH@c5DF| z-1IS&b8XxorSK$D`9l4@lMQ>r+nk=!J@>oEQh%#cNG>*P)4t8?Jiz~ zNFRR(G~nQ`ZkA`7LP4{Y3Hh7uSyR{z zXsh(o0Xn+X23(OI6SU4LFG@p1wD%OC(J(TMX%hE8!+cV1})D?SsK`%ABtl ze$GJis`#6JC?MZAstJYGk8F&~JQHTcD6{71@YCZmh8jeh)n7s`E=!$(h{pDa;U?w1 zDJvzB5P2)1%fJvnn4>&yJ6-$7E-YUOIAzU+vY3Wieh`n`v&>|b+@n&};J)=$u9I)WvoBQs&V{m-Dl9T-a`>!@v zWx8nRTX)3mx*}#Hd+Q=i-<`O`>7OH4qQ2f&UL8AB{E^~#^RVXScoESs@3d|6S9k0s z`3;N5pU6XUd(iZ*<)p>KUJ*n8C%Tq+Sn9M`s%$^$YS(+BA=Xy@`F)RK)pjL1W|=U- zwu^pYVUVGWtPlt)7^BV4Um3XOsjUqFU_SJ7uPTTjM^DQIWMCx1u6U35NQ9niL^vHG zV*wsA)_5$80E7j`BozVv+B6vAAXdl3-CQ6?P3f8LDyr_#EyV7o*R^^m`GH9%7Z$y#d{(HE4^+#d)cpAe~CWmcc>ieuhO*kLUWK1 z@Qqxa!Y=QRs9{MaLx9#53I`D?D5C)upX`@=d9MQYZa?tdN@?9&Jo#$0iGQ|pYK~Mj z0YU#~q!x7L81rH*)mW5=^_qF|&Z~5bU$C=nm9j)3q;pAb7u$ebNXYi-J z7gC-ARw9!GRAo9ub=PopEEaZ%pU9DzVMdBQ^n(4rX-ejPTjI%pF%JTV;5+>xxMKWn zwvvR$=m}Dl8UY>~(>SQGJB&3SrYGT9WZ?l878FP|)Fttr%}cvolBZ*p*CyBVZ!&(L zO*>BIpHV4li?7BB1-7dVdA-Lk05Izya3^rgzQW%0lURysm1#fi(EYEal) zHq#Kz3Y`TSFy8Wae@~TDJ{7U_ZE{y$#F_@O$TRek#=!LZ_`qbVa>^eZNO(UD{XU%S zvzL!rwtSkC**bf9UmeH$*c%C*di1>;x~7e>_ylU}O2tPw5a5`9!hef36Fs3KQMkS`B?^{Wg`A!MyuL6Koe`E`o|@JnF>gVZKq0G^2pvLmOe6*XpfPJV=BRLyRdP^nGCzn0lXnO3lBnjCG{YMV zX#@P=HeGEhCO{MZUjKcj*RO#0Kc!-x85i!l+L3o$LgFv-sZL$1eHk!Z=DCDcIkgTfJF){$5*U-xHfv}*nE*;2Y_bxNZ zYN!AkoUS0$OXT!IcT8AGmfif@2ln)}Q7LL5c~h%xSK`zmeJDnACoRwfc3dl?)wMjsGn3hyow1v zDjPRRm7D!77-h?pdC=-3zW-Y=ky_sO8WjIo&t3e6rz@m2GWV*4S*Dy z+wkx*?hhAJtG%Zai@_!)YW=^yrNX@0o%nA7tOb=r2y+|39H_RSWjJO`4m1@ zDOmCk)Pzcb*Jpc%5#YVn_FKK*wu5nTt>3`VgSwF5>XIoxv*n8+0JPz=NVN`r)?4%eC2j!2aZwfcVt zF;4=x;-Sv`UC+I%UbnxxWUDUS;Xi@pxL6=m&goMdPJAzy?{F90&-+!Gg7ffV7ImWC zV8;^cad^!ZXrye-G0CHNj$oHk+7}rb~f8Ecm!I5z0f$(8$@mGb%$_% zPnkXc7;SRerIL8a{ru08?wzxP&VK{Vh-YYL zVDMYn)Ah!uK6%%m-)O0Bp{WChC^19cX_|1atIzYL#z$b6Pg(t&Bt~I`cb@R{0VJ(@ zeN+dC-vj>kP_RKZU1^A~*qo^Mu8>usetP9`2AK%2j)0a*pyzq%WtZe$3V0x7Ts=*O5Nv0?VnG@auG$g9xdq-S8)SFSQ%qjVS*a zO^4~Ks?%}g;M;N_(EZ2TYoo4*qxuJdB5xlmQq+KUq44PeOgDGgL?U zxWv4*120PMjLAut5xgr@ojnaw^wM3780+L1rkrZcaE%zQ>$;w?%eoWUgnLgY|Utg6HZ&9%~k1^c{`#Bj;dIRk+7=7l!*;m)Agi z+d%y~$c1xU^aY_>>tUuSHy;@sUpCA|l8pazHQ{mE7C6%x|D-ewK0E;X?gxLWMfR=b z!;(@{tp)Y1wb6mV8$4IjFo|uO#Yht%qyqeZ;I!n)rxEbiDq{v@qs&vnTvKIn-v~VL z#rKFYY5LJ8hPc7s+?N|mlrX@!A;NMDW(WW}l`o1pz`!<+Uk37Kl$nuf$lWvSsUe`KlhQUgf*Gf*(O8)AsY!LJ!L=KSAv{Jrpg^9GXqg?UrAi2wd zRX4>e`s=8ClhmIy+qjFBoy|6hlj8d8xcTRr`tcRjcqg#9o{hMZ98Oo!8gfcBuxVEB ztJ982(p1E8Ow83d;+;H`N|$D>5%ZO*NlqiPr8ttmrA>Jp(Ww(!=1UbK2y%GRlqUz6 zb5ObSQe9UBtd`~r^3bK0^$Ie!1*MH%4Cr`I+w4h_O5=j-{RNd%$hE?S;=C)t-J&6X z7m{i1!gxi)B^Pn3cDJ5gj&!k$_P2}1UXIDM3oEsYdxegFvKTOFcl$Ovac|N4%ntVo zDaj8eUbQFbEwN7E=nd>st}Y2_CgC^7FPM!j(y4^RpDdodw2#|^+gfP|4$x&~E>_6E zb-F+_b=RcsF4=JsGe-TuF0!{ETEBKVj)tSw8O+_H0?L@sTEm_G#p6 z{2IQZ1J8BtwCm+G7WU4Jz^_x~tcJsVn!(jnI*&E#+i{;)J> zrs>t%{cixXbs6G}ct}ZFM?JBytJ#y{FemtUL*il^g zndBC`L#su3{riIr&}g6j0f4yU(w~(aQ+*`dwokFaIlToz&6ddBAJ4)TatLcTjT)U) zMQPFXC33jL$u-xwMvh8RrY|BHaySdoh6pYXmy!99xTGLCT)ySHL#GwQo@l3OYgg!D z;xFzUmz1|_#mgsv86I% z74?5NyjRA3$3uug+m=hy!!kgHr()(cp7MsE*3Z%-+2 z`!85)+fBL=c8;$(Tc3_(<~8SUpj& z4`=&mCQ}x}h8Qe7A zhT5U2DqXRr0Dy7dG{N8^T(LKXc5Tr~fo40&tGkx&JI%?Py+|qx{(!FF|4du1M%cX7 zZBqcJVUNWO0hYeF2U1kV_S-f^Ah{vJMGh#bi11evRB1*KbjQ;7`85P@GHc>(q=-Bt zI4#j6qyfPOodjzn%9vv<4G6DzK;ev3yh~HaA%8K%H`_#L$SRa=qUwSLw>7VUgNhQU z8@-o`f?A`#+Myvl+j#2j03~0X#&pnXvd^Y>@Z&Fa)FIv8U#SoZNG)az( zGesl`bAS%6<4yRJ`1nJ3%)i)qgZMQA_}9Lvl5rZ_Bt8J=zq${*x8Fkzhz)_+$H5_t z5I_`cydA&>KrMzs8MXpZDF#VPX-fDcMZr^H4_R*w-j9w3%G5b+v>l-7LJZM^wXI1`3wjsfsU!lcr^B?tauUyAAm4)WhatoqVnBV*EL^5&rJ z&M5W4CA)2X`y(Z$BxRo+J^-vqL-1!L{^w;7xve4{0&GLI-+bX+th4@(hdd2ZlBRl| z48WF{;+1~bc!NYP?>>^E;@S5dJ;5=X`-$J#4Y9>CAwJ59Ch<*gulF27Qh-y9!{BqHrM2Q~cNFMsujKCwx>Z-;ZecX}OOR z`v{doMB$~VEGeXa$b;mQ{n6keKl-!$jqQ&bzF_0M!8YE%Y@&XpuR`yBgjOT`e zWPcB~55%8Di|ylBe)+OZhg-N45Hc}H4p7VqiEkfx_#7t)`14~z(fhc3A8=CknK|XG z*=I+eKRSGoWI286s~q!y<{U!vyCkc^?F7oRWFji|tvwn`zwaw*&&8Poil-()hd^bh z$m}d%v$UPRr%dz+Lh$9J>L#4H@_F#(Bl8@5od@3cHI&H!AfI^aJODjS*|$j~4YdFb z(n;pis<3SkeWUkV<-Zrq``$(0YiY^nJ|9n;qyAFkZpS=7_wvSSgoHZ{`r9F?dX&DH z#*nt}ZJNad5PM1a(byX?&~I=4!9uo8woj55{^h^k3}U=v#~AByhP|11=QR7y?>E?! z@mgMvg!I>U{(ijk@5h}B8We`+6Fn-#Wsoe7|?S9ZvaJt$rT|tpugmmy9%;Cmlv3$t)KPt!DZ_DIo z=y__2CRTbQe!T7*`MLjTJYPEGpZeMH?qXNSkAGMHoE~n?J_xzc`1j}R*U^t37uRqg OS`0s)>NyGlsQn-GbJwr{ diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_3.gif b/docs/epy/uml_class_diagram_for_oauth2cl_3.gif deleted file mode 100644 index c77e2fb5b76d965eb4a4aa41e79e3526423b826f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3541 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 BT1)@{ diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_31.gif b/docs/epy/uml_class_diagram_for_oauth2cl_31.gif deleted file mode 100644 index 99c3fcc66131a5e6dd53de532b2175d945b8eccc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30674 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 diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_32.gif b/docs/epy/uml_class_diagram_for_oauth2cl_32.gif deleted file mode 100644 index 8b06d4a0b3267f0a8a1ee08cf81b07a2ed2ea8cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6119 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 diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_34.gif b/docs/epy/uml_class_diagram_for_oauth2cl_34.gif deleted file mode 100644 index 1935aa9ee1db9b45d2fb62945ba9ad5ced026111..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12619 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 bCBO`@VBQ7>i+U@OD-{csY@ibWK>z;$c2ud5 diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_35.gif b/docs/epy/uml_class_diagram_for_oauth2cl_35.gif deleted file mode 100644 index e0e5dc92a1276146eedce10762b82c667fd82454..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11639 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 yFE3)gzKc2h5cBPO%r~BYeY(*ZNeFEG{s diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_36.gif b/docs/epy/uml_class_diagram_for_oauth2cl_36.gif deleted file mode 100644 index d6affed36f4aa211e3e97138e174a3677b919aae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10246 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 diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_37.gif b/docs/epy/uml_class_diagram_for_oauth2cl_37.gif deleted file mode 100644 index a27e9dada1313f75e391a36dc08e8ff1ce47cda2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11958 zcmd_Q=9-!7oHL`VcN?SR`U3b0`UU)-DFA>80GI)Q8vw)s03HBf zl$6vkDmrR-3^jEEHT7Lu8YX(WWCjLS1Opo*f`geUm6@5y!oPGK|wScErS-67eOnCi4}^At4NBGrKG&2rEkc{+>{a5 zkdrKylhaX@(ZOIcF_<(Jc>`62a#dC1n<}Qalq+uCGErBz)KaU`(z4XivC+9@r>mi_ zukWO<?VRN6((UU@^7BgzxRV?h7!(xL7Zem69Gn&G znH}O)78;rn7Si1!>G;E};qvl{^6aTck6u+)zOBq%s>*AuuCA%6`A}0cQCs_= zwqUNF{H~#4zM;6OscE*QmHWOVe` z>(^V8lYid6y_%Z(Hb1|*x_Y#}e)j$Q#p&siZWTB+Q6oi(rXgw2~A zUU$~MDU!Z3QKr{b_qG%hw)gRM*EUu{JD!?H|8c`~H8xMwapG~~OucDJ=x-Pbn%->F z<@;%(yLsV%E-zDg40>8@TlfG|R$^o8N^kJjiH8QgZJ!3BPWC>%S!iYN<^{Fy8?et* zT`Qt~`Rug%h(XAoWkBKUVu<_e@Q35mec$JYogp*X8ej%>fNFbRipV|Zp&t*BxUp!!DJ!_E?Wh^q=6O_*Vp%}b`yuJ zuYy!-NUJ+(9WQte*o?tX(lTEbxc7&-^q4boCnJ{hh+l2g@#8{j03J_Os`FtPB*Lvk zqT}DOra(kn1+KrMlgROLE+ zo9deA^gItckUfYU%`GO}rc+TM$4~0R@#SLK^A-p4vOL>7o67zy(`kR(jR6!P{y%8L)7jOT@bB_;_&F z-X!wI==;FEGr8``61J2o{f0F*AVT_Cj*HMCUMVCLKxx8LT-UyOn>%Fkr(e5j$Dk30 z*q%ZCyK8I=RMu$?fwBI5y40>Tk&*UoUz>I98KZ`T(nISsMj>?)@pbEIt|&0rTeRaW zpG3MDvl+0@wI8bzc@DbXpW~?-X62@KWvrZti4)GMVLr99NPiGQ;cCluYo%z@J5C8W;DABH{9biy& zC+0m13VX=4ux;T10klz|xi16;83KilSv&<=6vQvRo>VVX0ZF?cz^dkf&mDXqX@pG) zpiY49tff2;<3b;-@zF-Pm;r_*35GTC>VsG)T{1v>_Yly+fB^PvcekhQ*8mq9k2D8& z#By)(zrTLe=wX1Ods9dH_BTK@89!p@Nq}mDi4k~UR(|TnxyQ5|S)Ih=1bu`I(PO9s zt&Gm+mGx>5(;rvT2pyOzJwt$16S1`X8&i`#ro;4e8#FPi{D$AL-%5g0>Vg~K<-Oxl z0z*%Xey3i4AG6FXmHlT@Rfg%xBwEuo{1l2nlbYiGyt2nzQH6OyvvLdxSdy+tc!-uCL`B_VWW)}!w5NJg z)O)k$QO-D;Z_vY#eebTvfkpv#ArMH?sb0uY=HLhtF{roYf1BzN>8TWb~e<~ zcyfJs&qqQjpMxdP{To=rD|Od^p;Cz>+#CD8mO{S2Bn^6(S)C=Pc(7W#C3L=Lh=01P zxAE`3=7moZ%w`Q_p6y=K4ypNjsUAu4$Mcy{IIikj^GQ0QU#;;!9C6X0T&?kpeiOS& z5)YRYJqPg}xPU&t{q^Ff&iK8}FH~IGD5%As|HVV%vO!|!L)cmowE*gM>dy&7lp*a2 zO5f4&le}SW`XfVv$QPza@(7wkNPv(h-NbncbT)vZ$By9dDtk6w;{kduU5M z6=E@!iZ|@+o3in&ngFws0g{b-lLQjF-H8~e6FftSN9pYkY z%mIe-#=aKJL@Mbg6Mb*#jQo?cVcLU@RHp3`REsa?``O-E>7LJ}<%O^KN<8m5=VMA% z&zrU&udKVKf%S!%>gC&2w1p?aztyyKeeK**)Qz1NdECl){q;M6#hw@eGo@S!H|3Y`qTn<9WS%o-Q_b;-e#aWfcUe8`rj+

X(U2 z(?WFKu}2?!?SAzOCLUGc-hW*=et1@q&wwk5d0E|HI1PL z`OUEvm~Mlj+_)5rhGoJ3$NMzM0Wq*jD znH)vdHuT<|2lcf zQNb!=3Rv+GAr9tVFfxD8uWI3y0!=X}p#Mdie5hV+79TS$SF@l(KGX=9rqCk7oevlz!oaa))Rs=ZD&;;WF0Y!j?AGf)OFq+v-@Ukt99iP6t;GY<)0fO$a>L)GvyhmXHJK_JWL^;d)>^Q%C#^fJe<3cf+srceA|RZ1AgX zwpn5BB^zWc0wli3_L)7?)-q)#JS9NG>W|j_r$`PS7rwdU*m!e3sFk%mM6DoEcJ@Qr$lF> zgx9Jdu_)v(8HyBX&lc%U-@O{o74A|jE|i2Y#A7YKF2n7-MDJhHAMn@w54JQ!^q(lu8Susxuo^vLY^NAJoSs|fqmZ-8Ln(tWb?pE>7-QC5|9*5+!6z8g{zm6O_0 zP7&b(N4w=9(muH7iFTLQdlw9gxG-H*?r~JnDOL$`n(~%ZiTYM?Bvy&rWkyAtG_#wx zH?aEy)he4+;&s*G(`hf*qeVT^Q$boe(dJ^y#;RKdb-lcP6f)Adq$tLU1R3b#9Sb$i zJ4}t4o(e*^t;|C*ACtT1$aJR1*K0sKC);pkWMy_&?e)Y#!6McYa(e|Ck+{Kb{;knE zZqu54nCqmMyK|D8>6YtJ1Lh#+AlO9*uW-Jh8gQy$;i4&kg%nsuu2oFTWbVs5Op-Ix z%ZOiQGkxMC9<6Lz_yD(?EeVmk%LjQMqFZ+aFo!nE=_9K=DE&?fEg(&eDL4D~gqPqz zcS2J%Uy-#y3E?`@r$SR1pBTUh9<;TvZY=8QR?LbHAS^crgtX=WEn>dM+AQB|ZCC$7v?V~JW#U&8V5$#4ltKWefqWW3f?#A)qi#>_eoFk1 zyx}`2@AT}WUX9w|Axbwea_egT4vTEGZbIZeVK#r4ipx!B;o1t?Wj1;hq=vd-q%>Dm zJV@F$75&DO$+i+UZ^hAstR!~%A6D4dHOo+&i(Padv-G$%o0y5+@ffIfD($(h)8o%& z;q|SW1fsI2=73m6MVnQJu0tcF)8Jga*XPng&B#yrOcTk-7Z{}66xTSc+b_25?K#^D zOaP<$aFvfYx}QDL+eEgx9{&dEFp=pTBSLBG0T1@5Pl3D2qIrXXD5$-LtYGmUf$lBY zAF={rLs?;bU}8rb_TowGP(ADK`Y<;yLWx&wVL!VCc+m&Oz6R~WiS^1hN6Xy*BFt_x z1z>29F@i{T5?tY`IAu_bp!YiOXghCd*#}`xp4Ak$4xQB>)8I0-6ThY$#3LE$>cKQzeC_C;U*^aX3Q#=UNJ zDh^1jgo=(lx0w=Z7^d`>zA;B^zZ()C$OttFs|+z43YvZ~dA%aI7x|;9Sl+vo@S5#s zM3BHoRp}bYD-bADT5H->OCwo+GL))p0~-vu#gHfy0#gY2Kbvc;TsuzgpJ|1-cj=_K-}T-<<1;v}?b zEOq9{Nc_qlSxUq6P82CWFxEwp$1|%$3Z#bWJG1= zN?Wu>w`{s));Wi`G)0j*+<))MgUcS-rini8vfig}JXhX4e~NSDp7d>gGxD)&a1x34 zs^(Nd-fvER{S;Y2Wv)$KnaAPyvJAP{Q8Uaak52QhijU)-Msy-& zi;?RqasMU>)e}Jn^@Xr|;<8_nieb;q8j+U{$bVvy|J0iMRq&ifF=JJj;L7F@<)SFU z5X)7-WCSC)YoZmIEXvtOuGNCAeq}R9+@wiqJy24+BBJXO`1E&f{~eLETc^a<>F<7j@=hhdqH=K@rw7{UI^hfWrJ-tqchy7j#!%3brY zWS7KkAHUtD$ekAC-`9yFHIKec`%A0V=9d+v1bis`o+LZUO6X%933-eV?d?8a*bMIu z*LYKcd^`5tiu`wpyxvpw*Wb`_xteFW!HB&k1E<7^RPGOKy@#7CyP-Sb>N@b&!YitG zpKU8$)_U3dTjM+S!FSbue*N)!Y4KSXy~s`~$@qGT@a)j?HaKR;S|?L55@1OjOr zKen5$a2Vh<{^sBHmrXQyG`Dg|ZeU~k-dZ!=vO@W0*wKc=eYg6*oBF+*ZU@FTPFr<1 zDiDdi;e@Cd@=H*6TDG-xsBv^kLrXE$TUTRb?Ly~(mdU+$_lP3gU2kI6RglqFSVAoQ ziW(Sbh6rkE3Z9OO91C+g^2f0agGVFdqI2S+WXe<9wqn*n|6>xHZg%KlR^)nePvD%m zrZg~be}5af7u<&AIgwf7e<2hm>&~1{yLeA9Y9~MXW$5~Y$Io@{fiP~07 zdTHlmBx5qNv}wDFemyM|K3zRrlZ1AMkmHy3X6_>;%i_hNzAFeBOF{)?YDN?`1a2l1 ztDX>5wuzg8NX^C4nyym4K2lKT_qY(f;>SXM;s%dq6DCs<3RpTEl68MOA%oPg?8ytB z$+B7L``z@5A5Ym*Ck>C6*p{?o?l!PzTvm51EM@F>iLx%)$|UEu3PfJ$2 z=YY)hK5@_7aw*@x>Flm_?ew|AsrD_mwEL$;9;f<0Hf??`-#wb#{&*5*wjIn@lWe>Z zYqoNCy3hR4X$a%a5&XN_e2t6}PoCI2HTsIQPgdWa2;4Xp=n&g2Hs-UUq$>I+$h4h(_E3Jo5UKyx%KGYckksh`psuC3 zLDW#gif(9MvT^iwVjjci99v6uG4gI1Jns7ouMH1N?jDxsvs3?Y_n<|PC2g??Jv}fj zd!685{4NzBRpbvO4mNQ#M zWy;~pP!t+%pdBjgQRALu`pQ5{YX3=?$k(d0oJ_Y=`TQnx!{qPU7mXn%&=#o|iTif* z-`^Cg&b2*TI;rAj57~V8aNzj+r=q)G_ofV(^5~^x0?tS5*@NtQQo{QcJ}!nVU^QHD zUyc@K4M$QH7Tn{OPQ0cn2Rv6>`ntSl8!c7QjwSoMa~&S@BdKg z*+ih$Ue0j8=(;peEE!rw(6Mmg69v|?gE7=uUG2398}B`)dKD5l9(E^nkoG`(5YS2I zZTOC|Z2_;C109wKtHf>yj5BqJa%!s8MNu(p*s}NX}f~ zIxvU=vzNt;r)mD!gE1=t=gc`!CZk~7C(-bITtmyOm!%FT|t80-;I~xt7bO?XjRllGhNKaZs z00iZa(nO&u{MXzxH30z3i+<%^3E^k&X}*FC42M}4?Gv8}(Q*z$(-6{T;6a0%PX!Tx zAm2! z3{D@xmM9yFlfUFb9av)B*!(Np?~cCdSE;*38}K_=mibpqYI}hxNC5brT$aQt=ZmOj zO2k8emPIl<5y~%pGhSq(U-r$Ta@fkD|H^Vn?FT~gjYvb^EQgeA$&z>k?d5O{LG%>! zdL+d_n49^QY2xnNG_zl@iyh_C`vPn(6(a~(Tm7fA$Hjui9smvYvb`5lmIPKzCh@6A z%Lr?);cJ=9tPwxihVKs1lWj(>SpGv((yeXx&jx6?5qJde`49eOgO!;I5&@&bPf?-| zxNc10p@J?j<~*2=xLcu_D_D@9FGWwA#B(tx<$O(!hFMNCxem2Se=w8!=l-y4k&BFp z?N??ro>jcxFhgnR3ytGtt~iO1RqOsa&Tuz#UAQSo!eET*oH?O9K@0zTpmBrev(hc|PH-77xCgSp|1%&{Z z3m(i}k>Bj@A?66jQ@h{_yDVr$X@lP=PvMFNHaw)lWRvVUT_~Olddg(zp_!pGKpnlC8x-Ox5_h$h5QT2v@J!Gi!hX0eY=&sNokHl8{?B%V#^OoN#Ys#a-Z>s=zhkbe{Y!G3Jg{n)NsPYK_fu zsLLoVi*EPTnr5iXR`FUk3J5lV3NL2;6j$t(pvyiyj*m5c&WVR9b;?&4J(62=7VpeBFT&drH=)n*U-JP{;+_HE-gsEOP8@k6_k$!PLm((E_8mS zJtC-h#A5pW6KmSqOG!!~{k_sx&d*VSq{R@kxR&+77?5$b9NhXc7@!$kMji@JtUnhD)<2hYgE2VS zql|uo&QQTMsAK3z?&_MVR~ z1R5Hu_W$~x0&{P-N8JUO^D71srk4EKP)&YZC}u?H9}!yNj;7+yU-b1?hf0FiXL^PZ zW${i@OrC;-3gx$XxT7>0MhIswXzZHgdR7uQv%rfy6Y-2=dBNb#T-!d?*e_IH{=1h5 zuY;vq$69j_-S%&| z-}~m6rLy<{bq33JG(#x=p-rhj^S)lT%T?H#`>P@e@9NGdY)`$x>Ori{_UPp#xNS&* zeX`d*j^d5+xP?+)TPNSgWcInwaFOZomW z*Q?7#?FSb}o&WrLKL7P1+>%du@ZfU$LH;W$iR0$02LP=)hLNNoC|CH0WBz&> z8pT20A}mp7rGQz!Zff~yI-UsjsiHsRCJzD(?gd=pbrFn&YbStEJ0Kjwct@}M*iE9a zk4U+bisB!pb?>8lnoRGVOtlR8YsYBtb*QVNxNR_=%Da$Xu4rbsf1_EyGOTp@G7YA!qDI4>O=!!8 zKo6hpti5zPeyN*2lF}g`Fr#f4!cBi%K^}n7^~0p1c*WHQJA<{9PK!-jItaqaol)6o z()A~w@gfZVPI&~Itew@f$0H&R>kWgb}+DmM+rmTzhvYg!R7O@9W1vx)3szO%BDDY^mj@u z2B7EJa_6En$`~M{VWQ{|A|wm~umB=1UG47RklL+I=*YTA`By#O1{M$o29k3D{ZCno zx?!@!f^9H`^dq-)468jw8f_zws#{#UO80*Bf*lOw0B1An7Lnnd?S{TNa<7|t-VBcP z)hNMrbE3<%GWQkchcVK}~6qr*6Ne zHad%ay@Z8a>!uC;X!d7PcNR9W(})e%#s$MaEV+>WTQ(uCxVY(Cmt25FC+_m=wBIpF z{~RYxXD-8IE-PU!cVk8-0D2W9i*P>Y`6Uf^=+Ln^tE>ryh`YLsG4y-=bq$7ySCI%!T9P4qt8%KRq(08Pfdg>q@QRu_n>_LgMEqBSE?HVl5o zE>ACen;UK$!DG8U3j^^Xw18{{KIl&sK;$Lq;b^=<<8O2h_mXPE6Lk#r^YC|sH9~m@f%BXFo`wC0>xywa zN-M`f6_5Wijjzsj7~Y>3>W6H{k3Fvact7Mr2Fx+w?c$7%V}=jjwA69A)p3OaxQTa+ z%W+)Ucf9(n!25CT(*zyee1g>i>*~Cjlf+ z6zN*qBWne`LsN?0Pl7-uud9w_>A4F8KYP6`%j9nz!{Qf)V7&eCtXNxCfv;6G_17cQ zge$ZSNP$vB!HK|Sb6qZx4WIF~U0+lsvt0T4owD&eHzdVW5AMjW-%)4VxQTYZp}3)X z+g-(K1LNr~7qL;Vl7M;WuHWV^8&0tAbT?YvP@)ibRsl=Ud6@BfnDV3f2MIW=hozH; zRiKCUeGi*V58HANyEYH|=N`6gkQ>o8?OjTqKl%Zvx)}} z00QZ^i~zjJe?T0wZ7B&x3sc~-L9o7fr5ysaFCN#o9k=RbZv~~rdKh4UD{gg&bOXSa z?Ri%+K^PlvT@D3yKzuMCK6UT^L`$b!uNbFIlR>|^EEbCZ<3I%x`k8C-mHqIONE2ygvC4aQqo5Q{~0&m~3=^_4i&!Hd{(a1Z5 z;mRAe6NbV=l}t8cBfiB_p5m~3#sG0wGJ&(cmMbXi_W$q}2L$gxK>afmb#BZJ-~~*M zJ#TMXu*E-kh41Ux5*sIpWbK=(?ji7}D%p20B@>JXci>cb8SLKD92ADXYbibIxcx5!WYupEp_BykSI3p#V)$ktR*r9Pf5rOZ|c9zbty<4zDJU5jO z{(unn>%dg~L(G*1<>BU27|zG`LQ7euY{s7GX1t05w4d+f?&KR=Sdd4d%m{` z7$gN62Ff_Y13&(Y?_4GszfMVlum_^mH*dlSMTw+TDgZkUef%C;J9bV+Q_u>>*HOk- zQ%3vW+KS%Vij(?n;Ryz&e6h)RBR&Z2AVDN4AaxLEHrdorpMpyN2$Q^266OV5jw%-- z+tKA>pHHdrK)%VQ;UOOCjc2skGR-E`x`N7HMIn=FDQzG@CV>0x|K6`azyEu~$i3T> zbasV1|3ldTG$kGR1)bXNc{rmf46;3OsBcyWq_18c{Ewjb6E}-~1=$?z8DXG%RNe;O z_bm@dZB{|pbKmwr->=utT@?QTK_2TxLSNo{|9bG?JnMm#(*wh05UmUN^8JIqpCA1D z@!*OIh6YnHiF+TShDp>&S^u4>3R<8Ajcf5f;(wLSssZfm90`nP^Xuk{`y2~S@b!qK{F?|__$@HB;ebbgz;nF7o7=yza*`ngf$)v9v(`q{l@^9(cF0< zQZ||5NV&l8=Q8fO$-D1H{C*$XR_Enez54$9#N=7&oe0W+i@QeC)pGMX`O4lb2XcRrNLP1AB$7mhFYhW&WgH~jPP z%UGUN&_A_{)4heRpdbHkT%I3q&-^dw>gK=8i(e-{eq7zcgQzhm0>vvN0#N;b1Y^Y@ diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_38.gif b/docs/epy/uml_class_diagram_for_oauth2cl_38.gif deleted file mode 100644 index bdeb0ca16234717721078f4db5d608a69703064d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10894 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 diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_39.gif b/docs/epy/uml_class_diagram_for_oauth2cl_39.gif deleted file mode 100644 index e4c7af6b4a63796a8a5b6a3144f3d9ddad2662ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6417 zcmW-lYdq8cKD(bv@x3{FEyuAE%Ma8@7>e|}ck^1`SM~`NnJo((#w$$F<+1dH6v-3x9 z@2|eTzi-}f*=#PC`~QdkuVjDo>;m8b(D)zx&j}#8l)F@G4TIso^z_qOOWctMQ{T6rU3vF?hf9l3NK8sjNlm+!o{@Py zE1RB^o0os%W$2kXsauC#R-AeEh_jnVtLmWqx6CY5D8Q>bLJ}>l<@p z6F;`Lf3Fykg!u5vV_x)!M|jax1I^FdmU9VRsp|gjZ0Ic_BS>3!ajNg3{F7J@;Qhn8 zQDMKdAUZ%y%Z!DL;BjXhWSo787U1}Tmi1L$8h4jSf{TM$Vn=5%KQ{D~7pr`@YKanx z-_=|@8Z3ikPs~G<>w$(@%dA0rR8QelZ)}&Dz!MVhr2FR=9#5S5ybk~ zS|uG>LcFA-fTZ(xd!rS~WDiEnOic?$_8Cyf-SJP2Uy;EnDUG#Lnvx39bOFGj9fTw} zBEo@%p2M_i3(B!c!Yy|UN5YY}py zayM({4N!fBV@Pd|=)o}Fk&`R|-pr;%pgG`o;f@Zv6?2Kwsi=Y>plK8yn_0^Q7?9`~ z>a=q!bSGlIfWU9#pVwJWAbuu`=2<;Uf2UdxY5-jV>)yN61% zY*}S-Sv&@xX=bpoCygRt|Rg@(ZJ`SRbd{@}8{+Us9S1?O8e^6v|v(PSEII?D!t$Bs&~Q>h!+Xn)b4)X|mD z=D>n@;xbJ=>h5;153uXNdQ=XETYBErezZ z&EKE%PXzt`Qh4G1Z&f+Y20$`WHUBJ@7XLL`1$ORvDv?4>T%S6Tb!=E z%feGn4-OkjQ^o)LvvOOs6d#M# zC+Yyh7R%~ouLe%I{V0+isMLoH-;MIIq2cQ936BR;f}-bcOYUa?;7j`t*=OD>;;;*4 z$AV6i5@7)j?>;hZYxTSESBcQ%F(d zKJsbGiASY;k>QC78|9&&>o|k_ar@%N93J@D9a~oRQGYu2){>*c*tG{X zUgU#t)YAW&b$k!%NDSrwf+tCw^Be({Tit$1h}^CK->KfISy6J^7aA$VY-$=lzwgCo zdxn@I-YkPICd!yEBVknC`@@UqE~N76)-#qTin6Z@buhRZ*Ox>*jCczBH!D}mYH$JR z!*{P7t=bP*;6ICzQi-3{*7mhd1^pwHMn7vDuGczO*^bt_{j7C;qvj0JV0VGzb)J|y z*O#_qjYU7}eeKnqT8-@PwMFDnzAT+uh<(rWE!s=!p#w~uz@W5+i=?txg^d&GeY?@O2ct^?1}b#3;AwA^hOfMl6F3^y z9ipc;+KaZtL4x&bG8daDD6IC>2I#!xQvNJ}Lrsv0B z7%qiKYDS+#&sVtz4P*yQRd+-TJ0(EHd!K>{t|oPO@IzqSxa91I6eRVm`_hV@v;exi z+fpBVDpo?);@=wLDlx*P4#|VhGkFfEARu&e<8*aAY(T9eNO=Mt#$LqfUA@9mg|LUS z87viD7o5p~vD-OGs>QcCv!0L$fHa~QYJu)RS+tj#V)zUpScU60#%Wz^o=Jc*pR^xu z-K%wwi4gB)CH=;a@D*lc;m8!ps*_#5@!EhrPPT^sgl$X*pEMOa$ z6(9{@9*1TpP0o^ZKp0BP+CF7Gq=r|379_@`p)}bLUna?PLYvh({6SIj$iQ*g(Zd}tN&V!ha1vuch(fFB<+X)vuw_Yxtl(v4LFJ@l>2l0bYGD9 zYJ}K&g28!B(10k+Oy32-iFmj9Z~)xbTga+Al&D#3wUGCzM#ma z1#yvs z;Lh;DHpQj@5mKtaypzIrQ9oI%!64R`mGHZU@pZe<#A7m2OWO0y&h))c$i>5P)zjl; zD%ZKz9vMSda9vg2-@BmIcR`3N z!J!>@gq1fz(x|MME092AKW))0Q{ClU6RL$mlnN7O2=S+N;?=ejUh*1{4H6MO32Ac) zx`l~~@d-u~i7p+9-^i{kv!=CP}Q@drMSn2q1q6iLy_L8eR@9D z`(rmCUYv44$6=hDtnH(e8D= zqA}_Eh>KsrW3^y3v@%OV1K0?!bW`b6ot%|_cviHv56FWpk=fzH{-rnNHJE<==S7X! zbhl2$#EGCc=jojai9sdGFb+|$q5NAm$97*x&M$qJu%eEFK3%`pTv zcp}uu0TLyN-L`~B(^P2*el;q=2KfBQQdKVWK4@1>UR9|#nyPMuN3iAg@R;SNU&yzA zdE+!8dALB+;XR=_{IEi+`vG&HOaVkF+bSMX+w^@F8VOPG>cntmasmC&9=}%1Qpe4} zn9PAPQu1NJLz5ES+HnQp zrerG$^Es3f0Ckph)y2_?^d(kvEq#ifI>$^tYmLPemZ}$~NstZ_97-gI0g*}6;vD?K zOj^MuQ2a9$#44O?_w&{sFmSDKUQTkGtk@k=@j0*Jv=PJIsM5o&a*GOo9LDaWmCi9; z&E{QKLDf71Qu43V+P0aZCvQ_t+B>l#;L7Zp8-57;FAS?pf})M&Y%9z5(Mo*Im2b62^e1Om*Jq{h}l1rOA~L$yOSGv`H{Zfu5`t9A=N-WFLJ_7p^(nd);zBp?LH0Ko$L z2Tdi}Zrd#)&-?7xXYH#cq_5lhobeW&@w%~YkS)o`T3O7>D>`k+KF^TUpA4Z6SS%ZTg) zu@7+uc0^QmAYOgkDR+u<o-VgYhkKAX~^%&&yw^S#|2)0dA44Pn1f$H9rPYz*5txEY5LGo*sX>~0!KYC5s>2`{TL6M*+srtAJ zU9!VXLm=>&Klbo4#yYlYg@y>Sm6K%H9N3?*zqMO6z4FLPqJvbAkwK5MU7|}|54o_% ztv7JS)uV043v-17cXhdo;G;eOp7|*M{E{^$$dqKEZv+rzQo55+_5re!#3bDHQ?pg_FIdBpJ0u)i? z8}Y&tpyBy;S;$%e1C%_RRHU&B+V@7qjyh_`Au;bZR#b_PsgfzclW?E#Q0mRP)C^l= zpTqs|p#eLFzjgqC;d1 z5%CEv!^^*WO(k2GlD+FGvtyL0Qi5lE^*!a4ozk%TDB;j#-*qpd_>mYexqzwGZ3))* zwWJYf+b zOX3-NKehcnYwYS)g>X?hRJZX6cXGfFQj+`p@}>S$4i&PSq)PuT-j^#cb5Y{u7-s0A zD1!RPfc_{TL+8_EE@mTFU|50Ml#+vOOqLRVpSOy^ljK#|>7AAVw37FetoO!XM&jD* z@wh#jOgKQ{%=|<71Lj45VS{Icl8yZh7$7SI5g$IqEOC=y&Z<3a`he37+nJTd?fE19 z=+|=$=E)4t6aU6!MZMpO=nsU<_rN9Sivdt{+6a;}Bu8v=#8qd4;$Lt1G#|L>=V_Sl z+khz^61^vs<0uA+JAC5TSO|r0M&+g+*?Hx2>9OC_$2fj!@L`14CFQd*9Lk-8h|l1VLE=31yOK>Mi1#3wQn^LNePIPJNSp-VQVFTQ6j*}b9)T|U$Es<%$N zZ8&s{-Wd4cXnC>`Kfz{N@h>P{OKAu zD-K&PYgm}i#2RoA?6eS%&|7c3*Uyr+OyqlfR?RBm2Td4J_P4*Cq(E6qnXSTL8zQ%M zj{gA$v-@jRKZciVTO5i=HCk_)T`k%L8>R*rE3azP)+YXg$`ST!A%Uus{^; zsio%tG}h#xoP&0~Ex6s524+7cNbR5Fg)O-GvXt%3b0GEm)5{NT36MpFS@LDJKaXkH;XTA67#ff$^7WLa@*GF7dj6S``}ma`_0T`_G!xou`<88GvgHpaI3`F)7}-Bl-tJsU=5k!fQOV zmDKorMX}kIJbXYU#q}GHuE4xW_G$3U#DfpZXM&aU1wld(0gH`L0RqVW$g@Za1+`*;%r~G3s0nP5NoE)Co8CB z!M8vA?Qpif=H|I)eO6t`2dG4W-n{ku9wyQ{Ong(-*(5{p-$5;&VuByrSu5$pJKr>(;6yYIYyvW7MZ7^;???9C~&v(Rhgm2#!NMXKDpB7LmQ*|pJ7kgJK? z?~rqWr|yJ&ImfUH;ZpaXS^#e|*7?MP(C$j!WJJ78v!lVY8~l8UQ>{_!33a!fzMcw+ zfl$3S5s*VUt58XEelsm|7m5&#i+h4_Yu1vmLl&FgI{)sTS>lzo`M@vis+iKvWY>_3 zGMSDqZyvZE894PMWcbK(o8HRwi+B{#q&Rxr@M(-Pl2&37w(zdRs=(wag%4qov9b_Yr})1h;hYCXG?Uu(dj3uCy#?h-T;aO}q0Xbg4>JK8z+h@1@29PA-_ xWjgkX`_&KjN`?$LzLbtx8GN}rUcjkO_L{~}pL~v;(<{YW0Yk5p)dgT+{D0dS5Sah~ diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_4.gif b/docs/epy/uml_class_diagram_for_oauth2cl_4.gif deleted file mode 100644 index 885acb21a7155731d53aa16d6a1c116f5e941237..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3072 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 Fe*m;M&lLaw diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_40.gif b/docs/epy/uml_class_diagram_for_oauth2cl_40.gif deleted file mode 100644 index da92fdb48678208d51d7634866be73e5a552e98e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6222 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 diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_41.gif b/docs/epy/uml_class_diagram_for_oauth2cl_41.gif deleted file mode 100644 index 7aed06ee068812b4fca9e7c106c8cd2b78c9df54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11395 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 VGQQ?$e63IXolAe{LI}Y0{{V0KZX^Hz diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_42.gif b/docs/epy/uml_class_diagram_for_oauth2cl_42.gif deleted file mode 100644 index 1bc8250a36174041eecdf8c816bd0aa8afabce91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12038 zcmeHt_dnH-7ys)H*Tuy(aW=J|QM3h!H|v6%vvX5t0=b@e>z` z5*Js%h$%^8N+cy!WF*z)WYiTDZYU|~D9clomGxCr&ZsEfJbl_gRoPfW#Y9W1P)El~ zSG`hK*IHl4?yPpz*|X>Hcqb#h8Y3e|V`Ep7v+iaF9+sBgmPQTM)_%68e&?(L?JWH5 z?Jqi7J2^RpI62*Oa&mQbjc{}8bhC?fKOgPs+2QS-UvsX=&A$V`*2eR1%5xr1-&%j9N1JURKgXcFJ7}r7b75IXAa6@A61qUiVc}M`7W^ zqKrqSnb)pedvNXA)9aLp>(_hB%4W(a12=M?+`KtloqG&DPhyzDu2MY<$yrv$?r>uBGLD%WXzS)%*MR89hDA{rwyL{hyyc z9UL6o9US~NJiI1b=AAXed1%$p_hX&4 zqlFSixgr)_b>pS74$Yq9UG)<;aDFc;Ebcc<-O`Hv{C@oY-IsUpW;*i5-Hoqm%}eFI zUUWCj-nFZ>yq!E}Z zqlMZgVm6v)oW_Y7uHLC|Vy=j`Enrup#hM{NBjt&Oj|?mdxZ85rivB`YJtiNG=^F`4F*LQ`Rs2q;;?i%Tgiior_(ichd5pe5i~ciAccxQj&*FC)Pd0!JVkEs2AeaDNj(LfDu@5f$U@Ac;~C(diMuI&qAc@!)kPh#54@VOoA40fr|^MZs{sh8XJW-FW9@HfcgEPs*C~< z4bdl)H+DJFivh)obw`b1M6=*TzHBszST(^D%)+LGyzmveHfVr{;;}WP${iDX4}rsG z5FnvG`BMO96r2mcn~wDLO#SXf->c-2z;+6dEAqsFu9!yJ#bB{PRy4b76NoLeB89@w z4qS-j!bp@n2M>UP-eH6ha-uwf&jK<<4;HN8PZy3gjguK=pUK_9ifn*5zHU?!2;J** z_TWP^Xm7cs_RAt3VM}5>Lrw!dkc7F8rTOI0pHX*J5Aw!%`LzBy3yg>|V;~S9AAhoC zbAW{vNSynn-s;>_y*T!{&FlWPI4|}+MDxh&9}5<0PwqzBXf+xYc=^`h;gXMTIIU75Hu8#1^rfM$j8JpSCm zVd;_20RHW_bCMJBTn7Z;{00FWhktufqbPlQ9!OHh;TyoU&x8QB3&8+hAatD=opUjA zBm{IVtVdL}w_d}U1`+FKfM6n64)%`8`u-qbR^$TMy{L@F{IZ9=6;9+bH?D~b#gUAP z@ER~-%*uijUeednqb@xIBBY@^LD@#~PzQ3{?Npid5%K$<`P$q8fE7*fR1L;rD~NK2 zMR-#&It0t0t3x~`9MtD&Z~19@I5Y!_yvGNK5s2u-;-pj~vXG-12;u*k>|8!qy)~Vfg~2)pa_7% zS3?4M*8+czvq$C{N0caZh)}}Z9ntC>&im0G<9iObdjT*fvy%fehtqmGPtr^5$QPTW zPd!9}IX4ch(mr5qz7e-8V%Sdp7#n9+_Ck@e_k8mgU5)7J%fqpGzdoJ=vzBM+98_~H z(O?pmuX5cFYS2@Srozo&*08x6N%OTgGlnxI{x-%aAwv-IvZ z-;L~-|H8Be;twArhJ@KTmqIw1j-!OTCdTDDIdIAKouvNjVqw`L-by!g=bV zksbjy6oX%OMAv`f`Pn~mdpwlRAi@T-^q0gre ze#sPSV_0^jPNw{Pbn+*d|7oJ20q2*hEI6+48GO3Ux=tRY)lCBlA%)XVwlJu;#6fhM zRi(J*@#u!zYT5=LLa>L&Iu;?N{B>*F^X( zjVd&S5SPK?pY6XRlli&TbsL;^yJttuud19g(uD?th#=>AVyXP~Mu_y55@*ElnIR~sqQZ1Qf$>>e90400YTeiv!-}g>6!hdr_q`7gQA!eAqW4EfEA|A^ z9a+V*#r8Ogo)K~Shisf&%k*VXm!-4AgNKR(fQ~i9jH<8uxV7W5nuJcmcv2B!8F z#4ejW(IBXPOnG%=kvxe$Ng!4zZK=;~_kX{4DAJHUHo$_VgZm=%*St{MZ(mNkHQgeA z4vTDFv>K!rF8td~eEDekXWOfyF2{Nz_hSa@of+LxuhEca+Y8)h-}aS4ck@p*ubF{= zjWOfCVVnMnfdX#}ygPu!l}&(MDiTMP#ZLKA=RJo!ZhRQJYn}}<+WRuY@@OCR9YcB? zaGv|#pN?at-6X5ob(lix>;@9GCF(6h5JC$tpGu(9t_R^%aA`Mx7-DByHWXulB8G#l zxdPKirtgNZD{BAc*9kVQaj7*R*{ z@Pse0*7;PujJI^`=^)kA#eKOK4^fbM)WU^?j?5H^SAI<_uo0CopHgUxCN%Fm@n`In zhi^~?J*cvc)JX$k^Z<g7~l7&{?$tjqI} znlj?ZqFT-JlbSV=V4n3MBZUO}>4&?qer8udTqP>&R4_Wb3O08T8%sLZVQ^-S`Q86= zacc5FDp~eaq%Z7JNltlh&h!2ArX4xsEV(E5M7nOEyl^Rh;>lvwNsiYc)hHC67{28~ zDf{W(JkQhOnx_$;CsLf(4|jOn%k%UoPx(Z?kV^g#+7X=SiKFJgpv7T!Y~-Lgg9LLh;daYFwn&WKo^ba6e>Nsd+&*2y*u=cqYMNg~HQ6DyrKB zc*0WW4N`w^+5F}SBUWWb?iZQ{qQe=0$&mnCUs0`nA<7{BVm=390`!rT{AP` zUp3V!graXZ6kr_+$F6d_ypV7}Wnl)KT9ll8!BqXcl98L7!LQtS6>xhA3WG0IVJQ}P z<);*^nq(AermD=GC(8OsTfFnoP}7tNxvo(v=IEvq_pLBE=Tw?+DSu*!@6A$yp3A8q8oQ``WddLxJ-I5yx>>=U;^sIp1Uhxa)nCF(FGUCo8$rBXZS4 z!#v{UexWu6{(cRY%XTwz^_q1yT$AB^H#X;{o7{eF`2og|Kk@P@>9P~W<1!t`RI8*c>&V%Max7hPH<~oT3MJq&5PY;u(OFw=>A5NPBWe>R zPHdFAd?fHutGs(2wd^bSlLeJ)?tg!P@@YtN$oeI}vKllE6m`MdcPXR%v&dI$2FWtar(C}|HN%Q(u3JB)op6~U-FSbAR zc5y*lki#AYeb%@r#Qm;8L;b&NPAq+eKi;Oi?{q3+x|XxwL~GNpde=AbVv5~Oi+w%> zpl%jR^BTq+iU??Ha+I80`dF8wQre#>n@E%%{!u~csHM=dxo$dK6XJ1vTS~sJ>DENG zO*-o~E@x+9CK+|wa2(}nk%0hTj5B~k?c}nn07?HyC+WspJ*5FT7AZ|-*JtiU7PnRy zo~(Z!@OJiw=D6w^Ka^aDXqK8V2Y{VTZb-1FW`9y28oBp2>Flj>ITm){v3gs|>dgSi z?FuuLSCJ78M~SQk?IhLjxuY81c_hu=O6e|NOm5e+DBWmicY4>(M?pc1^grD{ld#{y zaxeAruQpUaYMRAsxTNBoR>mBginCTFwWhP4`Mh%@NyU2IxJ$*%4~?=u0LYSgW={8z z2J!nL-VyUv|JYOr#=(deRvHuSk*n<+ciRA*6^xEU6zN9u7TC6W3!HIBY2s}{0g;Z= zAa}W>xfkK4zX?1Iu2wHl?S2mld$pxPeZrUS2ERZjFCxQ)`upB=G+5Qk-Rgfy>2H~+ zZ@XycC!tZldcNu*YR(m9M1;L}?XJ{~ueyjjp@Ztm5rH}7rW6;%SA)kfg{JELi0HyY z9u#a`GU3mi&jVso&0Qs9LQ&gSpE3U=80r*^Kjb zZ<!QR}0s|Gr7a+n2<5g6MHwt&jSXN%zk7-D7G6zx55?Nih_|S0&;=Mo7iy=M{JR zQGZ8^!dIc}goiQ3=5f)6l)dXk!jGb(TZ5X2AtCLJn<`y$$}{IRLUAyhq$(M&nr2UW z@*vBHbubn)_=B%erbYZg2zAi39n(lni3#hSquCa@6W*8-98^bMByo(oB&(H~p%9BQ5jywnY zBjkS&VMG0n{e&L7WsD3fHdN6f0;=slX4y7`N~OTl8Nh-$ScoXN3qj?~J@A;+d(QFH z2!RsRF$;cFvr3XNbV0p768$PQn)vF;ds0Un=Hc@ek3#vO?)it8Z{?`#5J-6r43X)R zbipxQ)VVNJjxg$NI^5v*<5jCmrFnG~8@YJ~U<rqs;5lsYdntGF-AFF|_B`>1+n^LREkTjrCFgI!#~d6ldUUFD?g>+!`(r)31(UPb^A51$&`@^ zx#Ipu!7TgdtlMlar2max?p(0)xDz^-HR4+pE`^P|VD;&`RnwQM$P5b#lENn+wi`@t zyqZ__s3x0fZX=s3KEK&h@VQ7YJa2I+j~+L@TCsFWI`bNiL`htn#qUvTCE^0zX7WFYg=7^uj*4g60f4OYQVQV=vr2ikrGM$wf4+O^QDEiW&;73Bypw?#LLzD?0rMo9RU z1wf-M+U90e5n$9#^1AGqvS$5x^9m}07Vw}NHvgynPM>BHFN%G8Gd-=dQ&R72GAXGI zCC;3X#CX_Vp4y1?u85vq=$it%FmU-IvFtX~W>Tijfw8X94b|f}%=7LlvlpQHbx?`XC6k@Dw@ zp(~Q~@to=v(Sk44ZL8?ZuijkV5fR;9C_q0}Mq=9-E63JLT+Wl;O?(9o4^vRJE;)l< zc5S|>6rr!txw+7bDNTvHJ2By(X4%@^Xs7<>dV;ICD3Z1bXsKfnUUH=(~oA#T7lumEYL||8Ag|A9p=!7ZjOm zr`7dT)g?8SuEFM2T9)oG3*jW9rxO%JzZ(?4(U3sHQ-+ zhGM@rxS0Cz?pL$z?PrzK8YfoD;gA~h+`}`dyXML7mU9b*u@84w-h1z|r2Xk#L9L1H zvMm4kbo{5rr)PkhL3{QGuKzd1E$FZO~4jQ^QT*oD}OFeF78 z02okvUIJjVnuWC*J6~+ZpZZqo^*W{eq6xnFGW)!q{ zGlpPBPZuG7(Q-`>HsvsmLjXEZe@KlAOb8r;*`iZKI8kv1bHf1DNa7bQOluH6iRAAq zkiN$wWz`+>x@}{9bdA(%~i?<;k zB4!wVKP$WIrn;og#GCIQA4H7zXoK(uoW^)Si?BoZ`ZCKI2T++s0Z~RcVMN$`2l|zx zF(0Bkp@^)20YVA9uR7jozn!kCKc^{IzFnG4JQ%lAtBxI5v0ap3~NaPxQp#gB?P%RLTk}~Za z=Z{H%&~}eKmZr(-eR>e2g#Cr73B0yoS zwdU~mQHfvtKcrqwYOOjtI@r9PKIeP>#~j+b9$Ad8+iJ|jda&T;>{CvRpYzJtfENjC zVe8KL-dTJ7)}CZ@=oVa?7VH-IE6&+H?EY}+LTL75XOF1oQ~8S#Y=50S<7U;ZUdE*8 zyLct8NHg>`%?8nmE`79R>U4nUo*2Ujfk8fo$N~~~vGqgnNaBP!v^RuafQgMFGgW4NnLGUv=S4T+x;wod<&n?6 zFLHn2WXB!UZ#OkJ!(;Rg5nMI5k#Jki)Y_HS$?GrcC;&awfT81mxymo@`}Ckv{le1Ek4y*TWE!{ zzklxmmLj}y?C|x@vqw%B6u{5l{ETM(_vcLQOD3~(=-j365CZ7?(6g6FIuYO}Z1MNf z{;C&6bCV^0O1WyXhmyI~J1UuG47=WsfAb{Mk!~N9w;mweq1;^)lV}m3Dr+h9tcNb< z)%h*t-Hw+D3!RV!+S;H|JVIuE5zb@gY*f0m13ro!w9kr?Pd6Usf+3;UE&>s(MT9SO zl0x`9#C3xK06`t#;4Uf3EE*0B+4iIt1$REOXu#M87lc+sQ5r-CPo+oEt@`bBrM2+f z&W;Og|IwoAM{V*h(*n<|l0Qa-SAT03cPq>Yoji?J$ zw~x`}tso*32{etAUseFz(6(nhy6jWSZgk2@G7u@^-`Rmz$uq?enyX2S*5>r6FY z*c&CPS*0AdEBeXeZv--4X2q#iv8vdFi<|&2pe0h-aYRte-r(umayB?QG3>&D4EuPK z3CFEK^K%I{q6N~1$j;|AT=iK6PL>q0S$-$o#CFTwdyZ?8;{78i1*fUdG?9VpY}+Ao zOPB}5AB$t1dN-VsmpalVOtvl8bzG9)ylxBK@D{&}hdmavYnQ{A`*NnZ4#_xo<^_cL ziCPsg0XP9DtPcxNN_jWPr6FA)YaFEi$Bmxl++8aj9%6IR{VW{+z(FhgqSqhy`K&iQ z<@Gyp;A(f!URBSdjh)J1q6a9f=HYW`We+uwC+K~3??iyI8N4V-4oo7R(>Kb6C>cU=t8pxe&Vc2=6Hda;=4xvk|&ur zmCT)EO5FziPn!LbvMYsd09T_uODSqxFEgCtO=^SWYrve9aX$IdF*l=2yl5o;3ttnYt5 zCBvMYIwLSi$Kl{m3$Ci{Yy!dNb0A`;3bpXnWC0jIe>h;B zqM#j2ih$EgZ)k(kJP&HZ$>~TS3^+?f4}bv%sen@$`^FU7^I$4GQrB{UId>S+$CnP|?~3&Rs@X@XVlfFw*g+KR)==V2oTN-MLRpsv8uSKh zk15U#o%(H@0j}w=mEIqKP*V8VhwUhi!w!?AV2BvNtu36MEu!zE8`DI>3DQe@J$!yz1*aL6tz^mfV4&Yq z9o|b|(>}8XInT3_54i`@zGkfKr|>+}9>4Q<ovH8BV2d4|iL$VMZ6IcnlJR%EIX4ELg*Y7hI|hG4+@PLvd#~_ z5#&1sHM+^pj`2U^Hd~-U$ha2+KU0MMf*X31RH6Y0`Cp_o=nQ2M9*MrlH%_IPyuWr# z`%go=W$_-4HST=G{`9ZPFcUq@_eeof_U_M+VR8Fmq$=l!MiY<6CZ3ZfUhhr3znJ*^ zHSvZ5np>(YfT^FJslT;pz+V$zgt}P<$_?6SkzzVUG3C5v8mh=~aS|6cIdX1MC-0(K zFtbakW{EAsf!EX$^375no2AYTC#7mc8;`m=j)K0JU4a(G z#C61qm|vAO2kV-XTi}@@xMh3fpU&>7UJ}zIj{>u<$ewF|6asQhhM#{ft185SL&{v; zO7B`MzdG5D$Q@d=YvwSQE}#NAi1O>?_DAoCw{8`|ah$CN;;%R~o&SS=t8$08sJBv2 zNuP#OLLtc>`J;Y?oxxaYR60x1tvbE-dVV;16=9caSzdgSif^d4zR{xA-ujq0F55Ua z&(XBb-biF)?Hfwbw)$#0@gNn`A(h8x4x-{Rz*WZgp<~!DW)Ju&kHf6;EzeNV={6r^ z|KbO(8balYWNt}WpI5VPu$~;9D5++!-wAa;hn zZHScZXQ{lcy0%Y~(>q~pyLHoF{oD3Zr}sVEzD?#Uj)5iVYBnhkLbO5LKsrr(oc|Lg ze?9lRV%vcfhXDnRrIG}Dfz#!r9TMfB5p;438L zvwNRkr9ZC+PO?5oSMId&Y#uL|KlhC?Q%k}2x&QL0w=>}4H4XH0o2H9KD>9qg^JTFzjGnxILq)N-+(r3Rq1_FAC!ed~| z3XU7y@OyLTwjY}^pMSAb0HmDeuu%g<% zT3xVIaBo-*=3MK2#fgS+(!sp*O$AZutaJzE0P&w7a=36ElR9B&;}9`tJrHvDH}Nid zjC5z5#GyA`NU&C%qnzmDKeHzdfUFg4gSWd3s9&ePhEa39Ha`AaqFTw{|4M>r?nNU#wX3O zV10rqQFMYOpPEa|Xgi*(2zOUsynp)MEuM_F#`rE7 zni5;%g3LvL;SOz8?=rDd;3LwuJWVs2JHPonk<_ zCR+QaIz^wKvfTnectCJ_5gF^jgU&hNCE{_O{E!YcG}|68AQbhUZ??@^BBygndEzzh zFnJLHUqZOzzI}d=;PBvm-rA+^#kvT^AVKpR?jWKUPZY?Ku!NLUeJ_ezT3TZM{p_`p zc8bC2{awiW!;bQrzV~NK?~MTE&G6+9$=+L{%Aam~FE@K{w<>*^@}64omR@U_XZP6` z_4&4=$Yq(YS`Ag)A`W-vp-oD6G& zC?g5xdmsxq!E_HKSh=bf3>Bx6^=M$Q22}VzNR*g?3S=0=(;?HVmUg}%0f@?xk5rZ~ z_HYGV=_}X(X5VG})X%Um2f+wnl_C&?0EPt;&)N|XjTx564CYA~!4x2x!5IbsAV>pg zkC1c-P-GEQUX}#XfPxc2%2i;v1j&NH&?68b(`%}>Ys~8)!6P3v0fG^Z$V^+)s`SGp z5EOdKRC~cJ1oH6{Fc3^WzD|~?gqk0%SfKq?c6}UR1aq|iaXg?6Ff4-oj=lUmDxv2# zS2ULc08{_t)&S-biGRz-2mp*E7%rPDX2cD{HmJE)05c70zv)9b^f7PTv?Q#9y*Di> z>lT4)pq>p&i4B4?)Kx4%g+jQj4MAvunYYQB!DRJgFiRrDoC3ltf$S@x;t~L49>juP zOI;4KZ%9Wag1`WfSjh=K0+Tman34nlMkVr&Y*-S&aCCuQBiZ|S#TW;e1A&T-O>DR| z%MK92{G)y%8AT%z5{Rl*>HLYL*IE!HFvmL$VWE*SFOwX4*2=#D{HE)a!yx-nq z;HfuX{2Rc)Jjf_LlB8Xr*>?+ro2hy`U(z%?WI81k|VB+giwK8F16 zi8QB0niIeuj|u*5(4m4|GXmMd9J-hF#cV4~p0HLMlU`vrK(bi{{jP;GOm%) zXExm(p*MGZAV(1OlUyd0h~u4$&^sGjfly%_fanN;x06pZi1P1N3J-la&HNFKW~}s8 zQ)0jjjHqB9B0`12aDF;WFehV09k;GWjXpk+!A1{vy$tm~+_xkUr4LuIUsohgZR%uy zmscS=zWnU-X3dhe>GYCnJj^xsH5WmKzZv2 zE{KER0)@cS9W=-*PvfK8pvb)_3wXLUHyD9~cJ_QP$tIV+j0=5u`0whj)-mB})}AJv zsBsL5W(9mUBVU@XD?|bOWe_ml_qsFmcnSiUU$KZHUOJQL^6=8Z$R&ALl49_os8)cm zY@ox#(Ec(Iwv5DY4()ciM7|OqRSD$^Ue`R%=spK+xN%f`3XH(7(i?)J591@>t>^^1 zKxki3BR`C30K^X9G7mJT7{ZE3Z0NP;=l%}g{pr$9?i9$_I)b78Y(tJjL)?fc@{|MO0llRssVZ`%J5s2lwtq!|4~a#QdjS0QlIS4{z4C zvdH{sN!~sGry7b=%9}T{W1C05Y9_8dPbaQD+bDK9mbVA)@BYc>zRDJ{X8`{IR6>mi zNzUGpj^4~T0Y+d!(BU0u_%XqVkN^uLpDo%vW`Ua~p`GMi_t@Do*ip*gk|})b5}`;c}fz-zv0Yr0G>B zL3Qv82eLDDmN!m^e?E|#YqSi&Nnn1+ziDyrY><#UxMvAm7%fq{c&ND09s0H_eEU%8 zeQ(UiW|oVW8Ye1~e}3E9{`qzK&ZVzC(6F^5+=roD1$Hq+&)$czl9LY0^Yfi{W7jof zcmMu89avSaU#c8lF1bbb{azWdvk({hS~e%5HT;jp?)&~ru|MQfq?Z_j*?gxW{%S3* z)VMv1*!7GF+o&)-+a9qL8MiUl9{Y87_F>%P<0`g9jHXw?Sc`UUsnUMx`i7dg;UQD)V@)3rD z$<@NK9VdlVAqx^HaQkR0=oYP DM{tz9 diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_43.gif b/docs/epy/uml_class_diagram_for_oauth2cl_43.gif deleted file mode 100644 index 16609ab2acd90910a767158e34d3052aea7a98b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9500 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 diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_45.gif b/docs/epy/uml_class_diagram_for_oauth2cl_45.gif deleted file mode 100644 index be6daa2fd2e5c260b793494bd10a2688481074c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9982 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�q%Z{*l^$C48F-TQ#NehgS_)S+$+nX>GxIQ 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 YzHxc>-DU2t3zgM%UdVNsfdSC^KiTs$i~s-t diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_46.gif b/docs/epy/uml_class_diagram_for_oauth2cl_46.gif deleted file mode 100644 index a5aad0e62691674a32273d4ebec8c04004e0e382..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11286 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 DM{tz9 diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_48.gif b/docs/epy/uml_class_diagram_for_oauth2cl_48.gif deleted file mode 100644 index d4eb9bb865b14723981b7f0b4b03ecf36d1b443c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7412 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 X@5{C{QO626zt&V^#m+?(1@!(8T9u!! diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_49.gif b/docs/epy/uml_class_diagram_for_oauth2cl_49.gif deleted file mode 100644 index a0d66643a0db96e53f240597893361e88c516607..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5870 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 diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_5.gif b/docs/epy/uml_class_diagram_for_oauth2cl_5.gif deleted file mode 100644 index 32b6ba65d70544d51cb5bd9935b1c51e4b387030..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5427 zcmWlXi9geiZ(Q?k5xpD4XetdlKg$reLdUaab-HeR7 ztSr{`>uoo0J}fABR9xIwRyJ5s@ua3^g2}9_tD9+Pm~UxW?C4nT>RRpT>FewJ)YrE) zIJh%B{Cj+y&*k#@{Qs9%{(%$*fPVnJ|CRi&2@vEH%V{op^4Eu}V@6I`mvfo1ZjAv= za}DR7tS3C?vEtkfN+woX6UI;d``<=ql4sMa&)>T*PJI5wrzc-dNlm+wo{^cAU}>Cl zJvZ;h&0F~ew+oAkOG@vQl`|?TtMcrE0Oq~A`i92)O|0ezEv;?s9i0!m{_TF$Ab(fe zj?+IdI5a#m`ebbU=>&IjYI4;qx@)g2O<>g9(21f!qfl&adJQjcV?}QC*@HNzRMcK@^mdD*u(~1HV+#919 z%5a@+teEb-wsc5%fb~o$U@T(pZhveihT5{uDmrw$>u@@oWTdEjD%I48nwBFBAZ=xb zLrDNACm5ERjAsMl&WhHik*Cix%;Fabj z6FS;iJdS|jv9ASR+fDj3$%7E1$sQPLLPg*FSz6oh1<#zJuOZ3`thwL{5UnVK`|9F_ zKP>12RfAxX5>U$Py?MlU3X{OKBv14wH>gY!=stJ?Lmn{X5;?*G6g31OH%27^ zmAeTDU(`ICBOnB~@q-dSZ?geVZJu>N+*$}PE)Fq?cdRDEqZh97DDRhylxx}{Kxc&k z!N3Z+SCGS{zZQm;c~vO!+;%qM*`IU&p?jLR2xQEZSQy_1))+1@>l=iD8Ck zHG)7j*arg4@b{|4+_PN5#5H%wy#jVD0uW$Y#_@0v6_9@lo_F{GqN~OMBADwCKmyZ5 z08&yOHdiUXpMlEvEqzH%28KXZxVYB;kBjJQIC@RUV}}J&IJY*YE;v-AAFKXhL>DhR zF}d?zKu*@$^BQF=QqNqn+R9xN`H>JH22^YK!nQbS-o=%C+B<^93}=;4=2=vZf-wU8 zuKBmBq?(B3a5 zSP1w*B)^TY5zV`L1R98J0})THOUL^TnCfkt>fRISfXn|C&NAR>_F3rb=Lbj0Jc%jWa@zOkUC zH3VyYc1+C8r=s*wN;n+mVMZDjGkPfvTWhw=9A<7&3&?cM@l22c*#=}=D6h1?liB9>{8&PFmO5DV4t z*g^ptmroW^r5l{Y;e?G8?q*;h(f?XCo&#kj3_1~q`^1l9L`;lDyp4^oJx7N^N!}ui zoQm$SF;A_os0vK>cAuvET|&C6yAy>*2QfU=&Ag!U;_rLIsTzP9d6MwE8d}&GwBQU^ z0%Ghu<>F08$JoBu;ZVi>`gnnZ&9@q2z7JYX@iB7W^5_CrCT+WqWsu?|h@x@1m&-~w zb5FU3O4XWFt5l%&JxF=hL({tTd7gM(1{lw3_{!hJ*9G>)w!U?d1+-&O%qa-*O0$x-J^s z8xctXDuq{FRketA6b$`!{ubl1aoG!Qt-0)Xv}vLa9ZkUl!nUnRyK*CqSB{QDomWb- z6X#FIQ9(eK3OJCMZjYj$ss*C<@f)S?`sF-;Dp&66_39W;LzE-D@JFdTBU_$KGspJzRjwpo^6QCXZVKi zoo(%!4GuR$@ZY&T?|Qj?KW@C7FKPVf+mG!gI=X?1+BerHUy!i*>%T+0>JJPU?=(jS zMm=~b@?!L*+I>gM`fv+T)e+-s57xNOtIUcN$t0wLDN8gvh87TU4G69|dD7C8cyQO( zud*t0bsiL=!13?D0f8>_gz50k`wimTi7QPB)WDc9V*8fPypbMT zGJ-+F*$|1C3pS~8*$1>d&hn3&G9BP0l~Ap*4WKdAxFEFpo9u6w`=rZE+Z}llsek1( z8W51ysyQzx7$-uXaJaTQ+9Bt$TT@){1bi{@xw6OGgC@UA3TnN*(}!4#gxC$z_Xkex z%QAhj2gm?m$wuIb5>%u~u5Rs&tazuCc)+S0H^WISCqx8k@bxwu){s+Sx2 zgd6a86=dJYYX-i9bnsK4Oz=v|`04^-MmTikcD^-D-jAVdT8Bw_mAoR}>#VQMx zG^{sUwWnVKd~csZwjR)KVjnZ{w;DZh;H0vY^`2w;({9lCvid0x9p9W{6za0;`09Y29Eei@9BVguyoL{GX#2SDe*sTwuF7`F?JMs%+|(1-v~ZeZc~f z+5!^yx=#3>0kr6&+o@O+gdZi@ee>Mu#p9DL7<-aS>oY*E#YlY4ZG;snM2{yxitU<` zHY%oRsV8EYMz|_?`Mn8om#HpA8bt%GsgNim@Pd{JSsBic)Ujd6I^=~n&VWK>aa}x+ zpe%`@q^Db+GHTD1%hT7Tn@ZK1y2T;7WatNHQ|*APN|!7m!kMoRM5jfjU#U7Qb3WSf zuBMU~$XNsv`@yZRo;x#8yQSjjtbE6gL~mi1&6EsG(NZG-2rlscu2Qgxc^=1WlwceX zZ4pmGB$~+Yrki5`a9Gehgk+vEd^-K6<@uv-ocERpmV#Z1MFNDy4de(Mv#gH+q-fH( z8b~J@fEY(>U2?v~<#_Gj$y9z2R0G>)o_v-`EqTFwc{6kY)U~7$NC8uF}V## zWnwLO1?0;7xec2EvXA3sADg|f1!k|;$ZaKh$f-!8Xfz}h4`~tsb|`E}_bq%FtCv=E zvm$DoU35p=OpbPYiVYsVCw5!7xL8hV(adJS1=gk?3m7=~oB_?X9XxjoZgMT@E^^C$ zK^&Sb>HC5H*Q#_dUhlE%p5FMUm~i&E|n+mVNRp4@}YX(fx)Loc`pEV-z~?~dRk z_)j%lS)-%~lns;1CfJ7vo263(sMlM}zcas}xtK=_=Ik;X=SeQDI z8p8zLeQ_}7t#nxYt}dwjb3TKQal&rBV2qMaxPj{1v(j=eVeGR2c@i9N98#4pqat5U zv?%LR4Y8#Il<-QimqE30z>2VXS17|#Vy`0oj!4(7D-hV`tbM7Ao#!=5_5dlzS$Q9s?E1bR) zk%g`C38*n4%OQBG-flI1Uh;Pr5ohIP^X32q9)QW>q1Fn4);J3ioRlRWY|3;`kRjF4 z2XaHneW8bULapc(q#b6cuM>fNT+pj@Q#q>50%4O2E;XNA5Ufz70oF!YDZVZzUqTol zVtfmf+rsd#KUaHGS@TU$>E|YJ?H)L-V3ri#4}d>6Q8s$@|KCNI5ak(HLpf zLz+1DXAO0T;YGzjIG)Uezpk13WhHR@kibLw_WFFS5z)=d?$KJP&0*R%aNtZhB4Xs26 zn7db&(0h*Az6n8u>}xmeG|0IDsS*JQ^z6s`jL^W^h+QwffX(SO#E4InF0--rr=96(xk4<5f zQPXH{vMwvxsMBCC>hdu5vBiMLf;#JgXnSi^WLQb2*9g{@1w54?Lw;obC=Y?~7q`I! z-iwMq_87u3QC84Ztt#LCga;SvGl;6Dv-@tO{oCC$Y$lV`i^^3Za832+Az60?vuTq_ zNsdjfz8p~+o7>yG)awQzOr1^4rS!$-H3iHb8-ze=_+SB6y4r~5#ZL8Pq5Z=J{Yb}N zj!7L9wO3#tyUiwdz0(3??V(Hb)=2YylB+-FBwu|Qu#850y#dut;W^XhiU$jwwfp4T zuV<-dtGafM(zSJkhlKD$5HG%P3yiiMx(Hb+$5@?Duz;vQ#Y)HSALh;=)GIlXoFaZa z$=iX`Z^t!6y1{EgIOJ+hQfStu3$T@OqH1i=x#(8VM+$!wQ{doLkCpPBV%wO-9{3{PS}qn`&|^~edfxZy z3(Ti@J;rJgkLFt_-1iKaa8)c-=zq7;xdvID0S0}pkxFX~5 zhi_UD4 z=#RovK2?*W(p>qZ5{+2+KflM{yJ66p!STy`N@o~*_?DYgq?*V$=S{2Z1Y>oi4c0J? zoZu}5uCM-#L;!3PFcaiBz4Eot^Jh4@_%7e?=Z(_jy&1ikWd|Hfog(@sN5T#n)-E#b zSk>~nk~g#90v+kXj#Gd{}ctSd#Adg2Ek|&LvT%Gb)UH!51L)5MZ5$$8?FB=rPa=qO}iT9@0;R)^T(YegQ zUyrUYKx5Ufg0*;4tv%b^9_&`nf`UPl7Bt%_@m(I*L&rM2QeLefT7wO zeB27_&N0OC*3^tw_UzwiHGIlc(vZ4}-P6yZ_FHyC0p0!8ANt990|^cT#%E;wZ8Msb z$!=oOelnAf|9NB<=sYcby?<0a+iRpM?{2CH9^8g=mUu0CN@eRWi0VL)hg zbVKX<*SWV*rQR-?%dCaPqcWwF4Ml`-m|fy?IaB4uwX|36Auu_S;kjV%wi~(I8fCW%H?9;7tQ6ZHQ2Dc3FhIxUB5E(LG0WEK zde$0VuigK<#!~$7!2UyP(1-SmAIP0$AG&%z+kv{LqIO;KZjlI3!aU0(g$Idw(^>=d0cXGPm?BL?! z(%|9}?CR>~=61>5J>tx%P*2ZhPtTaMuCb)kQ9eHLzV283{T~DbB%bq32|Ak=OiH?N z;n9T)*Dv~AzI-|T^5q=zIeKVdR(SZ6h=_tK!MTx<9nsMRF)<}Emu|&{md3|3u7%yA zQmd&~l9H0TlalTvC)cOM)Y53p>2dWL87XPzAlevU0TY#;ZH|RaI5P)zy>Lg;TY))3wE8b#87T+rt*d6TMJCa+=B=2+S=yY+dn*c^7+}b?(Xhy-Q9~lJwN;V{|pZ9jE;U98{@Ir z8{fWd|N6z_@&0dO|DXP!IiS1+7XSb{fc>B1|2hGHJOC}AV9R85C4rJUo`cNFo;0MY zU72mm?Y`@%1Hp5HEq4ZTFqRn#NAFj?$kRGi@A=|>^>7i+Z>a3(gPPHsM&V!PUOcEB zufQh>D%!QyP291~)A1T=z56mv6tFF~dssi+;PxPRe&}Jt%so<1hNAtW#@Pocrcj!A zb<^uM^82B3`?lu!r_n#Z%n!HSd;6RMgYh$uT+FwiN$&L?X>WNyKv%WDb?ou|kHf_W zF1#6uIpEV%Zh2j4)Lk@3T;4NCdGyJ{uQTZuQE)Qq(dz4xX#>id3s)6HF$6}?VCv=cTk6m62VYI-8BJhWnUxF?5a{!IVz=FjFn0QJDlGQ$EH@}D{H zgcnudaID+z05k^yDB$MNo1fb}(CmSPI@@XOYrZxnKru8wq(1NCzBWP_$ zHbMp-G;t(i+KI`MjZDUMqt!}jDv9zWs&b0aVSXPQiKXQ`{zNqvN=T0E2KNmCSpA^( z@;f!S-43BkjAs3Vg+6xpE+QWk-F#n^u}X8wAr+RmN$=5pL=jNfzj*}xm4IhKBXr4X zd`|zI`k-s0?t$W-XLZq-6wWSGz`h zX)*evoD2X+05AAj8`lkiJCe{e0E@@pdLB8{)aE2NypsIlWb4XfsXw9pD3lI^Pbmb; zpN2{#MqYllvRM4h>g%8D@+ftw5VF9|evNx9;jeDokcWn*L7=Z~h`uk+E`rmq5Vi7S z0F#DYA3S-n(iPONYFr<}wymrW;|8!lM+{~{evTS_YWz87x-oJ9h@eFNU|Z#FL znsBDiE&5VI6)DBf0V&2`QPe~+@+U^Gr75t~Gf{sIa=SQaIfc*`p@*l=B|~4T%9w91 z?p>%3FztxCxrcqIkSKj!HV3)RIscsxQe@l%WhJF0|0al~-+hA~qSy4}kd|L9M6tmJGJ$hRY zH{!6?r+t|}fM8TtE@!}6FY$+%g;ue1Vj3T)umI?D%dP{IXChX^4t%f1{jfL~sMR8f z006%Fmk3$-GO+nlQpOOMIPvhu_34&!=Y!4zCQG^T3}=c^)im&Dr;9%-jFiUPp` zU;?93aV}i7w+;eW*j9;zUKwaJ2SuXr1+OSlmUNS|a zR|0MdX9N&2$)g1fv9LA#p;Jrh{BP(>X{pOgkSY4yuHy-~Zm72#AB2JgOqoe3HhWGW-N*G0lJfG` zAD?i%kAwzLECn!ZgaMY}Z5NG4--tkAwY0BAGJ%H*;lomcT|{L%?A`|og?H1wv+fEWmxEPL3Q(>*dRYG5 zwA=lqowgG9i^JE@Jw^}76x&&8{UaDwcs&Ea8h$<+L(~#OzK3j;U~=TN-oi3Se9Fo; z&;!K{N>e(0r|uuUM_g?<`nrv4QCA>RS$Y?#3s2tbk}gtPi3fvAiqG&k!=eB=FQUH` zC2y1lz!o7D_mjE8@vZf?PwOQvJyw*=Y;Ks%pN~~Dg7ErR9xuwbD8f#$u+mf2LR-O6}q z+oJE8Jh?}<@!-Z|?`e&Iv5eva3-81N0fHd;D=9i=Mt>zj^Dhlch%WE%2;K+tm036~ z{B+N=TepL26n-}RRnd69roD<5CBxPOK%gC*J??7nS4h4Di!hFI#bA$h5yUSJyAg%DdZtxTgn^cq1`of+0{`CN+mVF z1t_=?nDmLeU?z{FM*6S4QN0QYJ(~R$eX{e*hPkYtFa84w;uz5D>3-seG^aUs`b~y* z&G2Ste#w;-KFA=!tZ{LAIcR=xqq`Cmuw*v>?)^Fu2D(P#sK4!)iHCM;#De?Y-ukn1 zOVcKdJ+5ug-@#DYF>@A(4`R_@Gj5;x7|hL9A{_EtIX1-I95%Z45(cto`$zEC{MuFF zSQ6S`Q2Wdu<1pdvvSPQS$wfFT8mk|opbu;VLOd;qkOVvR3{Nh1=^LjFc?Zx}<)1zK zEMF0iuW%Vf0s?L?m+`vmCrqBSRm=lJE@NTFd-2`yXx6u0CIz9!0JSw8DHw`{+^v(4 zlRM0gtOMm}fB}J%y24qMeb7P8r4M$(@Ehk9WPj57Z+~X`Q)tDba+?l;TCj`igV5o2 z`?XxcKHpck=&SGc>U%Jk0=TTD-obamsKchwo|K+`t$$*fQJG3?K&kVYcHV(2S&F@E zp9sy6v+3_lx|(7elB7fU9_hLDTr9de_eseFyHmUuPf{U{bBhiK7U1{Ue_jxB($x8axq@3 zicgAeJ6?+toU+Z4I_ko*^ZHth=Rui9s zB+Ca$2a+9R$S6OOQ+6d@!rDp3`V=nglx5AS@d>9-zYtCgzzu_V?xa8W!C^t|_={7= zl^&)D{c>HMiYIY#zTETqaJ_>(e-n-Oj(%(!U;*1!o(78a#Hr5 z{$wky8cfTDR!7>^)dWx5&>FPJ8@5@kGw08Ja(-!TOGAlA0g}Aap?f~v7&nTNe}TJRhav;~SWq^hGAji;e zCre8~JzY*T{8q5*b3SfOa}01yV5jZ+q{>)V{7J7^gwa*5(7vaaH3{JEZMoXXm>(wt zkqc@EDGqO-w|SwXJKhi}I^-tLL1)MsbN zX2}2eTp4P8VlLqJS}IB%ci4mJBhQ5Bb;DL%!n9Kq3? zg@rZSytYcYmz5!M=0_*t2R@=rt!qnMRCJyIF~Qzjk1p@l;JaN|wJBJ4M~o%1d>8*;Vpv7+T{3|COr`DoL<+@f3p?s=Pn*JIhU z>CKNSo9_?{OMMF058un)Hb^SDmu`FS-JUQgoMZ_Z73Tt7P_l$@XJ~8e`e7;pUA{$Y5=Y{L_1`FDsG1TDrB9WSs4ltdcSa z1uUL>ijJCjZ;YKV?S6M|*<_;4@MH7Q^jq9n>sJD*k^a|roov(cZLj-VyKmamI$N8A z$xENh#>LIQK34X{xS9Wbp!3?0E_ixHwQ{4RqQ#1_VRdpP*U^vZDDvC!2r&))kr5E& zA?{Ieey{o0B+^IJBb&pI{7*eX$HL9*ZgYQ~j^@)V-s6!=gj7$vot1&zwAD7QH&ZNL$MN(qe8C7z`JNa;P( zQOkR6ba&XiafrWgsN-=Y@RYyvWI@P-bGd@<^_LUtcio;94s}KsG`*FV>%ZEbu-5qa zaM-Q-2<^789hpvJM4id!AVYy8za|=a*BeYyo(D4g{@%PFuN~{lc%JbirgD$0y=*g0 zzd6IHIj0L&5z&PTX)<1KE(y(!t?k~Cf0mcmGVF7&q>`^&v*$gbr^K(vw9H8OOu;oA zqG5|7M=!AJ=sh;qdwi$YQK9doX&)j9fH*>&%lbSz`aI|Qj&~&3lVQH5{r;Z)=i>T< z%KC#l`a|aWFYWY`N1zZSzz+;W#tlT54a9Z~_%^~a*Q6+!$Wyoh2ot2n4bsXaC3*Nk zNBUs)&Y)f>n5+PZ11}2WUTEaP!?DotIIwu<1!F{982{pi0$_z4sw*3kPzJ;22KOKV zVaCvX(_w*ku<($i}b_|MBzr~RtB?~FW`g`2mqV+9HZ{=hmQa%%(1V>2D3!txEH@n2NIFv zo0(E+Y=}5}Jlqr5Re<1-qg$SATm1ne5?ioI3hZQyUX&8qWlJbZiJMKxj7mz!Psqhf z%63jD?UPj8olu#VP&S*?$dXWxpVTpv(C(bnT@~NAJGsAHT%Tw5@}PsbVf;(oF7PV* zrTOklyy6tmY|6@O$|iowwtUJw3xaZl+3ij_Do&p?o4!hyDQtv==1qHaPJ3oa7sbJJ zSfH;N$KQ){E}j!q&I#`1gv@g;?Q+P9Ght>k5ndc006442xzafkH$QW2cZQm-8J)0`c#z!5f11JZ!oZZ)pw0|1t$eoh;!O0#7o^Tvh65+&zqf`BGb2F( z6946SJ~Ij@V+{&N!rgIj!8J%K@>RPCH+gk7w)}Oe*{dWRN0t3L0|^$JaWar|A-ixm z0Q#AMLQI(dMR353Gj)+OV>Ul+#-S~|PT+OErti$YDW7GTaV$xYOa^F%0R$O<4~ApA z0E92{XRg6@7$BN4qk-fgaqxiAxeO#+Zw;cnXExIjA%g)BIC$|W#Fk`>z`sS@S`f;f zMN{B17})#ynT6fK#m;w$X0Jj4kizB@qQEoBd`RS+KYNZs251cM*a9Sz0@q-HaTvgd z&4<8&Gyw2-fG(Lus(*-tMlETLDcd6vup2_NDB;eZuz%& z6}MKd?EB(>5u&Bb5hU{^A?K1Qa6vlQ_y#6J2AnY*4gB(i632uB_3H#qllg?mbIA*H za>x}Q+{((gZ)5Q*W6dim<=?N0tokX!Wftbn;elilza07X73OM``G+fPzR^+ePC2aY zB51O;$3P0}2X*1c=Ggbkic9IHOIqlef4UqR<<(o>zc-sA zfWq1b!%I*a0BITp7gJ|Lfp`B+__5Ldv>*{DS98rZ0Sv5I@jJ$1C4cPK@tn_tZ`Lm~ zt4@njFb?>0*$liye(jg_)%W>4%@Hxw#JR}(SO2tgq4E=dYj#_pyG~#Bb6nHZz`YX1?9b=55l^TQ_){=ru@Q!d7v`R;k!lUHl7K z_A~>%ecNLHU!~2OgzZYRO-kHG-P`Tv=QH&@sYc#*>)F2{ihqym|9$lQZ-?0Wuo`rp#{_xJatJ|_HIdH(rxh1A!#|JE(ue9w{kabn49?M+}7XhH{RB1kioh}z)b zvEoDlX}k0ua6+0YC?xT!(st20Q`S%hZU9&9$%2VntD*Q=s`=V3&Hl5KAMK0v1Nu8E zRX#YB8Owgel#r2t<)JO4BW;k#zNyrVdvYJB>{T{FiEPttYsc!8=Z#o(Qni`2Fo!X< zGn^Io`-YNoDphQHU*hHY?orxcFwrUk;qfu%hvrFZ>Ng3sh^RWE+DU|tT)w0DB-J~O z+tHqsYGoZIt?bcIBz`8V(9mOEuBiERZj$;s6(5E5;I;(xIP*;CIuNK5pf9+-2>Vu@ z`Na)MCef@#Z83n+0>A2QF@$IwxNVgp2mws@t2_WG2uU-ce};8<2qhyE8p>*dPWaeZ zVhvIk%EToQa2alGqI`GhU~{y}Q!zCn6abC^$$%9Ap`^p$pf7DjO1`=Mea-g1w)sr} z(3Pw*!V#XE0wk(pyF|9pd+fU4;m>uJ$-n`AyZ68trp~D`@7&KHN4UX${%~0-C#zIw z6u_{_+r;}*m5~DQ#A*WyMa=RT4x*~&Jva={5nUmQYXi1w;t)E%N(ksxUA{+v*M%a% zD%3h(KbEw}RK^4eivw~n_z~;kH5P^k>sMAIpgxVTj+hAJ-N7*Hhy;^dM&%#Y#UnTyK6C}Ia>FoV!T7hzx0FCpZ7 zlPfk+b)tt-zfdXtsPrT)8-+Muq^c~T%RYFY+mMs3UfxvKys{Vv;z6w5ycb#>x zS6rTQ*6Yax{;s`t^$2dNzH;~STge#)EYp-Upji5`#jPyd=I+5m<_fmH=FS0DDHu`D zg=M}+Qw*UN=lr0oW%D(XCr|BBReQFgmS1veWGz(ZLSl2>cwnMwD+Q=&%PPv%GXhx9 zWULYJnXk^x_?fqQh7{#!6ExzG4M6S*s&ZJC)n%9|Nw`!>W+bf`w5#ka@9RvAeR5aU z=>x@p;|MfsigvmOPEs33Em=SI-EYi*%z%?g9RdvzLc$UOmx^FxgCu(s45gC` z2k{{3*jECS_h?dvzgAsM9B!Kwi(yv3@oEwUz$6vtL#B*IrcEjtFC*mxk;5b+g=jrK zQeD&|gb|D!Xs7r{Glg$OLj=lo*nC27O#H>t5c@g11^tvNdVB#G2+Z217=OmspM;)JsXB~Z07RLrOOb2TJK7i{ zFSZzv@uBOL7hC|&r0`XdDY{iS@{9d)aBraJ3jjdj4660|0tKdp$E@Wlt7069)^Px! zP&}OrP=;`CE`psNc!bamerO#fV+jTVQu)HxD>qmUT+aiQm(wLJ zry%=FlLBod9-z!W5cHDjU=|gHj}q0oE9F}>&F9@66PF#6%iLjB0=H?V$69YoOneIb zumO3h-C(HxdE&6wmm85fRiVa@k2~Bu)!iVhCVH^xvsHL-KGnM#K^Q&nB)Q-DjxQYP z;|N%sUvT1k=3H;`vefFU6{cI0;$7V%t__gozIxZ)C(r*;xnz6Zc4T3K`3E3N%~OLjV(B+Aw;w{}iKtZ4#MsiW z2aM5@pr+WSn-MRX1X*`%2J@U5Z<0+_ZEwl`mv_~-!nVHk)p0z+bCi#$m#Iu6Tdt$h z2S47CQNCm&_+FOeDOP zTuoB~S*9lhEDwH;syL$D4Xf@LM2_6KLj{YC$DDda;dqLI0`MH}e&Q;Upmd-ZVJ73A z#6R|aSm+_GOnrF#8vi63x-)Pgm97pMtZUfu4tTz^o15^0fB#+|-cftLXN6ojOMWPz za{MeQxdxa}w79e@WJeMZkdYI^f<7;oHFqIBMV` z5r;SJ3e0hpSM_F~5Lw&{!#y)+ar^F_3-ze9dEz$I{QDji%p}PeqaJ34@ew3T#m!W| zR36yxZ#|qk0h6WPu^5y-x)+00r3rq0^0yq;+NZalQ6*@zyRwy%0@Rz&ML(-CY{?Zg zsqYw17d-ui+PZo%^rrk|9dd;V_Z{zlCU8G*o^}66(-q!Wb9vQ1ii@>O4rZg-11o-p zt{hD{u(uUlP3)7N`{*&cVN&#$gEtNTmJCm47O9Nj4*c87iRJX%`qTc&%yQxNS@@d4 zbG^my2^H41XNB(^1+Rr_{H!TChXIt=0f3lRY1sXn&XitH9M)19l}1E~Ve#WiA#?gh zQ_5nzNjtf7%Hk@Vvh2CRE{b$G&DzvgqG80UB#IDm@GUqN?p+vZexNiqS&glp1xj|T z0w=Wdpjdp+cTpdRx%3zm<9G<<_AX)~20_La6s#*1uRT_cA5{I~bkc1~h5`s-CmoJ- ze=I1?Q{PwQYw!7uThOhPxVwC9#p>;R1Z{dv>o~NMO>36X{MkxVY0Z+=zHB9q^16;6 zkVK?qw?54%(Oi2w#m;nND7Vef=C6#8rM;d$Y}yxmJSO&3n?_sRdC+1*a&h+S5jFI#G?gw0 zDvEkgEQorz=evKxeZKQBZ?k5vnKf(8>^(*%h8pS~Pk=_yPvC!M0{|odh=)MnFc>48 zo`sPimXR@)i7AqqiG!7eo9zOEosG)D!OO)V$ipqb%PWjRW}#4G{3uBwelH>ZP$3~1 zVZnS+QF$?8MU1Gb6sAN@PD@_8R9^lf7OSHuTc)IhSC%(WQ#8=f$kEa=yQo@y@uH=U zrqyN5n#-5%^e)xu>Dd_=I2v4bHp07^>RmH4YceUY3gfb;%#jmc-7p_&d%S? z?yjAkqoZS&lht)+=Llz;uxr;kTwP<_?K|DwV+js1o}LMwP7l1j6Me6x5Z%)P2uXo~ zeL+DP!Cu#|U(X5k%?~Va2?X3vf?c3EPQX@Gk zDJf|*Dd}!%%v@UBeQJDLdU{vJt;vjxo-A^IZqmbol)}Qo{-UDCMU=UsqJiS#x3gxeyL-2DVj zMv~y1($}UtYsb>qL`^G=yXqz~c$5RSrn~B=a?pC|{3Z_?W(p*2+pf(#Xq+p-dd*gv zbT=(jXheJ%kDktXb_bWlC}7&tvQ%$eAniKaBY#S^wvCDPVeId#=CZ)f3X@>*stL@>RSfFr<7WIyFa* zbWbIOd9ZT>O?b=t176ea)2HqWP45;~B;Wv>tpN`(kpD!Tr@d7B;R7Em>-_!BI!y(? zXQZ#RPkIt^H97$&rL0h|6lYvW@g2MD8#$r-Kv2arsW|%^ZfC{jTs^LS?AqaEM?K4} z7a8Q<$n@rIuh@vGr{ruN^ezz2MmM22LgOdV033+dyVxiYO0wEwkqPQ_=OCY=pTk3V zI*riwk~IK8q01*V&WaYMJPt0gk{dMJ|9>gXO!&YixiM8VABj>{MJbn<39-<=d>+FDHGW3`G-g6MqP2=qK(64q@F z*-fJZLgt;`Rk;BGKG*O#}`WG3NjGdxKEF3Ws^puN=S=c zDPYq8ESPr#{52UI(+~%Nleap7;BIl)G)x_#4juEg*qa=D|D!9U`zzhZc2B92bvw^x zFfQ%F)(9Nn4Gmdchr%?_y%3|)=jC_Fp_%q2%;uj+e99Vry%h@#%u>w9u>5f-zQWER zgtSTn0FfHafE#{|ARNEH>3Kq1zHg6jSif6+(1COMQzpG;BL35NcHEOPzQyNifzE;% zXXsHUfU?wMSQQ26?TnH^G?;*x8abz4fUKF0O}qrzCu4CQ>yY1}BTiU!P;lK~SywGD zni6cExdPfXc+IytzgsjIV7i!y`c?zCXwm&$2Bw!?tr6L+TN&3~N_YNN$Fm^m0QY*99s8~RSE1zL zCCGAq`L~9krDlWI)aBx#Z}rmm;AZZoE9I$$^=b>PSK^XZs?NSO`%|S1d>KVON2gUj z^{`r%1n|~g@orK-wt`B&k%JJ(=C_7NU^YE<2;QPr!khQkzy45FHYC|KkAcxzxrvve z_dr3mwv)QtFNR)Bv~qa(3qE+C8d}S3F!5khL;%)xW8-^g;7FjpqgEO>4*`4+e>Ze~ zO1N(#I3!B1-Iq>u`7G}n428S$Sd5P%k5^(dAXFTix(qK2skKz4NSIjcf_csp@_I3bS4M(5z5q}M>*t=by+j_K!J|J{GU5-%UoJz%HSChx+>rVXU> zb3tn8%8Am$v`l9<0QGH~f6ix$-lH|8wC0Tn@S5(e^^1YS#Z(vY=sCShkxYyHnMFr_UGS$>uq+V)E+q%LG5NK; z(mhP1l!dk2*le5eD^@x1U?pmym>kT8gS2V%1|PWS9M#hd9)(n;3aBMdm3w5~7f?C|7%lpT zxMM#;zl|kp!#~3S;wwHDHlri(mfQr!n6hH?)Vd7h?RQ@0t8qf;&tJl8j z@&T8X{j-ws`$yjZ9)e3HkF+EojBmn?DtDA7L0GVf;z(PBV#BonwrhL#I`WukvE1X&@JDayrGYQ7si|`n=-ycn;%Z&aMQl@_Xv2dOksW~*rvr_s(=O2EPGB^2? zOtbFNTR)#S_kRzp{fG!(31}4%{(|3CKWf%_P9G3S_6uisY@@#wYz@osM1Z2@>Q{o| z8WraEFPV}gZt@E{tKOvVYyQ8i!Wy^Uz1tY1!}~sxZvzP zZnfTv!_;` z+EnnQYpJF;5N(@?wrL=EuoXn!fd2j=A`SHQbaydngVRX) z&_o$pAjT&nD9lUY0bnp0GY5)&dT9QsD?nk!! z+nvxu&x=HJzX*>@@)90?nY|MZ#pHrvxx#Tkru%pt-)qQmqNdDYwxPXvR2YO4j%20r z%@}7(`)2!&*oV+LkQd_(3$hGg3GJT1eUU5*hr9v-23e7n!O^F_!#EX+Oef}Xn@9xS zAk~49=-ga%VhiQY^Usb`hU zGD8aTaQ4k}<}lWhjUkhdFM-DLJ^c})QW0b;h>K5v&Ok9`G$g>fJwE)I?9|IkefIk42?96W*EHgO>3;m*ScB&Whu39wKin3_l5H7O(GFS&SP zFlB-qHxhI|KNNK(B8DAHjEEL{-^t|MR5@Q%V5tRm*<8L45q9jlBrMppR~^Bg9lCet z&?Hrdhe95p`}oG~xY3Dx3cfw9rBEYwy$j6N>Sf34%bD(e_NJJln7&KWLdB_!+nLB2 zn@%gM78|lHj;TYVDy7qHq&DgVzt>>{ER_O~cPTcVYe*Mt9hSRpaueIeLWoFU7O9TQz=_u%w%FN*dw)F4=GDc!VEB)SYUfLs zhd*mW$+?Xa5@9qkDqT65RzvPgd3{)CRvy7Aop*gg4dKMUqLKfBvn9tS-%kvTipYyN z7Y5gH$d>gX5^w+o3}+SdGSwR%fwl^V*dZlaLk;?|^%0B!c zHELp2jVsPL@0Tjyk0e*9!S!_udCbwt#4mamLe=vq>8s9BoLZGj&yzd8Ra#=Pwg6njmY)xIU~~QJQm?qAFg`Gvw|uQ5zwwrTvhO zZKzR}sX^J9M^&qDf1uTO)7qz^Pu=Hk5MNEysg0YJYUz^oZ3(3M5CV^ebx(H^A0pqi zB9aFAe&|!e_cDU=z{6pgc6@#Ddkub|M#US5rFDT7hKuIR^fc3Rm=a@rI~wq2*o5P zxrszo?_D}kTcw0hrAU04K~3`Y{zm~zj}ArCv(1nLAMWO?6m?<(r{|!BMcxDzRmqi> zIQ8p(&k?5;i0z9dyPHq`&UCE}m2gexFTwv}R)#W)qp#W9+~WtgO#e22?4qAP{mNzclbAzA~*JB{SgBHBkL#&l0qieH%4=xnDJGwYz!FfbOp;IGG)kl5TUFwdV=kmFNusy{WNL8?@98b?R3!Yo#G$Lu3dF`NU=6X*-B96dH*e zo_PtIa}dt#E}XDIOy$eU$4FqMkgt9_E46_*Pg`G?coUr#rZkCUQ!;BvNyEY#xC+$K8GPfz--DPWRUe0d)Mrp!)^6o6^X) zC}d&lGv!AJ)vA*38?I6V4ze0__Zcdtb@gcx`jx*r7*CSOofVOb753&&P3|Ggawu-(@mzfrfn z-u5Z7J=jLG4RMh%bn;pQCbi*pU*FmvJJ;d{KaVx1^3A4&hwrZCe!m2ISZ9*ynR7~f zR-Yth%F*mYZXQD{{r&TdDIt%U4Ybn*MxF!m09!sw6$apFEt4j)YcB}|%Q4g3$#ziv z*0w2#GQcsoeB{IKy8L9eh}p`!1rI9{7MzG!a^4=hx2h($IywTdY25}@4{}G| z-?p_tCwTr^San(e8oTJFXaeklNZ_{~{wm5eX_~Wm&o>ys94al)JQTt5K!gb^ow3^y zjQBhQxOCD>3L;ZKK`v*!`g?b#u>B>mc3=8W8gpA3>sjxSV()0eexNWI_8VE6)qN#< zhhb+!xBtyG`2d@L-+VrJ<9RE>+wJXr?H81&{t)5l$muBoZd5S7A^d)Q+CY23%lUx& zh$?k~C7x>u_sO+41=HhWTa9A;&Ohs10t4+3F$ zQoPMH@a~D6MxBRn3TG+kw20T3^yu@ZADI+JE{Lt(2xZqMVYMaZV~93tw-`!Wt5c?@ zs;{#r_RL*XW7fke=^4fA>4YaK@|3GcMyLcGvRH?D)=dAOQT^84)r{}#9U)EDk){!Zn5fK_6!KMd# zfd|E3)?yC9WDUyA`-s$YjcBT%{k@NfT;mgu?6;t!i7eYn`u2_C7zI$ib>rw$O=Kk=@r^BM! zUqv4+q{hv-&P}F45F6aYKgFaHb;IvO zDQkSQ#bF+CLE!ZFA4OrWqc0gp*wQGZI`Def7vd?aMd zo*?u-vI1(!dg_N`Dd*$5Rw~zX$ugPB6&ClN4>Ba{7yMJN^=qZ$dxF?;RpBHx>{t&o ziM2`5L5Fb}bxmq^MS$2;?V*g3Uf>aW9dI6qkh+^J2Nl24;JEbKAd^?(3dm|^-zZnu zAo~xTkUp6aLHky=W|Ub$B{_nX^k9qnTF?_3b77j#vkLNC%1qLOI$nCbvWQ*4>U-OI zev>PWjLTwpET$*q&8(`()lSKW0SSus9yLfytNR+fFFtMJZ08`DTFXic{NsLgWU zZ4~yys<6?+rgK+5@sDfb4l7M#{jZC+`&{;)y87R6q}+6cO2CP_)_eDBvzO@{ zF}gQrzrAKbEj8Yhz4Ab7QVz)lSVe;X0Apm{fCau!x+}w0C#^$mGRaNjCqYANPajGq z6-=XnrjKALFbT;YYnm(qXVe90>GR+vfMK>p6|k-Hq6mv&Cqr%pN;Z)USclWn->Q`Y zdQ^n*>#=2B=HT&qa{x!?h1+yNI?n(SGqnxaO{J=|uuXwxWGux5y~5#avdoJi#+?AD zCjBjDtp=zD$FR>zHebDG2BE>nHF*RyTHzuivuJptZz+(=t~M|;r?k{=ZZzLkDfu7& zjR~bCSNHL%0JNhCUi|ypixjMPk56>M4K3<<4ec1zxuvQgCYHjWXSvQ=66k-t% ze7e8)bp?H#0Wo~DPzMjUx>JEYR_T9K+ITDy4aSi5Oqo8ONw~zt589Y*EFlNihOGhUQ=Bh&7Y-<%rFx7}&k927wPWH{;=qs_MX`^O$SF+0>Nu^ViSrYfNxEWToW%_^2f zRsCv1n5EySx;Yl#L4hmMic_z)#y-z+ zV^DWm+wkFY@Sp4 z75yEr4?;F?l#5-^5dq-g;kA`mGAIIoG6Pm5<^lg9pe5u=NM|C;@khhY%h$Rnq=sKcX1Gf`v93GJg3Y=R^@KPz9FF98s;gi{= zX~Ub0hrw%%6e#@3B>u9N7jBGDqt4o#Yn;8DozK6F79ye9uAMk@BlLT}Qt_ZGaNhdE zMG#EH8>)kTaN!Erlaq4pC}$)YcGG&8%-X>N$Q27_`k3!`41%WQ*A-KLoh2)1XA2vc zKtLh{a3XQnH8OPc$2c?T($y;>;GS@_3Ql9pI!i*7u*~MRO3!6I-qY#|`gGsVS7kG1 zA(%BnXj0ZManb3bVxMw#PK{sU@%mg|0vp8p9Z-FGc!Lp(z|Rx9EgyQoc9{4IJ_Knc z)?^3Z@gR4=8Uh1wP^Oa(1APlN8_R>$>f)+4r(m#yrSoJbYjV4TQLgiKts(P6s|XT2 z_3XwjW?s~opTqH!`nor4%!`)wVLq53;qhYeZ3eHEFO01dB|P2;?^CY{=Bu9Ai~-cq z;}#(iG8bQ+bHwZnLD+*2AFPP+;m9HWp=8{*J&-!>Y6|mmDi@5p$C`G^%)HB%J#BgA zNv`Z`A@=m+%CQQ>6pZ=FIl(aUqg187`27-k`*d6BU%%p4e+c*|%Fmzt+uZY{Z1~Qtzn^a3{`2$kSzhq1fB&A}2KXQU zUBR9PviwqR`YD4e)S!8q;^_3X$6d50V{vO4xaSo(rZ7&=R@s3T(B=bpx(hcwqqPgIsxUoSN?VP}))kIdj>GfY1w8rsfh~Z7mC)kq)TU2S@ph*0)Q~@lfcnP`ZaugG|=)#D-*|$n}@VCP$XLTfmyiJpP8%i z>9Sj+-HN0hrwTMsCWi(d&0M%rNYMsJ8l^Lt10Z04glYjV=&_f~!xfXKJ0sJXtj45( z%E_2Y9piFa2=thw{4-LL~Q8-lk zKR`77hVcK?%#lPYGxPOt?c0@4gsP@E#c5t1N$(rRgbi>{bY&&8mhZIyAY(x4k&WbE zb9yD2;SV+ny>}tU4aid)CApQJWtj)BtIl&xn^YdPi4(;ch_-D3Bo}F@WS&LEbviKdH^4&ke{v#qghP*yeoN|G|` zZPjBT=SWI`7LzQuTW_I~a@H`QT(a#Wsep87?%GN~?DJAx3H^!x_$wg!4CA8OdWpN$ z{=MYMsH;Sn zfJ2zHL&O3m(&A;Hv%`%j%*_M`uXKkPaZKzzhaGZ*l{Cl_C2mS{i1QZH53nI^=V6J^ zWDCa>SI5*~$K>bBiFBl-D97{kduwUpYl(jgvFK#ML&uyVa7M2qh0c-s1_Dq(e8x_E zR*AXy*77D^=FNw$ZZSJp2OK`G!?)v1TYxBK`g$W4W(G|~=eBX7ew`$#>l*CVSLgC13 zs@p4#d<)y6`|xPjXZM^gg#vUW5;JLIIXJoB$AKE`RQ(r%r);IT?nDN=y?f;LLDk{E zJ51=%?VrDH$1Lt&KDhw{N!z^$vVfSphI?4q+EMWOM*)YUgjcy)?x9ugXHia>KJF)> zul_VT{{CeD=kKdj7DBK90bITF_l>*s-p-c<0vzLh;W+7IXKZ3Uw;<3xC9u3D zq^a%(8W7m*cj$f)_Sbef)I7Kl?A-Dm>`nF@usxn^d*GCeo%Rse@eus%A@p<)C2tS! i+{I}%B6K{(u6T;Od1695C2o02W_wD>uaW@Z;{O3foJ(H- diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_52.gif b/docs/epy/uml_class_diagram_for_oauth2cl_52.gif deleted file mode 100644 index 98f00ba8c8e85bebe2548c1a5b50bbf42287586a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12173 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 H6wv=au-*T& diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_53.gif b/docs/epy/uml_class_diagram_for_oauth2cl_53.gif deleted file mode 100644 index af4d9270baaed176ffecf2707d4eb519b285268e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2583 zcmV+y3h4DmNk%v~VMPH$0M!5h000081_liZ3K0$t77-B~7Z)EH86zAVDwH8nUmI7K)(OFcbLKtNSRMOa5iTuVz~Pful1QdLz|X;oEiSy^&iTz6q% zdt+mSYin41ejE#;eiL*o~Yrf(R3SlK^0YGY9}WNDJ`*M~ef@DgcZTKmv&n1{yHqkU^ozlj01TLx-}Z zOB@msU}RIIyCsVQ^8m zOg+q4+*J!2m^~Qb6$gT_I7logTahQT1SN2|5Ky2(2^!6e;-C=#AdLeea4aA&qDBe< zg~`=u%==nmEsJ{#&vtc10UR{|)Tn%!nP$#Ad*T4i>_!O*c+sg2F%t&|kqh)jpm3u+ z0usa1Kl_~}xcc|duHqoTf`mxsm`7~Z>3MqS-OZ2_n`#-bL;^+&pl8_t1vFT|J@BQ+ z9v1FJ7@>R^WY7S5%!P*kg9iI`CLMJHV8#psk*U^KGZ<8qATtf^|Izs~ss6De34mP+@DKs>=uxX@+IZ6ejq@L75Eu*IDDnh1Cf$FQY)@p04 zQaBKRgS__Y>#x8DE9|hu7HjOW$R?}ovdlK??6b-aP!1QmLTl}{*k-Hkw%m5>t*_D^ zWb3%(){1KsvzDv>?z+RB3q`u@#w+hr?mhwUy!hq|>$Hlor0>4~?<;P=1Q(o6y-rm7 z?ZONeuA!K0n)sb0u+r2kzJ(q$JFRl69=s_1pwO`Jc*^#0kL3!HabylH39`#oi#TIeCjn4U_4zG9* zxPbt~rh)-5kQuUTh6oNgfazdnEX=@P21QfD0PzbrXtM@&WD)}#KmaHm07~Mpfy1&a zV>x^32RtYslE?vIa#zH`1NQVHDdK>NGXj7FZm_(tbbvfKfI!sbVgfq>AT}5f$!&6@ z9BC;3AT|~dz@9kpmoqL!jb#A<24WxsF_Mu0CVB>ITmzfw9H59toW^WwGe_OkQ2|e) zfdKR&0SL&z1qZm>B3IK$A{r4WI+4I%a9{xn;J^g1jHUiQG`m0!(lVHNP9=47IRG$@ z8M`wA*oL^LS7IcI(b7Vw#{k&-wT50=5w>D!%%xKYE5nERn1-DZ}Va5SWAQYnDK(FX@OLQx8*v_sM0~Ub)3=B2E zUiKF1v1_%Ahd>0}W(XHeV#Dl8xUpHfBGUy)(#8kW`NgPt=PwLEqXx2SR2C!>2d^d6 zUKE^F=Gs;O^q9c`kO&m4YL$6f;*ytk^58EH06iGcBQr3J0}Z26O%`@8Go(Z%D^1tD z(!f%P1M8&|Fwc@}x!mQ_-$Qr-Gf0P_^p5MuS1yww(6O}`!!4hJ4iH+_8o0s%+J z3LgA!Ar!9SAWv1tbMWzyn;c9dzrX@c!19*6{N*r@xy)xy^P1cI<~Yx}&Ueo9p8Ndg zKo5G(HPCA;cwjC_PrA~V&h(}`{pnDTy40sm^{QL_>R8XZ*0;_y^{X2o5?~Lz*vC%x tvYY+vXivM^*Ut8~yZ!BOkGtIGPWQUo{qA_ryWaQC_rCl6?|=vb06Tf2ZTkQK diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_54.gif b/docs/epy/uml_class_diagram_for_oauth2cl_54.gif deleted file mode 100644 index f5391127e7658b2e01f15efc0fbc4dc150b8ac9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9609 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 BWcvUB diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_55.gif b/docs/epy/uml_class_diagram_for_oauth2cl_55.gif deleted file mode 100644 index c501be4c6a1a8ead30535da15a21e8d86edb5ae1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34447 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 bF^gKp#V>*}jA9%k8Oyl6fB*nHy&CP` diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_56.gif b/docs/epy/uml_class_diagram_for_oauth2cl_56.gif deleted file mode 100644 index ef910d825e90a8e92b1521c3da127ff89e492275..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29028 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 z 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 diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_57.gif b/docs/epy/uml_class_diagram_for_oauth2cl_57.gif deleted file mode 100644 index 3395029d75399efe40aa5e77510bc35cb5acf600..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24501 zcmeFYvX_XQI5$P5w z5m7(f-{1W|+|TZLFi);?ojGS_t}`>Q>ouC%8nQC>zd#P)U%>x~2mq)7fCT_N0suDv z2nPTR06>X|NT9@FFc>)rES8iMPC-sbO?i)+Dh3WufWsMS;VcXctPFJQ2>MheCN5?K z9~(1{jZKi9)tiIkJ{Nli7gsDd2M-UAI4`FZKaZqH@g0MiYh{yvmF(ok}w1lve zghaliq`I`2tgNiMtgNnrRI!4BzLK1wvYY`5WvZfBuBvLLu5PKWY^{k-(N@vX(Rr++ zYNM-LrK{_pukp-4+sRPd(a6Z%RL{)J%+<`S!OYCk($dSy%HP`9&&H4~+Z`RTPBt+vPvYF{-nhBNcz6_ecqDl`#Cv&pdwb)(y?uOq(tMn7 zzRul#eyITg*@12uK|$HipXWdK8VU984+|>}_sxItqBO#
upGB7GCYB)N&GA5=z z_IYzcczt5xOkzY^Qp8wtaz{#JYg$?tF6vEYW^ZOpR#w(jR#ty@eD|wYLph1xT1)R{ zXOBO9I$c{^Utd4__U&SO`{&Wo?bX$ES~?U3r4g{1Xe}FwqvF&l)M_h#m&739wl>jLF`kB0O=Q+?ubj-}GpVk z`gj__$20i0?QtBZZn0i>`|fnEg!}qT_v@!X1T@LXWjXC|q1L3~@%x@P$Ddmrri&l; zc7FeY_di}wL0lbtgX&(gDlvUbrjnmoRKnJD`tD36bX6}@gi`X34&jl$(WzHIHthf0 z5$Q*io}C^1+mH)?mp}mT5K#;Mr-42EDZDyh@Df3WMWU}thrlmRg47@nY&Ic)(b@h+ z@OHN5`g2Nn%?PZf$$8x4VrXv+Ty2}n4lrF1Yd~u6myUXo+xV_h)0^^Dcv0)zFvUn5 zNvkH;bo*LENs&~;uJQm5AojkQD`O&0-XvzB2U<~7M<4(IN1Vjxrx|F-Rk<4BsYbwD z2R``(b~n`OIC!l+0aq<0ILq4`&SuEJewJp}e&|#z+JhM^ zcf%ZvmqKX~d%1EH78NPwo4JRce#nhMGT~y4VX|tLnmq`+Uuh*HoBZ8j9K`gNeTX(9 z+{L=K;*}essru_t91XCB8KyB) zLG@0IE>wWaSybbU{4sGyb>u86iZ}OgoV@mx0wjDC@#oO1z)wE6=5948hLoK7x|+Fq z4upWdxgCnhP(~WM(FfjA6U6ou2l)(dJ`G9GUQ7Zxm&o2yQ zJ=EU|LL_I^-HhByU$bcf$e}NAA0byaJIy)iHD5}mS~k(#yKZ2FUI-H$<*<;jO08NC za)h!s{u_Y+rG~qZkQVdG4D85PBovQ0B0^j@Y09mIh7|?6JPNkPAGW`Vw}vV=cEz=q z+WL&Tk_&iR<{K-%t*UIkyHWj7FV`l6pv)a|$Ws}pTTQ67jpQKga&PqaKPtiq%+x%u z89M?dhWcDz{~7x2Dsd&M+O#HPBY)iKS`=z&JMuCARdshdCX;Si0TPSGqax>j33Psf z0W_BoVy|DZE}J42ebzd`oKROp9iL#`WA{@(5V%DyEul8VYeL4@%QEII(B#tH-= zsA?(rVP>`{3;{6PPNF4{pgU@JuWRByvUra;rXcdmJ;QnzxkkC!b~wN{3t3>c2hrmP z^P5p|L_+D1_baL!_ew!0Z`pMolYw#;`9RWR4gN!`1xR|-#9r=sd>bPNb?;L(y=oq( z+H;E9$B?N7(MIW-tW-Xus5p3;6Q#ECLxE=tItF8ufd$OEyq=TOk8d*q^Jl8egMLpx zMO@}?!m35vGKjl2zvs;+S4-Atzjw2~%wL|VmhPH-?-hDkutByj3BtuaORUP<(yNjG zJozE0=d$R`kyq}$_P{6h%i^1v{lf#;-MyzrmnFcb8u8z9bT5gnN}=C(Q7{Bu6wg%| zmDE=i#@npsPh#Z^?+*rebmpoJ`B2rHG%r#0a~V&wDp+huVghE{iQ5({MPKmgnB-?& zc8~+|5F<9AG&&kIp>vJR$l@U4VqX!n`Otf~`gF=Pax0_S+={s|a^zQp znV@}DG~ z3z~g%%LOxzkq1Y8fsHOPDaQYlbo}c6gg0q&0Bp{O4Ln{3>@0Js)3O1+Z{}%8Ib})1 zmaKc4#7@}$@ON!5nM0MIP-@=p@&h~@quRKFEVKeIuka5F@e+8WKPw@LEo zW|-kaYb>436YxhzazC=Rcul=6c)`smpMG1S#mv^d-kW!#scp&5dJZ%#LnC^>y)nUL zGoWqR){WgZ9Np12n}hU(s{RGFf`?}@j~%zv!}ajTAQGdeCjku|9*viMwvO43o@_R{M&He zxW?|mFW2D+$!G>Mmx*SvT}9`tMMfDkE+8gVbZ@y(WT6jsDa?*rkZN*B`Mdm@;(guji<%bgxVc{&G4^ybKqyN%0p|5eK#4l1#e z&?AI5#*^~prA{-Jk3uo%#lNU_wO3L&qmf9-Igsw_BZ1}}b&;@5LEZ3G3wP|S%7~gK zc)2X3x0n#&__N1~>n`ncU!jGWHoMo(kHn=Kh5meEQ>2+_7Px;LI1gyifC$fH2=X&u z+h~*QioIOupm5LU`HhBzSYv`ee2%GqWb0OK!$PtXgE`4p{Ge`**XJX^(lz=uBSxqe z^tL;yb;(_{_HI6$HHqCcvbfgFvHUWQ4PH1nJ@v-i=##Do=j2gZ_&L9aC|M$?99Jai zkj&FBSp&$hn|mw{R_jm3s_1fI^^Bw@I40Ko9|i}bn*i(@c}*p&SS(YVY2NZ8-|i_LyBD)K)c0HF7ozmT%H z9sOKr9ee0-SFDZVE@>b-FcA5~aI(<$UGq-S!R`|oYfE%j6XxoUHQoLkIRAu6`T1Hi ztl3O^vm8y&(DOt|$E2!}(O;i%V9L=R-1@6!hyIkPpy#Xhr?mG=Ru%Mt~GrIq3Z zVRx~DU#N}WT%ehKj06XHZ2_?EaC!v&2`zv2+A2vaWg)2@;$9EuDfNHg($BAGgyoUEFYp zM-#j6r8bul!2%GJt$g+AX&Xjq-;9(R?Jb{wPW@Ar`oP!qYL3Bj#HH&zr1m_mbB+P1 zGjM4&J($2LZsNwHiC#)G^PzCzX2~pv=?-y@MoSrMRT+YZ8R9DrqOd1Ia+$JslWc9~ znGB!|x!;*v>8Xm{a3xrlMmIu1E{o16OLHabLq(R%CV2+VBo1cTYM3Qlv+98Hg{0ke$k#iWoc;>@6&*t{)eU_4AJ~WZ4ks^Zw1n zxXp|4Lu48AjV%zTtN?`b64BiWaWER%c^?BTx56it5Fc#pKCwk<0?Rg-ZTsW<-A^jJ30r|+@UQ6QQSS-1%v$j z{mz=#n;|vS&vn2=AwD3!4Gv2`0(FLnlF9pu+Y&w&@~f_h2dy$+yK&zR9SK6h0@W;q zanJS{2@mtIHDyHCbHKJHw^Av@s1%})639@s#=R3=_tU^}%9WeQy_A#IElnW2)zyAp zT8YL~+hfR%N~^XY)FipfCNFi`vE&#*Hy@C&C{X|sBr%Ijdn1}T@4FmDyt;rf0GB#c zDBV9QkA+pRo<|$G5J~ljYyAZB@u9SX_f=}d=v(9dX=*>*_j7nBs$&>UR;%*7JVrUI z$l*13*{BK@SEXhpTT<)NCM8Wyf)1&K2py?ce*&_&ye9AP$H`icBHTODBPR0iG zRrzZ-Dm^*l9(L6pf%>=duinTv`b{>xb7LJ(Y}Bu7oKA!e95pHuHBHMmEh6letQ(i} zn{MAUy=* zl`=PW^Q1D0l%(mznx@=@Ft5BpRCCu=-)3~Q-IKM-uw}U;h<L860*Yhgv=2yd^N2QS;_C zAc!(D%(@DH$_x6Qh;YiX>?Q7X0>Z1e2zYhmBhF;4c8Q-60u5Y!Jcw|6`L}jDFAlFqx==hyEmixFGrA)=m zUK)Rh%^!G`w|||RE|>RBFJB=nzu%l6r%v2tg(Utp@j)@`;hzp8g*RpmqLvMBMyv`S z9}C+xAXp$#v>PlGv%osKH`rY`!lzIi>bw8DK=Pm<{Gv0cL4@F#cdRw?<8GpWzd~3St}EW*>bg=AHfIG_PdjrciTU@iw7?={s02l+8e3xjbve zAv5~cVL$M*EIhA>RllbRmA;T62g(25^v_UnIW`)^>yKXg^$CG>8V_Z&h?ag)Q?JlvF zuJkSNjiZfdOT}S}!@btmbIu`7%6IwN?CMON9!!)42y(l39rmpl^G!&E>lAa_+Qqx# z*pU1^sb}0wUY-j>jR+Hc=EwR>O8Q~@_H(05!lDYElhtGDUjTiam<-ikK&pVhzO6)< zzb4MsYloYfrlb2V&P2IE=nWCj<#dpC<=ME|ZYyqD!~R-wS~@!Q!_^wEV!;7E{1Fsm zD->6U(~mh_0?w{KG`4yF3qq_U=Zy+-%b&?4XLz`k^PO}9t9yqR9)cY!5wDU^( znw`TOewr9|P$ICn70|%$M@=u}l+<~RuA9T2;J4;{r|b9K4a+Pj|x2XTH3V+za7p}!1*X_hXfx!~r#iQa7+%FN3 z)ot=0UufYktumhB3uNRR&p{-ifWkU#S)Se3lKilck&AWB z!Jx`8--=%GABs;>yj{tEgn1hLEw~nwjk+yH{B%}vg7lgd?Zk?o75RVq;rC*t=6a-8 zLP$W(jFL1t5c&dkT(te$t%2wBW9ypT-$z5swe9`C#47x@ZijQn zBC)sI)6$J>E!4o1sAeyeH-$%g1tU=JxrDl{8#mb?uhOziy^c@pKrl@raJ zdNb$4y~zNJSkK+D^w*2Z0eWuA4AY;@u+g90oP+E*!Kt@iIyxgRZ^SarC5YJT=*>H8zR?`|eO`K=PoaQplY zlUqRp5B(i<4Y3m6&B~SHUGuje0+XvM$FbV>T${^hFkNYB`CWRI+<#);+=^@)CTjGS z#jR|F;HJ0$Nep_^Wj(J)>GD^^{PlLZ7iZ{bXN3McGE} z@o2?LF%@N6T0bq0BuQf}qL&`HRL1a&5kkI-fK6qDm??aaDX1r-f~|9BLPw5v_0Ze-&5 z)7-}DMYj3lu%ACaGkU%cw0z3+mCn*J(@fgjJ}K~eMPAi5$l9%;sKd(T^`{`TYg1D| zvY1N%$0&03siq4bmJuEWW)HZt^x6_f z!k4b{iDPq_XDH=E)@X%MZ<|~+zzbP}c4v3UzQd3Uar#m_i+c{tZaPR3dMg^%-#jQ+ zE~5Sycftoxc{Nd@vi5M3>h2y6 z%}^ZEGgh>~G#BVN7A_Uoox!Qx^h71iN5gxV*MOOSf_h`07@nKS2hPG8hGpT(1)>)G;e7i+gXtHjY-W}b^GIM)n8n{BPfDA*^pJi1usG8bE~A`;{7XiTGP2L+KL$Kob4>qm*!lkC5gi*pYvaHBOcQ|8$DZnZt@X815)APrc#}&&dDO z!Q*oStM>RTS#s+V3x?w=ncz4h7U&F1;vLEK!62O5ge_dDh9@Z!8V`YB zsCDPXhr3f9gx9u~2Ji5s62Dz-KSRFuUf+y`6&>XEWHQKUm4Yeau}M-idHpJZ55CWd z_$Eg&?=qyw34QQM`!7@sGX7g@tZ;VJj;p*W+NBm!FgF@|VL-DhC#E^!o{AT5Yr^x* z-orvid&I>a2ukY3n;T~`rc@AZ+N&#U=~Sj+I&!D17X8cp>t+I~$KOL|Uy6I=GB;J4 zHMmlGR%RW1a4ax+v--SZ?@eKbBXM@%33Tf#4MLBn-afd|!fh5F8TRjl!&h%*p}OYo<^P%RUPDpRE%fVyu^_Q%55>Fk_{&O=wUAz}J7I@VP1aEpPms|bs`WQ!>@m-opa zs)UwB(Z!nIE22(&$@N)qu8>oDV1bZ>wQ>L4=J=`hynxw$(LxnP1Uo9>!j2)DuvSdo7%eUyc_jAjoSh{PBe`7^~+ zvaB0eJy61~qn|*SjPh!f$3U|ok9xCn$Y&7~_GzFfHx7Tv_ZJ zL_*5VaK2#_l_iD>3R2$0M<1~G=|Izr)d!eHKe_Tp=JM{Zz~vi9WP4SQHyVUjR2#vp zKm9-`Q=YEXL{dy0VkiDb8}~=cBG!b)XBRN~+>~*+=GZDuS7_KycieksjC-x$D_|T^ zmr#*E+>8gl;A<*pDMEK}7;BX#9WoMBGV+Y(h0XBr7L?*3;~joXcUmA7ubHO>+^HLl zZ8&HsFRJEHH5-XXxi*dkod_pw3?mJNat7I&EaPKCpbhaui3jh564UPLp|7|S6 zeIS{xtpz77tfJakGo{%(Epe#kLHCw*(Y#@7I%8?7peeMXu<~d*e(RQk{(@DxTclhx z@%K~VII`+*?PNa?!j*~@!c>id+8W6-LMbyN&H*qo|2AB}fZZdp+IgnUmH12#3=Mu@ zOEz^!OL%sJa$Z#F)k<0!R8R8JIQ_yKl%&MaUw-)PwDr;Sz)qtClir_=)@Xb?D@IS* zGV-TkUajNI5ZOe1M?AxEBIiUc=?x;skn-AxascwWb&;IYL4y8x29bomi(2Szbf1pM z9D#NB2$o4&5>P#KNFNoI4;)Q@_$PJ4G<~$T>W7Oy>83<#tv+H-U!|?1%vv%PDXV%6 z-HE2^E;Ni2AA;;5EFr+p41BJyH}SP!Y}gv{Y_`2 z5|lbO68d`Y{`*2v*99WZYy_Y=TP6{*?oE?hM*ZwE^l5=BQfndi&& z{Xjv17Lg$UyRlFhH!6OD{NJO3%c%MxxyZi!1;L-@GxNry8(94w@+6jr36_}NwtN(A z)txq3*}LIhD=y_T4y7sbN;<9_W3<#xg=AvN${CMr24}@?fjKQ-GzKjly&5T5CN`Dt zbhSD(i;)IHSmodSu&lEEyOPVG`r5d$cT(jTr-E!uD6lroXL+OWvvO*XFJ;v#5nJ8$ z+#+6nK3{8%%Zkit3+fCW3r5tx;;3~qR>!`t`OgyLlL#JR`P3B1IxSV}LGq>P#%7s^xnI~skjk}zvak`a!$;~WTso|J zxtne3!f1m3RRZhTgQS9$4VLNwy7=6XmYdZH;lqUJ zSxm5c3!xcFwO#Y~&Bw&gRp!8BT;~%@^01BJwUycUrrc)IX5k-bG8pR$RyO_!sZB-H zaxkm`8&OJPnO;o%mTNfGY`4Lx3x)m%TcAp8-uYIds8a{+%OPl;i{{^WuKL{_Bb{S&9UqK0^r}4Y5*@d=3Aq{t6>(XwI6gsBmm02@^vQAo{_F)Z5k!!7$1D+v4XP=K3y#7yoz*pC z%mpk9Kv0;B$F8ruTyr8^bCjGDi(SL{qak?LylU5?^~0xgQ3Xl>V#BqJ^~mFSWQh`> zf^@5T>}Jj$UEqW%D27xQyVVC}$>Cl9cSKj~)_m&5X%q>u15}aN0t$i_CHD>DXJsYz1t~Ce9%=*l%SS1vU}aVpEZd>76XMQakU=z3!mVxqY7fNp}npmq8{T) z?jlH!)_4r06*Jy{Qr`(QHp5z#Fok0tv!{-uN^bK?m@x{^#iheH!rv=mj~6366IlsT zMcqE`L6`eI^LdUTgPwQmAHElydTvBGf2Hu+I^Ee6_S&gl+1B^k`)_X7%j;loc0bkY z$ZPtr+3SR&|M-K~>0a0OQ?IjoT|X$iFCse6g}tv{y}s1K-_AsKMP}GlwNKZl>=f>_R0HH@la#HQ0jG|cMeHnj5mV`oBpdi}PHwH=P zNCpNvXJ2~abN@>pb~$$TA9PE;k(wD8kr*767cQMN`4EpSH?&bPg0R@}3`|^<;jky& z;43O25+sQ240M-_73s^n5K#6D=ky~K^OG*2V`)`fI^WF|JkP&OAevzAX{TLefhiJV z0?UBhd@RB0WrD|^?7p;&0hR2N0Lwg(ZDzT(8n6TbKGGym1w|1->1{m=2TYpo^%WS% zd}`)zXecyueP9cNVG9YVDcG;d+?vfFLXAbtV>S@%f8$H3>lv%#+O)TkzlpD82x7&w*; zt8@U7LV@a*uf0B29&KCXK8$Cog=VR9_-h6|CB{(x`eo7$raxn}e?fJhAX0$2iVcOi z75#GO>sZfem_}$xAFpZsC_gfdZ}q<>*rIJ@{Z|qa2G%MVh;=0@AsCVLWJFSjREeq-BCU7Ta{#6FS5{NLXiHnxD9{6H{xNQuMe_eO zwz5{QT9aUqjY^3-Vt>c*B#Kde?gTib+=YzbQObPtYK3*f5#*4hv`v=LD<8_OK7$CGYOzM zBwAUF49V5e&?BgQ;^JoZfjaSoU`Ns>b&xzU0~={`6WJb98YLZk(2+q@X!s-7f-~dY z+%G$s5X_$T)>z43oyfo7^zcm?+Rb!e)`e5<>;-HPFcEmad6brD**21uP<@z6g)fjk zZDqqzi4{9!PE_&yxtt3?w0FP$BJ%O1OZ{}5LQ=TYu3%?F`9D?m2(VbhACav5Ur)F} zP`L;qxDbB-AsP#&5qHG5va7{WGqHNy_&h}`28sHe9Gr7b;5alhcA!K+d6s}hyT_q1 zHz3OGJm2Vg$@8I5KKSC~@RE17l*g!F$c?sIuS_RL-1F#)f3eoMhDY)F)sZe>-R1ZF z=%?Uv>(lX!`|j65s~v8i+dYr3@2}zg_UD`2e+e%234%%wHh+n13}T6Cggx$VM7Ks0 z=_R~QZp3ybGI&jzJ${St&E(&eBkN_n_3FztGle~GC65-(m810YZ>3I_+npDr-{$}P zH2Ws_^7Q*3nX~$0U#3qie`POrrgAR(9`@DxW;PR_{x5T<($d{3Z+vNDFOt=Yt`0Kn28AUF=`|YI` z9jzLK+|+Ii7qgc>oJnh-RCLU6qSSR!0d=rRgP!&-uGEOX^p z;Th3cGK}?e{_4Ej$Y;@@RbmXAlPrpgXyyLK7)rD8H-H9`#i&?Hh1o%|1c8%Z0NRR0 zj1m&ST#13c4@n*kwZlimEg^-X{4FlBFp<(Wubnu80k=C$3)?NlXv+X@tTu{VrY}tN zgWRuIXZ~Z|c95#lDe8QL<1Koq6%ns%2z_;n+aX)}O+8vkirg6|e9u#PoX!X?6`vNS z`SN2xtjCDGS-#%CabcRQg(yfakO&n_rtV-W-mC7~C@EBtI))e|J zJwoA>vgcpts|)pA@YzsrX{^2-RiVPg9?EW}M-SF*B83@i8Si8~Z zvf9?7@{*P#Bx;SkW7;sfj!TDBJ6n>^MG~^q4&9<#Wfz`P15bD2sDuEJ??n{F|H#Y~ z$Q_Jxm{~r6lzr*?jF5bi2{1?UV`Tv{Q%-hpHHwO^%_T~M%a*uo8zE1=qd#1}m|8w4 zKQq1WgHXFbup_m`X@F zd>?#6l0vJItz&v`2M1AA%?TCNQC3971GvX0UUl#Jcj2h!gjH1SUL48Q@x%LAOSW}_ zN(k#_2yo``zxksne#RdO$72>lTLGD(ot%eE6APXEh5~{9BF#oN5QcpoIYm1Vd=NmJ z0~n&wcr1OcDLoYu1ds{pWC+G<5??@ozv7SBMJ*tfox~&e0bj@q{wNX>nI$o<0@iM* zRylIm!Y`SpQcK_Uur%`*x4E5&d0LZ<-G(8f-6n9`x;bD1`nK)VNvA zBAAL*!aVR$C78}q<>+jCv+16ozZ1vsK~xLC4N?vUM0-X~Q>uB)p-}N`%=($^%y*!HjiDwg0)fgFp_kF3e(JiYM8LBk(+*? zABO|u)3r$CFX&XvQ~ylTFZY9t;>i!AvQk?s9H_Zc7@js4hKHGN==*80U!rR0eW~MGJxu+EA>wXdFy2TGx3F z)~6UHJLUJ`k~44ize_N+5{46v2x{*5`7QW)ooy%?~`Z5LWiQ<*L~trwQ%Ms~J+Q+_wC$aAaQ&0}psO!oLHaay zmj85`R)=?i$ks`M@{LI|D3?vVXU@Lc-ka11oufbPMm>@h!#JkA zpsXH8J(-M5cl8se6CIv@rW@Q+s_(}pGg9*pydc+Kn0-}UUxK}Z78H0-n`Qbx6Priv z^?v(pg0aaT3Vp~K}Mj^TbG(*@Hmt6?>k~+ zK7Nz4!9iBqFPwI`1R9^zbbdTQARID}a?{ULIw(ZS{LuRB4!$aIVfl)!OZy*)UXmxV z6HS%}iiI-4nV@fxBv^y5x+bNjv9`SQ&`8Sg*(fR`DiqZXoX^g#{K;@cApap?}=(R{QkXim3QY81DRRxtW=dp2=Kl7wca4jdql@{`4YG1mV8pjM$ z+t8|AO{6XB#3yUTdT7Nt5`z$SfDX#|(~@V*y<|OtGwRXt84H+^UF@P3bTp&vZ(`2q zBmqzMpM(S=mv?jwPk3FaVfRsmvk8d+X3+&27ZT6<+`{{?#BtL^#f2J=EdAd{T1xy~ z!T^4iP&!{vFPN*B`6QY{05!N!~`@ zmTBF+NYyipkFnDt1q1z+NKKz_;onQLV$97q%h)C&FFkc8`SsT6MzN9X05YCg62s<7 zaji~3;+S2mXI|n%?`yBuCrLoF0xK@HV0xibU=t~>4oedP&I?CT7!+h#UllrqqDpiw z(#{V^$hC=_YuyTt*Au{!gj7wX29(pFM+vVmEXzYoiuzk+9PF{M;@rqN29u9cWFpcI z#V3>8ZY5hya2cI>YBEw1OU?BS-PGvGl#QoBitC7H7C!25n@Cb2BE2%xJB|{JeMmMd zI()jaBQDS-bsi5RS)MI<0HejS=3Fu73NdiXZwZyd{O0b-TF23rS<*!sab$30l}?~T zVYwbg=VBECPS*6vJ6f*_SQ9x|uk5Ecw54JlxwH*#sMR=lIC6h-_N#HI%}xn4qgI(M z*qVkVHf#(&)|U_D_=E43SvkB(az~d#0@A>AK3quy~TXN(VV9ZZyLJR%#hV zRz0Z`RvwS=>d1b8Gl4FPf$+OEWNFCdslESl8~TPk%pkZo>SJEdlo< zV7=L8rH*E^s?6qprjk{mDPCo=MG9N2_B>kCX5DQLSb}XN*z{LHP>=OAcwFFW-_}S; zU~KPxzhNZ8tN0HGS`CifYkxaIJ&dOcKGOF1=wj0LzJ96xQ{oad7li=J*|cwIjHFlkMq}G>|NVEf18NF8A78m z-Z1$co_JJC zFHCwapC>v;&PvS#SzOPL{+kg(O#r*$MM=#t8EZNeZ)GA~$XFk?5)4HNlyZ`%H(+gzvdcE zMPs4I??G=(aBEtpR*6g#<3$NHMTE4~o^ynfceylLgCcY(1s(jV0V!;ib1le+C4?Mv zJLSRe-QSweln;>%H6AP7rj~>*RZ=x3o6dC6PR%;TQIL;9B*{is-3Q|ZW3@1PgGeJH zJ>zWWq_1l8PDNM!7EnOvokuQTaHPBhA+`l_L`eK0(x@x`qBXitJ2iZ!E? zq`#1$*rO2dRy&7ldEYn=-E;g|8Z%40a=0W+hZ*{0@@zL z^oIKvt5i}u{R~j*Mu7JE$$Q_C6YmVxh=hbz$! zrEJj~rkz9jDr%xyd<6wpyc&E3kbMFoe=BfA?V&qZq6L~g>~F#%#`d}8|XtshQ6mgQgYO-x#VZ+8sw zp~~TS6P@AJS8A5Xk7I={wIKK-_bjId#x5~azE-C3Hp9U-=Fh$cvu!N88+Yh0N_SzmU?b15<{W` zLnJOI4*LD~@ZleB_P>*_78P0leUC@B``w;pi$-uTZEE`1SJoFj6^Ye`+IS*BrG3*>rJGO>5B0&y4e)j4c>PjPk?Z9zHqUR$}w62H!}Em`-t4xL_h?|HK> zz^Bg!|C0C*lhjxGCt)JR-xzD$R4E!*E-#TdIw9DHJ}VJF^SOO}12uo~*d-5KhZ5yq zOXYogL-OomHWT-`4n>nCTAP~DuB~b8AL|l3x2*YPDl@U;`i!o`$t{maF#o^0^5%{L zFse2P)P0tSprTYWnG)1aX^zb#x4p`SUDYO%A$;nZpmRLt4Th9b>@pu^w8?vQR(t)L z`ZDg1JFQc(etiEJMW76*#NU73jaD^kda#0fm4d6>)sC`y_(20+{;%Uj(a*>QLEX_LCI&)PGj(n`lA{>Z}5dsun(V~ zW@%f1pp4_oGv+>>i6z` zKe_+X&iHG)EafJc3qv3j8N}lmf@ST;crkV@Gx37Vd3|EsPx6`R)-E5~JG(ST^`L&|=lVZ0*VlHL=Men9K z1UyY$Arsm~^Kz>Rp*6io#xR%*J7wrX+0#giaW5 zxVV(+0jiH*3xX$tS;mF$<(5X(=+mfar&$KA%b|rLa}T?{{Ja0dYZyIYtY#0)*LQbV zc(oA`hrMxy2$kfd_gK7?e`poDWLsDLn*0gBkUb=8x`*0EFu|r_&gpe3*TYArwu2&N z=#mqUiteTY%yB{M&&m#=F&jA(qQItoiYGB%^(@|bw;-oqBGUwavL0qtKxSa54`43B zpP?4t6YmyVUBWiouRDU54sHJg_{)QQTaPM5HUD;Mji!=1`)Cw0d0+k+{PO43<#R*H zbNug7|C~{>8=2u?%6?7U=*O{ef3;Tze-HX(#+eGnUxw$!^i5bWOy=}?7b#B3ys}&Q z^@`eHaYb#6cl13$V9@yazt^7a1N6ZPgeT}a^N!!3)R;kqG%v!s$c4vvf`Q7e zEdZXl_SILC(t}F@tK)E?%&*zur-VtZMC%DkxhKwZD8j9ydkI_4ebQ&W5)s6e-~AN$ zq(>hCVCwX&y#E(|@RT3aIbs^V7QM9MV?CcgKAt>YPfI73wTc|*z_v_5#Dt@yo0y2v z(vL}fQ;B=%15n-POX*L6Sf>i59zp1!5PrCTZHMWk7`5liP6Fiq;*Y-F_r7A6>&eQ& z&}fka;ENIfCaz2S@@HD6JHH0){z@7qt__Ru%FF65Km<=S&nDEi%lr2Sfd`Af1I47j zD?~y(J+wuc!2^UJfqpK$8F&z3LWK(%Hgxz9Vnm4(DOR+25o1P;8##9L_)#Dj0EkGI zGc~PWFp+ilw+!-X}k)KPMHg)ca$S5b{{UOnbK|fc1s5y%nb!ycQHE%9@ zT4InMQ)Lgd0ox&nDSo6pXnA3EaN)sQyC&J$p^h0-l?%ipVWMt7L0kw7;$wJr?T(8Z z_uB(NgB};~_@Q$FzyhR4005wwFvO7y%g?7rDv$#J2|p_MIZ|C900gQ}y@610000vF zYcHlCbPz}l4H^JIDf7@P&=1|5XfFgmmLV)TOqnl6Cui1!5aBS$}WR02Q}obY2t6qfXZgO=z(07n>ilP(At1_Hp1 z5xxA9tr9nz3xp+{Yq5(41`6T?CYPh}K|j)5vrR4qLeW1VZ&{zNsaSy_BSR(^Pmfm`Evh=XIe!!p)KW1nVTK_Ka zQ>q65NsTn%fsL$C1L(kbKt&ja1VCUYm73wcAeJi_KP3cOK(q@2rC4Ejx3m}Klt03k zFTZ*X0ss}eKtKWj-c(}&gApoKPMU2N$PEW1$Qe2)^p#J0G0kZSVwmSQRT43u88HhkW zu`|C4xzt^MeX-U1!VUJ?Z6{ILWlw7T_TGI@OLn4o|DE{arwSf1+KpeHdH<)77i#$C zrJug0=Ot5qpd&=Hh;+rehiLEVuy5)<>TkE6*@iT@0-_5VN2me3@p|KJm?j#MgcIg= zihgx#dASOXN8UK+I_^<^2Yi$6S zmjsr?fg9Zb0cO%z9{^AtIW(YR3i;t9fj9#NL2F570KjK1z`oIdzz^$coJjnz!#Z}z zf};VVE&bCWS=ul_0=WRXL>Ynv{*socT-7QG;>s()5}5+xe{z$;9vkFNWpSqAc_ zd4aG(T7;WZ57wW)NWmB8E z(;YVlGOJpF(3N0l)glq-2j2|Dg*q_U6oB(dBKZMC(o_`;zW;~DGd{&K1xq5xI1eu}DA)l@Fa ziPFn$^Ejs|&#uZ?#6bMm+xFrahr)F^MgtS;4$Qu%1SJdGZ z5p%(qb(Uj5%sC8Vevp`sTJi((_`wJ2lmh_JB>`8)U;#2(fX5`O+@c;tRUsIb4-%Uy zL{0ZID*(^~VCjSu`9TdWGDBjy_^lx+fdc}W?|{_gUjG%vw>++8Yd#0!U--7jydGkv zdIiE>KNuLm`>n5FlLkxQS`N5#Y1-4G=GTxEEk6=Kno;UU4RDm${q?xprdX`zydCy0}KCaXs#?H2PhD!3V`TC90dTABZcGz zxYD)Y+Up{js-G*@5dc39@{o&sWG^du%1su?ldbdO3s)|~xY^%DwtNuz)dUYU99L5v za%Viuc_13N?4R$J9EjXGU3_kcp8+k*?Y)_AaYoA<7NKdJ#-(WG0Y? zvr1PQTnYl_2siQwK9`c}jyy}$ktX#@qZeyiH~&x4x7KwZbG>U{Pp{X%7Pj$%J#1t5 zuGk0(&0xkb)`o;H2&eW5tB-xYS?i8>JgZCpE_lB|>Q5@}i{<~St-)(AE87UG3tjc* zZGuR9Cp9I=qstAuV6QL%959G^q7&nIr#XtTj$h29 zKqvq~J7Uq{bPQ`57jQ=K4l#jiO!yMt_{5LOQR5MskWx@6#68yA+NI{;K%($~Tjf_e zlGM?X1j(Z%&7hP4&!;i{74!h5l9{diC^Q!^OKE~_wsalRG=150V1|_-&fXHyqj~gY zt`($Rhmw@^DDP{++;+VNLHPux8+KYpLI2(aFF(h@1N0t7{kRJ33Bn2AS z-k?Xp|6QV3zv_)I3iyo*gzp4Jd`2^LsDsG+q-eMIxxI6m2Apmny3y%Ccq$N=+DcnU z1=VX)pVYMSx$kWy$Xg{4*RJYzG!%fbTxSnf0gLj2v`4GKVDC!VfAy@p>eb%ljdjhZ zROWyb=Cf|38^kJBL3_nRU-gOE8(VfDh??ynYs;hCj<&R5OD6iw&)RY>9{8|z|M+=S z{?!UZw0m7w0_Dxy=LeAUOyo3z-~#$(24+JyrmMQxXSk+gImAmK$m_KNYP`zphR`dd z)~mhVE5hijY3yr}B05JBgYnC$Lfr%LQBVZ49vvrGlY!DjI7I&4D!;<$-qVe5-6as zunNCS@iaxtme60$>67wo7T+JiUKo4Dl6*mIbPSJ0YjTUdwOKcGrcTqcZkr$VO2FTzSp(4ZD z!x)bd8Iw^NmysEp(HWl+8vmnF8mEyOtI-;-5gU(j01m(ave6sA5gfx&9LJFy%P|!Z zVHl<20M^k8((x(I5gy}F9_NuB>rv+XU>y&D2kem_`_Ui&5g-FnAP15l3v#7sARiB) z5Dbzb8`2>k5+Wl~A}2C33Lzm6Ko2NVBR7&GJJKUR5+qGR57vysA2iB1gT+$|Q5+`#~C;c%H)^Q*4@c`yvCx?+E41oa- zpahUoDyNbvt5PFJ-~brF5J-Xu))5e_5-h_~EXNWa0bw1Jpd^5@49Jo#+tMxHG9}7j z9htHuBH#cz050=VFaP&aDl=d%4+18ak}n67Fbgv!f$|~~(hCfeF&on{9TG7Ua~;?6 zF)PzDFOwb*LIwU(ATZN2KNB=dtt$^8G)vPoPm?T06E#*XIE(WphtoKdQ#nBrIhWHppEDwx6FR4pIt5ZXs}no3 za~`i#JG;|6SBg8oQ#_3_3xvQt&l5e^ zXLKVh^g^?fCBOgyfJ8T;ofIa2cl6A;!_bKR1bnw2SQt75T9&SKh(PWGS(TMp!RA@-L|VgYRk8C(0YFK6 z00UxW4~pgr`h)6X$?B3R0YYE~_H_m%z)>6QT1Axtf}jujKn+lUzFwtpflSwxWt;M;_J>B32+Kw&*PO!2lp* z(KTJEb6u6x2UcJKzDXc9q?Q06QAJAW65yVclmP$LrUDjNjR*l2AOz-S40s3I$;fumQUdQ8G6nI2Fb`)^|TQA%YjY1R z77W0^fl%Z@T;NR0a8*38zhKaCqjXmv6>S?gAshg-f&fHFusnFi4IaROAP~9|i+R80 zES#4rdUtVuS0U(kO~8g^EGAfhhJQJ#0=qYuzV|uT)fg#YZ{$D%D!>6yq&k*N&HvaC z40rc^0oHS~6?ESKJ)SHCAjryGN!uhK;Epf}DVP8^w^I#xAQ*R4SGa|p7J|0sO=h@; zo3K0rSZ^&jIfq9HcLmTC5hwP55~Y|S01+yv7!oN0iwTU0my<%P?RCExIK%kZ#+ZzG zGdxa(joa9b-x!YLSdQnIj_cTt?--Bs7>@xU57O8;*I17OS&#>rkPF$654mRg*pG?R zjExPA7uhx&dDtEql4Vnpg^iLc88$EZ*D_g?S#x;yCVT{A52!7C7sHc388wGzViY5X zsO7r=Bb8OzG+DW>1ml$#F_!;gmT5UO{UTNyU{=d%Ncv5N{Gjw!q(78ul>ZL`S(iiP zw8cQ41mJYlh>%Dj(BJ}`CVW6Zbww!Q5X4YEHE=hjQ=oUf)&SC)$2?hG#Jc>r0uYj3UR_vn0 zJgB5zx#FGS88bV>XR%H|-flV+WPa!wdil13qJJt5)d@Wo`~nqv?{PW799nG+FIgKt@j>O3w#$APRKA31;954#!#| zg>Y-{rG3uyXa)6DH>nmv2|i^7J}>j&3p&!u27sEYg-`jyV{f<${{P$=sgt@j=c0D= zj+p&}zL-Qo)F4^MfDR;J1|k)EPWbt*R6v>kIUIM{Y;aSej}mo0pf zCtS%bbH#5B$e(;Hqukb}oXW$}%3}@7v)n4T93%SRyOe+u6XJVzSs~m&)zn}H_5eE^ zqszUVD#83B+`zg0g=ZOJf#6GY93p_()nBwuFydU!rIOAq!p<>b&jk%M6eP2qqiz&~ z&vk&T4-%PP#`W{;9@0n zcPKpig-{q{(kZ#q!Hvpx%Eau;lFtbOVFwo8Bcg%xTV>3ICDM36)q@&?djLJ|S`l1tw%zzW#A| z1jSU$L%_zoJIsdf-qBS>+;m;#;r=ZXBf^}W-g6dp|7VU^RXp_&xH- zlm8k8-~b9h`JaCpb^rLQay1}e9os-P4q^KB8ZoJ0`@er8p&%b40Q}4UA?-3BrQiJ5 zKQn#uEZHCa0Wt}^5-YVb{_npYo$>%i01=c@{Q&}zz<~q{8a#+Fp~8g>8#;UlF`~qY z6f0W1h%uwajT}3AjOgdU0XB#Ni6rtdrT@y6EL*yK2{We5nKT>n5E)3I3Xz6t`uqtr zsL-KAiyA#xNaTxwb42<%3N@B6H^zmA=@_3YfckKXP*y!gi8$D2Rz(2tPy?AyD44?n*A`R_LkFhgcW^Bob%bXkr_1=*VM_AIjK5 z4MQq<;)*U#sThoYNMM2(VXUygjbF6zM;l0__=FJ~a$o`yYMRici9?JjCX|10aHAh0 zh=9czFf>4F1Q2Ip;phZAINE58f4m7|pO1R@ z>4p;Up(6r)a_|JEjEWd)hkgJmXsmK&=m!9e`f-P%V1A+DA7U)9zy)mOm%utNhna)3YsPt+*_ur>I>0RRZ3afhv{ zP8)2U0Ho1?5fTt-#0}$?d#<Xcf)g(dDbQ*1E1A547<|q-PrO zs2^XL`Uk|1D(nXWRrt{c0Ao6=C;&EId9EK9@VLSbk8(iis5*+kEEau=Eb*hq@=%5^iT=-f_24f#~GavkHzR?peM z*kg-P_zq)&jkBWw@c+m`=9-IPM6Z7U0k^IjDyz8!hEgsnsjaeW0_L%E&NUqS`mizp zvBwSOACE_lyiv3+kSd2m_~1IrE10Qw=buaJY=_hTvAy0;aKNDmtuOk=8FTkt_@_D# z(JY5yOu#+$=yUA{pL~{o{-@+0pM3v8!T2jUJSq+Hx?C9M#s^bb?+-}mRp>YbE^i@F zfdCL-t;ScplC|McA~+cbfbgifN#IC#KtQf^WP(c_@J0y~8l*TNf*2uSgLbNd>x{=D z|LIUDR;mI5mi2%mMXyR6@}X(C8=XpeoYvsYO|c&JZC!J>CAPqbDHji zr#(q2&v`17nT0gus!~+QetK$Qo)V-w$EnYRB4U(xXaE9C;I%)10AqhhL+hPMT6Piths1g2Mv<5I8@8;HEabWKLu(iF)23=rRk^}N~++p#;&aqsiBW*zzM0Es11qW3y!oH#z;WD!d^_G z&ssrLn8S`%sZSAVS#n~s3K!+xm^h$B1}e3C^Xt)qStmSgvm*yO2HNn^(z#~7H z-~n3%!oFY|qY;;QU$*@Nc>kc=mT}+$Hwa`YE304~^7Bzm>>HzO{D&-!C{mIPl|UN_ zuOp{G~Ia)Pzo%X*f1%}UBL znjxoVHp|&WZhrIAa&Q4P>3Pq5?z5l&4Cp`$deDR}w4wJ5gEQM1lpk1@qaO|FNRmr> z(v+^Wr7w-?Olw-wi{2-L=M3s>D!S8sjB}_@J;_m%dWWV)HLB~p>Oi&H)uD!Utfw?< zTF=?mw{B6cb!3x$Yo*E-0rrw tzYXq8PaxamF1NYQjqY@-d)@4Ax4YjB?|935-t?}wz3+|hd~-7(06Vu_m3aUF diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_6.gif b/docs/epy/uml_class_diagram_for_oauth2cl_6.gif deleted file mode 100644 index 25736510a85769b4b7442c13238c86d8c2c1b502..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmeH``#%$U1INF!*~Zw`+_N#wWl2&bieqz~TSlAYmRlu+$t6_Aj3vb>nVc}1+cybW+VCMLDSsLmki4^FKVlJ)a-mzkXh?_viI-ado!Z7kUYt2CLvl*Z?5m zaAifsG(|-&3YDmY!lBVT3`Px$QQNXbQw5i&qN1avb!qEXeF8pAm$02kFd>nykVuAx zhGvEa=GzS{jE${Lck)e5ZFcXzzGn~Be3yfzg_V`nWh*OZYiqatdn;^g+-+^?cGg}L z3d7!}%E5u@d<%j+1O7UAv9WHK9=%qU-9KR>_N zBS#Yay;*^Qw}OJwjvh`92}uhNKNo(aB|JRySYU2c2q!waJtijaRCrum+=aNfi!4?l z>%{N>VNz0Ya`d&-)a$9S_tMkL&$3F-ovX|^EzZcO$jq$HN)~Zbt8;Q{dAz0zXGM8= z5A*U`^D~+Y3hrFxwigxMFXnae`Q7}yVLtx}|H8jYOCOfzcbAn7mKO|F6h0IPh6Pu~ ztEwJVS3jxYKd!5LR)1Y25O<&)a zzP{DL!HwbJ`H_*$v9X1Ti4Rj#uU@@cmP%I^7dO6s-Q3*#?=t_#|J;Dy8cYEI9x(aQ z^y3o%xd|`|cv`cdn}bv_4jgE%?9IiJ+-}fXsvcg{G>@7dXt~*6Ky=8%yS54kuaXam z0tZ{GAMwq?hiz*J(L&4~ze&4l93)EYR;n~RkzL|&TQu3= z*A}L{tSWM^KRqimqY6DI_v~iSf95bf`5i&SLzyq;hVf0o_YdyP)T8m_W9IN@X5Mt8 z8Vvy%J{EDX=ppc!{#cq)J+TiuYZ`es8_G0+PWj))&KY9|eV2XP@lvHNqAdP!y${z| z4OBH4lCP$ZUL=Gzh=R*-CNVhmw2C8=Hw)T86X=V(iygR7IeWo%kHG3>>jOF^o4*?O z+oMFxQj7PWk3n!2j=-XStV&5uLA^7@W$hfe*1*sw`Xf+gDQXFa_d>*4y&n%>VI|x( z3ugLRV!NRCJG%B(1HBUb$B2Wt? zvY2Q5X9~q~KqyvM!(g?jn(K3ZQii{iYjEIUu6Is+k##+($S3)^!DavCuVws**lWj1 zbW(|w%$WA~Z-0sJ+0I5p<_M49IP-S9QCZS?i{sbXmd}k`GT?58C7fVJUFFg8>tyGP zd$t->75J#u3y*mF*E{mV(yrC~VxL%BE_`c!qE73Q|AHvCJWo^=n6_zbPNqLjG;McuTxhzp?g#y8BoQ^U`?0&7lN;)kE%7EE_UmIT!gGYUb+`FBlBV zR(!pps@g&Ps22-d1*j+3#r={cccn&cG2u&VVs7U)-iE`y9p8ydx+*X+5O3G=p#T-U zG`lmAc-99mbz{+p(m#kTt`@uPB`kA@>1>PrB%nYzcvZpug}}TWCD&jR5rsiYLZFw z_l?RB(*34uvqihgb6qScHEVBgq%5t?3vx}@-wDz!po(l^)A~YV$I|*@bHC}vhu@x+ zr>TRI%UvJut}bo-C5C3*Sz;quz03VOAUxbjS*#QKY@Ln^rhb+EZOcgQDEzZEnd-6- z9RHZB+s(JTTT*Ao&Q$vFhzKKUQf4+3!K|Q511dZZkk+$iSzsTrLJdB~(V3OVA!NZA z^|AX~X(5nvDkUPkfq%&6H zEnpm~TsMlAYwlU7LLluXGS4=Ckt}R}6XZVqyArdnkSc#V_a}-Ck<;)(K(H`lLqgc- zGgvW_)eonXR6@@CQI&n!kk2z-8Dz#w`IvY1nrJq6Z(tehRV_r12H@uhGJ&c9sPAt< zC}YJ?XC%^)u?&d-*#uz5g^pnWsWVHCP3EZi#gl4JOOe@PS3Ol0hakSG8xqosB74E1 zC83xQfZV-6g?NAmTAn3+6LTSuovIW_91(&oyoJyZKnc@C7&wc8Ha~!>>VzOD@uA># zfEfBog3zLgF)|WIH$FGlDGDgj7~6E=60VL88^xcX8S2Jos&$^0*U5jq?GBP>1pvmD zri*a~n@Htmdj3v4n{Yg}XVMeG_Z_Q-xWuy)Rsdk)*|0E$``W@KIUD**XxQ%{?S(1l@b*>Z9) zGBI-JNnV$w=pfQEKYY;=$@@vv1f2)~nm+Rg&`gy>M5?H$A918KGK$TvQI)fe4ta#d zi|EbstAGjz@47LH*dE0jqw$v;7rB-}fX^seMza%i=7 zo>5cWb-kOWw?&6jqH=|4lMS&+4#CQcK9BzN)f~ubN*P%U-dKMoMz=TTdVUDg4tQo= mV(y$re}DYI#`B9ODUuq`k5K^|e@>0Iw|9)3ibBA^fqw&YiWj&5 diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_7.gif b/docs/epy/uml_class_diagram_for_oauth2cl_7.gif deleted file mode 100644 index 4d06ce354795bf702bdd84835c7e88d3e7fc0d20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5904 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 diff --git a/docs/epy/uml_class_diagram_for_oauth2cl_9.gif b/docs/epy/uml_class_diagram_for_oauth2cl_9.gif deleted file mode 100644 index afb2dcf62e58615163f74617b94e1e375aec46dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11087 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 G`u_(E8o-7C