grpc 0.14.1 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (277) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +1398 -817
  3. data/include/grpc/compression.h +2 -1
  4. data/include/grpc/grpc.h +10 -1
  5. data/include/grpc/grpc_cronet.h +51 -0
  6. data/include/grpc/grpc_posix.h +70 -0
  7. data/include/grpc/impl/codegen/atm.h +2 -2
  8. data/include/grpc/impl/codegen/{atm_win32.h → atm_windows.h} +3 -3
  9. data/include/grpc/impl/codegen/compression_types.h +39 -5
  10. data/include/grpc/impl/codegen/connectivity_state.h +1 -1
  11. data/include/grpc/impl/codegen/grpc_types.h +10 -0
  12. data/include/grpc/impl/codegen/log.h +2 -1
  13. data/include/grpc/impl/codegen/port_platform.h +30 -12
  14. data/include/grpc/impl/codegen/slice_buffer.h +2 -3
  15. data/include/grpc/impl/codegen/sync.h +2 -2
  16. data/include/grpc/impl/codegen/{sync_win32.h → sync_windows.h} +3 -3
  17. data/include/grpc/support/{sync_win32.h → atm_windows.h} +4 -4
  18. data/include/grpc/support/avl.h +5 -0
  19. data/include/grpc/support/{log_win32.h → log_windows.h} +3 -3
  20. data/include/grpc/support/string_util.h +2 -1
  21. data/include/grpc/support/{atm_win32.h → sync_windows.h} +4 -4
  22. data/src/core/ext/census/gen/census.pb.c +179 -0
  23. data/src/core/ext/census/gen/census.pb.h +294 -0
  24. data/src/core/ext/census/grpc_filter.c +11 -7
  25. data/src/core/ext/client_config/channel_connectivity.c +28 -14
  26. data/src/core/ext/client_config/client_channel.c +77 -53
  27. data/src/core/ext/client_config/connector.h +1 -1
  28. data/src/core/ext/client_config/lb_policy.c +9 -6
  29. data/src/core/ext/client_config/lb_policy.h +9 -5
  30. data/src/core/ext/client_config/subchannel.c +58 -39
  31. data/src/core/ext/client_config/subchannel.h +3 -2
  32. data/src/core/ext/client_config/subchannel_call_holder.c +34 -19
  33. data/src/core/ext/client_config/subchannel_call_holder.h +2 -1
  34. data/src/core/ext/client_config/subchannel_index.c +20 -9
  35. data/src/core/ext/lb_policy/grpclb/load_balancer_api.c +7 -7
  36. data/src/core/ext/lb_policy/grpclb/load_balancer_api.h +5 -5
  37. data/src/core/ext/lb_policy/grpclb/proto/grpc/lb/{v0 → v1}/load_balancer.pb.c +29 -30
  38. data/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +178 -0
  39. data/src/core/ext/lb_policy/pick_first/pick_first.c +65 -45
  40. data/src/core/ext/lb_policy/round_robin/round_robin.c +84 -43
  41. data/src/core/ext/load_reporting/load_reporting.c +133 -0
  42. data/src/core/ext/load_reporting/load_reporting.h +75 -0
  43. data/src/core/ext/load_reporting/load_reporting_filter.c +151 -0
  44. data/src/core/ext/load_reporting/load_reporting_filter.h +41 -0
  45. data/src/core/ext/resolver/dns/native/dns_resolver.c +22 -8
  46. data/src/core/ext/resolver/sockaddr/sockaddr_resolver.c +2 -2
  47. data/src/core/ext/transport/chttp2/client/insecure/channel_create.c +4 -4
  48. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.c +95 -0
  49. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.c +14 -18
  50. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.c +49 -24
  51. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.c +82 -0
  52. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.c +104 -60
  53. data/src/core/ext/transport/chttp2/transport/bin_decoder.c +232 -0
  54. data/src/{ruby/ext/grpc/rb_signal.c → core/ext/transport/chttp2/transport/bin_decoder.h} +27 -31
  55. data/src/core/ext/transport/chttp2/transport/chttp2_transport.c +481 -260
  56. data/src/core/ext/transport/chttp2/transport/frame.h +1 -7
  57. data/src/core/ext/transport/chttp2/transport/frame_data.c +44 -27
  58. data/src/core/ext/transport/chttp2/transport/frame_data.h +6 -5
  59. data/src/core/ext/transport/chttp2/transport/frame_goaway.c +23 -17
  60. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +2 -2
  61. data/src/core/ext/transport/chttp2/transport/frame_ping.c +12 -7
  62. data/src/core/ext/transport/chttp2/transport/frame_ping.h +3 -3
  63. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.c +25 -12
  64. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +2 -2
  65. data/src/core/ext/transport/chttp2/transport/frame_settings.c +23 -21
  66. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -2
  67. data/src/core/ext/transport/chttp2/transport/frame_window_update.c +17 -9
  68. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +2 -2
  69. data/src/core/ext/transport/chttp2/transport/hpack_parser.c +365 -287
  70. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +8 -6
  71. data/src/core/ext/transport/chttp2/transport/hpack_table.c +24 -20
  72. data/src/core/ext/transport/chttp2/transport/hpack_table.h +5 -4
  73. data/src/core/ext/transport/chttp2/transport/incoming_metadata.c +1 -0
  74. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +1 -0
  75. data/src/core/ext/transport/chttp2/transport/internal.h +34 -32
  76. data/src/core/ext/transport/chttp2/transport/parsing.c +296 -212
  77. data/src/core/ext/transport/chttp2/transport/writing.c +12 -9
  78. data/src/core/lib/channel/channel_args.c +26 -12
  79. data/src/core/lib/channel/channel_args.h +1 -1
  80. data/src/core/lib/channel/channel_stack.c +12 -8
  81. data/src/core/lib/channel/channel_stack.h +27 -11
  82. data/src/core/lib/channel/channel_stack_builder.c +2 -2
  83. data/src/core/lib/channel/compress_filter.c +26 -31
  84. data/src/core/lib/channel/compress_filter.h +4 -4
  85. data/src/core/lib/channel/connected_channel.c +7 -5
  86. data/src/core/lib/channel/http_client_filter.c +34 -8
  87. data/src/core/lib/channel/http_client_filter.h +1 -1
  88. data/src/core/lib/channel/http_server_filter.c +21 -12
  89. data/src/core/lib/compression/{compression_algorithm.c → compression.c} +22 -21
  90. data/src/core/lib/http/httpcli.c +81 -59
  91. data/src/core/lib/http/httpcli.h +11 -15
  92. data/src/core/lib/http/httpcli_security_connector.c +5 -3
  93. data/src/core/lib/http/parser.c +127 -118
  94. data/src/core/lib/http/parser.h +11 -6
  95. data/src/core/lib/iomgr/closure.c +20 -16
  96. data/src/core/lib/iomgr/closure.h +19 -15
  97. data/src/core/lib/iomgr/endpoint.h +1 -1
  98. data/src/core/lib/iomgr/endpoint_pair_posix.c +2 -2
  99. data/src/core/lib/iomgr/error.c +535 -0
  100. data/src/core/lib/iomgr/error.h +192 -0
  101. data/src/core/lib/iomgr/ev_poll_and_epoll_posix.c +190 -83
  102. data/src/core/lib/iomgr/ev_poll_posix.c +1267 -0
  103. data/src/{ruby/ext/grpc/rb_signal.h → core/lib/iomgr/ev_poll_posix.h} +7 -5
  104. data/src/core/lib/iomgr/ev_posix.c +104 -14
  105. data/src/core/lib/iomgr/ev_posix.h +17 -7
  106. data/src/core/lib/iomgr/exec_ctx.c +25 -7
  107. data/src/core/lib/iomgr/exec_ctx.h +27 -8
  108. data/src/core/lib/iomgr/executor.c +2 -2
  109. data/src/core/lib/iomgr/executor.h +1 -1
  110. data/src/core/lib/iomgr/iocp_windows.c +2 -41
  111. data/src/core/lib/iomgr/iocp_windows.h +0 -8
  112. data/src/core/lib/iomgr/iomgr.c +5 -4
  113. data/src/core/lib/iomgr/iomgr_posix.c +5 -1
  114. data/src/core/lib/iomgr/iomgr_windows.c +1 -1
  115. data/src/core/lib/{support → iomgr}/load_file.c +15 -17
  116. data/src/core/lib/{support → iomgr}/load_file.h +8 -7
  117. data/src/core/lib/iomgr/polling_entity.c +104 -0
  118. data/src/core/lib/iomgr/polling_entity.h +81 -0
  119. data/src/core/lib/iomgr/pollset.h +6 -5
  120. data/src/core/lib/iomgr/pollset_set_windows.c +4 -1
  121. data/src/core/lib/iomgr/pollset_windows.c +10 -6
  122. data/src/core/lib/iomgr/resolve_address.h +5 -9
  123. data/src/core/lib/iomgr/resolve_address_posix.c +55 -38
  124. data/src/core/lib/iomgr/resolve_address_windows.c +51 -37
  125. data/src/core/lib/iomgr/sockaddr.h +2 -2
  126. data/src/core/lib/iomgr/{sockaddr_win32.h → sockaddr_windows.h} +3 -3
  127. data/src/core/lib/iomgr/socket_utils_common_posix.c +92 -45
  128. data/src/core/lib/iomgr/socket_utils_posix.h +19 -12
  129. data/src/core/lib/iomgr/socket_windows.c +61 -2
  130. data/src/core/lib/iomgr/socket_windows.h +13 -0
  131. data/src/core/lib/iomgr/tcp_client_posix.c +54 -39
  132. data/src/core/lib/iomgr/tcp_client_windows.c +34 -34
  133. data/src/core/lib/iomgr/tcp_posix.c +43 -39
  134. data/src/core/lib/iomgr/tcp_server.h +5 -3
  135. data/src/core/lib/iomgr/tcp_server_posix.c +103 -64
  136. data/src/core/lib/iomgr/tcp_server_windows.c +114 -101
  137. data/src/core/lib/iomgr/tcp_windows.c +45 -50
  138. data/src/core/lib/iomgr/tcp_windows.h +1 -1
  139. data/src/core/lib/iomgr/timer.c +26 -13
  140. data/src/core/lib/iomgr/udp_server.c +28 -4
  141. data/src/core/lib/iomgr/udp_server.h +5 -1
  142. data/src/core/lib/iomgr/unix_sockets_posix.c +8 -7
  143. data/src/core/lib/iomgr/unix_sockets_posix.h +2 -1
  144. data/src/core/lib/iomgr/unix_sockets_posix_noop.c +4 -2
  145. data/src/core/lib/iomgr/wakeup_fd_eventfd.c +15 -5
  146. data/src/core/lib/iomgr/wakeup_fd_pipe.c +13 -9
  147. data/src/core/lib/iomgr/wakeup_fd_posix.c +6 -6
  148. data/src/core/lib/iomgr/wakeup_fd_posix.h +9 -6
  149. data/src/core/lib/iomgr/workqueue.h +5 -4
  150. data/src/core/lib/iomgr/workqueue_posix.c +40 -26
  151. data/src/core/lib/iomgr/workqueue_windows.c +2 -2
  152. data/src/core/lib/profiling/basic_timers.c +2 -2
  153. data/src/core/lib/security/{security_context.c → context/security_context.c} +1 -1
  154. data/src/core/lib/security/{security_context.h → context/security_context.h} +4 -4
  155. data/src/core/lib/security/credentials/composite/composite_credentials.c +263 -0
  156. data/src/core/lib/security/credentials/composite/composite_credentials.h +72 -0
  157. data/src/core/lib/security/credentials/credentials.c +233 -0
  158. data/src/core/lib/security/{credentials.h → credentials/credentials.h} +19 -157
  159. data/src/core/lib/security/{credentials_metadata.c → credentials/credentials_metadata.c} +1 -1
  160. data/src/core/lib/security/credentials/fake/fake_credentials.c +139 -0
  161. data/src/core/lib/security/credentials/fake/fake_credentials.h +56 -0
  162. data/src/core/lib/security/{credentials_posix.c → credentials/google_default/credentials_posix.c} +1 -1
  163. data/src/core/lib/security/{credentials_win32.c → credentials/google_default/credentials_windows.c} +3 -3
  164. data/src/core/lib/security/{google_default_credentials.c → credentials/google_default/google_default_credentials.c} +93 -35
  165. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +46 -0
  166. data/src/core/lib/security/credentials/iam/iam_credentials.c +85 -0
  167. data/src/core/lib/security/credentials/iam/iam_credentials.h +44 -0
  168. data/src/core/lib/security/{json_token.c → credentials/jwt/json_token.c} +10 -101
  169. data/src/core/lib/security/{json_token.h → credentials/jwt/json_token.h} +3 -33
  170. data/src/core/lib/security/credentials/jwt/jwt_credentials.c +160 -0
  171. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +62 -0
  172. data/src/core/lib/security/{jwt_verifier.c → credentials/jwt/jwt_verifier.c} +35 -15
  173. data/src/core/lib/security/{jwt_verifier.h → credentials/jwt/jwt_verifier.h} +3 -3
  174. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.c +433 -0
  175. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +109 -0
  176. data/src/core/lib/security/credentials/plugin/plugin_credentials.c +129 -0
  177. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +45 -0
  178. data/src/core/lib/security/credentials/ssl/ssl_credentials.c +240 -0
  179. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +48 -0
  180. data/src/core/lib/security/{auth_filters.h → transport/auth_filters.h} +3 -3
  181. data/src/core/lib/security/{client_auth_filter.c → transport/client_auth_filter.c} +27 -20
  182. data/src/core/lib/security/{handshake.c → transport/handshake.c} +77 -45
  183. data/src/core/lib/security/{handshake.h → transport/handshake.h} +9 -11
  184. data/src/core/lib/security/{secure_endpoint.c → transport/secure_endpoint.c} +19 -12
  185. data/src/core/lib/security/{secure_endpoint.h → transport/secure_endpoint.h} +3 -3
  186. data/src/core/lib/security/{security_connector.c → transport/security_connector.c} +26 -17
  187. data/src/core/lib/security/{security_connector.h → transport/security_connector.h} +8 -8
  188. data/src/core/lib/security/{server_auth_filter.c → transport/server_auth_filter.c} +24 -16
  189. data/src/core/lib/security/transport/tsi_error.c +40 -0
  190. data/src/core/lib/security/transport/tsi_error.h +42 -0
  191. data/src/core/lib/security/{b64.c → util/b64.c} +1 -1
  192. data/src/core/lib/security/{b64.h → util/b64.h} +3 -3
  193. data/src/core/lib/security/util/json_util.c +61 -0
  194. data/src/core/lib/security/util/json_util.h +55 -0
  195. data/src/core/lib/support/avl.c +11 -0
  196. data/src/core/lib/support/cpu_windows.c +2 -2
  197. data/src/core/lib/support/{env_win32.c → env_windows.c} +3 -3
  198. data/src/core/lib/support/log.c +3 -1
  199. data/src/core/lib/support/log_linux.c +2 -2
  200. data/src/core/lib/support/{log_win32.c → log_windows.c} +4 -4
  201. data/src/core/lib/support/murmur_hash.c +3 -5
  202. data/src/core/lib/support/string.c +10 -0
  203. data/src/core/lib/support/string.h +4 -0
  204. data/src/core/lib/support/{string_util_win32.c → string_util_windows.c} +3 -3
  205. data/src/core/lib/support/{string_win32.c → string_windows.c} +2 -2
  206. data/src/core/lib/support/{string_win32.h → string_windows.h} +5 -5
  207. data/src/core/lib/support/subprocess_windows.c +1 -1
  208. data/src/core/lib/support/{sync_win32.c → sync_windows.c} +2 -2
  209. data/src/core/lib/support/{thd_win32.c → thd_windows.c} +2 -2
  210. data/src/core/lib/support/{time_win32.c → time_windows.c} +2 -2
  211. data/src/core/lib/support/tmpfile_msys.c +1 -1
  212. data/src/core/lib/support/{tmpfile_win32.c → tmpfile_windows.c} +3 -3
  213. data/src/core/lib/surface/alarm.c +2 -2
  214. data/src/core/lib/surface/byte_buffer_reader.c +13 -6
  215. data/src/core/lib/surface/call.c +323 -123
  216. data/src/core/lib/surface/call.h +2 -0
  217. data/src/core/lib/surface/call_log_batch.c +1 -1
  218. data/src/core/lib/surface/channel.c +64 -15
  219. data/src/core/lib/surface/channel.h +9 -0
  220. data/src/core/lib/surface/channel_ping.c +3 -3
  221. data/src/core/lib/surface/completion_queue.c +75 -19
  222. data/src/core/lib/surface/completion_queue.h +7 -2
  223. data/src/core/lib/surface/init.c +2 -1
  224. data/src/core/lib/surface/init_secure.c +4 -4
  225. data/src/core/lib/surface/lame_client.c +12 -8
  226. data/src/core/lib/surface/server.c +213 -120
  227. data/src/core/lib/surface/server.h +1 -0
  228. data/src/core/lib/surface/version.c +1 -1
  229. data/src/core/lib/transport/connectivity_state.c +40 -18
  230. data/src/core/lib/transport/connectivity_state.h +4 -1
  231. data/src/core/lib/transport/metadata.c +23 -23
  232. data/src/core/lib/transport/metadata.h +4 -0
  233. data/src/core/lib/transport/metadata_batch.c +9 -0
  234. data/src/core/lib/transport/metadata_batch.h +3 -0
  235. data/src/core/lib/transport/static_metadata.c +6 -5
  236. data/src/core/lib/transport/static_metadata.h +64 -60
  237. data/src/core/lib/transport/transport.c +24 -12
  238. data/src/core/lib/transport/transport.h +6 -5
  239. data/src/core/lib/transport/transport_impl.h +4 -0
  240. data/src/core/lib/transport/transport_op_string.c +2 -2
  241. data/src/core/plugin_registry/grpc_plugin_registry.c +4 -0
  242. data/src/ruby/bin/math_services.rb +41 -2
  243. data/src/ruby/ext/grpc/rb_call.c +42 -40
  244. data/src/ruby/ext/grpc/rb_channel.c +1 -1
  245. data/src/ruby/ext/grpc/rb_completion_queue.c +59 -6
  246. data/src/ruby/ext/grpc/rb_completion_queue.h +1 -1
  247. data/src/ruby/ext/grpc/rb_grpc.c +1 -3
  248. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +12 -2
  249. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +21 -5
  250. data/src/ruby/ext/grpc/rb_loader.c +1 -1
  251. data/src/ruby/ext/grpc/rb_server.c +5 -3
  252. data/src/ruby/lib/grpc.rb +0 -3
  253. data/src/ruby/lib/grpc/errors.rb +3 -2
  254. data/src/ruby/lib/grpc/generic/active_call.rb +32 -42
  255. data/src/ruby/lib/grpc/generic/bidi_call.rb +20 -0
  256. data/src/ruby/lib/grpc/generic/client_stub.rb +31 -54
  257. data/src/ruby/lib/grpc/generic/rpc_desc.rb +4 -4
  258. data/src/ruby/lib/grpc/generic/rpc_server.rb +12 -23
  259. data/src/ruby/lib/grpc/generic/service.rb +8 -8
  260. data/src/ruby/lib/grpc/version.rb +1 -1
  261. data/src/ruby/pb/grpc/health/v1/health_services.rb +30 -2
  262. data/src/ruby/pb/grpc/testing/duplicate/echo_duplicate_services.rb +34 -4
  263. data/src/ruby/pb/grpc/testing/metrics_services.rb +39 -2
  264. data/src/ruby/pb/src/proto/grpc/testing/empty.rb +15 -0
  265. data/src/ruby/pb/src/proto/grpc/testing/messages.rb +84 -0
  266. data/src/ruby/pb/src/proto/grpc/testing/test.rb +14 -0
  267. data/src/ruby/pb/src/proto/grpc/testing/test_services.rb +110 -0
  268. data/src/ruby/pb/test/client.rb +5 -2
  269. data/src/ruby/spec/generic/active_call_spec.rb +3 -2
  270. data/src/ruby/spec/generic/client_stub_spec.rb +27 -24
  271. data/src/ruby/spec/generic/rpc_desc_spec.rb +11 -11
  272. data/src/ruby/spec/generic/rpc_server_spec.rb +42 -61
  273. data/src/ruby/spec/pb/health/checker_spec.rb +3 -5
  274. metadata +86 -48
  275. data/src/core/ext/lb_policy/grpclb/proto/grpc/lb/v0/load_balancer.pb.h +0 -182
  276. data/src/core/lib/security/credentials.c +0 -1296
  277. data/src/ruby/lib/grpc/signals.rb +0 -69
@@ -0,0 +1,46 @@
1
+ /*
2
+ *
3
+ * Copyright 2016, Google Inc.
4
+ * All rights reserved.
5
+ *
6
+ * Redistribution and use in source and binary forms, with or without
7
+ * modification, are permitted provided that the following conditions are
8
+ * met:
9
+ *
10
+ * * Redistributions of source code must retain the above copyright
11
+ * notice, this list of conditions and the following disclaimer.
12
+ * * Redistributions in binary form must reproduce the above
13
+ * copyright notice, this list of conditions and the following disclaimer
14
+ * in the documentation and/or other materials provided with the
15
+ * distribution.
16
+ * * Neither the name of Google Inc. nor the names of its
17
+ * contributors may be used to endorse or promote products derived from
18
+ * this software without specific prior written permission.
19
+ *
20
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
+ *
32
+ */
33
+
34
+ #ifndef GRPC_CORE_LIB_SECURITY_CREDENTIALS_GOOGLE_DEFAULT_GOOGLE_DEFAULT_CREDENTIALS_H
35
+ #define GRPC_CORE_LIB_SECURITY_CREDENTIALS_GOOGLE_DEFAULT_GOOGLE_DEFAULT_CREDENTIALS_H
36
+
37
+ #include "src/core/lib/security/credentials/credentials.h"
38
+
39
+ #define GRPC_GOOGLE_CLOUD_SDK_CONFIG_DIRECTORY "gcloud"
40
+ #define GRPC_GOOGLE_WELL_KNOWN_CREDENTIALS_FILE \
41
+ "application_default_credentials.json"
42
+
43
+ void grpc_flush_cached_google_default_credentials(void);
44
+
45
+ #endif /* GRPC_CORE_LIB_SECURITY_CREDENTIALS_GOOGLE_DEFAULT_GOOGLE_DEFAULT_CREDENTIALS_H \
46
+ */
@@ -0,0 +1,85 @@
1
+ /*
2
+ *
3
+ * Copyright 2016, Google Inc.
4
+ * All rights reserved.
5
+ *
6
+ * Redistribution and use in source and binary forms, with or without
7
+ * modification, are permitted provided that the following conditions are
8
+ * met:
9
+ *
10
+ * * Redistributions of source code must retain the above copyright
11
+ * notice, this list of conditions and the following disclaimer.
12
+ * * Redistributions in binary form must reproduce the above
13
+ * copyright notice, this list of conditions and the following disclaimer
14
+ * in the documentation and/or other materials provided with the
15
+ * distribution.
16
+ * * Neither the name of Google Inc. nor the names of its
17
+ * contributors may be used to endorse or promote products derived from
18
+ * this software without specific prior written permission.
19
+ *
20
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
+ *
32
+ */
33
+
34
+ #include "src/core/lib/security/credentials/iam/iam_credentials.h"
35
+
36
+ #include <string.h>
37
+
38
+ #include "src/core/lib/surface/api_trace.h"
39
+
40
+ #include <grpc/support/alloc.h>
41
+ #include <grpc/support/log.h>
42
+ #include <grpc/support/string_util.h>
43
+ #include <grpc/support/sync.h>
44
+
45
+ static void iam_destruct(grpc_call_credentials *creds) {
46
+ grpc_google_iam_credentials *c = (grpc_google_iam_credentials *)creds;
47
+ grpc_credentials_md_store_unref(c->iam_md);
48
+ }
49
+
50
+ static void iam_get_request_metadata(grpc_exec_ctx *exec_ctx,
51
+ grpc_call_credentials *creds,
52
+ grpc_polling_entity *pollent,
53
+ grpc_auth_metadata_context context,
54
+ grpc_credentials_metadata_cb cb,
55
+ void *user_data) {
56
+ grpc_google_iam_credentials *c = (grpc_google_iam_credentials *)creds;
57
+ cb(exec_ctx, user_data, c->iam_md->entries, c->iam_md->num_entries,
58
+ GRPC_CREDENTIALS_OK);
59
+ }
60
+
61
+ static grpc_call_credentials_vtable iam_vtable = {iam_destruct,
62
+ iam_get_request_metadata};
63
+
64
+ grpc_call_credentials *grpc_google_iam_credentials_create(
65
+ const char *token, const char *authority_selector, void *reserved) {
66
+ grpc_google_iam_credentials *c;
67
+ GRPC_API_TRACE(
68
+ "grpc_iam_credentials_create(token=%s, authority_selector=%s, "
69
+ "reserved=%p)",
70
+ 3, (token, authority_selector, reserved));
71
+ GPR_ASSERT(reserved == NULL);
72
+ GPR_ASSERT(token != NULL);
73
+ GPR_ASSERT(authority_selector != NULL);
74
+ c = gpr_malloc(sizeof(grpc_google_iam_credentials));
75
+ memset(c, 0, sizeof(grpc_google_iam_credentials));
76
+ c->base.type = GRPC_CALL_CREDENTIALS_TYPE_IAM;
77
+ c->base.vtable = &iam_vtable;
78
+ gpr_ref_init(&c->base.refcount, 1);
79
+ c->iam_md = grpc_credentials_md_store_create(2);
80
+ grpc_credentials_md_store_add_cstrings(
81
+ c->iam_md, GRPC_IAM_AUTHORIZATION_TOKEN_METADATA_KEY, token);
82
+ grpc_credentials_md_store_add_cstrings(
83
+ c->iam_md, GRPC_IAM_AUTHORITY_SELECTOR_METADATA_KEY, authority_selector);
84
+ return &c->base;
85
+ }
@@ -0,0 +1,44 @@
1
+ /*
2
+ *
3
+ * Copyright 2016, Google Inc.
4
+ * All rights reserved.
5
+ *
6
+ * Redistribution and use in source and binary forms, with or without
7
+ * modification, are permitted provided that the following conditions are
8
+ * met:
9
+ *
10
+ * * Redistributions of source code must retain the above copyright
11
+ * notice, this list of conditions and the following disclaimer.
12
+ * * Redistributions in binary form must reproduce the above
13
+ * copyright notice, this list of conditions and the following disclaimer
14
+ * in the documentation and/or other materials provided with the
15
+ * distribution.
16
+ * * Neither the name of Google Inc. nor the names of its
17
+ * contributors may be used to endorse or promote products derived from
18
+ * this software without specific prior written permission.
19
+ *
20
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
+ *
32
+ */
33
+
34
+ #ifndef GRPC_CORE_LIB_SECURITY_CREDENTIALS_IAM_IAM_CREDENTIALS_H
35
+ #define GRPC_CORE_LIB_SECURITY_CREDENTIALS_IAM_IAM_CREDENTIALS_H
36
+
37
+ #include "src/core/lib/security/credentials/credentials.h"
38
+
39
+ typedef struct {
40
+ grpc_call_credentials base;
41
+ grpc_credentials_md_store *iam_md;
42
+ } grpc_google_iam_credentials;
43
+
44
+ #endif /* GRPC_CORE_LIB_SECURITY_CREDENTIALS_IAM_IAM_CREDENTIALS_H */
@@ -31,7 +31,7 @@
31
31
  *
32
32
  */
33
33
 
34
- #include "src/core/lib/security/json_token.h"
34
+ #include "src/core/lib/security/credentials/jwt/json_token.h"
35
35
 
36
36
  #include <string.h>
37
37
 
@@ -39,7 +39,8 @@
39
39
  #include <grpc/support/log.h>
40
40
  #include <grpc/support/string_util.h>
41
41
 
42
- #include "src/core/lib/security/b64.h"
42
+ #include "src/core/lib/security/util/b64.h"
43
+ #include "src/core/lib/security/util/json_util.h"
43
44
  #include "src/core/lib/support/string.h"
44
45
 
45
46
  #include <openssl/bio.h>
@@ -66,28 +67,6 @@ static grpc_jwt_encode_and_sign_override g_jwt_encode_and_sign_override = NULL;
66
67
 
67
68
  /* --- grpc_auth_json_key. --- */
68
69
 
69
- static const char *json_get_string_property(const grpc_json *json,
70
- const char *prop_name) {
71
- grpc_json *child;
72
- for (child = json->child; child != NULL; child = child->next) {
73
- if (strcmp(child->key, prop_name) == 0) break;
74
- }
75
- if (child == NULL || child->type != GRPC_JSON_STRING) {
76
- gpr_log(GPR_ERROR, "Invalid or missing %s property.", prop_name);
77
- return NULL;
78
- }
79
- return child->value;
80
- }
81
-
82
- static int set_json_key_string_property(const grpc_json *json,
83
- const char *prop_name,
84
- char **json_key_field) {
85
- const char *prop_value = json_get_string_property(json, prop_name);
86
- if (prop_value == NULL) return 0;
87
- *json_key_field = gpr_strdup(prop_value);
88
- return 1;
89
- }
90
-
91
70
  int grpc_auth_json_key_is_valid(const grpc_auth_json_key *json_key) {
92
71
  return (json_key != NULL) &&
93
72
  strcmp(json_key->type, GRPC_AUTH_JSON_TYPE_INVALID);
@@ -106,22 +85,22 @@ grpc_auth_json_key grpc_auth_json_key_create_from_json(const grpc_json *json) {
106
85
  goto end;
107
86
  }
108
87
 
109
- prop_value = json_get_string_property(json, "type");
88
+ prop_value = grpc_json_get_string_property(json, "type");
110
89
  if (prop_value == NULL ||
111
90
  strcmp(prop_value, GRPC_AUTH_JSON_TYPE_SERVICE_ACCOUNT)) {
112
91
  goto end;
113
92
  }
114
93
  result.type = GRPC_AUTH_JSON_TYPE_SERVICE_ACCOUNT;
115
94
 
116
- if (!set_json_key_string_property(json, "private_key_id",
117
- &result.private_key_id) ||
118
- !set_json_key_string_property(json, "client_id", &result.client_id) ||
119
- !set_json_key_string_property(json, "client_email",
120
- &result.client_email)) {
95
+ if (!grpc_copy_json_string_property(json, "private_key_id",
96
+ &result.private_key_id) ||
97
+ !grpc_copy_json_string_property(json, "client_id", &result.client_id) ||
98
+ !grpc_copy_json_string_property(json, "client_email",
99
+ &result.client_email)) {
121
100
  goto end;
122
101
  }
123
102
 
124
- prop_value = json_get_string_property(json, "private_key");
103
+ prop_value = grpc_json_get_string_property(json, "private_key");
125
104
  if (prop_value == NULL) {
126
105
  goto end;
127
106
  }
@@ -339,73 +318,3 @@ void grpc_jwt_encode_and_sign_set_override(
339
318
  grpc_jwt_encode_and_sign_override func) {
340
319
  g_jwt_encode_and_sign_override = func;
341
320
  }
342
-
343
- /* --- grpc_auth_refresh_token --- */
344
-
345
- int grpc_auth_refresh_token_is_valid(
346
- const grpc_auth_refresh_token *refresh_token) {
347
- return (refresh_token != NULL) &&
348
- strcmp(refresh_token->type, GRPC_AUTH_JSON_TYPE_INVALID);
349
- }
350
-
351
- grpc_auth_refresh_token grpc_auth_refresh_token_create_from_json(
352
- const grpc_json *json) {
353
- grpc_auth_refresh_token result;
354
- const char *prop_value;
355
- int success = 0;
356
-
357
- memset(&result, 0, sizeof(grpc_auth_refresh_token));
358
- result.type = GRPC_AUTH_JSON_TYPE_INVALID;
359
- if (json == NULL) {
360
- gpr_log(GPR_ERROR, "Invalid json.");
361
- goto end;
362
- }
363
-
364
- prop_value = json_get_string_property(json, "type");
365
- if (prop_value == NULL ||
366
- strcmp(prop_value, GRPC_AUTH_JSON_TYPE_AUTHORIZED_USER)) {
367
- goto end;
368
- }
369
- result.type = GRPC_AUTH_JSON_TYPE_AUTHORIZED_USER;
370
-
371
- if (!set_json_key_string_property(json, "client_secret",
372
- &result.client_secret) ||
373
- !set_json_key_string_property(json, "client_id", &result.client_id) ||
374
- !set_json_key_string_property(json, "refresh_token",
375
- &result.refresh_token)) {
376
- goto end;
377
- }
378
- success = 1;
379
-
380
- end:
381
- if (!success) grpc_auth_refresh_token_destruct(&result);
382
- return result;
383
- }
384
-
385
- grpc_auth_refresh_token grpc_auth_refresh_token_create_from_string(
386
- const char *json_string) {
387
- char *scratchpad = gpr_strdup(json_string);
388
- grpc_json *json = grpc_json_parse_string(scratchpad);
389
- grpc_auth_refresh_token result =
390
- grpc_auth_refresh_token_create_from_json(json);
391
- if (json != NULL) grpc_json_destroy(json);
392
- gpr_free(scratchpad);
393
- return result;
394
- }
395
-
396
- void grpc_auth_refresh_token_destruct(grpc_auth_refresh_token *refresh_token) {
397
- if (refresh_token == NULL) return;
398
- refresh_token->type = GRPC_AUTH_JSON_TYPE_INVALID;
399
- if (refresh_token->client_id != NULL) {
400
- gpr_free(refresh_token->client_id);
401
- refresh_token->client_id = NULL;
402
- }
403
- if (refresh_token->client_secret != NULL) {
404
- gpr_free(refresh_token->client_secret);
405
- refresh_token->client_secret = NULL;
406
- }
407
- if (refresh_token->refresh_token != NULL) {
408
- gpr_free(refresh_token->refresh_token);
409
- refresh_token->refresh_token = NULL;
410
- }
411
- }
@@ -31,8 +31,8 @@
31
31
  *
32
32
  */
33
33
 
34
- #ifndef GRPC_CORE_LIB_SECURITY_JSON_TOKEN_H
35
- #define GRPC_CORE_LIB_SECURITY_JSON_TOKEN_H
34
+ #ifndef GRPC_CORE_LIB_SECURITY_CREDENTIALS_JWT_JSON_TOKEN_H
35
+ #define GRPC_CORE_LIB_SECURITY_CREDENTIALS_JWT_JSON_TOKEN_H
36
36
 
37
37
  #include <grpc/support/slice.h>
38
38
  #include <openssl/rsa.h>
@@ -43,10 +43,6 @@
43
43
 
44
44
  #define GRPC_JWT_OAUTH2_AUDIENCE "https://www.googleapis.com/oauth2/v3/token"
45
45
 
46
- #define GRPC_AUTH_JSON_TYPE_INVALID "invalid"
47
- #define GRPC_AUTH_JSON_TYPE_SERVICE_ACCOUNT "service_account"
48
- #define GRPC_AUTH_JSON_TYPE_AUTHORIZED_USER "authorized_user"
49
-
50
46
  /* --- auth_json_key parsing. --- */
51
47
 
52
48
  typedef struct {
@@ -89,30 +85,4 @@ typedef char *(*grpc_jwt_encode_and_sign_override)(
89
85
  void grpc_jwt_encode_and_sign_set_override(
90
86
  grpc_jwt_encode_and_sign_override func);
91
87
 
92
- /* --- auth_refresh_token parsing. --- */
93
-
94
- typedef struct {
95
- const char *type;
96
- char *client_id;
97
- char *client_secret;
98
- char *refresh_token;
99
- } grpc_auth_refresh_token;
100
-
101
- /* Returns 1 if the object is valid, 0 otherwise. */
102
- int grpc_auth_refresh_token_is_valid(
103
- const grpc_auth_refresh_token *refresh_token);
104
-
105
- /* Creates a refresh token object from string. Returns an invalid object if a
106
- parsing error has been encountered. */
107
- grpc_auth_refresh_token grpc_auth_refresh_token_create_from_string(
108
- const char *json_string);
109
-
110
- /* Creates a refresh token object from parsed json. Returns an invalid object if
111
- a parsing error has been encountered. */
112
- grpc_auth_refresh_token grpc_auth_refresh_token_create_from_json(
113
- const grpc_json *json);
114
-
115
- /* Destructs the object. */
116
- void grpc_auth_refresh_token_destruct(grpc_auth_refresh_token *refresh_token);
117
-
118
- #endif /* GRPC_CORE_LIB_SECURITY_JSON_TOKEN_H */
88
+ #endif /* GRPC_CORE_LIB_SECURITY_CREDENTIALS_JWT_JSON_TOKEN_H */
@@ -0,0 +1,160 @@
1
+ /*
2
+ *
3
+ * Copyright 2016, Google Inc.
4
+ * All rights reserved.
5
+ *
6
+ * Redistribution and use in source and binary forms, with or without
7
+ * modification, are permitted provided that the following conditions are
8
+ * met:
9
+ *
10
+ * * Redistributions of source code must retain the above copyright
11
+ * notice, this list of conditions and the following disclaimer.
12
+ * * Redistributions in binary form must reproduce the above
13
+ * copyright notice, this list of conditions and the following disclaimer
14
+ * in the documentation and/or other materials provided with the
15
+ * distribution.
16
+ * * Neither the name of Google Inc. nor the names of its
17
+ * contributors may be used to endorse or promote products derived from
18
+ * this software without specific prior written permission.
19
+ *
20
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
+ *
32
+ */
33
+
34
+ #include "src/core/lib/security/credentials/jwt/jwt_credentials.h"
35
+
36
+ #include <string.h>
37
+
38
+ #include "src/core/lib/surface/api_trace.h"
39
+
40
+ #include <grpc/support/alloc.h>
41
+ #include <grpc/support/log.h>
42
+ #include <grpc/support/string_util.h>
43
+ #include <grpc/support/sync.h>
44
+
45
+ static void jwt_reset_cache(grpc_service_account_jwt_access_credentials *c) {
46
+ if (c->cached.jwt_md != NULL) {
47
+ grpc_credentials_md_store_unref(c->cached.jwt_md);
48
+ c->cached.jwt_md = NULL;
49
+ }
50
+ if (c->cached.service_url != NULL) {
51
+ gpr_free(c->cached.service_url);
52
+ c->cached.service_url = NULL;
53
+ }
54
+ c->cached.jwt_expiration = gpr_inf_past(GPR_CLOCK_REALTIME);
55
+ }
56
+
57
+ static void jwt_destruct(grpc_call_credentials *creds) {
58
+ grpc_service_account_jwt_access_credentials *c =
59
+ (grpc_service_account_jwt_access_credentials *)creds;
60
+ grpc_auth_json_key_destruct(&c->key);
61
+ jwt_reset_cache(c);
62
+ gpr_mu_destroy(&c->cache_mu);
63
+ }
64
+
65
+ static void jwt_get_request_metadata(grpc_exec_ctx *exec_ctx,
66
+ grpc_call_credentials *creds,
67
+ grpc_polling_entity *pollent,
68
+ grpc_auth_metadata_context context,
69
+ grpc_credentials_metadata_cb cb,
70
+ void *user_data) {
71
+ grpc_service_account_jwt_access_credentials *c =
72
+ (grpc_service_account_jwt_access_credentials *)creds;
73
+ gpr_timespec refresh_threshold = gpr_time_from_seconds(
74
+ GRPC_SECURE_TOKEN_REFRESH_THRESHOLD_SECS, GPR_TIMESPAN);
75
+
76
+ /* See if we can return a cached jwt. */
77
+ grpc_credentials_md_store *jwt_md = NULL;
78
+ {
79
+ gpr_mu_lock(&c->cache_mu);
80
+ if (c->cached.service_url != NULL &&
81
+ strcmp(c->cached.service_url, context.service_url) == 0 &&
82
+ c->cached.jwt_md != NULL &&
83
+ (gpr_time_cmp(gpr_time_sub(c->cached.jwt_expiration,
84
+ gpr_now(GPR_CLOCK_REALTIME)),
85
+ refresh_threshold) > 0)) {
86
+ jwt_md = grpc_credentials_md_store_ref(c->cached.jwt_md);
87
+ }
88
+ gpr_mu_unlock(&c->cache_mu);
89
+ }
90
+
91
+ if (jwt_md == NULL) {
92
+ char *jwt = NULL;
93
+ /* Generate a new jwt. */
94
+ gpr_mu_lock(&c->cache_mu);
95
+ jwt_reset_cache(c);
96
+ jwt = grpc_jwt_encode_and_sign(&c->key, context.service_url,
97
+ c->jwt_lifetime, NULL);
98
+ if (jwt != NULL) {
99
+ char *md_value;
100
+ gpr_asprintf(&md_value, "Bearer %s", jwt);
101
+ gpr_free(jwt);
102
+ c->cached.jwt_expiration =
103
+ gpr_time_add(gpr_now(GPR_CLOCK_REALTIME), c->jwt_lifetime);
104
+ c->cached.service_url = gpr_strdup(context.service_url);
105
+ c->cached.jwt_md = grpc_credentials_md_store_create(1);
106
+ grpc_credentials_md_store_add_cstrings(
107
+ c->cached.jwt_md, GRPC_AUTHORIZATION_METADATA_KEY, md_value);
108
+ gpr_free(md_value);
109
+ jwt_md = grpc_credentials_md_store_ref(c->cached.jwt_md);
110
+ }
111
+ gpr_mu_unlock(&c->cache_mu);
112
+ }
113
+
114
+ if (jwt_md != NULL) {
115
+ cb(exec_ctx, user_data, jwt_md->entries, jwt_md->num_entries,
116
+ GRPC_CREDENTIALS_OK);
117
+ grpc_credentials_md_store_unref(jwt_md);
118
+ } else {
119
+ cb(exec_ctx, user_data, NULL, 0, GRPC_CREDENTIALS_ERROR);
120
+ }
121
+ }
122
+
123
+ static grpc_call_credentials_vtable jwt_vtable = {jwt_destruct,
124
+ jwt_get_request_metadata};
125
+
126
+ grpc_call_credentials *
127
+ grpc_service_account_jwt_access_credentials_create_from_auth_json_key(
128
+ grpc_auth_json_key key, gpr_timespec token_lifetime) {
129
+ grpc_service_account_jwt_access_credentials *c;
130
+ if (!grpc_auth_json_key_is_valid(&key)) {
131
+ gpr_log(GPR_ERROR, "Invalid input for jwt credentials creation");
132
+ return NULL;
133
+ }
134
+ c = gpr_malloc(sizeof(grpc_service_account_jwt_access_credentials));
135
+ memset(c, 0, sizeof(grpc_service_account_jwt_access_credentials));
136
+ c->base.type = GRPC_CALL_CREDENTIALS_TYPE_JWT;
137
+ gpr_ref_init(&c->base.refcount, 1);
138
+ c->base.vtable = &jwt_vtable;
139
+ c->key = key;
140
+ c->jwt_lifetime = token_lifetime;
141
+ gpr_mu_init(&c->cache_mu);
142
+ jwt_reset_cache(c);
143
+ return &c->base;
144
+ }
145
+
146
+ grpc_call_credentials *grpc_service_account_jwt_access_credentials_create(
147
+ const char *json_key, gpr_timespec token_lifetime, void *reserved) {
148
+ GRPC_API_TRACE(
149
+ "grpc_service_account_jwt_access_credentials_create("
150
+ "json_key=%s, "
151
+ "token_lifetime="
152
+ "gpr_timespec { tv_sec: %"PRId64", tv_nsec: %d, clock_type: %d }, "
153
+ "reserved=%p)",
154
+ 5,
155
+ (json_key, token_lifetime.tv_sec, token_lifetime.tv_nsec,
156
+ (int)token_lifetime.clock_type, reserved));
157
+ GPR_ASSERT(reserved == NULL);
158
+ return grpc_service_account_jwt_access_credentials_create_from_auth_json_key(
159
+ grpc_auth_json_key_create_from_string(json_key), token_lifetime);
160
+ }