From cd9b1c850db35ad37669dc0a650712b1cd29527f Mon Sep 17 00:00:00 2001 From: Julien Boeuf Date: Fri, 20 Feb 2015 17:40:41 -0800 Subject: Added support for default credentials. - Tested with new tool (print_default_creds_token) on: - workstation for env var and well known place. - GCE for compute engine default creds. - I'd prefer the grpc_default_credentials_create() API to remain synchronous even though there may be an async call for gce detection on which we block. --- include/grpc/grpc_security.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'include') diff --git a/include/grpc/grpc_security.h b/include/grpc/grpc_security.h index 472887f7c6..217c1940ac 100644 --- a/include/grpc/grpc_security.h +++ b/include/grpc/grpc_security.h @@ -51,7 +51,7 @@ typedef struct grpc_credentials grpc_credentials; The creator of the credentials object is responsible for its release. */ void grpc_credentials_release(grpc_credentials *creds); -/* Creates default credentials. */ +/* Creates default credentials to connect to a google gRPC service. */ grpc_credentials *grpc_default_credentials_create(void); /* Environment variable that points to the default SSL roots file. This file -- cgit v1.2.3 From c66f2a816e02b55c82679f5ae6ae29d37991b786 Mon Sep 17 00:00:00 2001 From: Julien Boeuf Date: Mon, 23 Feb 2015 13:00:36 -0800 Subject: Addressing iniitial feedback. - Renaming default credentials -> google default credentials. - Various other things in cpp: - Adding Cpp wrapping for JWT Tokens. - Renaming ComposeCredentials -> CompositeCredentials. --- Makefile | 28 ++-- build.json | 6 +- include/grpc++/credentials.h | 20 ++- include/grpc/grpc_security.h | 17 +- src/core/security/credentials.h | 2 +- src/core/security/credentials_posix.c | 2 +- src/core/security/credentials_win32.c | 2 +- src/core/security/default_credentials.c | 185 --------------------- src/core/security/google_default_credentials.c | 185 +++++++++++++++++++++ src/core/security/security_context.c | 6 - src/cpp/client/credentials.cc | 18 +- test/core/security/print_default_creds_token.c | 107 ------------ .../security/print_google_default_creds_token.c | 107 ++++++++++++ test/cpp/util/create_test_channel.cc | 2 +- vsprojects/vs2013/Grpc.mak | 14 +- vsprojects/vs2013/grpc.vcxproj | 4 +- vsprojects/vs2013/grpc.vcxproj.filters | 4 +- vsprojects/vs2013/grpc_shared.vcxproj | 4 +- vsprojects/vs2013/grpc_shared.vcxproj.filters | 4 +- 19 files changed, 369 insertions(+), 348 deletions(-) delete mode 100644 src/core/security/default_credentials.c create mode 100644 src/core/security/google_default_credentials.c delete mode 100644 test/core/security/print_default_creds_token.c create mode 100644 test/core/security/print_google_default_creds_token.c (limited to 'include') diff --git a/Makefile b/Makefile index b60f22de2c..ff002f443b 100644 --- a/Makefile +++ b/Makefile @@ -481,7 +481,7 @@ grpc_create_jwt: $(BINDIR)/$(CONFIG)/grpc_create_jwt grpc_credentials_test: $(BINDIR)/$(CONFIG)/grpc_credentials_test grpc_fetch_oauth2: $(BINDIR)/$(CONFIG)/grpc_fetch_oauth2 grpc_json_token_test: $(BINDIR)/$(CONFIG)/grpc_json_token_test -grpc_print_default_creds_token: $(BINDIR)/$(CONFIG)/grpc_print_default_creds_token +grpc_print_google_default_creds_token: $(BINDIR)/$(CONFIG)/grpc_print_google_default_creds_token grpc_stream_op_test: $(BINDIR)/$(CONFIG)/grpc_stream_op_test hpack_parser_test: $(BINDIR)/$(CONFIG)/hpack_parser_test hpack_table_test: $(BINDIR)/$(CONFIG)/hpack_table_test @@ -1764,7 +1764,7 @@ test_cxx: buildtests_cxx $(Q) $(BINDIR)/$(CONFIG)/thread_pool_test || ( echo test thread_pool_test failed ; exit 1 ) -tools: privatelibs $(BINDIR)/$(CONFIG)/gen_hpack_tables $(BINDIR)/$(CONFIG)/grpc_create_jwt $(BINDIR)/$(CONFIG)/grpc_fetch_oauth2 $(BINDIR)/$(CONFIG)/grpc_print_default_creds_token +tools: privatelibs $(BINDIR)/$(CONFIG)/gen_hpack_tables $(BINDIR)/$(CONFIG)/grpc_create_jwt $(BINDIR)/$(CONFIG)/grpc_fetch_oauth2 $(BINDIR)/$(CONFIG)/grpc_print_google_default_creds_token buildbenchmarks: privatelibs $(BINDIR)/$(CONFIG)/grpc_completion_queue_benchmark $(BINDIR)/$(CONFIG)/low_level_ping_pong_benchmark @@ -2286,8 +2286,8 @@ LIBGRPC_SRC = \ src/core/security/credentials.c \ src/core/security/credentials_posix.c \ src/core/security/credentials_win32.c \ - src/core/security/default_credentials.c \ src/core/security/factories.c \ + src/core/security/google_default_credentials.c \ src/core/security/json_token.c \ src/core/security/secure_endpoint.c \ src/core/security/secure_transport_setup.c \ @@ -2430,8 +2430,8 @@ src/core/security/base64.c: $(OPENSSL_DEP) src/core/security/credentials.c: $(OPENSSL_DEP) src/core/security/credentials_posix.c: $(OPENSSL_DEP) src/core/security/credentials_win32.c: $(OPENSSL_DEP) -src/core/security/default_credentials.c: $(OPENSSL_DEP) src/core/security/factories.c: $(OPENSSL_DEP) +src/core/security/google_default_credentials.c: $(OPENSSL_DEP) src/core/security/json_token.c: $(OPENSSL_DEP) src/core/security/secure_endpoint.c: $(OPENSSL_DEP) src/core/security/secure_transport_setup.c: $(OPENSSL_DEP) @@ -2591,8 +2591,8 @@ $(OBJDIR)/$(CONFIG)/src/core/security/base64.o: $(OBJDIR)/$(CONFIG)/src/core/security/credentials.o: $(OBJDIR)/$(CONFIG)/src/core/security/credentials_posix.o: $(OBJDIR)/$(CONFIG)/src/core/security/credentials_win32.o: -$(OBJDIR)/$(CONFIG)/src/core/security/default_credentials.o: $(OBJDIR)/$(CONFIG)/src/core/security/factories.o: +$(OBJDIR)/$(CONFIG)/src/core/security/google_default_credentials.o: $(OBJDIR)/$(CONFIG)/src/core/security/json_token.o: $(OBJDIR)/$(CONFIG)/src/core/security/secure_endpoint.o: $(OBJDIR)/$(CONFIG)/src/core/security/secure_transport_setup.o: @@ -6556,33 +6556,33 @@ endif endif -GRPC_PRINT_DEFAULT_CREDS_TOKEN_SRC = \ - test/core/security/print_default_creds_token.c \ +GRPC_PRINT_GOOGLE_DEFAULT_CREDS_TOKEN_SRC = \ + test/core/security/print_google_default_creds_token.c \ -GRPC_PRINT_DEFAULT_CREDS_TOKEN_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GRPC_PRINT_DEFAULT_CREDS_TOKEN_SRC)))) +GRPC_PRINT_GOOGLE_DEFAULT_CREDS_TOKEN_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GRPC_PRINT_GOOGLE_DEFAULT_CREDS_TOKEN_SRC)))) ifeq ($(NO_SECURE),true) # You can't build secure targets if you don't have OpenSSL with ALPN. -$(BINDIR)/$(CONFIG)/grpc_print_default_creds_token: openssl_dep_error +$(BINDIR)/$(CONFIG)/grpc_print_google_default_creds_token: openssl_dep_error else -$(BINDIR)/$(CONFIG)/grpc_print_default_creds_token: $(GRPC_PRINT_DEFAULT_CREDS_TOKEN_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(BINDIR)/$(CONFIG)/grpc_print_google_default_creds_token: $(GRPC_PRINT_GOOGLE_DEFAULT_CREDS_TOKEN_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(E) "[LD] Linking $@" $(Q) mkdir -p `dirname $@` - $(Q) $(LD) $(LDFLAGS) $(GRPC_PRINT_DEFAULT_CREDS_TOKEN_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/grpc_print_default_creds_token + $(Q) $(LD) $(LDFLAGS) $(GRPC_PRINT_GOOGLE_DEFAULT_CREDS_TOKEN_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/grpc_print_google_default_creds_token endif -$(OBJDIR)/$(CONFIG)/test/core/security/print_default_creds_token.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a +$(OBJDIR)/$(CONFIG)/test/core/security/print_google_default_creds_token.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a -deps_grpc_print_default_creds_token: $(GRPC_PRINT_DEFAULT_CREDS_TOKEN_OBJS:.o=.dep) +deps_grpc_print_google_default_creds_token: $(GRPC_PRINT_GOOGLE_DEFAULT_CREDS_TOKEN_OBJS:.o=.dep) ifneq ($(NO_SECURE),true) ifneq ($(NO_DEPS),true) --include $(GRPC_PRINT_DEFAULT_CREDS_TOKEN_OBJS:.o=.dep) +-include $(GRPC_PRINT_GOOGLE_DEFAULT_CREDS_TOKEN_OBJS:.o=.dep) endif endif diff --git a/build.json b/build.json index 3ad89449a7..b5906033f1 100644 --- a/build.json +++ b/build.json @@ -322,8 +322,8 @@ "src/core/security/credentials.c", "src/core/security/credentials_posix.c", "src/core/security/credentials_win32.c", - "src/core/security/default_credentials.c", "src/core/security/factories.c", + "src/core/security/google_default_credentials.c", "src/core/security/json_token.c", "src/core/security/secure_endpoint.c", "src/core/security/secure_transport_setup.c", @@ -1190,11 +1190,11 @@ ] }, { - "name": "grpc_print_default_creds_token", + "name": "grpc_print_google_default_creds_token", "build": "tool", "language": "c", "src": [ - "test/core/security/print_default_creds_token.c" + "test/core/security/print_google_default_creds_token.c" ], "deps": [ "grpc_test_util", diff --git a/include/grpc++/credentials.h b/include/grpc++/credentials.h index ac6f394847..5cbcca3aa5 100644 --- a/include/grpc++/credentials.h +++ b/include/grpc++/credentials.h @@ -86,17 +86,23 @@ struct SslCredentialsOptions { // fail on it. class CredentialsFactory { public: - // Builds credentials with reasonable defaults. - static std::unique_ptr DefaultCredentials(); + // Builds google credentials with reasonable defaults. + // WARNING: Do NOT use this credentials to connect to a non-google service as + // this could result in an oauth2 token leak. + static std::unique_ptr GoogleDefaultCredentials(); // Builds SSL Credentials given SSL specific options static std::unique_ptr SslCredentials( const SslCredentialsOptions& options); // Builds credentials for use when running in GCE + // WARNING: Do NOT use this credentials to connect to a non-google service as + // this could result in an oauth2 token leak. static std::unique_ptr ComputeEngineCredentials(); // Builds service account credentials. + // WARNING: Do NOT use this credentials to connect to a non-google service as + // this could result in an oauth2 token leak. // json_key is the JSON key string containing the client's private key. // scope is a space-delimited list of the requested permissions. // token_lifetime is the lifetime of each token acquired through this service @@ -106,13 +112,21 @@ class CredentialsFactory { const grpc::string& json_key, const grpc::string& scope, std::chrono::seconds token_lifetime); + // Builds JWT credentials. + // json_key is the JSON key string containing the client's private key. + // token_lifetime is the lifetime of each Json Web Token (JWT) created with + // this credentials. It should not exceed grpc_max_auth_token_lifetime or + // will be cropped to this value. + static std::unique_ptr JWTCredentials( + const grpc::string& json_key, std::chrono::seconds token_lifetime); + // Builds IAM credentials. static std::unique_ptr IAMCredentials( const grpc::string& authorization_token, const grpc::string& authority_selector); // Combines two credentials objects into a composite credentials - static std::unique_ptr ComposeCredentials( + static std::unique_ptr CompositeCredentials( const std::unique_ptr& creds1, const std::unique_ptr& creds2); }; diff --git a/include/grpc/grpc_security.h b/include/grpc/grpc_security.h index 217c1940ac..cc2fac2f1c 100644 --- a/include/grpc/grpc_security.h +++ b/include/grpc/grpc_security.h @@ -51,8 +51,10 @@ typedef struct grpc_credentials grpc_credentials; The creator of the credentials object is responsible for its release. */ void grpc_credentials_release(grpc_credentials *creds); -/* Creates default credentials to connect to a google gRPC service. */ -grpc_credentials *grpc_default_credentials_create(void); +/* Creates default credentials to connect to a google gRPC service. + WARNING: Do NOT use this credentials to connect to a non-google service as + this could result in an oauth2 token leak. */ +grpc_credentials *grpc_google_default_credentials_create(void); /* Environment variable that points to the default SSL roots file. This file must be a PEM encoded file with all the roots such as the one that can be @@ -85,13 +87,17 @@ grpc_credentials *grpc_ssl_credentials_create( grpc_credentials *grpc_composite_credentials_create(grpc_credentials *creds1, grpc_credentials *creds2); -/* Creates a compute engine credentials object. */ +/* Creates a compute engine credentials object. + WARNING: Do NOT use this credentials to connect to a non-google service as + this could result in an oauth2 token leak. */ grpc_credentials *grpc_compute_engine_credentials_create(void); extern const gpr_timespec grpc_max_auth_token_lifetime; /* Creates a service account credentials object. May return NULL if the input is invalid. + WARNING: Do NOT use this credentials to connect to a non-google service as + this could result in an oauth2 token leak. - json_key is the JSON key string containing the client's private key. - scope is a space-delimited list of the requested permissions. - token_lifetime is the lifetime of each token acquired through this service @@ -126,11 +132,6 @@ grpc_credentials *grpc_iam_credentials_create(const char *authorization_token, channel, it will just be ignored. */ #define GRPC_SSL_TARGET_NAME_OVERRIDE_ARG "grpc.ssl_target_name_override" -/* Creates a default secure channel using the default credentials object using - the environment. */ -grpc_channel *grpc_default_secure_channel_create(const char *target, - const grpc_channel_args *args); - /* Creates a secure channel using the passed-in credentials. */ grpc_channel *grpc_secure_channel_create(grpc_credentials *creds, const char *target, diff --git a/src/core/security/credentials.h b/src/core/security/credentials.h index 9886afc9c0..0a0074c1d5 100644 --- a/src/core/security/credentials.h +++ b/src/core/security/credentials.h @@ -67,7 +67,7 @@ typedef enum { /* --- grpc_credentials. --- */ /* It is the caller's responsibility to gpr_free the result if not NULL. */ -char *grpc_get_well_known_credentials_file_path(void); +char *grpc_get_well_known_google_credentials_file_path(void); typedef void (*grpc_credentials_metadata_cb)(void *user_data, grpc_mdelem **md_elems, diff --git a/src/core/security/credentials_posix.c b/src/core/security/credentials_posix.c index 9cffd64d31..79622cb024 100644 --- a/src/core/security/credentials_posix.c +++ b/src/core/security/credentials_posix.c @@ -43,7 +43,7 @@ #include "src/core/support/env.h" #include "src/core/support/string.h" -char *grpc_get_well_known_credentials_file_path(void) { +char *grpc_get_well_known_google_credentials_file_path(void) { char *result = NULL; char *home = gpr_getenv("HOME"); if (home == NULL) { diff --git a/src/core/security/credentials_win32.c b/src/core/security/credentials_win32.c index a8b711517b..ddb310468b 100644 --- a/src/core/security/credentials_win32.c +++ b/src/core/security/credentials_win32.c @@ -43,7 +43,7 @@ #include "src/core/support/env.h" #include "src/core/support/string.h" -char *grpc_get_well_known_credentials_file_path(void) { +char *grpc_get_well_known_google_credentials_file_path(void) { char *result = NULL; char *appdata_path = gpr_getenv("APPDATA"); if (appdata_path == NULL) { diff --git a/src/core/security/default_credentials.c b/src/core/security/default_credentials.c deleted file mode 100644 index d7a974d8a1..0000000000 --- a/src/core/security/default_credentials.c +++ /dev/null @@ -1,185 +0,0 @@ -/* - * - * 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. - * - */ - -#include "src/core/security/credentials.h" - -#include - -#include -#include -#include - -#include "src/core/httpcli/httpcli.h" -#include "src/core/support/env.h" -#include "src/core/support/file.h" - -/* -- Constants. -- */ - -#define GRPC_COMPUTE_ENGINE_DETECTION_HOST "metadata.google.internal" -#define GRPC_GOOGLE_CREDENTIALS_ENV_VAR "GOOGLE_APPLICATION_CREDENTIALS" - -/* -- Default credentials. -- */ - -static grpc_credentials *default_credentials = NULL; -static int compute_engine_detection_done = 0; -static gpr_mu g_mu; -static gpr_once g_once = GPR_ONCE_INIT; - -static void init_default_credentials(void) { - gpr_mu_init(&g_mu); -} - -typedef struct { - gpr_cv cv; - gpr_mu mu; - int is_done; - int success; -} compute_engine_detector; - -static void on_compute_engine_detection_http_response( - void *user_data, const grpc_httpcli_response *response) { - compute_engine_detector *detector = (compute_engine_detector *)user_data; - if (response != NULL && response->status == 200 && response->hdr_count > 0) { - /* Internet providers can return a generic response to all requests, so - it is necessary to check that metadata header is present also. */ - size_t i; - for (i = 0; i < response->hdr_count; i++) { - grpc_httpcli_header *header = &response->hdrs[i]; - if (!strcmp(header->key, "Metadata-Flavor") && - !strcmp(header->value, "Google")) { - detector->success = 1; - break; - } - } - } - gpr_mu_lock(&detector->mu); - detector->is_done = 1; - gpr_mu_unlock(&detector->mu); - gpr_cv_signal(&detector->cv); -} - -static int is_stack_running_on_compute_engine(void) { - compute_engine_detector detector; - grpc_httpcli_request request; - - /* The http call is local. If it takes more than one sec, it is for sure not - on compute engine. */ - gpr_timespec max_detection_delay = {1, 0}; - - gpr_mu_init(&detector.mu); - gpr_cv_init(&detector.cv); - detector.is_done = 0; - detector.success = 0; - - memset(&request, 0, sizeof(grpc_httpcli_request)); - request.host = GRPC_COMPUTE_ENGINE_DETECTION_HOST; - request.path = "/"; - - grpc_httpcli_get(&request, gpr_time_add(gpr_now(), max_detection_delay), - on_compute_engine_detection_http_response, &detector); - - /* Block until we get the response. This is not ideal but this should only be - called once for the lifetime of the process by the default credentials. */ - gpr_mu_lock(&detector.mu); - while (!detector.is_done) { - gpr_cv_wait(&detector.cv, &detector.mu, gpr_inf_future); - } - gpr_mu_unlock(&detector.mu); - - gpr_mu_destroy(&detector.mu); - gpr_cv_destroy(&detector.cv); - return detector.success; -} - -/* Takes ownership of creds_path if not NULL. */ -static grpc_credentials *create_jwt_creds_from_path(char *creds_path) { - grpc_credentials *result = NULL; - gpr_slice creds_data; - int file_ok = 0; - if (creds_path == NULL) return NULL; - creds_data = gpr_load_file(creds_path, &file_ok); - gpr_free(creds_path); - if (file_ok) { - result = grpc_jwt_credentials_create( - (const char *)GPR_SLICE_START_PTR(creds_data), - grpc_max_auth_token_lifetime); - gpr_slice_unref(creds_data); - } - return result; -} - -grpc_credentials *grpc_default_credentials_create(void) { - grpc_credentials *result = NULL; - int serving_cached_credentials = 0; - gpr_once_init(&g_once, init_default_credentials); - - gpr_mu_lock(&g_mu); - - if (default_credentials != NULL) { - result = default_credentials; - serving_cached_credentials = 1; - goto end; - } - - /* First, try the environment variable. */ - result = - create_jwt_creds_from_path(gpr_getenv(GRPC_GOOGLE_CREDENTIALS_ENV_VAR)); - if (result != NULL) goto end; - - /* Then the well-known file. */ - result = create_jwt_creds_from_path( - grpc_get_well_known_credentials_file_path()); - if (result != NULL) goto end; - - /* At last try to see if we're on compute engine (do the detection only once - since it requires a network test). */ - if (!compute_engine_detection_done) { - int need_compute_engine_creds = is_stack_running_on_compute_engine(); - compute_engine_detection_done = 1; - if (need_compute_engine_creds) { - result = grpc_compute_engine_credentials_create(); - } - } - -end: - if (!serving_cached_credentials && result != NULL) { - /* Blend with default ssl credentials and add a global reference so that it - can be cached and re-served. */ - result = grpc_composite_credentials_create( - grpc_ssl_credentials_create(NULL, NULL), result); - GPR_ASSERT(result != NULL); - default_credentials = grpc_credentials_ref(result); - } - gpr_mu_unlock(&g_mu); - return result; -} diff --git a/src/core/security/google_default_credentials.c b/src/core/security/google_default_credentials.c new file mode 100644 index 0000000000..dc0e453b87 --- /dev/null +++ b/src/core/security/google_default_credentials.c @@ -0,0 +1,185 @@ +/* + * + * 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. + * + */ + +#include "src/core/security/credentials.h" + +#include + +#include +#include +#include + +#include "src/core/httpcli/httpcli.h" +#include "src/core/support/env.h" +#include "src/core/support/file.h" + +/* -- Constants. -- */ + +#define GRPC_COMPUTE_ENGINE_DETECTION_HOST "metadata.google.internal" +#define GRPC_GOOGLE_CREDENTIALS_ENV_VAR "GOOGLE_APPLICATION_CREDENTIALS" + +/* -- Default credentials. -- */ + +static grpc_credentials *default_credentials = NULL; +static int compute_engine_detection_done = 0; +static gpr_mu g_mu; +static gpr_once g_once = GPR_ONCE_INIT; + +static void init_default_credentials(void) { + gpr_mu_init(&g_mu); +} + +typedef struct { + gpr_cv cv; + gpr_mu mu; + int is_done; + int success; +} compute_engine_detector; + +static void on_compute_engine_detection_http_response( + void *user_data, const grpc_httpcli_response *response) { + compute_engine_detector *detector = (compute_engine_detector *)user_data; + if (response != NULL && response->status == 200 && response->hdr_count > 0) { + /* Internet providers can return a generic response to all requests, so + it is necessary to check that metadata header is present also. */ + size_t i; + for (i = 0; i < response->hdr_count; i++) { + grpc_httpcli_header *header = &response->hdrs[i]; + if (!strcmp(header->key, "Metadata-Flavor") && + !strcmp(header->value, "Google")) { + detector->success = 1; + break; + } + } + } + gpr_mu_lock(&detector->mu); + detector->is_done = 1; + gpr_mu_unlock(&detector->mu); + gpr_cv_signal(&detector->cv); +} + +static int is_stack_running_on_compute_engine(void) { + compute_engine_detector detector; + grpc_httpcli_request request; + + /* The http call is local. If it takes more than one sec, it is for sure not + on compute engine. */ + gpr_timespec max_detection_delay = {1, 0}; + + gpr_mu_init(&detector.mu); + gpr_cv_init(&detector.cv); + detector.is_done = 0; + detector.success = 0; + + memset(&request, 0, sizeof(grpc_httpcli_request)); + request.host = GRPC_COMPUTE_ENGINE_DETECTION_HOST; + request.path = "/"; + + grpc_httpcli_get(&request, gpr_time_add(gpr_now(), max_detection_delay), + on_compute_engine_detection_http_response, &detector); + + /* Block until we get the response. This is not ideal but this should only be + called once for the lifetime of the process by the default credentials. */ + gpr_mu_lock(&detector.mu); + while (!detector.is_done) { + gpr_cv_wait(&detector.cv, &detector.mu, gpr_inf_future); + } + gpr_mu_unlock(&detector.mu); + + gpr_mu_destroy(&detector.mu); + gpr_cv_destroy(&detector.cv); + return detector.success; +} + +/* Takes ownership of creds_path if not NULL. */ +static grpc_credentials *create_jwt_creds_from_path(char *creds_path) { + grpc_credentials *result = NULL; + gpr_slice creds_data; + int file_ok = 0; + if (creds_path == NULL) return NULL; + creds_data = gpr_load_file(creds_path, &file_ok); + gpr_free(creds_path); + if (file_ok) { + result = grpc_jwt_credentials_create( + (const char *)GPR_SLICE_START_PTR(creds_data), + grpc_max_auth_token_lifetime); + gpr_slice_unref(creds_data); + } + return result; +} + +grpc_credentials *grpc_google_default_credentials_create(void) { + grpc_credentials *result = NULL; + int serving_cached_credentials = 0; + gpr_once_init(&g_once, init_default_credentials); + + gpr_mu_lock(&g_mu); + + if (default_credentials != NULL) { + result = default_credentials; + serving_cached_credentials = 1; + goto end; + } + + /* First, try the environment variable. */ + result = + create_jwt_creds_from_path(gpr_getenv(GRPC_GOOGLE_CREDENTIALS_ENV_VAR)); + if (result != NULL) goto end; + + /* Then the well-known file. */ + result = create_jwt_creds_from_path( + grpc_get_well_known_google_credentials_file_path()); + if (result != NULL) goto end; + + /* At last try to see if we're on compute engine (do the detection only once + since it requires a network test). */ + if (!compute_engine_detection_done) { + int need_compute_engine_creds = is_stack_running_on_compute_engine(); + compute_engine_detection_done = 1; + if (need_compute_engine_creds) { + result = grpc_compute_engine_credentials_create(); + } + } + +end: + if (!serving_cached_credentials && result != NULL) { + /* Blend with default ssl credentials and add a global reference so that it + can be cached and re-served. */ + result = grpc_composite_credentials_create( + grpc_ssl_credentials_create(NULL, NULL), result); + GPR_ASSERT(result != NULL); + default_credentials = grpc_credentials_ref(result); + } + gpr_mu_unlock(&g_mu); + return result; +} diff --git a/src/core/security/security_context.c b/src/core/security/security_context.c index 71bd06b271..df6728ca4b 100644 --- a/src/core/security/security_context.c +++ b/src/core/security/security_context.c @@ -636,9 +636,3 @@ grpc_channel *grpc_secure_channel_create_with_factories( creds->type); return grpc_lame_client_channel_create(); } - -grpc_channel *grpc_default_secure_channel_create( - const char *target, const grpc_channel_args *args) { - return grpc_secure_channel_create(grpc_default_credentials_create(), target, - args); -} diff --git a/src/cpp/client/credentials.cc b/src/cpp/client/credentials.cc index 66571cad73..a140f551e0 100644 --- a/src/cpp/client/credentials.cc +++ b/src/cpp/client/credentials.cc @@ -45,8 +45,8 @@ Credentials::Credentials(grpc_credentials *c_creds) : creds_(c_creds) {} Credentials::~Credentials() { grpc_credentials_release(creds_); } grpc_credentials *Credentials::GetRawCreds() { return creds_; } -std::unique_ptr CredentialsFactory::DefaultCredentials() { - grpc_credentials *c_creds = grpc_default_credentials_create(); +std::unique_ptr CredentialsFactory::GoogleDefaultCredentials() { + grpc_credentials *c_creds = grpc_google_default_credentials_create(); std::unique_ptr cpp_creds(new Credentials(c_creds)); return cpp_creds; } @@ -86,6 +86,18 @@ std::unique_ptr CredentialsFactory::ServiceAccountCredentials( return cpp_creds; } +// Builds JWT credentials. +std::unique_ptr CredentialsFactory::JWTCredentials( + const grpc::string &json_key, std::chrono::seconds token_lifetime) { + gpr_timespec lifetime = gpr_time_from_seconds( + token_lifetime.count() > 0 ? token_lifetime.count() : 0); + grpc_credentials *c_creds = + grpc_jwt_credentials_create(json_key.c_str(), lifetime); + std::unique_ptr cpp_creds( + c_creds == nullptr ? nullptr : new Credentials(c_creds)); + return cpp_creds; +} + // Builds IAM credentials. std::unique_ptr CredentialsFactory::IAMCredentials( const grpc::string &authorization_token, @@ -98,7 +110,7 @@ std::unique_ptr CredentialsFactory::IAMCredentials( } // Combines two credentials objects into a composite credentials. -std::unique_ptr CredentialsFactory::ComposeCredentials( +std::unique_ptr CredentialsFactory::CompositeCredentials( const std::unique_ptr &creds1, const std::unique_ptr &creds2) { // Note that we are not saving unique_ptrs to the two credentials diff --git a/test/core/security/print_default_creds_token.c b/test/core/security/print_default_creds_token.c deleted file mode 100644 index b11acace40..0000000000 --- a/test/core/security/print_default_creds_token.c +++ /dev/null @@ -1,107 +0,0 @@ -/* - * - * 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. - * - */ - -#include -#include - -#include "src/core/security/credentials.h" -#include -#include -#include -#include -#include -#include -#include - -typedef struct { - gpr_cv cv; - gpr_mu mu; - int is_done; -} synchronizer; - -static void on_metadata_response(void *user_data, grpc_mdelem **md_elems, - size_t num_md, - grpc_credentials_status status) { - synchronizer *sync = user_data; - if (status == GRPC_CREDENTIALS_ERROR) { - fprintf(stderr, "Fetching token failed.\n"); - } else { - GPR_ASSERT(num_md == 1); - printf("\nGot token: %s\n\n", - (const char *)GPR_SLICE_START_PTR(md_elems[0]->value->slice)); - } - gpr_mu_lock(&sync->mu); - sync->is_done = 1; - gpr_mu_unlock(&sync->mu); - gpr_cv_signal(&sync->cv); -} - -int main(int argc, char **argv) { - int result = 0; - synchronizer sync; - grpc_credentials *creds = NULL; - char *service_url = "https://test.foo.google.com/Foo"; - gpr_cmdline *cl = gpr_cmdline_create("print_default_creds_token"); - gpr_cmdline_add_string(cl, "service_url", - "Service URL for the token request.", - &service_url); - gpr_cmdline_parse(cl, argc, argv); - - grpc_init(); - - creds = grpc_default_credentials_create(); - if (creds == NULL) { - fprintf(stderr, "\nCould not find default credentials.\n\n"); - result = 1; - goto end; - } - - gpr_mu_init(&sync.mu); - gpr_cv_init(&sync.cv); - sync.is_done = 0; - - grpc_credentials_get_request_metadata(creds, "", on_metadata_response, &sync); - - gpr_mu_lock(&sync.mu); - while (!sync.is_done) gpr_cv_wait(&sync.cv, &sync.mu, gpr_inf_future); - gpr_mu_unlock(&sync.mu); - - gpr_mu_destroy(&sync.mu); - gpr_cv_destroy(&sync.cv); - grpc_credentials_release(creds); - -end: - gpr_cmdline_destroy(cl); - grpc_shutdown(); - return result; -} diff --git a/test/core/security/print_google_default_creds_token.c b/test/core/security/print_google_default_creds_token.c new file mode 100644 index 0000000000..cfd62cf6cc --- /dev/null +++ b/test/core/security/print_google_default_creds_token.c @@ -0,0 +1,107 @@ +/* + * + * 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. + * + */ + +#include +#include + +#include "src/core/security/credentials.h" +#include +#include +#include +#include +#include +#include +#include + +typedef struct { + gpr_cv cv; + gpr_mu mu; + int is_done; +} synchronizer; + +static void on_metadata_response(void *user_data, grpc_mdelem **md_elems, + size_t num_md, + grpc_credentials_status status) { + synchronizer *sync = user_data; + if (status == GRPC_CREDENTIALS_ERROR) { + fprintf(stderr, "Fetching token failed.\n"); + } else { + GPR_ASSERT(num_md == 1); + printf("\nGot token: %s\n\n", + (const char *)GPR_SLICE_START_PTR(md_elems[0]->value->slice)); + } + gpr_mu_lock(&sync->mu); + sync->is_done = 1; + gpr_mu_unlock(&sync->mu); + gpr_cv_signal(&sync->cv); +} + +int main(int argc, char **argv) { + int result = 0; + synchronizer sync; + grpc_credentials *creds = NULL; + char *service_url = "https://test.foo.google.com/Foo"; + gpr_cmdline *cl = gpr_cmdline_create("print_google_default_creds_token"); + gpr_cmdline_add_string(cl, "service_url", + "Service URL for the token request.", + &service_url); + gpr_cmdline_parse(cl, argc, argv); + + grpc_init(); + + creds = grpc_google_default_credentials_create(); + if (creds == NULL) { + fprintf(stderr, "\nCould not find default credentials.\n\n"); + result = 1; + goto end; + } + + gpr_mu_init(&sync.mu); + gpr_cv_init(&sync.cv); + sync.is_done = 0; + + grpc_credentials_get_request_metadata(creds, "", on_metadata_response, &sync); + + gpr_mu_lock(&sync.mu); + while (!sync.is_done) gpr_cv_wait(&sync.cv, &sync.mu, gpr_inf_future); + gpr_mu_unlock(&sync.mu); + + gpr_mu_destroy(&sync.mu); + gpr_cv_destroy(&sync.cv); + grpc_credentials_release(creds); + +end: + gpr_cmdline_destroy(cl); + grpc_shutdown(); + return result; +} diff --git a/test/cpp/util/create_test_channel.cc b/test/cpp/util/create_test_channel.cc index b0472d32a9..66a9a7b7c4 100644 --- a/test/cpp/util/create_test_channel.cc +++ b/test/cpp/util/create_test_channel.cc @@ -75,7 +75,7 @@ std::shared_ptr CreateTestChannel( server.empty() ? override_hostname : server; if (creds.get()) { channel_creds = - CredentialsFactory::ComposeCredentials(creds, channel_creds); + CredentialsFactory::CompositeCredentials(creds, channel_creds); } return CreateChannel(connect_to, channel_creds, channel_args); } else { diff --git a/vsprojects/vs2013/Grpc.mak b/vsprojects/vs2013/Grpc.mak index 2591a82321..313263b70c 100644 --- a/vsprojects/vs2013/Grpc.mak +++ b/vsprojects/vs2013/Grpc.mak @@ -450,13 +450,13 @@ grpc_json_token_test: grpc_json_token_test.exe echo Running grpc_json_token_test $(OUT_DIR)\grpc_json_token_test.exe -grpc_print_default_creds_token.exe: grpc_test_util - echo Building grpc_print_default_creds_token - $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\security\print_default_creds_token.c - $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_print_default_creds_token.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\print_default_creds_token.obj -grpc_print_default_creds_token: grpc_print_default_creds_token.exe - echo Running grpc_print_default_creds_token - $(OUT_DIR)\grpc_print_default_creds_token.exe +grpc_print_google_default_creds_token.exe: grpc_test_util + echo Building grpc_print_google_default_creds_token + $(CC) $(CFLAGS) /Fo:$(OUT_DIR)\ ..\..\test\core\security\print_google_default_creds_token.c + $(LINK) $(LFLAGS) /OUT:"$(OUT_DIR)\grpc_print_google_default_creds_token.exe" Debug\grpc_test_util.lib Debug\grpc.lib Debug\gpr_test_util.lib Debug\gpr.lib $(LIBS) $(OUT_DIR)\print_google_default_creds_token.obj +grpc_print_google_default_creds_token: grpc_print_google_default_creds_token.exe + echo Running grpc_print_google_default_creds_token + $(OUT_DIR)\grpc_print_google_default_creds_token.exe grpc_stream_op_test.exe: grpc_test_util echo Building grpc_stream_op_test diff --git a/vsprojects/vs2013/grpc.vcxproj b/vsprojects/vs2013/grpc.vcxproj index bdbca9222d..48f975f99b 100644 --- a/vsprojects/vs2013/grpc.vcxproj +++ b/vsprojects/vs2013/grpc.vcxproj @@ -205,10 +205,10 @@ - - + + diff --git a/vsprojects/vs2013/grpc.vcxproj.filters b/vsprojects/vs2013/grpc.vcxproj.filters index d3dd374eb6..867e54516c 100644 --- a/vsprojects/vs2013/grpc.vcxproj.filters +++ b/vsprojects/vs2013/grpc.vcxproj.filters @@ -28,10 +28,10 @@ src\core\security - + src\core\security - + src\core\security diff --git a/vsprojects/vs2013/grpc_shared.vcxproj b/vsprojects/vs2013/grpc_shared.vcxproj index 9655bb90b5..4b2f1e725e 100644 --- a/vsprojects/vs2013/grpc_shared.vcxproj +++ b/vsprojects/vs2013/grpc_shared.vcxproj @@ -209,10 +209,10 @@ - - + + diff --git a/vsprojects/vs2013/grpc_shared.vcxproj.filters b/vsprojects/vs2013/grpc_shared.vcxproj.filters index d3dd374eb6..867e54516c 100644 --- a/vsprojects/vs2013/grpc_shared.vcxproj.filters +++ b/vsprojects/vs2013/grpc_shared.vcxproj.filters @@ -28,10 +28,10 @@ src\core\security - + src\core\security - + src\core\security -- cgit v1.2.3 From 65b0759653bf36e6ed71e61f57796b85ab6f5ac9 Mon Sep 17 00:00:00 2001 From: Nicolas Noble Date: Mon, 23 Feb 2015 15:28:04 -0800 Subject: Addressing a first batch of feedback. --- include/grpc/support/atm.h | 4 ++-- include/grpc/support/sync.h | 2 +- include/grpc/support/sync_posix.h | 1 - include/grpc/support/sync_win32.h | 1 - include/grpc/support/time.h | 2 +- src/core/support/log_win32.c | 2 +- src/core/support/string_posix.c | 2 +- src/core/support/sync.c | 4 ++-- src/core/support/time.c | 14 +++++++------- src/cpp/server/thread_pool.cc | 6 +++--- test/core/support/time_test.c | 8 ++++---- 11 files changed, 22 insertions(+), 24 deletions(-) (limited to 'include') diff --git a/include/grpc/support/atm.h b/include/grpc/support/atm.h index 0cac9bf586..f1e30d31e8 100644 --- a/include/grpc/support/atm.h +++ b/include/grpc/support/atm.h @@ -51,12 +51,12 @@ The routines may be implemented as macros. - // Atomic operations acton an intergral_type gpr_atm that is guaranteed to + // Atomic operations act on an intergral_type gpr_atm that is guaranteed to // be the same size as a pointer. typedef gpr_intptr gpr_atm; // A memory barrier, providing both acquire and release semantics, but not - // otherwise acting no memory. + // otherwise acting on memory. void gpr_atm_full_barrier(void); // Atomically return *p, with acquire semantics. diff --git a/include/grpc/support/sync.h b/include/grpc/support/sync.h index 4437375db7..bc99317f3c 100644 --- a/include/grpc/support/sync.h +++ b/include/grpc/support/sync.h @@ -206,7 +206,7 @@ void *gpr_event_cancellable_wait(gpr_event *ev, gpr_timespec abs_deadline, /* --- Reference counting --- - These calls act on the type gpr_refcount. It requires no desctruction. */ + These calls act on the type gpr_refcount. It requires no destruction. */ /* Initialize *r to value n. */ void gpr_ref_init(gpr_refcount *r, int n); diff --git a/include/grpc/support/sync_posix.h b/include/grpc/support/sync_posix.h index 413226a9e8..8ba2c5b892 100644 --- a/include/grpc/support/sync_posix.h +++ b/include/grpc/support/sync_posix.h @@ -36,7 +36,6 @@ #include -/* Posix variant of gpr_sync_platform.h */ #include typedef pthread_mutex_t gpr_mu; diff --git a/include/grpc/support/sync_win32.h b/include/grpc/support/sync_win32.h index 5a48b52a2d..13823b8ee3 100644 --- a/include/grpc/support/sync_win32.h +++ b/include/grpc/support/sync_win32.h @@ -36,7 +36,6 @@ #include -/* Win32 variant of gpr_sync_platform.h */ #include typedef struct { diff --git a/include/grpc/support/time.h b/include/grpc/support/time.h index ebc18c91e9..150b7ac8c5 100644 --- a/include/grpc/support/time.h +++ b/include/grpc/support/time.h @@ -76,7 +76,7 @@ gpr_timespec gpr_time_min(gpr_timespec a, gpr_timespec b); gpr_timespec gpr_time_add(gpr_timespec a, gpr_timespec b); gpr_timespec gpr_time_sub(gpr_timespec a, gpr_timespec b); -/* Return a timespec representing a given number of microseconds. LONG_MIN is +/* Return a timespec representing a given number of time units. LONG_MIN is interpreted as gpr_inf_past, and LONG_MAX as gpr_inf_future. */ gpr_timespec gpr_time_from_micros(long x); gpr_timespec gpr_time_from_nanos(long x); diff --git a/src/core/support/log_win32.c b/src/core/support/log_win32.c index cff130ae18..720dc141f5 100644 --- a/src/core/support/log_win32.c +++ b/src/core/support/log_win32.c @@ -90,7 +90,7 @@ void gpr_default_log(gpr_log_func_args *args) { strcpy(time_buffer, "error:strftime"); } - fprintf(stderr, "%s%s.%09u %5u %s:%d: %s\n", + fprintf(stderr, "%s%s.%09u %5u %s:%d] %s\n", gpr_log_severity_string(args->severity), time_buffer, (int)(now.tv_nsec), GetCurrentThreadId(), args->file, args->line, args->message); diff --git a/src/core/support/string_posix.c b/src/core/support/string_posix.c index 8a678b3103..25c333db4e 100644 --- a/src/core/support/string_posix.c +++ b/src/core/support/string_posix.c @@ -51,7 +51,7 @@ int gpr_asprintf(char **strp, const char *format, ...) { va_start(args, format); ret = vsnprintf(buf, sizeof(buf), format, args); va_end(args); - if (!(0 <= ret)) { + if (ret < 0) { *strp = NULL; return -1; } diff --git a/src/core/support/sync.c b/src/core/support/sync.c index 1a5cf57c4f..ccfe1e25f4 100644 --- a/src/core/support/sync.c +++ b/src/core/support/sync.c @@ -41,7 +41,7 @@ Should be a prime. */ enum { event_sync_partitions = 31 }; -/* Event are partitioned by address to avoid lock contention. */ +/* Events are partitioned by address to avoid lock contention. */ static struct sync_array_s { gpr_mu mu; gpr_cv cv; @@ -71,10 +71,10 @@ void gpr_event_set(gpr_event *ev, void *value) { struct sync_array_s *s = hash(ev); gpr_mu_lock(&s->mu); GPR_ASSERT(gpr_atm_acq_load(&ev->state) == 0); - GPR_ASSERT(value != NULL); gpr_atm_rel_store(&ev->state, (gpr_atm)value); gpr_cv_broadcast(&s->cv); gpr_mu_unlock(&s->mu); + GPR_ASSERT(value != NULL); } void *gpr_event_get(gpr_event *ev) { diff --git a/src/core/support/time.c b/src/core/support/time.c index 67f7665650..7dbf95059f 100644 --- a/src/core/support/time.c +++ b/src/core/support/time.c @@ -85,12 +85,12 @@ gpr_timespec gpr_time_from_nanos(long ns) { } else if (ns == LONG_MIN) { result = gpr_inf_past; } else if (ns >= 0) { - result.tv_sec = ns / 1000000000; - result.tv_nsec = ns - result.tv_sec * 1000000000; + result.tv_sec = ns / GPR_NS_PER_SEC; + result.tv_nsec = ns - result.tv_sec * GPR_NS_PER_SEC; } else { /* Calculation carefully formulated to avoid any possible under/overflow. */ - result.tv_sec = (-(999999999 - (ns + 1000000000)) / 1000000000) - 1; - result.tv_nsec = ns - result.tv_sec * 1000000000; + result.tv_sec = (-(999999999 - (ns + GPR_NS_PER_SEC)) / GPR_NS_PER_SEC) - 1; + result.tv_nsec = ns - result.tv_sec * GPR_NS_PER_SEC; } return result; } @@ -172,8 +172,8 @@ gpr_timespec gpr_time_add(gpr_timespec a, gpr_timespec b) { gpr_timespec sum; int inc = 0; sum.tv_nsec = a.tv_nsec + b.tv_nsec; - if (sum.tv_nsec >= 1000000000) { - sum.tv_nsec -= 1000000000; + if (sum.tv_nsec >= GPR_NS_PER_SEC) { + sum.tv_nsec -= GPR_NS_PER_SEC; inc++; } if (a.tv_sec == TYPE_MAX(time_t) || a.tv_sec == TYPE_MIN(time_t)) { @@ -200,7 +200,7 @@ gpr_timespec gpr_time_sub(gpr_timespec a, gpr_timespec b) { int dec = 0; diff.tv_nsec = a.tv_nsec - b.tv_nsec; if (diff.tv_nsec < 0) { - diff.tv_nsec += 1000000000; + diff.tv_nsec += GPR_NS_PER_SEC; dec++; } if (a.tv_sec == TYPE_MAX(time_t) || a.tv_sec == TYPE_MIN(time_t)) { diff --git a/src/cpp/server/thread_pool.cc b/src/cpp/server/thread_pool.cc index 1ca98129d3..fa11ddd04c 100644 --- a/src/cpp/server/thread_pool.cc +++ b/src/cpp/server/thread_pool.cc @@ -37,11 +37,11 @@ namespace grpc { ThreadPool::ThreadPool(int num_threads) { for (int i = 0; i < num_threads; i++) { - threads_.push_back(std::thread([=]() { + threads_.push_back(std::thread([this]() { for (;;) { - std::unique_lock lock(mu_); // Wait until work is available or we are shutting down. - auto have_work = [=]() { return shutdown_ || !callbacks_.empty(); }; + auto have_work = [this]() { return shutdown_ || !callbacks_.empty(); }; + std::unique_lock lock(mu_); if (!have_work()) { cv_.wait(lock, have_work); } diff --git a/test/core/support/time_test.c b/test/core/support/time_test.c index 2741e17f95..c1dce777b0 100644 --- a/test/core/support/time_test.c +++ b/test/core/support/time_test.c @@ -81,7 +81,7 @@ static void ts_to_s(gpr_timespec t, void *arg) { if (t.tv_sec < 0 && t.tv_nsec != 0) { t.tv_sec++; - t.tv_nsec = 1000000000 - t.tv_nsec; + t.tv_nsec = GPR_NS_PER_SEC - t.tv_nsec; } i_to_s(t.tv_sec, 10, 0, writer, arg); (*writer)(arg, ".", 1); @@ -127,15 +127,15 @@ static void test_values(void) { /* Test possible overflow in conversion of -ve values. */ x = gpr_time_from_micros(-(LONG_MAX - 999997)); GPR_ASSERT(x.tv_sec < 0); - GPR_ASSERT(x.tv_nsec >= 0 && x.tv_nsec < 1000000000); + GPR_ASSERT(x.tv_nsec >= 0 && x.tv_nsec < GPR_NS_PER_SEC); x = gpr_time_from_nanos(-(LONG_MAX - 999999997)); GPR_ASSERT(x.tv_sec < 0); - GPR_ASSERT(x.tv_nsec >= 0 && x.tv_nsec < 1000000000); + GPR_ASSERT(x.tv_nsec >= 0 && x.tv_nsec < GPR_NS_PER_SEC); x = gpr_time_from_millis(-(LONG_MAX - 997)); GPR_ASSERT(x.tv_sec < 0); - GPR_ASSERT(x.tv_nsec >= 0 && x.tv_nsec < 1000000000); + GPR_ASSERT(x.tv_nsec >= 0 && x.tv_nsec < GPR_NS_PER_SEC); /* Test general -ve values. */ for (i = -1; i > -1000 * 1000 * 1000; i *= 7) { -- cgit v1.2.3