Index: third_party/grpc/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi |
diff --git a/third_party/grpc/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi b/third_party/grpc/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3f439c8900fdcd7889828659d5cf9d1059819b44 |
--- /dev/null |
+++ b/third_party/grpc/src/python/grpcio/grpc/_cython/_cygrpc/credentials.pyx.pxi |
@@ -0,0 +1,289 @@ |
+# Copyright 2015, Google Inc. |
+# All rights reserved. |
+# |
+# Redistribution and use in source and binary forms, with or without |
+# modification, are permitted provided that the following conditions are |
+# met: |
+# |
+# * Redistributions of source code must retain the above copyright |
+# notice, this list of conditions and the following disclaimer. |
+# * Redistributions in binary form must reproduce the above |
+# copyright notice, this list of conditions and the following disclaimer |
+# in the documentation and/or other materials provided with the |
+# distribution. |
+# * Neither the name of Google Inc. nor the names of its |
+# contributors may be used to endorse or promote products derived from |
+# this software without specific prior written permission. |
+# |
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
+ |
+cimport cpython |
+ |
+ |
+cdef class ChannelCredentials: |
+ |
+ def __cinit__(self): |
+ self.c_credentials = NULL |
+ self.c_ssl_pem_key_cert_pair.private_key = NULL |
+ self.c_ssl_pem_key_cert_pair.certificate_chain = NULL |
+ self.references = [] |
+ |
+ # The object *can* be invalid in Python if we fail to make the credentials |
+ # (and the core thus returns NULL credentials). Used primarily for debugging. |
+ @property |
+ def is_valid(self): |
+ return self.c_credentials != NULL |
+ |
+ def __dealloc__(self): |
+ if self.c_credentials != NULL: |
+ grpc_channel_credentials_release(self.c_credentials) |
+ |
+ |
+cdef class CallCredentials: |
+ |
+ def __cinit__(self): |
+ self.c_credentials = NULL |
+ self.references = [] |
+ |
+ # The object *can* be invalid in Python if we fail to make the credentials |
+ # (and the core thus returns NULL credentials). Used primarily for debugging. |
+ @property |
+ def is_valid(self): |
+ return self.c_credentials != NULL |
+ |
+ def __dealloc__(self): |
+ if self.c_credentials != NULL: |
+ grpc_call_credentials_release(self.c_credentials) |
+ |
+ |
+cdef class ServerCredentials: |
+ |
+ def __cinit__(self): |
+ self.c_credentials = NULL |
+ self.references = [] |
+ |
+ def __dealloc__(self): |
+ if self.c_credentials != NULL: |
+ grpc_server_credentials_release(self.c_credentials) |
+ |
+ |
+cdef class CredentialsMetadataPlugin: |
+ |
+ def __cinit__(self, object plugin_callback, str name): |
+ """ |
+ Args: |
+ plugin_callback (callable): Callback accepting a service URL (str/bytes) |
+ and callback object (accepting a Metadata, |
+ grpc_status_code, and a str/bytes error message). This argument |
+ when called should be non-blocking and eventually call the callback |
+ object with the appropriate status code/details and metadata (if |
+ successful). |
+ name (str): Plugin name. |
+ """ |
+ if not callable(plugin_callback): |
+ raise ValueError('expected callable plugin_callback') |
+ self.plugin_callback = plugin_callback |
+ self.plugin_name = name |
+ |
+ @staticmethod |
+ cdef grpc_metadata_credentials_plugin make_c_plugin(self): |
+ cdef grpc_metadata_credentials_plugin result |
+ result.get_metadata = plugin_get_metadata |
+ result.destroy = plugin_destroy_c_plugin_state |
+ result.state = <void *>self |
+ result.type = self.plugin_name |
+ cpython.Py_INCREF(self) |
+ return result |
+ |
+ |
+cdef class AuthMetadataContext: |
+ |
+ def __cinit__(self): |
+ self.context.service_url = NULL |
+ self.context.method_name = NULL |
+ |
+ @property |
+ def service_url(self): |
+ return self.context.service_url |
+ |
+ @property |
+ def method_name(self): |
+ return self.context.method_name |
+ |
+ |
+cdef void plugin_get_metadata( |
+ void *state, grpc_auth_metadata_context context, |
+ grpc_credentials_plugin_metadata_cb cb, void *user_data) with gil: |
+ def python_callback( |
+ Metadata metadata, grpc_status_code status, |
+ const char *error_details): |
+ cb(user_data, metadata.c_metadata_array.metadata, |
+ metadata.c_metadata_array.count, status, error_details) |
+ cdef CredentialsMetadataPlugin self = <CredentialsMetadataPlugin>state |
+ cdef AuthMetadataContext cy_context = AuthMetadataContext() |
+ cy_context.context = context |
+ self.plugin_callback(cy_context, python_callback) |
+ |
+cdef void plugin_destroy_c_plugin_state(void *state): |
+ cpython.Py_DECREF(<CredentialsMetadataPlugin>state) |
+ |
+def channel_credentials_google_default(): |
+ cdef ChannelCredentials credentials = ChannelCredentials(); |
+ credentials.c_credentials = grpc_google_default_credentials_create() |
+ return credentials |
+ |
+def channel_credentials_ssl(pem_root_certificates, |
+ SslPemKeyCertPair ssl_pem_key_cert_pair): |
+ if pem_root_certificates is None: |
+ pass |
+ elif isinstance(pem_root_certificates, bytes): |
+ pass |
+ elif isinstance(pem_root_certificates, basestring): |
+ pem_root_certificates = pem_root_certificates.encode() |
+ else: |
+ raise TypeError("expected str or bytes for pem_root_certificates") |
+ cdef ChannelCredentials credentials = ChannelCredentials() |
+ cdef const char *c_pem_root_certificates = NULL |
+ if pem_root_certificates is not None: |
+ c_pem_root_certificates = pem_root_certificates |
+ credentials.references.append(pem_root_certificates) |
+ if ssl_pem_key_cert_pair is not None: |
+ credentials.c_credentials = grpc_ssl_credentials_create( |
+ c_pem_root_certificates, &ssl_pem_key_cert_pair.c_pair, NULL) |
+ credentials.references.append(ssl_pem_key_cert_pair) |
+ else: |
+ credentials.c_credentials = grpc_ssl_credentials_create( |
+ c_pem_root_certificates, NULL, NULL) |
+ return credentials |
+ |
+def channel_credentials_composite( |
+ ChannelCredentials credentials_1 not None, |
+ CallCredentials credentials_2 not None): |
+ if not credentials_1.is_valid or not credentials_2.is_valid: |
+ raise ValueError("passed credentials must both be valid") |
+ cdef ChannelCredentials credentials = ChannelCredentials() |
+ credentials.c_credentials = grpc_composite_channel_credentials_create( |
+ credentials_1.c_credentials, credentials_2.c_credentials, NULL) |
+ credentials.references.append(credentials_1) |
+ credentials.references.append(credentials_2) |
+ return credentials |
+ |
+def call_credentials_composite( |
+ CallCredentials credentials_1 not None, |
+ CallCredentials credentials_2 not None): |
+ if not credentials_1.is_valid or not credentials_2.is_valid: |
+ raise ValueError("passed credentials must both be valid") |
+ cdef CallCredentials credentials = CallCredentials() |
+ credentials.c_credentials = grpc_composite_call_credentials_create( |
+ credentials_1.c_credentials, credentials_2.c_credentials, NULL) |
+ credentials.references.append(credentials_1) |
+ credentials.references.append(credentials_2) |
+ return credentials |
+ |
+def call_credentials_google_compute_engine(): |
+ cdef CallCredentials credentials = CallCredentials() |
+ credentials.c_credentials = ( |
+ grpc_google_compute_engine_credentials_create(NULL)) |
+ return credentials |
+ |
+def call_credentials_service_account_jwt_access( |
+ json_key, Timespec token_lifetime not None): |
+ if isinstance(json_key, bytes): |
+ pass |
+ elif isinstance(json_key, basestring): |
+ json_key = json_key.encode() |
+ else: |
+ raise TypeError("expected json_key to be str or bytes") |
+ cdef CallCredentials credentials = CallCredentials() |
+ credentials.c_credentials = ( |
+ grpc_service_account_jwt_access_credentials_create( |
+ json_key, token_lifetime.c_time, NULL)) |
+ credentials.references.append(json_key) |
+ return credentials |
+ |
+def call_credentials_google_refresh_token(json_refresh_token): |
+ if isinstance(json_refresh_token, bytes): |
+ pass |
+ elif isinstance(json_refresh_token, basestring): |
+ json_refresh_token = json_refresh_token.encode() |
+ else: |
+ raise TypeError("expected json_refresh_token to be str or bytes") |
+ cdef CallCredentials credentials = CallCredentials() |
+ credentials.c_credentials = grpc_google_refresh_token_credentials_create( |
+ json_refresh_token, NULL) |
+ credentials.references.append(json_refresh_token) |
+ return credentials |
+ |
+def call_credentials_google_iam(authorization_token, authority_selector): |
+ if isinstance(authorization_token, bytes): |
+ pass |
+ elif isinstance(authorization_token, basestring): |
+ authorization_token = authorization_token.encode() |
+ else: |
+ raise TypeError("expected authorization_token to be str or bytes") |
+ if isinstance(authority_selector, bytes): |
+ pass |
+ elif isinstance(authority_selector, basestring): |
+ authority_selector = authority_selector.encode() |
+ else: |
+ raise TypeError("expected authority_selector to be str or bytes") |
+ cdef CallCredentials credentials = CallCredentials() |
+ credentials.c_credentials = grpc_google_iam_credentials_create( |
+ authorization_token, authority_selector, NULL) |
+ credentials.references.append(authorization_token) |
+ credentials.references.append(authority_selector) |
+ return credentials |
+ |
+def call_credentials_metadata_plugin(CredentialsMetadataPlugin plugin): |
+ cdef CallCredentials credentials = CallCredentials() |
+ credentials.c_credentials = ( |
+ grpc_metadata_credentials_create_from_plugin(plugin.make_c_plugin(), |
+ NULL)) |
+ # TODO(atash): the following held reference is *probably* never necessary |
+ credentials.references.append(plugin) |
+ return credentials |
+ |
+def server_credentials_ssl(pem_root_certs, pem_key_cert_pairs, |
+ bint force_client_auth): |
+ cdef char *c_pem_root_certs = NULL |
+ if pem_root_certs is None: |
+ pass |
+ elif isinstance(pem_root_certs, bytes): |
+ c_pem_root_certs = pem_root_certs |
+ elif isinstance(pem_root_certs, basestring): |
+ pem_root_certs = pem_root_certs.encode() |
+ c_pem_root_certs = pem_root_certs |
+ else: |
+ raise TypeError("expected pem_root_certs to be str or bytes") |
+ pem_key_cert_pairs = list(pem_key_cert_pairs) |
+ for pair in pem_key_cert_pairs: |
+ if not isinstance(pair, SslPemKeyCertPair): |
+ raise TypeError("expected pem_key_cert_pairs to be sequence of " |
+ "SslPemKeyCertPair") |
+ cdef ServerCredentials credentials = ServerCredentials() |
+ credentials.references.append(pem_key_cert_pairs) |
+ credentials.references.append(pem_root_certs) |
+ credentials.c_ssl_pem_key_cert_pairs_count = len(pem_key_cert_pairs) |
+ credentials.c_ssl_pem_key_cert_pairs = ( |
+ <grpc_ssl_pem_key_cert_pair *>gpr_malloc( |
+ sizeof(grpc_ssl_pem_key_cert_pair) * |
+ credentials.c_ssl_pem_key_cert_pairs_count |
+ )) |
+ for i in range(credentials.c_ssl_pem_key_cert_pairs_count): |
+ credentials.c_ssl_pem_key_cert_pairs[i] = ( |
+ (<SslPemKeyCertPair>pem_key_cert_pairs[i]).c_pair) |
+ credentials.c_credentials = grpc_ssl_server_credentials_create( |
+ c_pem_root_certs, credentials.c_ssl_pem_key_cert_pairs, |
+ credentials.c_ssl_pem_key_cert_pairs_count, force_client_auth, NULL) |
+ return credentials |
+ |