mirror of https://github.com/grpc/grpc.git
commit
2c77f75b74
35 changed files with 934 additions and 170 deletions
@ -0,0 +1,166 @@ |
|||||||
|
/*
|
||||||
|
* |
||||||
|
* 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 <grpc/support/port_platform.h> |
||||||
|
#ifdef GPR_WINSOCK_SOCKET |
||||||
|
|
||||||
|
#include "src/core/iomgr/sockaddr.h" |
||||||
|
#include "src/core/iomgr/resolve_address.h" |
||||||
|
|
||||||
|
#include <sys/types.h> |
||||||
|
#include <string.h> |
||||||
|
|
||||||
|
#include "src/core/iomgr/iomgr_internal.h" |
||||||
|
#include "src/core/iomgr/sockaddr_utils.h" |
||||||
|
#include "src/core/support/string.h" |
||||||
|
#include <grpc/support/alloc.h> |
||||||
|
#include <grpc/support/host_port.h> |
||||||
|
#include <grpc/support/log.h> |
||||||
|
#include <grpc/support/thd.h> |
||||||
|
#include <grpc/support/time.h> |
||||||
|
|
||||||
|
typedef struct { |
||||||
|
char *name; |
||||||
|
char *default_port; |
||||||
|
grpc_resolve_cb cb; |
||||||
|
void *arg; |
||||||
|
} request; |
||||||
|
|
||||||
|
grpc_resolved_addresses *grpc_blocking_resolve_address( |
||||||
|
const char *name, const char *default_port) { |
||||||
|
struct addrinfo hints; |
||||||
|
struct addrinfo *result = NULL, *resp; |
||||||
|
char *host; |
||||||
|
char *port; |
||||||
|
int s; |
||||||
|
size_t i; |
||||||
|
grpc_resolved_addresses *addrs = NULL; |
||||||
|
const gpr_timespec start_time = gpr_now(); |
||||||
|
|
||||||
|
/* parse name, splitting it into host and port parts */ |
||||||
|
gpr_split_host_port(name, &host, &port); |
||||||
|
if (host == NULL) { |
||||||
|
gpr_log(GPR_ERROR, "unparseable host:port: '%s'", name); |
||||||
|
goto done; |
||||||
|
} |
||||||
|
if (port == NULL) { |
||||||
|
if (default_port == NULL) { |
||||||
|
gpr_log(GPR_ERROR, "no port in name '%s'", name); |
||||||
|
goto done; |
||||||
|
} |
||||||
|
port = gpr_strdup(default_port); |
||||||
|
} |
||||||
|
|
||||||
|
/* Call getaddrinfo */ |
||||||
|
memset(&hints, 0, sizeof(hints)); |
||||||
|
hints.ai_family = AF_UNSPEC; /* ipv4 or ipv6 */ |
||||||
|
hints.ai_socktype = SOCK_STREAM; /* stream socket */ |
||||||
|
hints.ai_flags = AI_PASSIVE; /* for wildcard IP address */ |
||||||
|
|
||||||
|
s = getaddrinfo(host, port, &hints, &result); |
||||||
|
if (s != 0) { |
||||||
|
gpr_log(GPR_ERROR, "getaddrinfo: %s", gai_strerror(s)); |
||||||
|
goto done; |
||||||
|
} |
||||||
|
|
||||||
|
/* Success path: set addrs non-NULL, fill it in */ |
||||||
|
addrs = gpr_malloc(sizeof(grpc_resolved_addresses)); |
||||||
|
addrs->naddrs = 0; |
||||||
|
for (resp = result; resp != NULL; resp = resp->ai_next) { |
||||||
|
addrs->naddrs++; |
||||||
|
} |
||||||
|
addrs->addrs = gpr_malloc(sizeof(grpc_resolved_address) * addrs->naddrs); |
||||||
|
i = 0; |
||||||
|
for (resp = result; resp != NULL; resp = resp->ai_next) { |
||||||
|
memcpy(&addrs->addrs[i].addr, resp->ai_addr, resp->ai_addrlen); |
||||||
|
addrs->addrs[i].len = resp->ai_addrlen; |
||||||
|
i++; |
||||||
|
} |
||||||
|
|
||||||
|
/* Temporary logging, to help identify flakiness in dualstack_socket_test. */ |
||||||
|
{ |
||||||
|
const gpr_timespec delay = gpr_time_sub(gpr_now(), start_time); |
||||||
|
const int delay_ms = |
||||||
|
delay.tv_sec * GPR_MS_PER_SEC + delay.tv_nsec / GPR_NS_PER_MS; |
||||||
|
gpr_log(GPR_INFO, "logspam: getaddrinfo(%s, %s) resolved %d addrs in %dms:", |
||||||
|
host, port, addrs->naddrs, delay_ms); |
||||||
|
for (i = 0; i < addrs->naddrs; i++) { |
||||||
|
char *buf; |
||||||
|
grpc_sockaddr_to_string(&buf, (struct sockaddr *)&addrs->addrs[i].addr, |
||||||
|
0); |
||||||
|
gpr_log(GPR_INFO, "logspam: [%d] %s", i, buf); |
||||||
|
gpr_free(buf); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
done: |
||||||
|
gpr_free(host); |
||||||
|
gpr_free(port); |
||||||
|
if (result) { |
||||||
|
freeaddrinfo(result); |
||||||
|
} |
||||||
|
return addrs; |
||||||
|
} |
||||||
|
|
||||||
|
/* Thread function to asynch-ify grpc_blocking_resolve_address */ |
||||||
|
static void do_request(void *rp) { |
||||||
|
request *r = rp; |
||||||
|
grpc_resolved_addresses *resolved = |
||||||
|
grpc_blocking_resolve_address(r->name, r->default_port); |
||||||
|
void *arg = r->arg; |
||||||
|
grpc_resolve_cb cb = r->cb; |
||||||
|
gpr_free(r->name); |
||||||
|
gpr_free(r->default_port); |
||||||
|
gpr_free(r); |
||||||
|
cb(arg, resolved); |
||||||
|
grpc_iomgr_unref(); |
||||||
|
} |
||||||
|
|
||||||
|
void grpc_resolved_addresses_destroy(grpc_resolved_addresses *addrs) { |
||||||
|
gpr_free(addrs->addrs); |
||||||
|
gpr_free(addrs); |
||||||
|
} |
||||||
|
|
||||||
|
void grpc_resolve_address(const char *name, const char *default_port, |
||||||
|
grpc_resolve_cb cb, void *arg) { |
||||||
|
request *r = gpr_malloc(sizeof(request)); |
||||||
|
gpr_thd_id id; |
||||||
|
grpc_iomgr_ref(); |
||||||
|
r->name = gpr_strdup(name); |
||||||
|
r->default_port = gpr_strdup(default_port); |
||||||
|
r->cb = cb; |
||||||
|
r->arg = arg; |
||||||
|
gpr_thd_new(&id, do_request, r, NULL); |
||||||
|
} |
||||||
|
|
||||||
|
#endif |
@ -0,0 +1,110 @@ |
|||||||
|
/*
|
||||||
|
* |
||||||
|
* 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 <stdio.h> |
||||||
|
#include <string.h> |
||||||
|
|
||||||
|
#include "src/core/security/credentials.h" |
||||||
|
#include "src/core/security/json_token.h" |
||||||
|
#include "src/core/support/file.h" |
||||||
|
|
||||||
|
#include <grpc/support/alloc.h> |
||||||
|
#include <grpc/support/cmdline.h> |
||||||
|
#include <grpc/support/log.h> |
||||||
|
#include <grpc/support/slice.h> |
||||||
|
|
||||||
|
void create_jwt(const char *json_key_file_path, const char *service_url, |
||||||
|
const char *scope) { |
||||||
|
grpc_auth_json_key key; |
||||||
|
int ok = 0; |
||||||
|
char *jwt; |
||||||
|
gpr_slice json_key_data = gpr_load_file(json_key_file_path, &ok); |
||||||
|
if (!ok) { |
||||||
|
fprintf(stderr, "Could not read %s.\n", json_key_file_path); |
||||||
|
exit(1); |
||||||
|
} |
||||||
|
key = grpc_auth_json_key_create_from_string( |
||||||
|
(const char *)GPR_SLICE_START_PTR(json_key_data)); |
||||||
|
gpr_slice_unref(json_key_data); |
||||||
|
if (!grpc_auth_json_key_is_valid(&key)) { |
||||||
|
fprintf(stderr, "Could not parse json key.\n"); |
||||||
|
exit(1); |
||||||
|
} |
||||||
|
jwt = grpc_jwt_encode_and_sign( |
||||||
|
&key, service_url == NULL ? GRPC_JWT_OAUTH2_AUDIENCE : service_url, |
||||||
|
grpc_max_auth_token_lifetime, scope); |
||||||
|
grpc_auth_json_key_destruct(&key); |
||||||
|
if (jwt == NULL) { |
||||||
|
fprintf(stderr, "Could not create JWT.\n"); |
||||||
|
exit(1); |
||||||
|
} |
||||||
|
fprintf(stdout, "%s\n", jwt); |
||||||
|
gpr_free(jwt); |
||||||
|
} |
||||||
|
|
||||||
|
int main(int argc, char **argv) { |
||||||
|
char *scope = NULL; |
||||||
|
char *json_key_file_path = NULL; |
||||||
|
char *service_url = NULL; |
||||||
|
gpr_cmdline *cl = gpr_cmdline_create("create_jwt"); |
||||||
|
gpr_cmdline_add_string(cl, "json_key", "File path of the json key.", |
||||||
|
&json_key_file_path); |
||||||
|
gpr_cmdline_add_string(cl, "scope", |
||||||
|
"OPTIONAL Space delimited permissions. Mutually " |
||||||
|
"exclusive with service_url", |
||||||
|
&scope); |
||||||
|
gpr_cmdline_add_string(cl, "service_url", |
||||||
|
"OPTIONAL service URL. Mutually exclusive with scope.", |
||||||
|
&service_url); |
||||||
|
gpr_cmdline_parse(cl, argc, argv); |
||||||
|
|
||||||
|
if (json_key_file_path == NULL) { |
||||||
|
fprintf(stderr, "Missing --json_key option.\n"); |
||||||
|
exit(1); |
||||||
|
} |
||||||
|
if (scope != NULL) { |
||||||
|
if (service_url != NULL) { |
||||||
|
fprintf(stderr, |
||||||
|
"Options --scope and --service_url are mutually exclusive.\n"); |
||||||
|
exit(1); |
||||||
|
} |
||||||
|
} else if (service_url == NULL) { |
||||||
|
fprintf(stderr, "Need one of --service_url or --scope options.\n"); |
||||||
|
exit(1); |
||||||
|
} |
||||||
|
|
||||||
|
create_jwt(json_key_file_path, service_url, scope); |
||||||
|
|
||||||
|
gpr_cmdline_destroy(cl); |
||||||
|
return 0; |
||||||
|
} |
Loading…
Reference in new issue