From c8aa08c26e4ea1079ef3ab33289d8062e86b5bbe Mon Sep 17 00:00:00 2001 From: Bu Sun Kim <8822365+busunkim96@users.noreply.github.com> Date: Tue, 9 Nov 2021 09:44:50 -0700 Subject: [PATCH 01/17] chore: refresh user token (#915) --- system_tests/secrets.tar.enc | Bin 10323 -> 10323 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/system_tests/secrets.tar.enc b/system_tests/secrets.tar.enc index 5f20b1e4ccdcbe19f2cc6aff26157fee83079100..9dae4398fbf3723433b9e899fa53ffa21fc5c947 100644 GIT binary patch literal 10323 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 literal 10323 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 From 47d4da6323aac126ccf75fc9cc8cd70594953ad0 Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Tue, 9 Nov 2021 12:07:48 -0500 Subject: [PATCH 02/17] chore: drop 'setuptools' dependency (#913) Closes #595. --- setup.py | 1 - 1 file changed, 1 deletion(-) diff --git a/setup.py b/setup.py index 301e99643..44c512128 100644 --- a/setup.py +++ b/setup.py @@ -28,7 +28,6 @@ 'rsa>=3.1.4,<5; python_version >= "3.6"', # install enum34 to support 2.7. enum34 only works up to python version 3.3. 'enum34>=1.1.10; python_version < "3.4"', - "setuptools>=40.3.0", "six>=1.9.0", ) From 3a01950c6e4e78a2b8a59b9cb1230b29339209c0 Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Tue, 9 Nov 2021 12:28:20 -0500 Subject: [PATCH 03/17] chore: drop 'docgen' nox session (#914) No longer run by default, and leaves the environment fouled. Closes #636. --- noxfile.py | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/noxfile.py b/noxfile.py index efb367e83..8c22b7a77 100644 --- a/noxfile.py +++ b/noxfile.py @@ -115,23 +115,6 @@ def cover(session): session.run("coverage", "report", "--show-missing", "--fail-under=100") -@nox.session(python="3.7") -def docgen(session): - session.env["SPHINX_APIDOC_OPTIONS"] = "members,inherited-members,show-inheritance" - session.install("-r", "testing/requirements.txt") - session.install("sphinx") - session.install("-e", ".") - session.run("rm", "-r", "docs/reference") - session.run( - "sphinx-apidoc", - "--output-dir", - "docs/reference", - "--separate", - "--module-first", - "google", - ) - - @nox.session(python="3.8") def docs(session): """Build the docs for this library.""" From e756f08dc78616040ab8fbd7db20903137ccf0c7 Mon Sep 17 00:00:00 2001 From: Hao Xin Date: Wed, 10 Nov 2021 23:58:17 +0800 Subject: [PATCH 04/17] fix: fix the message format for metadata server exception (#916) ``` RefreshError: ("Failed to ... from the Google Compute Enginemetadata service. Status: 403 ...) ``` --- google/auth/compute_engine/_metadata.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/google/auth/compute_engine/_metadata.py b/google/auth/compute_engine/_metadata.py index 9db7bea92..d57c22a15 100644 --- a/google/auth/compute_engine/_metadata.py +++ b/google/auth/compute_engine/_metadata.py @@ -161,7 +161,7 @@ def get( retries += 1 else: raise exceptions.TransportError( - "Failed to retrieve {} from the Google Compute Engine" + "Failed to retrieve {} from the Google Compute Engine " "metadata service. Compute Engine Metadata server unavailable".format(url) ) @@ -172,7 +172,7 @@ def get( return json.loads(content) except ValueError as caught_exc: new_exc = exceptions.TransportError( - "Received invalid JSON from the Google Compute Engine" + "Received invalid JSON from the Google Compute Engine " "metadata service: {:.20}".format(content) ) six.raise_from(new_exc, caught_exc) @@ -180,7 +180,7 @@ def get( return content else: raise exceptions.TransportError( - "Failed to retrieve {} from the Google Compute Engine" + "Failed to retrieve {} from the Google Compute Engine " "metadata service. Status: {} Response:\n{}".format( url, response.status, response.data ), From 967be4f4e2a43ba7e240d7acb01b6b992d40e6ec Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Thu, 18 Nov 2021 10:10:18 -0500 Subject: [PATCH 05/17] docs: fix intersphinx link for 'requests-oauthlib' (#921) Closes #920. --- docs/conf.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index 58e5b9a99..652d808bd 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -363,7 +363,10 @@ "python": ("https://docs.python.org/3.5", None), "urllib3": ("https://urllib3.readthedocs.io/en/stable", None), "requests": ("https://requests.kennethreitz.org/en/master/", None), - "requests-oauthlib": ("https://requests-oauthlib.readthedocs.io/en/stable/", None), + "requests-oauthlib": ( + "https://requests-oauthlib.readthedocs.io/en/v1.3.0-docs/", + None, + ), } # Autodoc config From 3c3fbf40b07e090f2be7fac5b304dbf438b5cd6c Mon Sep 17 00:00:00 2001 From: Bu Sun Kim <8822365+busunkim96@users.noreply.github.com> Date: Thu, 18 Nov 2021 13:08:43 -0700 Subject: [PATCH 06/17] chore: update refresh token (#923) --- system_tests/secrets.tar.enc | Bin 10323 -> 10323 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/system_tests/secrets.tar.enc b/system_tests/secrets.tar.enc index 9dae4398fbf3723433b9e899fa53ffa21fc5c947..ebd9e696a1ceac2ef15016f1f038ea16d84fcdec 100644 GIT binary patch literal 10323 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 literal 10323 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 From a71cdf5d79b61d3bd0463330c3cfe5fc72e4fd0c Mon Sep 17 00:00:00 2001 From: Anthonios Partheniou Date: Tue, 28 Dec 2021 18:47:38 -0500 Subject: [PATCH 07/17] chore: update release_level in repo-metadata.json (#933) * chore: update .repo-metadata.json * remove api_shortname * revert --- .repo-metadata.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.repo-metadata.json b/.repo-metadata.json index 9d799aa38..f6a3d96a0 100644 --- a/.repo-metadata.json +++ b/.repo-metadata.json @@ -1,11 +1,11 @@ { - "name": "google-auth", - "name_pretty": "Google Auth Python Library", - "client_documentation": "https://googleapis.dev/python/google-auth/latest", - "issue_tracker": "https://github.com/googleapis/google-auth-library-python/issues", - "release_level": "ga", - "language": "python", - "library_type": "AUTH", - "repo": "googleapis/google-auth-library-python", - "distribution_name": "google-auth" + "name": "google-auth", + "name_pretty": "Google Auth Python Library", + "client_documentation": "https://googleapis.dev/python/google-auth/latest", + "issue_tracker": "https://github.com/googleapis/google-auth-library-python/issues", + "release_level": "stable", + "language": "python", + "library_type": "AUTH", + "repo": "googleapis/google-auth-library-python", + "distribution_name": "google-auth" } From dc6a4c15f259d6cff03dccfef2ae6958636c9d8e Mon Sep 17 00:00:00 2001 From: arithmetic1728 <58957152+arithmetic1728@users.noreply.github.com> Date: Thu, 6 Jan 2022 03:09:50 -0800 Subject: [PATCH 08/17] chore: update system test user creds (#938) --- system_tests/secrets.tar.enc | Bin 10323 -> 10324 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/system_tests/secrets.tar.enc b/system_tests/secrets.tar.enc index ebd9e696a1ceac2ef15016f1f038ea16d84fcdec..5df7af8cf8c9cb34326c284db0d98d431446f524 100644 GIT binary patch literal 10324 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 literal 10323 zcmV-ZD6H2CBmnkJRTCPl#NFKr40q`Sv3@|6Nq>RuZaE0LRP_ zjtR`1_t>%kVhCFoh;wPJO-VHtTQNCI^9KNJG!?l(bHbUO++9t~NT$4kd%J5to|TwW zyOyBDoc5IsG!(Jlay8U%p^B!jq}4%P0onOz+M2L zn^`8fQGK;Wj^~s}(*8+vp>cmWx5?Ag*91x`_~&lov}8OL1u7#6(jfIg-eXk0{LnVs z9Z|*>@A`~r4`IU33;X%rh>2@%u}U0~^uRr7x%ZdE2jx|^fLS1K<$LR6Th$5{_KJzhDk{QuwGO|n zLs5PR;O#(qLvD=u9008@PKk{6bzJ;$bqN>+7C<Plis!>|a8Yyl`WH_r@f>wfWu~ zUcx-hb5vld#hul5xU!^ly?|Kx*k&vcdzbv3V?M=t$3(?%z@#;#f1&~AeYKoYVJviG zwu7>Z$)xt#!XRKbQ$|-9A2(b3uL79gdl+FOrliq2STcQtfR&AlqXwu9-2bdI)tp-2Z*H>G z+Bb|SS1{B}`GYiZjH+i9s$VB^@K#R~06ZbMV3Xl(HqyN16FgAEG97r-es`L5KiiuC zvUi4rN&%yx`E7o7B$Hb8`HTDd)V@NPH)OEp~qL}Pp-5cNQdv;BqXX%5??a9&4>l~+F7Z$Y?`{3 zGH%ou@7E-YD3fMgzZwcK=B?%sn#Rq6B0BGm!<+~ZrzyFJy;l9OA<Kwn(YsIlNPC zU^~Xc+B4m)T2XtOKpGX%hr^L1|Cb6MK{Z`JQ2k_+0U^MEVrC56%*s6)@=&?0j@eq` z@CX^OAQ;(6-=2pq=ST{2D`j^efJn&4b^$wbDht|mHl7`|1bf5c22@RzO{z{}F&?H8 z!LLx!T1p>gI;eh@(;ax+vLc^!doYQbXApt;PBGI4`$*<9q zHfltQE@9TASesLL33!3`$W3b;58c7c5^`?iZvP9XNiuvl*n8^^21XB%f5nArn>0J@ zAvdo`tW;oMQZG7o2N7>VFDr%2NV7vtLqE`65~bUzt3mQFEa ziUz{o6IYC+W7T34So2<8;-4!c62C<=)~Dw3TRa&LmR?cp8)Ojhj+L$;;w90%37%= zTncDy?*$WG0h5sVuiP(oHp0Rnmt(5nEd;#|Au2PMm245bc$hxZuOlNH>H5uvt%sx# z6ZL{SDD#3PKTeEgI6%}Q^Dj)$2non}MmDL|+RZ;36scYe==%nf@MKs5+F3YS$qq;f zEb<6FuPytsCA!X*K+rtX30OBJn1zDYs_RF17=v0Bn68#3z12_1Qi%;hv4u!35V4{R zGr7J$3%z9h37oeAFtcI|5&s+5UQjQ5dWTI*=%7dzF}xE7yE(Zr4!4o+ffm22ut+Ui zJ@3j?A*QlY0=hj0vsAsybt(870~^B?IYcGbG(*p{-O*qf9WkfHyfTnRdKYmjjTpv* zQ=K03&Cv!-n_ZSF+C%r4Y5iDh9W0wor~iW{l56KgC|cvGKk`>|@7_ZiwiLkZ4E|j1 zeE&ciojWner=WFNh9am=_GpP3B)H6ZqLZQ$w8Y0*1wwWFVo-tJonMUniXFi zqltsat|N`9=!RHLG6D-X{0AgjN*S=yTr?a8AP8}3P6$ryH*hmKN1VZvH`Gi7+w|bH z08a}daCug0rkTUVA-5}dMOyFtg(SlppuJ(RE2Xope(~q~ zl=3qYwS8eN7SMeuQA8rCMC&r_4;A7i#M2guIQ%+2j={-! za~kOE$ud1gJxPRDadFP-j#P?ar#`4Sj=&*~Ub)r# z@f*l?#h?8r3r_7((RiSJlz+VK)VJ(=$r`tKSG@V4cRcJTT{D$))te2Q_e=z}Y-0lb z%4zvQ?ddZw24Lpsc3xoj(ochg#YQs}fz~Zm+Edyff46SVNmjX2Zro0!8Pao^?$><& zMH2%$a{uWlh>e6y1*2ByqJnUnd z5zlA7(5|$c73&3ep13&Y$r^rH{H<)R3a{kp2aG!t@}(sEkB5+DBE!&I-N*fx*wY4Z zE)>$nefp2it@HZ~PC2S~^1Af@$=RaBNx|gIRZZ=Ej6G2*0)1C`-wPm}{iyp8By2^L zFikFXMqo%%$z7a2Z`Xn;2EryFrS=30sPXjnl?valt1x^1 zh8%sc8fxDNJt=}ZbxtAs$7$q|9ZDW*lZW+Wc|BKjERW5i zE-W6E3hPYGVA1Vphy+ee1P$Pxide-m++#db5hR4C4e;FI`}eVW8NlpCF&;z8jLN`( zw%-uvnBYCmZ=!cg`+Iru)Ud8wzAep}oRyYUPnv1&1rmY0#1xg(MD#cK+#thDlGl|4 z%bQJgqOr*A-4h;HCH~UWSTmx36P#MzPRL;wO#gAV!@T)TSmeeE!l}&lfx3p$s63BV zJ%YhxvJhRxbfj=VL`U(U+a}BDuw0wYCc7L5uZBi}-G+hyEf~_EU;=d* znenWhuUJN99rX!I|B`Z&OA?~=f}f9l}{0kg#q#KOX(CpvtSOf(l00d z&5e?f1us2nYP7s_%wbt@ZGBPyMXN|e4KS4F z1-y2!Jn?@EIIIdB==xmXJUpJ4KOIGxP({s5GPZ7JsIsR%${)zTZU3cdLM~?61d2?9 zCb<4cK}X(VYHeDbAxDi6dkX#k;vT4m>2n$%GjuX1SGAXf>o1;2#aGo&fI4>Vd;Z#+ z>+%pi%Jf9PfwC@WIPuUEkn}T zcJ%PVK404`$3(%{=6FnHjh?Sfk^W0&(mKgiS9#XW1E&qcr8_yJ;}aS0=v9dN9xkf(qf#In=*w{ zZBw@7y{6u5{v&>*y=+m=6FECI8ya4p%C;>Bfujvr67B&@Xd<)0;Pw(p!H}WM={G2*p^u8f+?cYjb&`p9Z)mo*>GS9K|<+=XgCG6E)tK%eU6vZNm1-EihKADm^=Hm4WJ*e-*Y(V zO;L?laI9yef(G-2q>XMBX{0?upTNm|gjct4 zCV6erB-eW26Xl%I3m?_lE!-Az^Ee_B@zg)A73zhUQg@R*pIu~HYS9XDbQzc#i(n@# zGaelS6xqX{!u~Q}2T8$Rx-jy_zDL{(ULn}`{zL(F)`Tj z+%+KYdSPRxdwc0d&(FT(4`-Urf^V`I2-skRXz>Ei_uOfSgKeJu%^;r}fUAc`@6TMt zvyb2!Y1J}A72X)s;E0h>r2FfE_3|f7MPQf=z-_ z>u&^}aaSRpn3WN*Yeac|h1N&4O;ape<^a9(?_eSEcPnUbgZHHADJU)Wu%8MqhOAY2 z0Z8X9+pj{XE#TKyL0~Lgx`MdBm&LUgy;JpZ>Zx7Qj=}Or_b>#0saZ)IT)KQZ#LR8p zhxkQrU#-z?grtTSCZgvc)3Wpz^cQB}kMaokP7nd6lXi9fPQ;K=o3d|C0o_wasK_Njvb%AWeMM@yz?s^q z)0OFq@}felyR!Nsm9JeZnACB7^w&E1z62vKi5mLlZ(IOKl$Yna9bs%$(OV@3-mieO z`(Q@+O&+Qj9Rb?y#p_g3;J+_-hB^Atm{HqIv~8aI!zIdXft**>*BQ&R!g&Zh?i-1_ zGn=YGCqLssj2}g`5qLMSVkGw6J_8GJzDUsgDZwy6;Cx;>Kcl87BS}J98v05?T(40Z ziX#`?<)1;N-yOs{^%@kE@9fRPvLRuf)heLvC_dXe4ts8{>T$Wvj#MN)j%d%BtUWBC z*{||EF{*<7&gflox)Z8-%RfB14IRJgigMXMqWzRLkM{t}DROWxAiDh@nf}@JZrr_g6i)Lyh4d%T=hiyX3C%KUUtR-DE+(?@1o|wl9-~^O|g9-;? zDCa9+uG6ll>eFrl8-XCn$5R@35Eqp7P6u@Ue-#YgV#Zs9t^uB-f@k%;K3i6xr@P)N zC_>ef@!mCI5rtZ5O#i@BtQ5G3SKPLK(e9{_Uz-R5Nk~2tn)F`+C->nRHL&%AkpXH5 zqNQY+fRIBBu)<_%*(pmDPBMcuiMBE8lW5hQ4-Kc%VNb~L$lsQQ2G*O?UlY}jL?3zh z#<+2_RK%>?gng0IZO(1`AFTvllL}wUOc5Jut3i9)6g60F)%eAbpXLg8#Izug8&`VA z^2kU;^gSy<9)j{CEuy-J?JE17dwSFg%OSLaAq-9`?G>%Q(W#Jzo+eX9dvQoC0Z+%j zw>h`bx?yRm6=-U`XX?d~J9r~T&-JGB`3+{3Ny?&8EDH*8yM)ZauC-KDl@*xY3i6O= z6uv2zH=?=>LBo{$-{>Z3s378nWy;;K;dYc{6Y#_H;+%(SF#DDNT|1qRK6v@$D!sOi z66;KRx#wlV)OFg|bNMV@oWuQF|W)SkVv)|vP z6%$s>8+Ya>v{Vi8G&7_yLG)*L^%bKTgrZWB?nvmG+y!B+>y_GKOwelZR|gRL_z(1C z{K}c@&Iq0_KGi)f`1$tBo4Z(>(lAb>4UL0QSavvHm2OPPW9udJGF5!+FT)nVx?sb}a6_)L*^Kvfcb z?YkYR6G6*eTra4U@YQ?v$-*LZAg1DfSBj@tP+YD6bWto_bQUwVyiq4c0J<+J$z>ge z`1Z;H+uUf+!1s4td>TZ4L2=KI;y9GFsm=qZY9^y8GM)}Y=jp0Ua$G{+An6<~93nMK zGwl9*wj9p|sA$p03&mzK`%h_h&QAzIF6Q_qV&m$MTnTJJEj|0U zA19w&64qGB>yPCpQc^9`K|8M!+p!4#T9OWpb1nTxUi=$Ko*6t{BIlTaq6EYPU&hiK zpRb_l(;CNEELG+H(1ZeZI)l9}LBzrVpdeD)TpUXc+WMX78uE+9i_I z@5Y)IR(oKU_v!hRf-skRaPn#eKh5aS?Q4Bu3Y-+v>S1ogri680&rrG8ZqE2)m;^m%rf2FXYVi!6=o0?h81D>wHRq^ z!2P0)!OyKd{g0J-bLF1$eLG|*@u3QmTmsP+Wq9v%4|?rHz8jb`&=7 ztw;bnm`tc;UPVJkhpz+cSSOESit8>0qNp)PV?wRTq`T+XS|)xBSfPi{@UV}>^lhK8 z4Az7JGSOp_eB?&^ilr`PWv#;vz}*DE7xfEaduKS~?%@OqWo=i&7nb$8-j8=EI6&{K zQXSLsT{(S(wu8g~6T43h{7BRtA?R9_(Fx7;Cg--lvwvccHyn|%?r~fR%MXx3BzuEA z7V_$rMZtJ5w?I@Q+n_h)6<9T;KsFwF0I_SaL@H)K%vsS!ra){$KgvVetv{bt_MBo@ z{AUOA`>r*EI*Otz*#Ff`Z{_LZs^8fD^7pU3bc(ArHYuyt7F=}97{_V^nV`>AC<42) zoTqYqlY1qG5sm&6bSLBN{jr9{D1Ob*IkvkTWY~O=r1VwiLsY0PMQE)ow*4&}vU#2u zTYg+6e6+Nx_?mWJ(RHANE!Aov6X6WVikrvGoM28Wu35+rEX{s(Q8y*eQ#i6z3i->& zi8U!2YNm71>5fwaXh7KEd-wJ>L#QRhr2^6!Q{}DRzH4K<2T8!e4NWuG!SlYguKfLy z(VevT@md8Fg7gAcG+rSZ8_T@Q1(H{G`*Xdmn!a?=UvlTwby9Tc)f6u6v22w1=L=eq}J?n%b2fBg~1jUi)5}+{iR$7QS~5j%2)XXUPI+oj2B*OX5jbn zK5U4J5G&k{VHRl_*U#sAk`rGXMtp%6JAZ*~_65gRtChg38RnaL?`eR98meDEc6GnY zkPj4QrC1L-A>Yxb+S*v{#~cxVgj^ZSR(VDk%&858zj!XLrK< z2S%H>REE#o(;2LkJ}i&QMJ z8RV({Yox^?w!a?6AY$qzYV2oFkanTAM2!!)P{L3Bbe5Ymy+oT0d3`@yl3l8hFlZ>#h5$CMnao!o4g8HN8ZN=%ZN|)CCZgQ} z*m;lN%NHVcwfc5UhLC**)rjbk-<8cZa~N2inOs*oX0#0CC;xCW_h_mtZ~tP2skB() zzU`^{k2NA*#p9$Lp4y-aIP0m!Hot`CDC1MgTt4>jDL;jxbm&(hUaZyYzr=3~_`Dt< z-|EyfofxsCUBiC<3f@;n>cffY+-vQH12ih3~hiOY(?;exbLGTkI07&G7(B3qI< z3P*`YgTth{B@i<&W#=HFWKpF>b-YGJxj*=eOH3Dk2(qRH#JINdI+pOxcN8hlFr`vp zJpJ|}04J}i;z;jzsfcliLjX&}{_TO*2QS>ZB6m+j+jBi-&()wBb7~8JxqxhId1^G} z5&Yv@&TOIP9zSQ;bLCKl;>|mw59i-4#?qFCp{$Viw|L|9M;nLQ$y?P1n{@s@M)oR^*-4~Z5_Yk*#V)xr0aGbP zAkhw;AgTQQ+u}%8{UN9>vvoGx)*^RSsgDW@6f_OiwL_u3CNkcX=3Jf21w@o@A1dUF zat{A-V8cXeCNzlZK^$F)xNP&<-o@9WBb<%MozHtsmI6eIP)0;p)Z{Pkta^Mk8ZI;! z*Sq0s)koM}?wExcG{@c1HE?||r-q8}KwOj^ZnLnfXA{cyT` zF~M&F=j0E>FN>mjJua+kY`Xhl3LC$D>}JW?uJE9I*(@K_&ZOty|@qtS9N|Ds)? zzYXYyrn<=g5guMM!#-PUe_sTkddB^s{U!Xo^x!U>(-r;&Zv>=cdJSfqBiE{rQzi?PM_uXDb)Y1h(`~7{|;gETW>a_?$|v#{8Dm(YCTwg^oI1+pb>KK1G^G z6fBU(mw4c@e5@}|UckxJwuv1+qL-~fz5{)Tp;pnI`vM@Ry9Dm%pAAKnI>7E$?sWjm zjzD#zuQ7u%3SS9X$uAvRA?1$qlhj=O>gD?1;o!P0h8RG-PzLDtm=z#d7!;jmhZF0k z&Y-{sf0JtjXaAp6L@POEpKyZ7b7zxb?;(0&zl5a|!n-r7#*?%H$)P$e%~VOooEwrc zs0rK$P7$e-%DnlgkIL; zBE%Q%SA-*|Pd+BqNI^bM+iF-=f3Np9eNLh44PxRq6 z<6G5T*t+lwrMnUU=-b(F2>)X*oc^`7gI*TnAR6&pi=o_WASud4vL8+vDVLbZnfM__3+UlnNfSpR;&_`5w(0oL3(ER0*bmC5n`%AdZp7pe5 z9KZEfyI#}|E|9w-vLqD6#-V{@MZ&16OOG@m!=RTU2 zf04@ubyA#qsz6)~D>i}vd1fk?rCTF~8Zvs!Z#-Duz(V}3hl-$x(${t~5lbMJmHPsY zYjL@_ThRA|Zx6tDqXqw7c#kP4HJ}+*cxpq-oJVxSS@2r>YMwH8MMhIteWHi(e7n>e z5&oD`Gv!UT8cos&``F2Iho`p|;#NmjR*-_U5r(aE!O8Vl)ezAudi36BL@8}>o-~&~ z23Cs&amQf%)=KDeuLfY<2q-8?Mj52(FwIIdBy0~DMPFGpQcMyP{Ss6H zHb292uY&J$y04%&UNuLJ4&#o^ns}~|%%fl8IUqw72Y(?V>4BGLxM+^*`X%Pk&1IfY zY*{yGBdGEI!@oUlaD^uc2O5izDzqO0#gZx=4o=NLVjI;EjZUj3-7R#?RP`={_R zYn?5iqlP&3d^GgTA+z0asE6~w5#ZGDI7@mIjYd>4c#@SYVNcqrbYguBEH3ej~;-GF0{ffb?`J2wnQXvM|6ALc! zqdZckl5P)%0-!wMHg`~flTSL|I32U7r4Mi<5c#p5$g}fQ0l?ZxN~kcQs_^i`{bTouA9=WpwI5i?v5$z{T1eUY$57Pb*KsF`EqV8Ik9*QtGQmdX|BRFp_>? zY=Bn8`5tDH`@6X{)lC!2oI;2x{5B=!No|!zW+zTv7ol2;_#j)IvE=XlD z&b?oy&J0lR56~G}32F2e0a?a+AvtsCZmnJ@&}RdIDI{AFf!i1a=N;UJAfEYvjZ|ue zHSyH>jmz2#VWLi%e{{@?BW3_)Y1iqwOaMX5+OQe{@u&mVXc@CjqCy#MNGYp&&q)U` z6=L!U;>C;319iU-c*AE6OTQ-9!R0-P;s@3{4lQJ*^y+{X&sEN;8bc1Nd(!!T_?NEV z>#biHL=P-Xg>V`kp@moBfXZzSm@M`Y9=*F7v*e>+Wz(wfkdJE^>$x#y2LIqQSVb~b zlH2DAK()t!6mc+4gK8I^cu{p%{m?g7#4=lcpOf-XofnBkAzyou;P(^E_enW>Os}^H zJ&QGhgWm3`K&Pu_}&A)<(<-v7Yv!c z+=h?d%*vh11`985a=Fi4)ZxE0f`jh03q~oeJ@aOpGDIj7A2moyIF;MEPwO56=J}U% zLwiSBxQO{HV^vFXaZk)CkIs&45dy`4p;v?0iN#+~7nUez5I_I4xTqzq8KSvlMo(EQuAJK?UC0izsr~&Lkm|)sC@Vm z)>!oEe?TE3Z`u&Y_Cs;zC=TAjCP>cr^0QZ08@>qt#5N79x_b|>4H)4|=y5k151`b@ z{zfe*AEVV1rlfMkjUO=rGs^+=;5$R=(wrMJ#1=C{`T1;*8GC>Gebn_JdKHnqa32b- z$+XyR$*$`@w_gES>tj?PTvYmCFH2esF8Z(2^(l^8Z3qB%3g*Z%F*z^}V7HhjJhzdS lg(V_+VwlzLy~w-`3=Q(k>m8E0XT?8z|Dqc)MXm$FzM-1K0q+0+ From c99350455d0f7fd3aab950ac47b43000c73dd312 Mon Sep 17 00:00:00 2001 From: Tres Seaver Date: Thu, 6 Jan 2022 17:15:03 -0500 Subject: [PATCH 09/17] feat: add 'py.typed' declaration (#919) Test types under CI using new 'mypy' nox session. Co-authored-by: arithmetic1728 <58957152+arithmetic1728@users.noreply.github.com> --- google/__init__.py | 2 +- google/auth/_jwt_async.py | 10 +++------- google/auth/_oauth2client.py | 8 ++++---- google/auth/app_engine.py | 8 ++++---- google/auth/aws.py | 7 +------ google/auth/compute_engine/credentials.py | 2 +- google/auth/crypt/__init__.py | 2 +- google/auth/crypt/_cryptography_rsa.py | 2 +- google/auth/crypt/_python_rsa.py | 12 ++++++------ google/auth/crypt/es256.py | 4 ++-- google/auth/crypt/rsa.py | 4 ++-- google/auth/jwt.py | 14 +++++++------- google/auth/py.typed | 2 ++ google/auth/transport/_aiohttp_requests.py | 4 ++-- google/auth/transport/grpc.py | 2 +- google/auth/transport/requests.py | 2 +- google/auth/transport/urllib3.py | 13 ++++++------- google/oauth2/challenges.py | 6 +++--- google/oauth2/py.typed | 2 ++ google/oauth2/service_account.py | 8 ++++---- mypy.ini | 3 +++ noxfile.py | 18 ++++++++++++++++++ tests/compute_engine/test__metadata.py | 2 +- tests/compute_engine/test_credentials.py | 4 ++-- tests/conftest.py | 2 +- tests/crypt/test__cryptography_rsa.py | 4 ++-- tests/crypt/test__python_rsa.py | 8 ++++---- tests/crypt/test_es256.py | 4 ++-- tests/oauth2/test__client.py | 2 +- tests/oauth2/test_challenges.py | 4 ++-- tests/oauth2/test_credentials.py | 2 +- tests/oauth2/test_id_token.py | 2 +- tests/oauth2/test_reauth.py | 2 +- tests/oauth2/test_service_account.py | 2 +- tests/oauth2/test_sts.py | 2 +- tests/oauth2/test_utils.py | 2 +- tests/test__cloud_sdk.py | 8 ++++---- tests/test__default.py | 2 +- tests/test__helpers.py | 2 +- tests/test__oauth2client.py | 10 +++++----- tests/test__service_account_info.py | 2 +- tests/test_app_engine.py | 2 +- tests/test_aws.py | 2 +- tests/test_credentials.py | 2 +- tests/test_downscoped.py | 2 +- tests/test_external_account.py | 2 +- tests/test_iam.py | 2 +- tests/test_identity_pool.py | 2 +- tests/test_impersonated_credentials.py | 11 ++++++++--- tests/test_jwt.py | 4 ++-- tests/transport/compliance.py | 6 +++--- tests/transport/test__http_client.py | 2 +- tests/transport/test__mtls_helper.py | 4 +--- tests/transport/test_grpc.py | 4 ++-- tests/transport/test_mtls.py | 2 +- tests/transport/test_requests.py | 2 +- tests/transport/test_urllib3.py | 4 ++-- tests_async/conftest.py | 2 +- tests_async/oauth2/test__client_async.py | 2 +- tests_async/oauth2/test_credentials_async.py | 2 +- tests_async/oauth2/test_id_token.py | 2 +- tests_async/oauth2/test_reauth_async.py | 2 +- .../oauth2/test_service_account_async.py | 2 +- tests_async/test__default_async.py | 2 +- tests_async/test_credentials_async.py | 2 +- tests_async/test_jwt_async.py | 2 +- tests_async/transport/async_compliance.py | 6 +++--- tests_async/transport/test_aiohttp_requests.py | 6 +++--- 68 files changed, 151 insertions(+), 133 deletions(-) create mode 100644 google/auth/py.typed create mode 100644 google/oauth2/py.typed create mode 100644 mypy.ini diff --git a/google/__init__.py b/google/__init__.py index 0d0a4c3ab..70a7bd995 100644 --- a/google/__init__.py +++ b/google/__init__.py @@ -21,4 +21,4 @@ except ImportError: import pkgutil - __path__ = pkgutil.extend_path(__path__, __name__) + __path__ = pkgutil.extend_path(__path__, __name__) # type: ignore diff --git a/google/auth/_jwt_async.py b/google/auth/_jwt_async.py index 49e3026e5..3a1abc5b8 100644 --- a/google/auth/_jwt_async.py +++ b/google/auth/_jwt_async.py @@ -43,7 +43,7 @@ change in minor releases. """ -import google.auth +from google.auth import _credentials_async from google.auth import jwt @@ -91,9 +91,7 @@ def decode(token, certs=None, verify=True, audience=None): class Credentials( - jwt.Credentials, - google.auth._credentials_async.Signing, - google.auth._credentials_async.Credentials, + jwt.Credentials, _credentials_async.Signing, _credentials_async.Credentials ): """Credentials that use a JWT as the bearer token. @@ -146,9 +144,7 @@ class Credentials( class OnDemandCredentials( - jwt.OnDemandCredentials, - google.auth._credentials_async.Signing, - google.auth._credentials_async.Credentials, + jwt.OnDemandCredentials, _credentials_async.Signing, _credentials_async.Credentials ): """On-demand JWT credentials. diff --git a/google/auth/_oauth2client.py b/google/auth/_oauth2client.py index 95a9876f3..a86ba8dd6 100644 --- a/google/auth/_oauth2client.py +++ b/google/auth/_oauth2client.py @@ -30,14 +30,14 @@ import google.oauth2.service_account try: - import oauth2client.client - import oauth2client.contrib.gce - import oauth2client.service_account + import oauth2client.client # type: ignore + import oauth2client.contrib.gce # type: ignore + import oauth2client.service_account # type: ignore except ImportError as caught_exc: six.raise_from(ImportError("oauth2client is not installed."), caught_exc) try: - import oauth2client.contrib.appengine # pytype: disable=import-error + import oauth2client.contrib.appengine # type: ignore _HAS_APPENGINE = True except ImportError: diff --git a/google/auth/app_engine.py b/google/auth/app_engine.py index 81aef73b4..1460a7d1a 100644 --- a/google/auth/app_engine.py +++ b/google/auth/app_engine.py @@ -30,9 +30,9 @@ # pytype: disable=import-error try: - from google.appengine.api import app_identity + from google.appengine.api import app_identity # type: ignore except ImportError: - app_identity = None + app_identity = None # type: ignore # pytype: enable=import-error @@ -168,12 +168,12 @@ def with_quota_project(self, quota_project_id): def sign_bytes(self, message): return self._signer.sign(message) - @property + @property # type: ignore @_helpers.copy_docstring(credentials.Signing) def signer_email(self): return self.service_account_email - @property + @property # type: ignore @_helpers.copy_docstring(credentials.Signing) def signer(self): return self._signer diff --git a/google/auth/aws.py b/google/auth/aws.py index 925b1ddfb..2fd96d058 100644 --- a/google/auth/aws.py +++ b/google/auth/aws.py @@ -45,14 +45,9 @@ import posixpath import re -try: - from urllib.parse import urljoin -# Python 2.7 compatibility -except ImportError: # pragma: NO COVER - from urlparse import urljoin - from six.moves import http_client from six.moves import urllib +from six.moves.urllib.parse import urljoin from google.auth import _helpers from google.auth import environment_vars diff --git a/google/auth/compute_engine/credentials.py b/google/auth/compute_engine/credentials.py index b39ac50ae..59b48dae6 100644 --- a/google/auth/compute_engine/credentials.py +++ b/google/auth/compute_engine/credentials.py @@ -379,7 +379,7 @@ def refresh(self, request): self.token = access_token self.expiry = expiry - @property + @property # type: ignore @_helpers.copy_docstring(credentials.Signing) def signer(self): return self._signer diff --git a/google/auth/crypt/__init__.py b/google/auth/crypt/__init__.py index 15ac95068..9f91f0d0b 100644 --- a/google/auth/crypt/__init__.py +++ b/google/auth/crypt/__init__.py @@ -45,7 +45,7 @@ try: from google.auth.crypt import es256 except ImportError: # pragma: NO COVER - es256 = None + es256 = None # type: ignore if es256 is not None: # pragma: NO COVER __all__ = [ diff --git a/google/auth/crypt/_cryptography_rsa.py b/google/auth/crypt/_cryptography_rsa.py index 916c9d80a..4f2d61166 100644 --- a/google/auth/crypt/_cryptography_rsa.py +++ b/google/auth/crypt/_cryptography_rsa.py @@ -101,7 +101,7 @@ def __init__(self, private_key, key_id=None): self._key = private_key self._key_id = key_id - @property + @property # type: ignore @_helpers.copy_docstring(base.Signer) def key_id(self): return self._key_id diff --git a/google/auth/crypt/_python_rsa.py b/google/auth/crypt/_python_rsa.py index ec30dd09a..797a2592b 100644 --- a/google/auth/crypt/_python_rsa.py +++ b/google/auth/crypt/_python_rsa.py @@ -21,11 +21,11 @@ from __future__ import absolute_import -from pyasn1.codec.der import decoder -from pyasn1_modules import pem -from pyasn1_modules.rfc2459 import Certificate -from pyasn1_modules.rfc5208 import PrivateKeyInfo -import rsa +from pyasn1.codec.der import decoder # type: ignore +from pyasn1_modules import pem # type: ignore +from pyasn1_modules.rfc2459 import Certificate # type: ignore +from pyasn1_modules.rfc5208 import PrivateKeyInfo # type: ignore +import rsa # type: ignore import six from google.auth import _helpers @@ -125,7 +125,7 @@ def __init__(self, private_key, key_id=None): self._key = private_key self._key_id = key_id - @property + @property # type: ignore @_helpers.copy_docstring(base.Signer) def key_id(self): return self._key_id diff --git a/google/auth/crypt/es256.py b/google/auth/crypt/es256.py index 42823a7a5..7920cc7ff 100644 --- a/google/auth/crypt/es256.py +++ b/google/auth/crypt/es256.py @@ -15,7 +15,7 @@ """ECDSA (ES256) verifier and signer that use the ``cryptography`` library. """ -from cryptography import utils +from cryptography import utils # type: ignore import cryptography.exceptions from cryptography.hazmat import backends from cryptography.hazmat.primitives import hashes @@ -117,7 +117,7 @@ def __init__(self, private_key, key_id=None): self._key = private_key self._key_id = key_id - @property + @property # type: ignore @_helpers.copy_docstring(base.Signer) def key_id(self): return self._key_id diff --git a/google/auth/crypt/rsa.py b/google/auth/crypt/rsa.py index 8b2d64c10..ed842d1eb 100644 --- a/google/auth/crypt/rsa.py +++ b/google/auth/crypt/rsa.py @@ -26,5 +26,5 @@ # unavailable. from google.auth.crypt import _python_rsa - RSASigner = _python_rsa.RSASigner - RSAVerifier = _python_rsa.RSAVerifier + RSASigner = _python_rsa.RSASigner # type: ignore + RSAVerifier = _python_rsa.RSAVerifier # type: ignore diff --git a/google/auth/jwt.py b/google/auth/jwt.py index d56559510..9d7b76e73 100644 --- a/google/auth/jwt.py +++ b/google/auth/jwt.py @@ -44,7 +44,7 @@ from collections.abc import Mapping # Python 2.7 compatibility except ImportError: # pragma: NO COVER - from collections import Mapping + from collections import Mapping # type: ignore import copy import datetime import json @@ -62,7 +62,7 @@ try: from google.auth.crypt import es256 except ImportError: # pragma: NO COVER - es256 = None + es256 = None # type: ignore _DEFAULT_TOKEN_LIFETIME_SECS = 3600 # 1 hour in seconds _DEFAULT_MAX_CACHE_SIZE = 10 @@ -70,7 +70,7 @@ _CRYPTOGRAPHY_BASED_ALGORITHMS = frozenset(["ES256"]) if es256 is not None: # pragma: NO COVER - _ALGORITHM_TO_VERIFIER_CLASS["ES256"] = es256.ES256Verifier + _ALGORITHM_TO_VERIFIER_CLASS["ES256"] = es256.ES256Verifier # type: ignore def encode(signer, payload, header=None, key_id=None): @@ -557,12 +557,12 @@ def refresh(self, request): def sign_bytes(self, message): return self._signer.sign(message) - @property + @property # type: ignore @_helpers.copy_docstring(google.auth.credentials.Signing) def signer_email(self): return self._issuer - @property + @property # type: ignore @_helpers.copy_docstring(google.auth.credentials.Signing) def signer(self): return self._signer @@ -846,12 +846,12 @@ def before_request(self, request, method, url, headers): def sign_bytes(self, message): return self._signer.sign(message) - @property + @property # type: ignore @_helpers.copy_docstring(google.auth.credentials.Signing) def signer_email(self): return self._issuer - @property + @property # type: ignore @_helpers.copy_docstring(google.auth.credentials.Signing) def signer(self): return self._signer diff --git a/google/auth/py.typed b/google/auth/py.typed new file mode 100644 index 000000000..aa7b68923 --- /dev/null +++ b/google/auth/py.typed @@ -0,0 +1,2 @@ +# Marker file for PEP 561. +# The google-auth package uses inline types. diff --git a/google/auth/transport/_aiohttp_requests.py b/google/auth/transport/_aiohttp_requests.py index ab7dfef67..8a20e7abe 100644 --- a/google/auth/transport/_aiohttp_requests.py +++ b/google/auth/transport/_aiohttp_requests.py @@ -23,9 +23,9 @@ import asyncio import functools -import aiohttp +import aiohttp # type: ignore import six -import urllib3 +import urllib3 # type: ignore from google.auth import exceptions from google.auth import transport diff --git a/google/auth/transport/grpc.py b/google/auth/transport/grpc.py index c47cb3dda..87fa5042f 100644 --- a/google/auth/transport/grpc.py +++ b/google/auth/transport/grpc.py @@ -27,7 +27,7 @@ from google.oauth2 import service_account try: - import grpc + import grpc # type: ignore except ImportError as caught_exc: # pragma: NO COVER six.raise_from( ImportError( diff --git a/google/auth/transport/requests.py b/google/auth/transport/requests.py index 817176bef..9c6f6c888 100644 --- a/google/auth/transport/requests.py +++ b/google/auth/transport/requests.py @@ -205,7 +205,7 @@ class _MutualTlsAdapter(requests.adapters.HTTPAdapter): def __init__(self, cert, key): import certifi from OpenSSL import crypto - import urllib3.contrib.pyopenssl + import urllib3.contrib.pyopenssl # type: ignore urllib3.contrib.pyopenssl.inject_into_urllib3() diff --git a/google/auth/transport/urllib3.py b/google/auth/transport/urllib3.py index 6a2504d97..ad67327a4 100644 --- a/google/auth/transport/urllib3.py +++ b/google/auth/transport/urllib3.py @@ -29,13 +29,14 @@ try: import certifi except ImportError: # pragma: NO COVER - certifi = None + certifi = None # type: ignore + +import six try: - import urllib3 + import urllib3 # type: ignore + import urllib3.exceptions # type: ignore except ImportError as caught_exc: # pragma: NO COVER - import six - six.raise_from( ImportError( "The urllib3 library is not installed, please install the " @@ -43,8 +44,6 @@ ), caught_exc, ) -import six -import urllib3.exceptions # pylint: disable=ungrouped-imports from google.auth import environment_vars from google.auth import exceptions @@ -169,7 +168,7 @@ def _make_mutual_tls_http(cert, key): """ import certifi from OpenSSL import crypto - import urllib3.contrib.pyopenssl + import urllib3.contrib.pyopenssl # type: ignore urllib3.contrib.pyopenssl.inject_into_urllib3() ctx = urllib3.util.ssl_.create_urllib3_context() diff --git a/google/oauth2/challenges.py b/google/oauth2/challenges.py index 95e76cb32..bb523e6ca 100644 --- a/google/oauth2/challenges.py +++ b/google/oauth2/challenges.py @@ -114,9 +114,9 @@ def is_locally_eligible(self): @_helpers.copy_docstring(ReauthChallenge) def obtain_challenge_input(self, metadata): try: - import pyu2f.convenience.authenticator - import pyu2f.errors - import pyu2f.model + import pyu2f.convenience.authenticator # type: ignore + import pyu2f.errors # type: ignore + import pyu2f.model # type: ignore except ImportError: raise exceptions.ReauthFailError( "pyu2f dependency is required to use Security key reauth feature. " diff --git a/google/oauth2/py.typed b/google/oauth2/py.typed new file mode 100644 index 000000000..d82ed62c2 --- /dev/null +++ b/google/oauth2/py.typed @@ -0,0 +1,2 @@ +# Marker file for PEP 561. +# The google-oauth2 package uses inline types. diff --git a/google/oauth2/service_account.py b/google/oauth2/service_account.py index ecaac038c..5c4f340fa 100644 --- a/google/oauth2/service_account.py +++ b/google/oauth2/service_account.py @@ -444,12 +444,12 @@ def _create_self_signed_jwt(self, audience): def sign_bytes(self, message): return self._signer.sign(message) - @property + @property # type: ignore @_helpers.copy_docstring(credentials.Signing) def signer(self): return self._signer - @property + @property # type: ignore @_helpers.copy_docstring(credentials.Signing) def signer_email(self): return self._service_account_email @@ -676,12 +676,12 @@ def service_account_email(self): def sign_bytes(self, message): return self._signer.sign(message) - @property + @property # type: ignore @_helpers.copy_docstring(credentials.Signing) def signer(self): return self._signer - @property + @property # type: ignore @_helpers.copy_docstring(credentials.Signing) def signer_email(self): return self._service_account_email diff --git a/mypy.ini b/mypy.ini new file mode 100644 index 000000000..4505b4854 --- /dev/null +++ b/mypy.ini @@ -0,0 +1,3 @@ +[mypy] +python_version = 3.6 +namespace_packages = True diff --git a/noxfile.py b/noxfile.py index 8c22b7a77..1032be641 100644 --- a/noxfile.py +++ b/noxfile.py @@ -62,6 +62,24 @@ def blacken(session): session.run("black", *BLACK_PATHS) +@nox.session(python="3.6") +def mypy(session): + """Verify type hints are mypy compatible.""" + session.install("-e", ".") + session.install( + "mypy", + "types-cachetools", + "types-certifi", + "types-freezegun", + "types-pyOpenSSL", + "types-requests", + "types-setuptools", + "types-six", + "types-mock", + ) + session.run("mypy", "google/", "tests/", "tests_async/") + + @nox.session(python=["3.6", "3.7", "3.8", "3.9", "3.10"]) def unit(session): constraints_path = str( diff --git a/tests/compute_engine/test__metadata.py b/tests/compute_engine/test__metadata.py index 852822dc0..568812056 100644 --- a/tests/compute_engine/test__metadata.py +++ b/tests/compute_engine/test__metadata.py @@ -17,7 +17,7 @@ import os import mock -import pytest +import pytest # type: ignore from six.moves import http_client from six.moves import reload_module diff --git a/tests/compute_engine/test_credentials.py b/tests/compute_engine/test_credentials.py index 81cc6db31..ff01720c4 100644 --- a/tests/compute_engine/test_credentials.py +++ b/tests/compute_engine/test_credentials.py @@ -15,8 +15,8 @@ import datetime import mock -import pytest -import responses +import pytest # type: ignore +import responses # type: ignore from google.auth import _helpers from google.auth import exceptions diff --git a/tests/conftest.py b/tests/conftest.py index cf8a0f9e5..8080ec3fa 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -16,7 +16,7 @@ import sys import mock -import pytest +import pytest # type: ignore def pytest_configure(): diff --git a/tests/crypt/test__cryptography_rsa.py b/tests/crypt/test__cryptography_rsa.py index dbf07c780..99d8fc37c 100644 --- a/tests/crypt/test__cryptography_rsa.py +++ b/tests/crypt/test__cryptography_rsa.py @@ -16,7 +16,7 @@ import os from cryptography.hazmat.primitives.asymmetric import rsa -import pytest +import pytest # type: ignore from google.auth import _helpers from google.auth.crypt import _cryptography_rsa @@ -55,7 +55,7 @@ # The service account JSON file can be generated from the Google Cloud Console. SERVICE_ACCOUNT_JSON_FILE = os.path.join(DATA_DIR, "service_account.json") -with open(SERVICE_ACCOUNT_JSON_FILE, "r") as fh: +with open(SERVICE_ACCOUNT_JSON_FILE, "rb") as fh: SERVICE_ACCOUNT_INFO = json.load(fh) diff --git a/tests/crypt/test__python_rsa.py b/tests/crypt/test__python_rsa.py index 886ee55a2..9d832f044 100644 --- a/tests/crypt/test__python_rsa.py +++ b/tests/crypt/test__python_rsa.py @@ -16,9 +16,9 @@ import os import mock -from pyasn1_modules import pem -import pytest -import rsa +from pyasn1_modules import pem # type: ignore +import pytest # type: ignore +import rsa # type: ignore import six from google.auth import _helpers @@ -58,7 +58,7 @@ # The service account JSON file can be generated from the Google Cloud Console. SERVICE_ACCOUNT_JSON_FILE = os.path.join(DATA_DIR, "service_account.json") -with open(SERVICE_ACCOUNT_JSON_FILE, "r") as fh: +with open(SERVICE_ACCOUNT_JSON_FILE, "rb") as fh: SERVICE_ACCOUNT_INFO = json.load(fh) diff --git a/tests/crypt/test_es256.py b/tests/crypt/test_es256.py index 5bb9050cd..33465ce6d 100644 --- a/tests/crypt/test_es256.py +++ b/tests/crypt/test_es256.py @@ -17,7 +17,7 @@ import os from cryptography.hazmat.primitives.asymmetric import ec -import pytest +import pytest # type: ignore from google.auth import _helpers from google.auth.crypt import base @@ -45,7 +45,7 @@ SERVICE_ACCOUNT_JSON_FILE = os.path.join(DATA_DIR, "es256_service_account.json") -with open(SERVICE_ACCOUNT_JSON_FILE, "r") as fh: +with open(SERVICE_ACCOUNT_JSON_FILE, "rb") as fh: SERVICE_ACCOUNT_INFO = json.load(fh) diff --git a/tests/oauth2/test__client.py b/tests/oauth2/test__client.py index 54686df59..5485bed84 100644 --- a/tests/oauth2/test__client.py +++ b/tests/oauth2/test__client.py @@ -17,7 +17,7 @@ import os import mock -import pytest +import pytest # type: ignore import six from six.moves import http_client from six.moves import urllib diff --git a/tests/oauth2/test_challenges.py b/tests/oauth2/test_challenges.py index 412895ada..9e35d88af 100644 --- a/tests/oauth2/test_challenges.py +++ b/tests/oauth2/test_challenges.py @@ -18,8 +18,8 @@ import sys import mock -import pytest -import pyu2f +import pytest # type: ignore +import pyu2f # type: ignore from google.auth import exceptions from google.oauth2 import challenges diff --git a/tests/oauth2/test_credentials.py b/tests/oauth2/test_credentials.py index 243f97de8..e5f71def0 100644 --- a/tests/oauth2/test_credentials.py +++ b/tests/oauth2/test_credentials.py @@ -19,7 +19,7 @@ import sys import mock -import pytest +import pytest # type: ignore from google.auth import _helpers from google.auth import exceptions diff --git a/tests/oauth2/test_id_token.py b/tests/oauth2/test_id_token.py index ccfaaaf8c..40204f9d4 100644 --- a/tests/oauth2/test_id_token.py +++ b/tests/oauth2/test_id_token.py @@ -16,7 +16,7 @@ import os import mock -import pytest +import pytest # type: ignore from google.auth import environment_vars from google.auth import exceptions diff --git a/tests/oauth2/test_reauth.py b/tests/oauth2/test_reauth.py index 58d649d83..ae64be009 100644 --- a/tests/oauth2/test_reauth.py +++ b/tests/oauth2/test_reauth.py @@ -15,7 +15,7 @@ import copy import mock -import pytest +import pytest # type: ignore from google.auth import exceptions from google.oauth2 import reauth diff --git a/tests/oauth2/test_service_account.py b/tests/oauth2/test_service_account.py index 531fc4c9e..1d1438485 100644 --- a/tests/oauth2/test_service_account.py +++ b/tests/oauth2/test_service_account.py @@ -38,7 +38,7 @@ SERVICE_ACCOUNT_JSON_FILE = os.path.join(DATA_DIR, "service_account.json") -with open(SERVICE_ACCOUNT_JSON_FILE, "r") as fh: +with open(SERVICE_ACCOUNT_JSON_FILE, "rb") as fh: SERVICE_ACCOUNT_INFO = json.load(fh) SIGNER = crypt.RSASigner.from_string(PRIVATE_KEY_BYTES, "1") diff --git a/tests/oauth2/test_sts.py b/tests/oauth2/test_sts.py index e8e008df5..f61a1d338 100644 --- a/tests/oauth2/test_sts.py +++ b/tests/oauth2/test_sts.py @@ -15,7 +15,7 @@ import json import mock -import pytest +import pytest # type: ignore from six.moves import http_client from six.moves import urllib diff --git a/tests/oauth2/test_utils.py b/tests/oauth2/test_utils.py index 6de9ff533..543a693a9 100644 --- a/tests/oauth2/test_utils.py +++ b/tests/oauth2/test_utils.py @@ -14,7 +14,7 @@ import json -import pytest +import pytest # type: ignore from google.auth import exceptions from google.oauth2 import utils diff --git a/tests/test__cloud_sdk.py b/tests/test__cloud_sdk.py index 31cb6c22c..c05c44320 100644 --- a/tests/test__cloud_sdk.py +++ b/tests/test__cloud_sdk.py @@ -18,7 +18,7 @@ import subprocess import mock -import pytest +import pytest # type: ignore from google.auth import _cloud_sdk from google.auth import environment_vars @@ -28,12 +28,12 @@ DATA_DIR = os.path.join(os.path.dirname(__file__), "data") AUTHORIZED_USER_FILE = os.path.join(DATA_DIR, "authorized_user.json") -with io.open(AUTHORIZED_USER_FILE) as fh: +with io.open(AUTHORIZED_USER_FILE, "rb") as fh: AUTHORIZED_USER_FILE_DATA = json.load(fh) SERVICE_ACCOUNT_FILE = os.path.join(DATA_DIR, "service_account.json") -with io.open(SERVICE_ACCOUNT_FILE) as fh: +with io.open(SERVICE_ACCOUNT_FILE, "rb") as fh: SERVICE_ACCOUNT_FILE_DATA = json.load(fh) with io.open(os.path.join(DATA_DIR, "cloud_sdk_config.json"), "rb") as fh: @@ -63,7 +63,7 @@ def test_get_project_id(data, expected_project_id): @mock.patch( "subprocess.check_output", autospec=True, - side_effect=subprocess.CalledProcessError(-1, None), + side_effect=subprocess.CalledProcessError(-1, "testing"), ) def test_get_project_id_call_error(check_output): project_id = _cloud_sdk.get_project_id() diff --git a/tests/test__default.py b/tests/test__default.py index 1ce03cfe8..fe5710d3d 100644 --- a/tests/test__default.py +++ b/tests/test__default.py @@ -16,7 +16,7 @@ import os import mock -import pytest +import pytest # type: ignore from google.auth import _default from google.auth import app_engine diff --git a/tests/test__helpers.py b/tests/test__helpers.py index 0c0bad2d2..8c71f3e51 100644 --- a/tests/test__helpers.py +++ b/tests/test__helpers.py @@ -14,7 +14,7 @@ import datetime -import pytest +import pytest # type: ignore from six.moves import urllib from google.auth import _helpers diff --git a/tests/test__oauth2client.py b/tests/test__oauth2client.py index 6b1112b50..f1fac511b 100644 --- a/tests/test__oauth2client.py +++ b/tests/test__oauth2client.py @@ -17,10 +17,10 @@ import sys import mock -import oauth2client.client -import oauth2client.contrib.gce -import oauth2client.service_account -import pytest +import oauth2client.client # type: ignore +import oauth2client.contrib.gce # type: ignore +import oauth2client.service_account # type: ignore +import pytest # type: ignore from six.moves import reload_module from google.auth import _oauth2client @@ -109,7 +109,7 @@ def test__convert_appengine_app_assertion_credentials( app_identity, mock_oauth2client_gae_imports ): - import oauth2client.contrib.appengine + import oauth2client.contrib.appengine # type: ignore service_account_id = "service_account_id" old_credentials = oauth2client.contrib.appengine.AppAssertionCredentials( diff --git a/tests/test__service_account_info.py b/tests/test__service_account_info.py index 13b2f85a2..d5529bcce 100644 --- a/tests/test__service_account_info.py +++ b/tests/test__service_account_info.py @@ -15,7 +15,7 @@ import json import os -import pytest +import pytest # type: ignore import six from google.auth import _service_account_info diff --git a/tests/test_app_engine.py b/tests/test_app_engine.py index 6a788b9e9..ca085bd69 100644 --- a/tests/test_app_engine.py +++ b/tests/test_app_engine.py @@ -15,7 +15,7 @@ import datetime import mock -import pytest +import pytest # type: ignore from google.auth import app_engine diff --git a/tests/test_aws.py b/tests/test_aws.py index 9ca08d5b2..d37131afb 100644 --- a/tests/test_aws.py +++ b/tests/test_aws.py @@ -16,7 +16,7 @@ import json import mock -import pytest +import pytest # type: ignore from six.moves import http_client from six.moves import urllib diff --git a/tests/test_credentials.py b/tests/test_credentials.py index 2de638840..da074143a 100644 --- a/tests/test_credentials.py +++ b/tests/test_credentials.py @@ -14,7 +14,7 @@ import datetime -import pytest +import pytest # type: ignore from google.auth import _helpers from google.auth import credentials diff --git a/tests/test_downscoped.py b/tests/test_downscoped.py index 9ca95f5aa..7d0768a18 100644 --- a/tests/test_downscoped.py +++ b/tests/test_downscoped.py @@ -16,7 +16,7 @@ import json import mock -import pytest +import pytest # type: ignore from six.moves import http_client from six.moves import urllib diff --git a/tests/test_external_account.py b/tests/test_external_account.py index 3c34f998c..3897aef15 100644 --- a/tests/test_external_account.py +++ b/tests/test_external_account.py @@ -16,7 +16,7 @@ import json import mock -import pytest +import pytest # type: ignore from six.moves import http_client from six.moves import urllib diff --git a/tests/test_iam.py b/tests/test_iam.py index bc71225b1..ae482765b 100644 --- a/tests/test_iam.py +++ b/tests/test_iam.py @@ -17,7 +17,7 @@ import json import mock -import pytest +import pytest # type: ignore from six.moves import http_client from google.auth import _helpers diff --git a/tests/test_identity_pool.py b/tests/test_identity_pool.py index 87e343be4..664c317d0 100644 --- a/tests/test_identity_pool.py +++ b/tests/test_identity_pool.py @@ -17,7 +17,7 @@ import os import mock -import pytest +import pytest # type: ignore from six.moves import http_client from six.moves import urllib diff --git a/tests/test_impersonated_credentials.py b/tests/test_impersonated_credentials.py index bc404e36b..58d159a59 100644 --- a/tests/test_impersonated_credentials.py +++ b/tests/test_impersonated_credentials.py @@ -16,8 +16,11 @@ import json import os +# Because Python 2.7 +# from typing import List + import mock -import pytest +import pytest # type: ignore from six.moves import http_client from google.auth import _helpers @@ -46,7 +49,7 @@ ) ID_TOKEN_EXPIRY = 1564475051 -with open(SERVICE_ACCOUNT_JSON_FILE, "r") as fh: +with open(SERVICE_ACCOUNT_JSON_FILE, "rb") as fh: SERVICE_ACCOUNT_INFO = json.load(fh) SIGNER = crypt.RSASigner.from_string(PRIVATE_KEY_BYTES, "1") @@ -98,7 +101,9 @@ class TestImpersonatedCredentials(object): SERVICE_ACCOUNT_EMAIL = "service-account@example.com" TARGET_PRINCIPAL = "impersonated@project.iam.gserviceaccount.com" TARGET_SCOPES = ["https://www.googleapis.com/auth/devstorage.read_only"] - DELEGATES = [] + # DELEGATES: List[str] = [] + # Because Python 2.7: + DELEGATES = [] # type: ignore LIFETIME = 3600 SOURCE_CREDENTIALS = service_account.Credentials( SIGNER, SERVICE_ACCOUNT_EMAIL, TOKEN_URI diff --git a/tests/test_jwt.py b/tests/test_jwt.py index c0e1184dc..bc01ebfc7 100644 --- a/tests/test_jwt.py +++ b/tests/test_jwt.py @@ -18,7 +18,7 @@ import os import mock -import pytest +import pytest # type: ignore from google.auth import _helpers from google.auth import crypt @@ -45,7 +45,7 @@ SERVICE_ACCOUNT_JSON_FILE = os.path.join(DATA_DIR, "service_account.json") -with open(SERVICE_ACCOUNT_JSON_FILE, "r") as fh: +with open(SERVICE_ACCOUNT_JSON_FILE, "rb") as fh: SERVICE_ACCOUNT_INFO = json.load(fh) diff --git a/tests/transport/compliance.py b/tests/transport/compliance.py index e093d761d..faf39b9ba 100644 --- a/tests/transport/compliance.py +++ b/tests/transport/compliance.py @@ -14,9 +14,9 @@ import time -import flask -import pytest -from pytest_localserver.http import WSGIServer +import flask # type: ignore +import pytest # type: ignore +from pytest_localserver.http import WSGIServer # type: ignore from six.moves import http_client from google.auth import exceptions diff --git a/tests/transport/test__http_client.py b/tests/transport/test__http_client.py index c176cb2f4..202276323 100644 --- a/tests/transport/test__http_client.py +++ b/tests/transport/test__http_client.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -import pytest +import pytest # type: ignore from google.auth import exceptions import google.auth.transport._http_client diff --git a/tests/transport/test__mtls_helper.py b/tests/transport/test__mtls_helper.py index 3b6349a1d..1621a0530 100644 --- a/tests/transport/test__mtls_helper.py +++ b/tests/transport/test__mtls_helper.py @@ -17,15 +17,13 @@ import mock from OpenSSL import crypto -import pytest +import pytest # type: ignore from google.auth import exceptions from google.auth.transport import _mtls_helper CONTEXT_AWARE_METADATA = {"cert_provider_command": ["some command"]} -CONTEXT_AWARE_METADATA_NO_CERT_PROVIDER_COMMAND = {} - ENCRYPTED_EC_PRIVATE_KEY = b"""-----BEGIN ENCRYPTED PRIVATE KEY----- MIHkME8GCSqGSIb3DQEFDTBCMCkGCSqGSIb3DQEFDDAcBAgl2/yVgs1h3QICCAAw DAYIKoZIhvcNAgkFADAVBgkrBgEEAZdVAQIECJk2GRrvxOaJBIGQXIBnMU4wmciT diff --git a/tests/transport/test_grpc.py b/tests/transport/test_grpc.py index 3437658a3..f62ab0eae 100644 --- a/tests/transport/test_grpc.py +++ b/tests/transport/test_grpc.py @@ -17,7 +17,7 @@ import time import mock -import pytest +import pytest # type: ignore from google.auth import _helpers from google.auth import credentials @@ -28,7 +28,7 @@ try: # pylint: disable=ungrouped-imports - import grpc + import grpc # type: ignore import google.auth.transport.grpc HAS_GRPC = True diff --git a/tests/transport/test_mtls.py b/tests/transport/test_mtls.py index ff70bb3c2..b62063e47 100644 --- a/tests/transport/test_mtls.py +++ b/tests/transport/test_mtls.py @@ -13,7 +13,7 @@ # limitations under the License. import mock -import pytest +import pytest # type: ignore from google.auth import exceptions from google.auth.transport import mtls diff --git a/tests/transport/test_requests.py b/tests/transport/test_requests.py index ed9300d76..60d44a5f4 100644 --- a/tests/transport/test_requests.py +++ b/tests/transport/test_requests.py @@ -20,7 +20,7 @@ import freezegun import mock import OpenSSL -import pytest +import pytest # type: ignore import requests import requests.adapters from six.moves import http_client diff --git a/tests/transport/test_urllib3.py b/tests/transport/test_urllib3.py index e3848c177..396961c39 100644 --- a/tests/transport/test_urllib3.py +++ b/tests/transport/test_urllib3.py @@ -17,9 +17,9 @@ import mock import OpenSSL -import pytest +import pytest # type: ignore from six.moves import http_client -import urllib3 +import urllib3 # type: ignore from google.auth import environment_vars from google.auth import exceptions diff --git a/tests_async/conftest.py b/tests_async/conftest.py index b4e90f0e8..f13dec0e4 100644 --- a/tests_async/conftest.py +++ b/tests_async/conftest.py @@ -16,7 +16,7 @@ import sys import mock -import pytest +import pytest # type: ignore def pytest_configure(): diff --git a/tests_async/oauth2/test__client_async.py b/tests_async/oauth2/test__client_async.py index 6e48c4590..91874cdd4 100644 --- a/tests_async/oauth2/test__client_async.py +++ b/tests_async/oauth2/test__client_async.py @@ -16,7 +16,7 @@ import json import mock -import pytest +import pytest # type: ignore import six from six.moves import http_client from six.moves import urllib diff --git a/tests_async/oauth2/test_credentials_async.py b/tests_async/oauth2/test_credentials_async.py index 06c91419c..a328cc3cb 100644 --- a/tests_async/oauth2/test_credentials_async.py +++ b/tests_async/oauth2/test_credentials_async.py @@ -19,7 +19,7 @@ import sys import mock -import pytest +import pytest # type: ignore from google.auth import _helpers from google.auth import exceptions diff --git a/tests_async/oauth2/test_id_token.py b/tests_async/oauth2/test_id_token.py index 2aee7676b..b84e74db2 100644 --- a/tests_async/oauth2/test_id_token.py +++ b/tests_async/oauth2/test_id_token.py @@ -15,7 +15,7 @@ import os import mock -import pytest +import pytest # type: ignore from google.auth import environment_vars from google.auth import exceptions diff --git a/tests_async/oauth2/test_reauth_async.py b/tests_async/oauth2/test_reauth_async.py index d982e13a1..8f51bd3a7 100644 --- a/tests_async/oauth2/test_reauth_async.py +++ b/tests_async/oauth2/test_reauth_async.py @@ -15,7 +15,7 @@ import copy import mock -import pytest +import pytest # type: ignore from google.auth import exceptions from google.oauth2 import _reauth_async diff --git a/tests_async/oauth2/test_service_account_async.py b/tests_async/oauth2/test_service_account_async.py index 3dce13d82..176992f77 100644 --- a/tests_async/oauth2/test_service_account_async.py +++ b/tests_async/oauth2/test_service_account_async.py @@ -15,7 +15,7 @@ import datetime import mock -import pytest +import pytest # type: ignore from google.auth import _helpers from google.auth import crypt diff --git a/tests_async/test__default_async.py b/tests_async/test__default_async.py index 69a50d69a..bf1a129a8 100644 --- a/tests_async/test__default_async.py +++ b/tests_async/test__default_async.py @@ -16,7 +16,7 @@ import os import mock -import pytest +import pytest # type: ignore from google.auth import _credentials_async as credentials from google.auth import _default_async as _default diff --git a/tests_async/test_credentials_async.py b/tests_async/test_credentials_async.py index 5315483da..9db5fc9ae 100644 --- a/tests_async/test_credentials_async.py +++ b/tests_async/test_credentials_async.py @@ -14,7 +14,7 @@ import datetime -import pytest +import pytest # type: ignore from google.auth import _credentials_async as credentials from google.auth import _helpers diff --git a/tests_async/test_jwt_async.py b/tests_async/test_jwt_async.py index a35b837b7..f24a0a99d 100644 --- a/tests_async/test_jwt_async.py +++ b/tests_async/test_jwt_async.py @@ -16,7 +16,7 @@ import json import mock -import pytest +import pytest # type: ignore from google.auth import _jwt_async as jwt_async from google.auth import crypt diff --git a/tests_async/transport/async_compliance.py b/tests_async/transport/async_compliance.py index 9c4b173c2..36fe7a301 100644 --- a/tests_async/transport/async_compliance.py +++ b/tests_async/transport/async_compliance.py @@ -14,9 +14,9 @@ import time -import flask -import pytest -from pytest_localserver.http import WSGIServer +import flask # type: ignore +import pytest # type: ignore +from pytest_localserver.http import WSGIServer # type: ignore from six.moves import http_client from google.auth import exceptions diff --git a/tests_async/transport/test_aiohttp_requests.py b/tests_async/transport/test_aiohttp_requests.py index a64a4eec9..d00955a7d 100644 --- a/tests_async/transport/test_aiohttp_requests.py +++ b/tests_async/transport/test_aiohttp_requests.py @@ -12,10 +12,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -import aiohttp -from aioresponses import aioresponses, core +import aiohttp # type: ignore +from aioresponses import aioresponses, core # type: ignore import mock -import pytest +import pytest # type: ignore from tests_async.transport import async_compliance import google.auth._credentials_async From 82bc5f08111de78a2b475b0310d3f35470680dbe Mon Sep 17 00:00:00 2001 From: Matthew Hughes <34972397+matthewhughes934@users.noreply.github.com> Date: Fri, 7 Jan 2022 15:54:58 +1100 Subject: [PATCH 10/17] Docs: note ValueError in `verify_oauth2_token` (#928) These `ValueError`s can be raised by `google.auth.jwt.decode` e.g.: * https://github.com/googleapis/google-auth-library-python/blob/8f1e9cfd56dbaae0dff64499e1d0cf55abc5b97e/google/oauth2/id_token.py#L162 * https://github.com/googleapis/google-auth-library-python/blob/8f1e9cfd56dbaae0dff64499e1d0cf55abc5b97e/google/oauth2/id_token.py#L135 * https://github.com/googleapis/google-auth-library-python/blob/8f1e9cfd56dbaae0dff64499e1d0cf55abc5b97e/google/auth/jwt.py#L255 Handling of this is noted in the user docs [1] [1] https://developers.google.com/identity/sign-in/web/backend-auth Co-authored-by: arithmetic1728 <58957152+arithmetic1728@users.noreply.github.com> --- google/oauth2/id_token.py | 1 + 1 file changed, 1 insertion(+) diff --git a/google/oauth2/id_token.py b/google/oauth2/id_token.py index 74899ae55..48f5b0a59 100644 --- a/google/oauth2/id_token.py +++ b/google/oauth2/id_token.py @@ -158,6 +158,7 @@ def verify_oauth2_token(id_token, request, audience=None, clock_skew_in_seconds= Raises: exceptions.GoogleAuthError: If the issuer is invalid. + ValueError: If token verification fails """ idinfo = verify_token( id_token, From 87cd2455aca96ac3fbc4a8b2f8e4c0bba568a70b Mon Sep 17 00:00:00 2001 From: arithmetic1728 <58957152+arithmetic1728@users.noreply.github.com> Date: Fri, 7 Jan 2022 03:12:55 -0800 Subject: [PATCH 11/17] chore: update user cred for system tests (#940) --- system_tests/secrets.tar.enc | Bin 10324 -> 10324 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/system_tests/secrets.tar.enc b/system_tests/secrets.tar.enc index 5df7af8cf8c9cb34326c284db0d98d431446f524..2a742194cbf2154cf0f12b11f34f6b61afb5cf50 100644 GIT binary patch literal 10324 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 From 1b42b633fd167a6ae36e307405a3207ae453796c Mon Sep 17 00:00:00 2001 From: arithmetic1728 <58957152+arithmetic1728@users.noreply.github.com> Date: Tue, 18 Jan 2022 16:10:34 -0800 Subject: [PATCH 12/17] chore: update user creds for system test (#948) --- google/auth/transport/requests.py | 4 ++-- system_tests/secrets.tar.enc | Bin 10324 -> 10324 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/google/auth/transport/requests.py b/google/auth/transport/requests.py index 9c6f6c888..46ca669ff 100644 --- a/google/auth/transport/requests.py +++ b/google/auth/transport/requests.py @@ -36,10 +36,10 @@ ) import requests.adapters # pylint: disable=ungrouped-imports import requests.exceptions # pylint: disable=ungrouped-imports -from requests.packages.urllib3.util.ssl_ import ( +import six # pylint: disable=ungrouped-imports +from urllib3.util.ssl_ import ( create_urllib3_context, ) # pylint: disable=ungrouped-imports -import six # pylint: disable=ungrouped-imports from google.auth import environment_vars from google.auth import exceptions diff --git a/system_tests/secrets.tar.enc b/system_tests/secrets.tar.enc index 2a742194cbf2154cf0f12b11f34f6b61afb5cf50..25940c0846bc204630645fef878de47d0ffac16e 100644 GIT binary patch literal 10324 zcmV-aD67{BB>?tKRTGV;|7ua1P&p(Y0$&@_9a1mcICd+Q)+#=h5kU5@g2WQ4PyiA0 z;H4twb(yc~jrBL#f4Y`te3v)H$CJiLXFKBG7HUX(Vf~c{1h%Rj1>q=p>Ylb;{ibN@ z|8!zNbK%p_HobLuoTnL|t);=TA>04q_$9uaNQbW9WY2xPgl%6GR^^Imj>4oo zEl2qXYl7IqI=w20M0&3}W|O6KW4G%Y%5irl*%+l-K!(Sp2LuUlIe6Io9EypoZAM!G zJ`hB*`J`JU*6fRZde&wV-&&qyO+>2v2asZPYG$bj!9mRO>&5T+e+PucFG_FY9>Q@G z4)MO(lWPhEZ-&pRHJ%5?mE>Ol4_P9P!_{WI2Q9je%8LvtH|~0-@n)idtwcOfW$nqK zrP6U-lP~ zt#^|khEN)7b;zz&NZBHA8{Tf3g}#iswhsA#KcZ~4c_JUlSp7%r42 zq697^$;T#L{0>j1m{w0}N{!o}jjx#McXr}VO=mEAbJIS?!8YyG+K`KCoav2g46neQ z#}JZYpm`Acc%?g@uURD2|{+Rj^hq25?jR{jFq55gLpm^1M zW4}@h8{-qy=%Kxj%}OFTKf7oX9agCO9Rlu)w^j#fVZhMYDh&OaZH6Cn1@R_1y#O3{ zE2^Sh?|C60LuWO5&ri*7I$@}C+~D}bB2>))#nH+3 zjB!nVV@rSW4?t&xZ~k&?CoVc}d&-OJKRSl3`h z(>7l%8-4#Zp~4pJ**QiwCV}yCxSC_MEd2#20!$pt>vz~XtifJL;HW<7(q7WdScMTK zl~x2sr%p@(pJx7ZWf#Jrrh>EN-ia1eaaNJkg{6KCw){-SxsTPDd z`Zr9fWe%hHnAyp?gu?~H`gxvy4;xp8P^f@oi*sQouhXCR()tTnaHGrJeM&!|y?#1E zXA*>%Q#3v}&FQxL5G^xm`AfG9M3jZ?vv6cpFW?Sk;+3SfXZ2-@={8M)wHx-k#Tfyw zZl92U2n|t-`+I!12Jl0;1kg8E)*79Q)48euc1^6v`Ry^ofuNW2!(WahoXQ|e@369O zU3%z)HgF`$keDkICh*z6W&8r@4Kj{{D4Abu3>$}kt{hPhG<1Ok%RdaW;~c3U{_GNg z=Z;Nh6E*1{VY!J>wikgL(201#i=CqY_4PKowAM4`6@HVkbZub1#F(|DfqW%6C3I7lUPhx&@=lmal&b2f|t)ok-6U#WCl!#;|lK#tBd0Gt*Z` zr+c}V17q5&fF;|H#TOq&Z=YSEP&VM)Lp6eQuB)(MX-Ovxp@}bd6V9I8lDVM%XS{BJ z>b9df!OP?13J19vzDL#r)15}CH^mvRlTu)@w2X|>&Bs=TAPI=cW4?Q!J0qm|7HK)uLb6JB#S)|u} zxi*$6<2g_q@!URvc^v6DYL(Xe2DaJ|A9+>fhYxm7&5L}dLp6B z>pT^lHV(P@Ttm{_?-Kxm>Wg?>ER>@5`)`Y2clNf>GXkIib5i|MI+`EH>${ibcFy*M zb$_a|q&zp?iUeU`mY_=firSx9-rwyVCZt)_nEb>u$*|?t)5Adcel3HJhBq3ez}f>p zoh3Z%zR7Su$bmLb6RWjpsYf&^8VbwD#K6qLDtVRK#StY7)ydMo~jySnx=F*V&z%^#bw9<_D|NWfd#d>?nS1?LY8G%g`^q z?}c#E;t$(9E?=8ij|l+JlWKg7Xb>ojyBuCM3Z`FJ6c)~AH9Pzw9VJi95OypRoE2}0 z(;E2w5rVc$7T6_|xZ*gi)fDP&1&ZbHW{GWyQL|P1Gg{LSxI(t(|2sp~n*<@(piiO7g})obSmZ(L3=MiQ7QBUI>S^^XqC1mifd=E4 zuH}tkbejs`W_jPl2r(Uuubv@MYMj_i8?EL|Wf)dGAq;P$2u4P&7Mcy;zXa5#PF4`4Y(+onMf7fKbFqq!Fiq zGD<`AgtS=kwS=H#(f7c5c^+#p;?(V7m|_`&DG=BjtRjOG<^AqIf{mHi%x;Atg;X^99a2`)`=O|39;pi*!5g6OyoXZW$*(4|_LH=YtCcFDi%#2R+N3iV_*ka*X8D zwpqHq)y4kkJdLM7^>r!nG} zRkakP7a^LBoUla-pbAG;WS$|V)#_L1zFw=%U0#Bk1Qo~boiH=Jp-)A5uCyw@fJpr@vH^&P~);Rn5mrqaZ7HL3yMp8 zGin*yO$O-=4y1{Nb1R~cNgBb$9$1YP$`~SAAScKzR*=$hEIGjQapsqzBZrqyAWrvH z*G*)ga}V67m<0n1iD5)ASy8s8&UG}4`3(}}pqokw_$5gBBrj=k^qtaVag<?U80eu z!GlM7&=-~vc*5AaFu%p=#cxea7mC1ddgQ8vJxX9o_QuXJZHp{2kP6eVobG%3tI2P4 z&`?9%VzFX=JYxRWwCT|4WYDCNxy2+0u=uR`Jkh+Bx#NMz95@a*iEA+xllkSNkHe9e zK~L#^HXEal?Jo#Y1du&farG}G-$8LmllV3lnEx#2?9bMViYQ<=h*oY!WIgOf{eD0`L4g~@@_8ret^nH1Mp0G+qF zC4c2u$%yXLtgd&_f*q&rszEDG8)#}%zDtm|(H8Fwv|oa}FNtcJ<}h+)p~4ZX3c0if zU){$GxJ^;AbBg8iB)DTm>C%2~1NM>i9;`;?6_aQw(>qlyjy#w!Ee?Q%64ac{wx$TG ztW?gArR0C?G@_x2<{+$3eP{r*r`tIgZIpF-=TNjP&tuG@77XU%d;2p#PlWw$@J6Gv z=o?uv+b9NQJ^)QeWJ;zrFNU2?28U|MJ1CxRp={!jr>xNf9$0LL1Nt{Yw4EF44^aw< z8h=8tynrfAhioAOi`pRoxEYhUgBRbaS}L_^uQ&Ml^63C5oJ!m3i7(*6cWwS|vcFDe zFKaNH!y@v#i0&?%k{IWAZyNe=*}8K&sB9K^E*LaUSuvkaI~uZ87_}A(^mu*bQYkhK z<2fRa$hV#aYm$?%V?HTb%rWFGIL03Y7F6i)gpG2}PWfLe)ng=T$$#{8cESc5@Bpy> z);u=#7O6k>KUz%;bA6BSMZHezSc44(9Fydxo*iJAuOUQxe3Z?W6k~N9|LLpfBASzS zam3rXh~?5V>UMDQzW)YOvAdroFU}UudMBS2eSgs=z{pV6BB&^FH|Ywo zP&+Qv;DMk}#HGbRaLq(ym{4P7DX*8Blb>=jtp2>JzmJq8(cd6#Gdg1LBM6kr%i2WV zPdEh)T1Uk$5t!*ReiP<{7e>B+rA4X~B-}?qP}xMeFqMB9x?(rp??mb@*I}PA1oGvy zh}T4L#zY~$(z`-q-macIOpJ^MK2yV^;@?y0SrQ)9MtE%zpk$@6ZTljfLS_s4&$<^XiEiwt zO!BlQ2TdG+3VFPa_(j>jMfC>EYkGuHc}Ye+YHQf2;q*#=oj*q<)hxDck+}m@Yg6#*uLZR(_+)bA0Z(HPgB1S- zN4jN@8`epg&98355^~s(b_;csTTnE|=XYjlvsG<}AVXQFN7W*ls0=C-{ux&-rw{u{ zkS3ms*bU_&44`^J>PRY=7h^Jj7(YN(NU@EBzpS=0TCrPS3fJC!)GJB~!6-tP@LTyi zNmb;;f5)u}iyqqcv3LGQnRPUEiDjgmy%%I$dYpuZONYcys$}0cCfpYktJ@fHzB3PT zGjnJmBGZ5(X}x`7%FC{(c3 zIA3IRitQsB+0{mZN*~OfK=9l`-u8w4OnVM84gX{dl1Tft$x$o~=Qxs%*I&GM`JwFO zbmIH6kbqO#Gdbru+O~GEG1)bHf0NxPA4+tV(6*vapdM9-=)6X9sL2@5=3Iz1*4SOq z)0k1}v!$Z@yQr#Um@dAeDNR%>$+Cu#q4dpFtJRo_*-*`!QH76Qsybb%4byaqz8^r= zC!+YOTnZwIzORqxzWUzIp&r{8#J>DF=qM06QYj|Gn zokj$GkxsPi-bhLtcJy2 z>u0%=cB<=BZ@F4;1DRu}&nQ%43H0)n1)Ytodk$lmPcLYrTD%x8kAOyb-2@$Es3#(4 z^LLsLg@yWcgX2?w|6u-7oySK!Tg6*WIWXyLOW2oK;pgM3<>-sPXaCQH^rWe1h0%%s zq%Lfd9Qz+luqfH`k}rO9Q|`=FP*UD4`S<)k&-;sgO|O7^++Uh)mI6HJ#3_rqx$U7a znE!+MDR$6sRtd@%x`c%UcPkF%d;is|3pUer0fClgP!|KVVW?hWPss?g!?E@gsh9-3 z5X#+1es@g|H;Ajx>xPf&yd+g?!nxZ?HRUD#l7|t9@+?LLxUDuZI7|?hOckPbAKt=h zqx=-NYVt~ft_iq0mFq$NLt$Cy%nEs42PU;Pg{bLhxs<$kI-a9=g^zbf-NqKjAl}m* zj}{U{5x;c_PyX5D3R7honyI2^^BLZ7>FNK6mJ^xo$SNZ*`7lpAY_Fc6+&rPq-+pP) zTa6g?j9m_=R^SC=>4MXpP<0}X%;>C?<~Z5+O$`3^!VH@P=qO`wW;LTIODZPQfy7?I zt|xyo;yJT=n4~nTB@=0TwoOI~>935t?0aQQnu88JZ{DsFwVe}}uT@*@g0VBKvEUA2& z3A1~%R>?4T0eQ3VDlk5o$fZXmF|mR0eyFe2N{j|ZUONCkHG1(fsX@nC|V9o+wp3_uuq2Nnv*1Og`;m&(ECJ}+4M;FV6J*~q~wb4>HCSPRpzJz*{9js?>GP_&G4Jp zev?D3-OP$kK9Ndpy#T$+$4)~iWe@_Dv9DLHn{%20Z^H!v!`v^dP#G*Y02T28^~YDb z$N^Oss)Af7>SDYz)=n)RzDSrZ&I#a;bhys%ax5Ww1_-JE12YjE{;T94N~%X!7>yUZ zF`#W>qt^i35xB_oA#x*{BOvTj?p+|m5>Y+KccvoYHHDqDaZ{qS3&d&%=*Y3QNipf+ zMQF}GYJqR(?`8@FN7cV5lV+MDe&vhE?rQBm@*fNrclxGxFfaQJm^;0t1YTau$zzd& zKU^TX10X68{@BC(%I&8i;iWNaL`dIJK+?~)TtS_(&MDwUM7G}LWd9XRH%vVZ9Z@la z=tJQ-Y_ptaGS{4sNwKuBKxK(rKvt1~mh9CvEMN>v+C4siK#$a`nz8RnT+gVuq4@x$7I|&Lx<015q)gmJ{lr z5U{SQEGuiu`879FQp4WVq&6s!D~Y^X3Y0dDGtPS=z6|Vnq;?r; zte9s6jbEyOB!T70qK~w=chy{=zTIfV$TVZo8buq{SH(98!>TYUy9LFIYKn~Ya(`>> z*r=Gup2YoC$4#6VV?UA3Vc zn(R{K)y5h!9~&z4P{Nv>;Y1<0haSEhTQ})6z~jDjir=rCMTnL_i7^S`hx09QN5Z00 zn^`2KHnxYu@X~r|<{eq-jD8b=zZnVjv$gE+#|eCx5Fus0KY|04l>*|^^^J5fB^F}| zvJqpW-J{MUB8&^x5wbeHlTyrHxX1asD7V5Y|ARbbOf1EUeLp6_YW+Idq3fQsnp^C3 z@=12Q^tv>yL5^L(t!-!c{bGK3i|60)Xr|JHFk&(zpFZWjMlaGjHp~uVR zunrNbA!xy9E+DV8Ffe**8?&?dd`*S#KfwoJA=!NaboJRG4%x?cfyBFhdySA{!>Gy1 zDBgw@%0&WCBQ5-VNZq6lRWvd%8Ebmqe|axp2OM53S$ zbiL68$yVB!$Y{|;`j}^2EjP?gyYAu}8CtHMdqWr$#fx!@`y1pAi7c%4Za7>r7IsNa z4w~TrHu37#QP^9NR$!OGC#MlkT)OrPnx%S~%FhgDHWa0wF-53Z-0F#d0Zf`}{~gp- zELHD5bLF$o^!xZic`F{M9yf^S&)(zJC}5uCUPD>?qJKxVEknaJq-0Q2T_fXszs>Cq|fau6?l=9c%bX z*A797vh)0RItzEvA|&AdThj*a!7Lupha*3SG~l;{+hVk~=sdzn>T32g(wnxOFTnfhk{m2S z8&s5`jf@S)xo}p-&#^xt(56voP+KhFrDk;>(v-I6vvNq&Mickc&FeW1mDhLt8z?|R z55Ltmo%H+~luwk|&sGWK7ZrT$tUbZ(Bj_ysiE=ju{md7c{=Yko7mn@WTl4|ze>uec z7I&Rp7OkFa%KFa~d%hG5!Z=0x+|&4CcSlg5vsB*az~9hRMTUQ*h56b3ocO2Riu_r3 z8!N`Lgh-2i9&2(iqbPU$P@#k2F6wL$-p@wRW>r(Q?zvbv%?2&#ZfvZ$$@Bg&U@#D> zCcz?Rt2I0tX8|=YeGnH2(^>QAX|*vK*#h6VwaHa_7y?PcKQ<~vABQ_r4$3=muM2jE zY*$ka=s`Z8h5))HE_kG=Qv^HSc3XCwguibHxABn_9&yr&0@$=sG9XNaxORDB1d_Zu zk&B^u3zNzqM?2IC0twl0?6Tl{m)6cMhGUU*tFmpr%B-}ZR!#977X#o&&KY0UA1XN z>_FqO%@-#q+qGV5E|hBVKL{2uBI7m+qH$1iqkBOBl1Gh%Hr+ z=Uaw1xb6ctWs>-Ya(PgsG|q_}R75M+=UIp9(f)H=)P%tjF`fOy zO30Sq-w6c!OpWVWvBjk#>KlYJ?n#iQu8Kl1uSl9`@+SC1BVr?4BVc75xPAU((CMdBq(`K&Gx5KdrP=mj&EK*9 zdud4(xU(;@5b0eqo#~lHaffw8Fqjf~KO zst&0>)VYt~-UFuv4j5>hrHd*d;eoMu#JUOb6k8Mwvx2e2_ru0}ZV8szs;OmZznh%b zNcet;6nX&GB$!FX<}}i{IRODQs=M64o%pp~m)~`bllX+bAD?Bi3$mbTF6wswF({y& zY`SPr;KoJytc==EYlG>C$PG&QHEk~o7zGHHKBI?bay{y1Xt9k{%ubMBheU8qSxU6)M#>s{qd8ukHQ=Wv29o2;9#V4Tr&)`5 znRwZ2hT0E+{{cDj_9v&@jEs)x8$FRpfZ-C`;G^9Mq94s%?mZG(wXF~19V zjIq4P;^}nqb()uvmZ^Gn1jgW2$05T{d=CbY#}p-UOen`nVkPYc`>u{h>dzt9mM(&& zJ1YOnypk41nry}#B{hfYI(_a5aMBf}xay?Yo5A?` z3zgS9$s02YwlPWI7Vf7IJZ!r{tR@1ogxAiWLZbcMm`G`HUq6*ztgw5`K6mH=dFnz| zULHl4i@DHhR`YATpsknYXv291Z^urz(Mux<&k}!6s*IaSv5Z41m zEHeuMml!{L*Cjv=Hl`5%2^O>-Mq&f^{@Eq}-Z7%}j%HavO^73@6e5jTkg}P?f-(P% z-!p6RcyO{#Lbjw~>%p6>By};Sa6Z7z^&b+ynJ^CZ1A*{=9TKREv!33|2kf950FS(u zl7D>`WhQ`cw2WCJCr(B1h7V&*{0SX8bm|F}Gg0kn-2`z^P}rtwrfD7M6MUW$#t)sl zew0)sR6hHK?e5CA;WngNJ1lOJo6hI^6RK z5l(Y8Zhk)%o~Cc4l%?w)<{+u?g3QFXdoyl;f&4>?3O;B z8NxQ)t&fN#JiO)MW8n5c#y+^sqM<0`cn|@E)G(Mc!+tM7`3%1FL`KhXb)nE8605f>D%AKE1}y|T|8H|hLj4S&ERBUC*?1*mfp z4a(ezI6;^AC;q|6VT1jqSP%P z^3WwSAUorRFKj%xC+c5|>Ml{sUL;PXD`9AmfbjX7sBiz zI`#d@i(mTS_TyX(uaT6AVkzTO&ueODfwwyqrTyrZPLpPZ+cqxelVvh46JBcaND0&_ zuO959no#y%B3HBQoFFZq_SZ67teI+9^we2ulx7jUqOqk_loa6M$xGXy2`Uay zy(jh6EDat3JGP-El^|EPP_cA76nof5-1?@>p+pn0OTbl6g@laKgLY%wkFjSmU?p7YNhU3SQE7^w`=vFaLS49ohn{ErrKF0HAMp>SD*335I#dPkk%b(|RBc$GlaKrCq~r)!Q-luCuBb25 zBl*NyZN&bDU_agp0vBheTWX0%o>#b!sENII$%vH=w^ZT*>m5J+LK<5K9SdW+^vp*Qp&Q!|m_cPk~;!s3X_cfZXAf=`y|~&6>VR-o>M#otn2u z@FWku`z`dL0%uqkeLF#-b4vK($eY3pDzV5~&bv-jhjmOqPc+L^`DEYGZG_X5wsZyJ z!%3l9LM%y_;*woVd*1>&xxR^lzO4 m%J^Q2NXci+r)TY(=-CyY+LPzbcv^B1Si+h&IqdH=dWieN;wSh3 literal 10324 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 Date: Tue, 18 Jan 2022 19:49:15 -0500 Subject: [PATCH 13/17] chore(python): update release.sh to use keystore (#943) * chore(python): update release.sh to use keystore Source-Link: https://github.com/googleapis/synthtool/commit/69fda12e2994f0b595a397e8bb6e3e9f380524eb Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:ae600f36b6bc972b368367b6f83a1d91ec2c82a4a116b383d67d547c56fe6de3 * use urllib3 instead of requests.packages.urllib3 * lint Co-authored-by: Owl Bot Co-authored-by: Anthonios Partheniou --- .github/.OwlBot.lock.yaml | 2 +- .kokoro/release.sh | 2 +- .kokoro/release/common.cfg | 12 +++++++++++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/.github/.OwlBot.lock.yaml b/.github/.OwlBot.lock.yaml index cb89b2e32..eecb84c21 100644 --- a/.github/.OwlBot.lock.yaml +++ b/.github/.OwlBot.lock.yaml @@ -1,3 +1,3 @@ docker: image: gcr.io/cloud-devrel-public-resources/owlbot-python:latest - digest: sha256:ec49167c606648a063d1222220b48119c912562849a0528f35bfb592a9f72737 + digest: sha256:ae600f36b6bc972b368367b6f83a1d91ec2c82a4a116b383d67d547c56fe6de3 diff --git a/.kokoro/release.sh b/.kokoro/release.sh index 967bc917e..638176950 100755 --- a/.kokoro/release.sh +++ b/.kokoro/release.sh @@ -26,7 +26,7 @@ python3 -m pip install --upgrade twine wheel setuptools export PYTHONUNBUFFERED=1 # Move into the package, build the distribution and upload. -TWINE_PASSWORD=$(cat "${KOKORO_GFILE_DIR}/secret_manager/google-cloud-pypi-token") +TWINE_PASSWORD=$(cat "${KOKORO_KEYSTORE_DIR}/73713_google-cloud-pypi-token-keystore-1") cd github/google-auth-library-python python3 setup.py sdist bdist_wheel twine upload --username __token__ --password "${TWINE_PASSWORD}" dist/* diff --git a/.kokoro/release/common.cfg b/.kokoro/release/common.cfg index 07334fd50..9ec8d102f 100644 --- a/.kokoro/release/common.cfg +++ b/.kokoro/release/common.cfg @@ -23,8 +23,18 @@ env_vars: { value: "github/google-auth-library-python/.kokoro/release.sh" } +# Fetch PyPI password +before_action { + fetch_keystore { + keystore_resource { + keystore_config_id: 73713 + keyname: "google-cloud-pypi-token-keystore-1" + } + } +} + # Tokens needed to report release status back to GitHub env_vars: { key: "SECRET_MANAGER_KEYS" - value: "releasetool-publish-reporter-app,releasetool-publish-reporter-googleapis-installation,releasetool-publish-reporter-pem,google-cloud-pypi-token" + value: "releasetool-publish-reporter-app,releasetool-publish-reporter-googleapis-installation,releasetool-publish-reporter-pem" } From 3b15092b3461278400e4683060f64a96d50587c4 Mon Sep 17 00:00:00 2001 From: arithmetic1728 <58957152+arithmetic1728@users.noreply.github.com> Date: Wed, 19 Jan 2022 14:55:25 -0800 Subject: [PATCH 14/17] feat: add api key support (#826) * feat: add api key support * chore: update * Update google/auth/_default.py Co-authored-by: Bu Sun Kim <8822365+busunkim96@users.noreply.github.com> Co-authored-by: Bu Sun Kim <8822365+busunkim96@users.noreply.github.com> --- google/auth/_default.py | 41 ++++++++++++++- google/auth/_default_async.py | 45 ++++++++++++++-- google/auth/api_key.py | 83 ++++++++++++++++++++++++++++++ google/auth/environment_vars.py | 3 ++ tests/test__default.py | 44 ++++++++++++++++ tests/test_api_key.py | 45 ++++++++++++++++ tests_async/test__default_async.py | 44 ++++++++++++++++ 7 files changed, 299 insertions(+), 6 deletions(-) create mode 100644 google/auth/api_key.py create mode 100644 tests/test_api_key.py diff --git a/google/auth/_default.py b/google/auth/_default.py index 4ae7c8c06..54d656164 100644 --- a/google/auth/_default.py +++ b/google/auth/_default.py @@ -353,6 +353,24 @@ def _get_external_account_credentials( return credentials, credentials.get_project_id(request=request) +def _get_api_key_credentials(quota_project_id=None): + """Gets API key credentials and project ID.""" + from google.auth import api_key + + api_key_value = os.environ.get(environment_vars.API_KEY) + if api_key_value: + return api_key.Credentials(api_key_value), quota_project_id + else: + return None, None + + +def get_api_key_credentials(api_key_value): + """Gets API key credentials using the given api key value.""" + from google.auth import api_key + + return api_key.Credentials(api_key_value) + + def default(scopes=None, request=None, quota_project_id=None, default_scopes=None): """Gets the default credentials for the current environment. @@ -361,7 +379,14 @@ def default(scopes=None, request=None, quota_project_id=None, default_scopes=Non This function acquires credentials from the environment in the following order: - 1. If the environment variable ``GOOGLE_APPLICATION_CREDENTIALS`` is set + 1. If both ``GOOGLE_API_KEY`` and ``GOOGLE_APPLICATION_CREDENTIALS`` + environment variables are set, throw an exception. + + If ``GOOGLE_API_KEY`` is set, an `API Key`_ credentials will be returned. + The project ID returned is the one defined by ``GOOGLE_CLOUD_PROJECT`` or + ``GCLOUD_PROJECT`` environment variables. + + If the environment variable ``GOOGLE_APPLICATION_CREDENTIALS`` is set to the path of a valid service account JSON private key file, then it is loaded and returned. The project ID returned is the project ID defined in the service account file if available (some older files do not @@ -409,6 +434,7 @@ def default(scopes=None, request=None, quota_project_id=None, default_scopes=Non .. _Metadata Service: https://cloud.google.com/compute/docs\ /storing-retrieving-metadata .. _Cloud Run: https://cloud.google.com/run + .. _API Key: https://cloud.google.com/docs/authentication/api-keys Example:: @@ -444,16 +470,25 @@ def default(scopes=None, request=None, quota_project_id=None, default_scopes=Non invalid. """ from google.auth.credentials import with_scopes_if_required + from google.auth.credentials import CredentialsWithQuotaProject explicit_project_id = os.environ.get( environment_vars.PROJECT, os.environ.get(environment_vars.LEGACY_PROJECT) ) + if os.environ.get(environment_vars.API_KEY) and os.environ.get( + environment_vars.CREDENTIALS + ): + raise exceptions.DefaultCredentialsError( + "Environment variables GOOGLE_API_KEY and GOOGLE_APPLICATION_CREDENTIALS are mutually exclusive" + ) + checkers = ( # Avoid passing scopes here to prevent passing scopes to user credentials. # with_scopes_if_required() below will ensure scopes/default scopes are # safely set on the returned credentials since requires_scopes will # guard against setting scopes on user credentials. + lambda: _get_api_key_credentials(quota_project_id=quota_project_id), lambda: _get_explicit_environ_credentials(quota_project_id=quota_project_id), lambda: _get_gcloud_sdk_credentials(quota_project_id=quota_project_id), _get_gae_credentials, @@ -477,7 +512,9 @@ def default(scopes=None, request=None, quota_project_id=None, default_scopes=Non request = google.auth.transport.requests.Request() project_id = credentials.get_project_id(request=request) - if quota_project_id: + if quota_project_id and isinstance( + credentials, CredentialsWithQuotaProject + ): credentials = credentials.with_quota_project(quota_project_id) effective_project_id = explicit_project_id or project_id diff --git a/google/auth/_default_async.py b/google/auth/_default_async.py index fb277c54e..a6f7d7777 100644 --- a/google/auth/_default_async.py +++ b/google/auth/_default_async.py @@ -161,6 +161,24 @@ def _get_gae_credentials(): return _default._get_gae_credentials() +def _get_api_key_credentials(quota_project_id=None): + """Gets API key credentials and project ID.""" + from google.auth import api_key + + api_key_value = os.environ.get(environment_vars.API_KEY) + if api_key_value: + return api_key.Credentials(api_key_value), quota_project_id + else: + return None, None + + +def get_api_key_credentials(api_key_value): + """Gets API key credentials using the given api key value.""" + from google.auth import api_key + + return api_key.Credentials(api_key_value) + + def _get_gce_credentials(request=None): """Gets credentials and project ID from the GCE Metadata Service.""" # Ping requires a transport, but we want application default credentials @@ -182,7 +200,14 @@ def default_async(scopes=None, request=None, quota_project_id=None): This function acquires credentials from the environment in the following order: - 1. If the environment variable ``GOOGLE_APPLICATION_CREDENTIALS`` is set + 1. If both ``GOOGLE_API_KEY`` and ``GOOGLE_APPLICATION_CREDENTIALS`` + environment variables are set, throw an exception. + + If ``GOOGLE_API_KEY`` is set, an `API Key`_ credentials will be returned. + The project ID returned is the one defined by ``GOOGLE_CLOUD_PROJECT`` or + ``GCLOUD_PROJECT`` environment variables. + + If the environment variable ``GOOGLE_APPLICATION_CREDENTIALS`` is set to the path of a valid service account JSON private key file, then it is loaded and returned. The project ID returned is the project ID defined in the service account file if available (some older files do not @@ -221,6 +246,7 @@ def default_async(scopes=None, request=None, quota_project_id=None): .. _Metadata Service: https://cloud.google.com/compute/docs\ /storing-retrieving-metadata .. _Cloud Run: https://cloud.google.com/run + .. _API Key: https://cloud.google.com/docs/authentication/api-keys Example:: @@ -250,12 +276,21 @@ def default_async(scopes=None, request=None, quota_project_id=None): invalid. """ from google.auth._credentials_async import with_scopes_if_required + from google.auth.credentials import CredentialsWithQuotaProject explicit_project_id = os.environ.get( environment_vars.PROJECT, os.environ.get(environment_vars.LEGACY_PROJECT) ) + if os.environ.get(environment_vars.API_KEY) and os.environ.get( + environment_vars.CREDENTIALS + ): + raise exceptions.DefaultCredentialsError( + "GOOGLE_API_KEY and GOOGLE_APPLICATION_CREDENTIALS are mutually exclusive" + ) + checkers = ( + lambda: _get_api_key_credentials(quota_project_id=quota_project_id), lambda: _get_explicit_environ_credentials(quota_project_id=quota_project_id), lambda: _get_gcloud_sdk_credentials(quota_project_id=quota_project_id), _get_gae_credentials, @@ -265,9 +300,11 @@ def default_async(scopes=None, request=None, quota_project_id=None): for checker in checkers: credentials, project_id = checker() if credentials is not None: - credentials = with_scopes_if_required( - credentials, scopes - ).with_quota_project(quota_project_id) + credentials = with_scopes_if_required(credentials, scopes) + if quota_project_id and isinstance( + credentials, CredentialsWithQuotaProject + ): + credentials = credentials.with_quota_project(quota_project_id) effective_project_id = explicit_project_id or project_id if not effective_project_id: _default._LOGGER.warning( diff --git a/google/auth/api_key.py b/google/auth/api_key.py new file mode 100644 index 000000000..7cdef429c --- /dev/null +++ b/google/auth/api_key.py @@ -0,0 +1,83 @@ +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Google API key support. + +This module provides authentication using the `API key`_. + + +.. _API key: + https://cloud.google.com/docs/authentication/api-keys/ +""" + +from google.auth import _helpers +from google.auth import credentials + + +class Credentials(credentials.Credentials): + """API key credentials. + + These credentials use API key to provide authorization to applications. + """ + + def __init__(self, token): + """ + Args: + token (str): API key string + + Raises: + ValueError: If the provided API key is not a non-empty string. + """ + if not token: + raise ValueError("Token must be a non-empty API key string") + super(Credentials, self).__init__() + self.token = token + + @property + def expired(self): + return False + + @property + def valid(self): + return True + + @_helpers.copy_docstring(credentials.Credentials) + def refresh(self, request): + return + + def apply(self, headers, token=None): + """Apply the API key token to the x-goog-api-key header. + + Args: + headers (Mapping): The HTTP request headers. + token (Optional[str]): If specified, overrides the current access + token. + """ + headers["x-goog-api-key"] = token or self.token + + def before_request(self, request, method, url, headers): + """Performs credential-specific before request logic. + + Refreshes the credentials if necessary, then calls :meth:`apply` to + apply the token to the x-goog-api-key header. + + Args: + request (google.auth.transport.Request): The object used to make + HTTP requests. + method (str): The request's HTTP method or the RPC method being + invoked. + url (str): The request's URI or the RPC service's URI. + headers (Mapping): The request's headers. + """ + self.apply(headers) diff --git a/google/auth/environment_vars.py b/google/auth/environment_vars.py index c076dc59d..d872c95f9 100644 --- a/google/auth/environment_vars.py +++ b/google/auth/environment_vars.py @@ -33,6 +33,9 @@ """Environment variable defining the location of Google application default credentials.""" +API_KEY = "GOOGLE_API_KEY" +"""Environment variable defining the API key value.""" + # The environment variable name which can replace ~/.config if set. CLOUD_SDK_CONFIG_DIR = "CLOUDSDK_CONFIG" """Environment variable defines the location of Google Cloud SDK's config diff --git a/tests/test__default.py b/tests/test__default.py index fe5710d3d..67795ef02 100644 --- a/tests/test__default.py +++ b/tests/test__default.py @@ -19,6 +19,7 @@ import pytest # type: ignore from google.auth import _default +from google.auth import api_key from google.auth import app_engine from google.auth import aws from google.auth import compute_engine @@ -994,3 +995,46 @@ def test_default_no_warning_with_quota_project_id_for_user_creds(get_adc_path): get_adc_path.return_value = AUTHORIZED_USER_CLOUD_SDK_FILE credentials, project_id = _default.default(quota_project_id="project-foo") + + +def test__get_api_key_credentials_no_env_var(): + cred, project_id = _default._get_api_key_credentials(quota_project_id="project-foo") + assert cred is None + assert project_id is None + + +def test__get_api_key_credentials_from_env_var(): + with mock.patch.dict(os.environ, {environment_vars.API_KEY: "api-key"}): + cred, project_id = _default._get_api_key_credentials( + quota_project_id="project-foo" + ) + assert isinstance(cred, api_key.Credentials) + assert cred.token == "api-key" + assert project_id == "project-foo" + + +def test_exception_with_api_key_and_adc_env_var(): + with mock.patch.dict(os.environ, {environment_vars.API_KEY: "api-key"}): + with mock.patch.dict( + os.environ, {environment_vars.CREDENTIALS: "/path/to/json"} + ): + with pytest.raises(exceptions.DefaultCredentialsError) as excinfo: + _default.default() + + assert excinfo.match( + r"GOOGLE_API_KEY and GOOGLE_APPLICATION_CREDENTIALS are mutually exclusive" + ) + + +def test_default_api_key_from_env_var(): + with mock.patch.dict(os.environ, {environment_vars.API_KEY: "api-key"}): + cred, project_id = _default.default() + assert isinstance(cred, api_key.Credentials) + assert cred.token == "api-key" + assert project_id is None + + +def test_get_api_key_credentials(): + cred = _default.get_api_key_credentials("api-key") + assert isinstance(cred, api_key.Credentials) + assert cred.token == "api-key" diff --git a/tests/test_api_key.py b/tests/test_api_key.py new file mode 100644 index 000000000..9721731be --- /dev/null +++ b/tests/test_api_key.py @@ -0,0 +1,45 @@ +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import pytest # type: ignore + +from google.auth import api_key + + +def test_credentials_constructor(): + with pytest.raises(ValueError) as excinfo: + api_key.Credentials("") + + assert excinfo.match(r"Token must be a non-empty API key string") + + +def test_expired_and_valid(): + credentials = api_key.Credentials("api-key") + + assert credentials.valid + assert credentials.token == "api-key" + assert not credentials.expired + + credentials.refresh(None) + assert credentials.valid + assert credentials.token == "api-key" + assert not credentials.expired + + +def test_before_request(): + credentials = api_key.Credentials("api-key") + headers = {} + + credentials.before_request(None, "http://example.com", "GET", headers) + assert headers["x-goog-api-key"] == "api-key" diff --git a/tests_async/test__default_async.py b/tests_async/test__default_async.py index bf1a129a8..2a1921081 100644 --- a/tests_async/test__default_async.py +++ b/tests_async/test__default_async.py @@ -20,6 +20,7 @@ from google.auth import _credentials_async as credentials from google.auth import _default_async as _default +from google.auth import api_key from google.auth import app_engine from google.auth import compute_engine from google.auth import environment_vars @@ -561,3 +562,46 @@ def test_default_no_warning_with_quota_project_id_for_user_creds(get_adc_path): get_adc_path.return_value = test_default.AUTHORIZED_USER_CLOUD_SDK_FILE credentials, project_id = _default.default_async(quota_project_id="project-foo") + + +def test__get_api_key_credentials_no_env_var(): + cred, project_id = _default._get_api_key_credentials(quota_project_id="project-foo") + assert cred is None + assert project_id is None + + +def test__get_api_key_credentials_from_env_var(): + with mock.patch.dict(os.environ, {environment_vars.API_KEY: "api-key"}): + cred, project_id = _default._get_api_key_credentials( + quota_project_id="project-foo" + ) + assert isinstance(cred, api_key.Credentials) + assert cred.token == "api-key" + assert project_id == "project-foo" + + +def test_exception_with_api_key_and_adc_env_var(): + with mock.patch.dict(os.environ, {environment_vars.API_KEY: "api-key"}): + with mock.patch.dict( + os.environ, {environment_vars.CREDENTIALS: "/path/to/json"} + ): + with pytest.raises(exceptions.DefaultCredentialsError) as excinfo: + _default.default_async() + + assert excinfo.match( + r"GOOGLE_API_KEY and GOOGLE_APPLICATION_CREDENTIALS are mutually exclusive" + ) + + +def test_default_api_key_from_env_var(): + with mock.patch.dict(os.environ, {environment_vars.API_KEY: "api-key"}): + cred, project_id = _default.default_async() + assert isinstance(cred, api_key.Credentials) + assert cred.token == "api-key" + assert project_id is None + + +def test_get_api_key_credentials(): + cred = _default.get_api_key_credentials("api-key") + assert isinstance(cred, api_key.Credentials) + assert cred.token == "api-key" From 431d0bf1c924d8044fb7472c9ef3bd3e7ff0792d Mon Sep 17 00:00:00 2001 From: arithmetic1728 <58957152+arithmetic1728@users.noreply.github.com> Date: Thu, 20 Jan 2022 10:21:37 -0800 Subject: [PATCH 15/17] chore: update user creds for system tests (#951) --- system_tests/secrets.tar.enc | Bin 10324 -> 10324 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/system_tests/secrets.tar.enc b/system_tests/secrets.tar.enc index 25940c0846bc204630645fef878de47d0ffac16e..550f89847f0bc39aa547564d83f593267259fa66 100644 GIT binary patch literal 10324 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
S>RSh754;C(FDufKr=J4%VT=p_3Px-=YQNGC3y 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 From 1eae37db7f6fceb32d6ef0041962ce1755d2116c Mon Sep 17 00:00:00 2001 From: Bu Sun Kim <8822365+busunkim96@users.noreply.github.com> Date: Thu, 20 Jan 2022 13:46:18 -0700 Subject: [PATCH 16/17] fix(deps): allow cachetools 5.0 for python 3.7+ (#937) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(deps): allow cachetools 5.0 for python 3.7+ Changes listed https://github.com/tkem/cachetools/blob/master/CHANGELOG.rst#v500-2021-12-21 * chore: remove split pin * Update setup.py * 🦉 Updates from OwlBot See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md Co-authored-by: Owl Bot Co-authored-by: arithmetic1728 <58957152+arithmetic1728@users.noreply.github.com> --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 44c512128..22f627b99 100644 --- a/setup.py +++ b/setup.py @@ -20,7 +20,7 @@ DEPENDENCIES = ( - "cachetools>=2.0.0,<5.0", + "cachetools>=2.0.0,<6.0", "pyasn1-modules>=0.2.1", # rsa==4.5 is the last version to support 2.7 # https://github.com/sybrenstuvel/python-rsa/issues/152#issuecomment-643470233 From 88580b441fc20e9677433e1d01f07a466317df61 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Thu, 20 Jan 2022 21:06:35 +0000 Subject: [PATCH 17/17] chore(main): release 2.4.0 (#949) :robot: I have created a release *beep* *boop* --- ## [2.4.0](https://github.com/googleapis/google-auth-library-python/compare/v2.3.3...v2.4.0) (2022-01-20) ### Features * add 'py.typed' declaration ([#919](https://github.com/googleapis/google-auth-library-python/issues/919)) ([c993504](https://github.com/googleapis/google-auth-library-python/commit/c99350455d0f7fd3aab950ac47b43000c73dd312)) * add api key support ([#826](https://github.com/googleapis/google-auth-library-python/issues/826)) ([3b15092](https://github.com/googleapis/google-auth-library-python/commit/3b15092b3461278400e4683060f64a96d50587c4)) ### Bug Fixes * **deps:** allow cachetools 5.0 for python 3.7+ ([#937](https://github.com/googleapis/google-auth-library-python/issues/937)) ([1eae37d](https://github.com/googleapis/google-auth-library-python/commit/1eae37db7f6fceb32d6ef0041962ce1755d2116c)) * fix the message format for metadata server exception ([#916](https://github.com/googleapis/google-auth-library-python/issues/916)) ([e756f08](https://github.com/googleapis/google-auth-library-python/commit/e756f08dc78616040ab8fbd7db20903137ccf0c7)) ### Documentation * fix intersphinx link for 'requests-oauthlib' ([#921](https://github.com/googleapis/google-auth-library-python/issues/921)) ([967be4f](https://github.com/googleapis/google-auth-library-python/commit/967be4f4e2a43ba7e240d7acb01b6b992d40e6ec)) * note ValueError in `verify_oauth2_token` ([#928](https://github.com/googleapis/google-auth-library-python/issues/928)) ([82bc5f0](https://github.com/googleapis/google-auth-library-python/commit/82bc5f08111de78a2b475b0310d3f35470680dbe)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --- CHANGELOG.md | 20 ++++++++++++++++++++ google/auth/version.py | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 73440f7e3..43376ec7a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,26 @@ [1]: https://pypi.org/project/google-auth/#history +## [2.4.0](https://github.com/googleapis/google-auth-library-python/compare/v2.3.3...v2.4.0) (2022-01-20) + + +### Features + +* add 'py.typed' declaration ([#919](https://github.com/googleapis/google-auth-library-python/issues/919)) ([c993504](https://github.com/googleapis/google-auth-library-python/commit/c99350455d0f7fd3aab950ac47b43000c73dd312)) +* add api key support ([#826](https://github.com/googleapis/google-auth-library-python/issues/826)) ([3b15092](https://github.com/googleapis/google-auth-library-python/commit/3b15092b3461278400e4683060f64a96d50587c4)) + + +### Bug Fixes + +* **deps:** allow cachetools 5.0 for python 3.7+ ([#937](https://github.com/googleapis/google-auth-library-python/issues/937)) ([1eae37d](https://github.com/googleapis/google-auth-library-python/commit/1eae37db7f6fceb32d6ef0041962ce1755d2116c)) +* fix the message format for metadata server exception ([#916](https://github.com/googleapis/google-auth-library-python/issues/916)) ([e756f08](https://github.com/googleapis/google-auth-library-python/commit/e756f08dc78616040ab8fbd7db20903137ccf0c7)) + + +### Documentation + +* fix intersphinx link for 'requests-oauthlib' ([#921](https://github.com/googleapis/google-auth-library-python/issues/921)) ([967be4f](https://github.com/googleapis/google-auth-library-python/commit/967be4f4e2a43ba7e240d7acb01b6b992d40e6ec)) +* note ValueError in `verify_oauth2_token` ([#928](https://github.com/googleapis/google-auth-library-python/issues/928)) ([82bc5f0](https://github.com/googleapis/google-auth-library-python/commit/82bc5f08111de78a2b475b0310d3f35470680dbe)) + ### [2.3.3](https://www.github.com/googleapis/google-auth-library-python/compare/v2.3.2...v2.3.3) (2021-11-01) diff --git a/google/auth/version.py b/google/auth/version.py index ad9a0c7a4..562d21480 100644 --- a/google/auth/version.py +++ b/google/auth/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "2.3.3" +__version__ = "2.4.0"