grpc 0.11.0 → 0.12.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 (459) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +29456 -0
  3. data/Rakefile +13 -8
  4. data/etc/roots.pem +5114 -0
  5. data/include/grpc/byte_buffer.h +120 -0
  6. data/include/grpc/byte_buffer_reader.h +58 -0
  7. data/include/grpc/census.h +488 -0
  8. data/include/grpc/compression.h +106 -0
  9. data/include/grpc/grpc.h +732 -0
  10. data/include/grpc/grpc_security.h +374 -0
  11. data/include/grpc/grpc_zookeeper.h +59 -0
  12. data/include/grpc/status.h +163 -0
  13. data/include/grpc/support/alloc.h +72 -0
  14. data/include/grpc/support/atm.h +92 -0
  15. data/include/grpc/support/atm_gcc_atomic.h +72 -0
  16. data/include/grpc/support/atm_gcc_sync.h +87 -0
  17. data/include/grpc/support/atm_win32.h +125 -0
  18. data/include/grpc/support/avl.h +91 -0
  19. data/include/grpc/support/cmdline.h +101 -0
  20. data/include/grpc/support/cpu.h +57 -0
  21. data/include/grpc/support/histogram.h +76 -0
  22. data/include/grpc/support/host_port.h +64 -0
  23. data/include/grpc/support/log.h +108 -0
  24. data/include/grpc/support/log_win32.h +51 -0
  25. data/include/grpc/support/port_platform.h +356 -0
  26. data/include/grpc/support/slice.h +182 -0
  27. data/include/grpc/support/slice_buffer.h +102 -0
  28. data/include/grpc/support/string_util.h +61 -0
  29. data/include/grpc/support/subprocess.h +57 -0
  30. data/include/grpc/support/sync.h +315 -0
  31. data/include/grpc/support/sync_generic.h +55 -0
  32. data/include/grpc/support/sync_posix.h +47 -0
  33. data/include/grpc/support/sync_win32.h +49 -0
  34. data/include/grpc/support/thd.h +91 -0
  35. data/include/grpc/support/time.h +128 -0
  36. data/include/grpc/support/tls.h +77 -0
  37. data/include/grpc/support/tls_gcc.h +56 -0
  38. data/include/grpc/support/tls_msvc.h +56 -0
  39. data/include/grpc/support/tls_pthread.h +60 -0
  40. data/include/grpc/support/useful.h +75 -0
  41. data/src/core/census/aggregation.h +66 -0
  42. data/src/core/census/context.c +46 -0
  43. data/src/core/census/context.h +47 -0
  44. data/src/core/census/grpc_context.c +53 -0
  45. data/src/core/census/grpc_filter.c +184 -0
  46. data/src/core/census/grpc_filter.h +44 -0
  47. data/src/core/census/initialize.c +57 -0
  48. data/src/core/census/operation.c +63 -0
  49. data/src/core/census/rpc_metric_id.h +51 -0
  50. data/src/core/census/tracing.c +45 -0
  51. data/src/core/channel/channel_args.c +209 -0
  52. data/src/core/channel/channel_args.h +88 -0
  53. data/src/core/channel/channel_stack.c +262 -0
  54. data/src/core/channel/channel_stack.h +260 -0
  55. data/src/core/channel/client_channel.c +524 -0
  56. data/src/core/channel/client_channel.h +63 -0
  57. data/src/core/channel/client_uchannel.c +243 -0
  58. data/src/core/channel/client_uchannel.h +60 -0
  59. data/src/core/channel/compress_filter.c +297 -0
  60. data/src/core/channel/compress_filter.h +65 -0
  61. data/src/core/channel/connected_channel.c +167 -0
  62. data/src/core/channel/connected_channel.h +51 -0
  63. data/src/core/channel/context.h +49 -0
  64. data/src/core/channel/http_client_filter.c +248 -0
  65. data/src/core/channel/http_client_filter.h +44 -0
  66. data/src/core/channel/http_server_filter.c +233 -0
  67. data/src/core/channel/http_server_filter.h +42 -0
  68. data/src/core/channel/subchannel_call_holder.c +259 -0
  69. data/src/core/channel/subchannel_call_holder.h +98 -0
  70. data/src/core/client_config/client_config.c +72 -0
  71. data/src/core/client_config/client_config.h +53 -0
  72. data/src/core/client_config/connector.c +54 -0
  73. data/src/core/client_config/connector.h +95 -0
  74. data/src/core/client_config/default_initial_connect_string.c +39 -0
  75. data/src/core/client_config/initial_connect_string.c +53 -0
  76. data/src/core/client_config/initial_connect_string.h +50 -0
  77. data/src/core/client_config/lb_policies/pick_first.c +398 -0
  78. data/src/core/client_config/lb_policies/pick_first.h +43 -0
  79. data/src/core/client_config/lb_policies/round_robin.c +537 -0
  80. data/src/core/client_config/lb_policies/round_robin.h +46 -0
  81. data/src/core/client_config/lb_policy.c +134 -0
  82. data/src/core/client_config/lb_policy.h +143 -0
  83. data/src/core/client_config/lb_policy_factory.c +48 -0
  84. data/src/core/client_config/lb_policy_factory.h +73 -0
  85. data/src/core/client_config/lb_policy_registry.c +88 -0
  86. data/src/core/client_config/lb_policy_registry.h +54 -0
  87. data/src/core/client_config/resolver.c +82 -0
  88. data/src/core/client_config/resolver.h +94 -0
  89. data/src/core/client_config/resolver_factory.c +55 -0
  90. data/src/core/client_config/resolver_factory.h +82 -0
  91. data/src/core/client_config/resolver_registry.c +137 -0
  92. data/src/core/client_config/resolver_registry.h +65 -0
  93. data/src/core/client_config/resolvers/dns_resolver.c +257 -0
  94. data/src/core/client_config/resolvers/dns_resolver.h +42 -0
  95. data/src/core/client_config/resolvers/sockaddr_resolver.c +391 -0
  96. data/src/core/client_config/resolvers/sockaddr_resolver.h +50 -0
  97. data/src/core/client_config/subchannel.c +697 -0
  98. data/src/core/client_config/subchannel.h +165 -0
  99. data/src/core/client_config/subchannel_factory.c +49 -0
  100. data/src/core/client_config/subchannel_factory.h +66 -0
  101. data/src/core/client_config/uri_parser.c +242 -0
  102. data/src/core/client_config/uri_parser.h +51 -0
  103. data/src/core/compression/algorithm.c +166 -0
  104. data/src/core/compression/algorithm_metadata.h +53 -0
  105. data/src/core/compression/message_compress.c +198 -0
  106. data/src/core/compression/message_compress.h +52 -0
  107. data/src/core/debug/trace.c +136 -0
  108. data/src/core/debug/trace.h +43 -0
  109. data/src/core/httpcli/format_request.c +120 -0
  110. data/src/core/httpcli/format_request.h +45 -0
  111. data/src/core/httpcli/httpcli.c +286 -0
  112. data/src/core/httpcli/httpcli.h +162 -0
  113. data/src/core/httpcli/httpcli_security_connector.c +189 -0
  114. data/src/core/httpcli/parser.c +211 -0
  115. data/src/core/httpcli/parser.h +64 -0
  116. data/src/core/iomgr/closure.c +98 -0
  117. data/src/core/iomgr/closure.h +97 -0
  118. data/src/core/iomgr/endpoint.c +67 -0
  119. data/src/core/iomgr/endpoint.h +102 -0
  120. data/src/core/iomgr/endpoint_pair.h +47 -0
  121. data/src/core/iomgr/endpoint_pair_posix.c +82 -0
  122. data/src/core/iomgr/endpoint_pair_windows.c +97 -0
  123. data/src/core/iomgr/exec_ctx.c +72 -0
  124. data/src/core/iomgr/exec_ctx.h +78 -0
  125. data/src/core/iomgr/executor.c +143 -0
  126. data/src/core/iomgr/executor.h +53 -0
  127. data/src/core/iomgr/fd_posix.c +438 -0
  128. data/src/core/iomgr/fd_posix.h +189 -0
  129. data/src/core/iomgr/iocp_windows.c +206 -0
  130. data/src/core/iomgr/iocp_windows.h +56 -0
  131. data/src/core/iomgr/iomgr.c +156 -0
  132. data/src/core/iomgr/iomgr.h +43 -0
  133. data/src/core/iomgr/iomgr_internal.h +58 -0
  134. data/src/core/iomgr/iomgr_posix.c +52 -0
  135. data/src/core/iomgr/iomgr_posix.h +39 -0
  136. data/src/core/iomgr/iomgr_windows.c +73 -0
  137. data/src/core/iomgr/pollset.h +95 -0
  138. data/src/core/iomgr/pollset_multipoller_with_epoll.c +258 -0
  139. data/src/core/iomgr/pollset_multipoller_with_poll_posix.c +227 -0
  140. data/src/core/iomgr/pollset_posix.c +638 -0
  141. data/src/core/iomgr/pollset_posix.h +147 -0
  142. data/src/core/iomgr/pollset_set.h +67 -0
  143. data/src/core/iomgr/pollset_set_posix.c +182 -0
  144. data/src/core/iomgr/pollset_set_posix.h +61 -0
  145. data/src/core/iomgr/pollset_set_windows.c +60 -0
  146. data/src/core/iomgr/pollset_set_windows.h +39 -0
  147. data/src/core/iomgr/pollset_windows.c +248 -0
  148. data/src/core/iomgr/pollset_windows.h +79 -0
  149. data/src/core/iomgr/resolve_address.h +72 -0
  150. data/src/core/iomgr/resolve_address_posix.c +183 -0
  151. data/src/core/iomgr/resolve_address_windows.c +166 -0
  152. data/src/core/iomgr/sockaddr.h +47 -0
  153. data/src/core/iomgr/sockaddr_posix.h +44 -0
  154. data/src/core/iomgr/sockaddr_utils.c +234 -0
  155. data/src/core/iomgr/sockaddr_utils.h +89 -0
  156. data/src/core/iomgr/sockaddr_win32.h +46 -0
  157. data/src/core/iomgr/socket_utils_common_posix.c +208 -0
  158. data/src/core/iomgr/socket_utils_linux.c +51 -0
  159. data/src/core/iomgr/socket_utils_posix.c +70 -0
  160. data/src/core/iomgr/socket_utils_posix.h +113 -0
  161. data/src/core/iomgr/socket_windows.c +98 -0
  162. data/src/core/iomgr/socket_windows.h +111 -0
  163. data/src/core/iomgr/tcp_client.h +53 -0
  164. data/src/core/iomgr/tcp_client_posix.c +304 -0
  165. data/src/core/iomgr/tcp_client_windows.c +221 -0
  166. data/src/core/iomgr/tcp_posix.c +485 -0
  167. data/src/core/iomgr/tcp_posix.h +65 -0
  168. data/src/core/iomgr/tcp_server.h +83 -0
  169. data/src/core/iomgr/tcp_server_posix.c +562 -0
  170. data/src/core/iomgr/tcp_server_windows.c +509 -0
  171. data/src/core/iomgr/tcp_windows.c +406 -0
  172. data/src/core/iomgr/tcp_windows.h +57 -0
  173. data/src/core/iomgr/time_averaged_stats.c +77 -0
  174. data/src/core/iomgr/time_averaged_stats.h +88 -0
  175. data/src/core/iomgr/timer.c +345 -0
  176. data/src/core/iomgr/timer.h +89 -0
  177. data/src/core/iomgr/timer_heap.c +148 -0
  178. data/src/core/iomgr/timer_heap.h +57 -0
  179. data/src/core/iomgr/timer_internal.h +61 -0
  180. data/src/core/iomgr/udp_server.c +439 -0
  181. data/src/core/iomgr/udp_server.h +83 -0
  182. data/src/core/iomgr/wakeup_fd_eventfd.c +85 -0
  183. data/src/core/iomgr/wakeup_fd_nospecial.c +51 -0
  184. data/src/core/iomgr/wakeup_fd_pipe.c +97 -0
  185. data/src/core/iomgr/wakeup_fd_pipe.h +41 -0
  186. data/src/core/iomgr/wakeup_fd_posix.c +72 -0
  187. data/src/core/iomgr/wakeup_fd_posix.h +101 -0
  188. data/src/core/iomgr/workqueue.h +85 -0
  189. data/src/core/iomgr/workqueue_posix.c +143 -0
  190. data/src/core/iomgr/workqueue_posix.h +51 -0
  191. data/src/core/iomgr/workqueue_windows.c +40 -0
  192. data/src/core/iomgr/workqueue_windows.h +37 -0
  193. data/src/core/json/json.c +64 -0
  194. data/src/core/json/json.h +88 -0
  195. data/src/core/json/json_common.h +49 -0
  196. data/src/core/json/json_reader.c +660 -0
  197. data/src/core/json/json_reader.h +160 -0
  198. data/src/core/json/json_string.c +379 -0
  199. data/src/core/json/json_writer.c +260 -0
  200. data/src/core/json/json_writer.h +97 -0
  201. data/src/core/profiling/basic_timers.c +274 -0
  202. data/src/core/profiling/stap_timers.c +65 -0
  203. data/src/core/profiling/timers.h +119 -0
  204. data/src/core/security/auth_filters.h +42 -0
  205. data/src/core/security/base64.c +233 -0
  206. data/src/core/security/base64.h +52 -0
  207. data/src/core/security/client_auth_filter.c +337 -0
  208. data/src/core/security/credentials.c +1273 -0
  209. data/src/core/security/credentials.h +376 -0
  210. data/src/core/security/credentials_metadata.c +101 -0
  211. data/src/core/security/credentials_posix.c +61 -0
  212. data/src/core/security/credentials_win32.c +61 -0
  213. data/src/core/security/google_default_credentials.c +260 -0
  214. data/src/core/security/handshake.c +327 -0
  215. data/src/core/security/handshake.h +50 -0
  216. data/src/core/security/json_token.c +405 -0
  217. data/src/core/security/json_token.h +118 -0
  218. data/src/core/security/jwt_verifier.c +842 -0
  219. data/src/core/security/jwt_verifier.h +136 -0
  220. data/src/core/security/secure_endpoint.c +383 -0
  221. data/src/core/security/secure_endpoint.h +49 -0
  222. data/src/core/security/security_connector.c +756 -0
  223. data/src/core/security/security_connector.h +246 -0
  224. data/src/core/security/security_context.c +342 -0
  225. data/src/core/security/security_context.h +114 -0
  226. data/src/core/security/server_auth_filter.c +264 -0
  227. data/src/core/security/server_secure_chttp2.c +268 -0
  228. data/src/core/statistics/census_interface.h +76 -0
  229. data/src/core/statistics/census_rpc_stats.h +101 -0
  230. data/src/core/support/alloc.c +90 -0
  231. data/src/core/support/avl.c +288 -0
  232. data/src/core/support/block_annotate.h +48 -0
  233. data/src/core/support/cmdline.c +347 -0
  234. data/src/core/support/cpu_iphone.c +49 -0
  235. data/src/core/support/cpu_linux.c +78 -0
  236. data/src/core/support/cpu_posix.c +77 -0
  237. data/src/core/support/cpu_windows.c +47 -0
  238. data/src/core/support/env.h +60 -0
  239. data/src/core/support/env_linux.c +62 -0
  240. data/src/core/support/env_posix.c +57 -0
  241. data/src/core/support/env_win32.c +65 -0
  242. data/src/core/support/file.c +91 -0
  243. data/src/core/support/file.h +63 -0
  244. data/src/core/support/file_posix.c +85 -0
  245. data/src/core/support/file_win32.c +84 -0
  246. data/src/core/support/histogram.c +244 -0
  247. data/src/core/support/host_port.c +110 -0
  248. data/src/core/support/log.c +66 -0
  249. data/src/core/support/log_android.c +87 -0
  250. data/src/core/support/log_linux.c +105 -0
  251. data/src/core/support/log_posix.c +102 -0
  252. data/src/core/support/log_win32.c +125 -0
  253. data/src/core/support/murmur_hash.c +96 -0
  254. data/src/core/support/murmur_hash.h +44 -0
  255. data/src/core/support/slice.c +343 -0
  256. data/src/core/support/slice_buffer.c +282 -0
  257. data/src/core/support/stack_lockfree.c +175 -0
  258. data/src/core/support/stack_lockfree.h +53 -0
  259. data/src/core/support/string.c +296 -0
  260. data/src/core/support/string.h +121 -0
  261. data/src/core/support/string_posix.c +86 -0
  262. data/src/core/support/string_win32.c +109 -0
  263. data/src/core/support/string_win32.h +47 -0
  264. data/src/core/support/subprocess_posix.c +112 -0
  265. data/src/core/support/sync.c +122 -0
  266. data/src/core/support/sync_posix.c +104 -0
  267. data/src/core/support/sync_win32.c +128 -0
  268. data/src/core/support/thd.c +64 -0
  269. data/src/core/support/thd_internal.h +39 -0
  270. data/src/core/support/thd_posix.c +94 -0
  271. data/src/core/support/thd_win32.c +117 -0
  272. data/src/core/support/time.c +304 -0
  273. data/src/core/support/time_posix.c +161 -0
  274. data/src/core/support/time_precise.c +89 -0
  275. data/src/core/support/time_precise.h +42 -0
  276. data/src/core/support/time_win32.c +101 -0
  277. data/src/core/support/tls_pthread.c +45 -0
  278. data/src/core/surface/api_trace.c +36 -0
  279. data/src/core/surface/api_trace.h +65 -0
  280. data/src/core/surface/byte_buffer.c +97 -0
  281. data/src/core/surface/byte_buffer_reader.c +123 -0
  282. data/src/core/surface/call.c +1424 -0
  283. data/src/core/surface/call.h +109 -0
  284. data/src/core/surface/call_details.c +50 -0
  285. data/src/core/surface/call_log_batch.c +118 -0
  286. data/src/core/surface/call_test_only.h +64 -0
  287. data/src/core/surface/channel.c +327 -0
  288. data/src/core/surface/channel.h +74 -0
  289. data/src/core/surface/channel_connectivity.c +220 -0
  290. data/src/core/surface/channel_create.c +235 -0
  291. data/src/core/surface/channel_ping.c +79 -0
  292. data/src/core/surface/completion_queue.c +481 -0
  293. data/src/core/surface/completion_queue.h +91 -0
  294. data/src/core/surface/event_string.c +81 -0
  295. data/src/core/surface/event_string.h +42 -0
  296. data/src/core/surface/init.c +168 -0
  297. data/src/core/surface/init.h +40 -0
  298. data/src/core/surface/init_secure.c +42 -0
  299. data/src/core/surface/lame_client.c +149 -0
  300. data/src/core/surface/metadata_array.c +49 -0
  301. data/src/core/surface/secure_channel_create.c +336 -0
  302. data/src/core/surface/server.c +1343 -0
  303. data/src/core/surface/server.h +67 -0
  304. data/src/core/surface/server_chttp2.c +149 -0
  305. data/src/core/surface/server_create.c +51 -0
  306. data/src/core/surface/surface_trace.h +48 -0
  307. data/src/core/surface/validate_metadata.c +73 -0
  308. data/src/core/surface/version.c +39 -0
  309. data/src/core/transport/byte_stream.c +76 -0
  310. data/src/core/transport/byte_stream.h +88 -0
  311. data/src/core/transport/chttp2/alpn.c +56 -0
  312. data/src/core/transport/chttp2/alpn.h +49 -0
  313. data/src/core/transport/chttp2/bin_encoder.c +285 -0
  314. data/src/core/transport/chttp2/bin_encoder.h +54 -0
  315. data/src/core/transport/chttp2/frame.h +69 -0
  316. data/src/core/transport/chttp2/frame_data.c +245 -0
  317. data/src/core/transport/chttp2/frame_data.h +101 -0
  318. data/src/core/transport/chttp2/frame_goaway.c +193 -0
  319. data/src/core/transport/chttp2/frame_goaway.h +77 -0
  320. data/src/core/transport/chttp2/frame_ping.c +97 -0
  321. data/src/core/transport/chttp2/frame_ping.h +56 -0
  322. data/src/core/transport/chttp2/frame_rst_stream.c +100 -0
  323. data/src/core/transport/chttp2/frame_rst_stream.h +55 -0
  324. data/src/core/transport/chttp2/frame_settings.c +259 -0
  325. data/src/core/transport/chttp2/frame_settings.h +103 -0
  326. data/src/core/transport/chttp2/frame_window_update.c +114 -0
  327. data/src/core/transport/chttp2/frame_window_update.h +58 -0
  328. data/src/core/transport/chttp2/hpack_encoder.c +572 -0
  329. data/src/core/transport/chttp2/hpack_encoder.h +95 -0
  330. data/src/core/transport/chttp2/hpack_parser.c +1449 -0
  331. data/src/core/transport/chttp2/hpack_parser.h +116 -0
  332. data/src/core/transport/chttp2/hpack_table.c +361 -0
  333. data/src/core/transport/chttp2/hpack_table.h +108 -0
  334. data/src/core/transport/chttp2/http2_errors.h +56 -0
  335. data/src/core/transport/chttp2/huffsyms.c +297 -0
  336. data/src/core/transport/chttp2/huffsyms.h +48 -0
  337. data/src/core/transport/chttp2/incoming_metadata.c +96 -0
  338. data/src/core/transport/chttp2/incoming_metadata.h +60 -0
  339. data/src/core/transport/chttp2/internal.h +757 -0
  340. data/src/core/transport/chttp2/parsing.c +866 -0
  341. data/src/core/transport/chttp2/status_conversion.c +109 -0
  342. data/src/core/transport/chttp2/status_conversion.h +50 -0
  343. data/src/core/transport/chttp2/stream_lists.c +401 -0
  344. data/src/core/transport/chttp2/stream_map.c +198 -0
  345. data/src/core/transport/chttp2/stream_map.h +85 -0
  346. data/src/core/transport/chttp2/timeout_encoding.c +185 -0
  347. data/src/core/transport/chttp2/timeout_encoding.h +47 -0
  348. data/src/core/transport/chttp2/varint.c +66 -0
  349. data/src/core/transport/chttp2/varint.h +76 -0
  350. data/src/core/transport/chttp2/writing.c +356 -0
  351. data/src/core/transport/chttp2_transport.c +1692 -0
  352. data/src/core/transport/chttp2_transport.h +51 -0
  353. data/src/core/transport/connectivity_state.c +164 -0
  354. data/src/core/transport/connectivity_state.h +85 -0
  355. data/src/core/transport/metadata.c +690 -0
  356. data/src/core/transport/metadata.h +156 -0
  357. data/src/core/transport/metadata_batch.c +194 -0
  358. data/src/core/transport/metadata_batch.h +125 -0
  359. data/src/core/transport/static_metadata.c +90 -0
  360. data/src/core/transport/static_metadata.h +408 -0
  361. data/src/core/transport/transport.c +183 -0
  362. data/src/core/transport/transport.h +222 -0
  363. data/src/core/transport/transport_impl.h +78 -0
  364. data/src/core/transport/transport_op_string.c +140 -0
  365. data/src/core/tsi/fake_transport_security.c +525 -0
  366. data/src/core/tsi/fake_transport_security.h +61 -0
  367. data/src/core/tsi/ssl_transport_security.c +1467 -0
  368. data/src/core/tsi/ssl_transport_security.h +173 -0
  369. data/src/core/tsi/transport_security.c +284 -0
  370. data/src/core/tsi/transport_security.h +111 -0
  371. data/src/core/tsi/transport_security_interface.h +344 -0
  372. data/{bin → src/ruby/bin}/apis/google/protobuf/empty.rb +0 -0
  373. data/{bin → src/ruby/bin}/apis/pubsub_demo.rb +7 -15
  374. data/{bin → src/ruby/bin}/apis/tech/pubsub/proto/pubsub.rb +0 -0
  375. data/{bin → src/ruby/bin}/apis/tech/pubsub/proto/pubsub_services.rb +0 -0
  376. data/{bin → src/ruby/bin}/grpc_ruby_interop_client +0 -0
  377. data/{bin → src/ruby/bin}/grpc_ruby_interop_server +0 -0
  378. data/{bin → src/ruby/bin}/interop/interop_client.rb +0 -0
  379. data/{bin → src/ruby/bin}/interop/interop_server.rb +0 -0
  380. data/src/ruby/bin/math.rb +32 -0
  381. data/{bin → src/ruby/bin}/math_client.rb +1 -1
  382. data/{bin → src/ruby/bin}/math_server.rb +1 -1
  383. data/src/ruby/bin/math_services.rb +27 -0
  384. data/{bin → src/ruby/bin}/noproto_client.rb +1 -1
  385. data/{bin → src/ruby/bin}/noproto_server.rb +1 -1
  386. data/{ext → src/ruby/ext}/grpc/extconf.rb +24 -40
  387. data/{ext → src/ruby/ext}/grpc/rb_byte_buffer.c +0 -0
  388. data/{ext → src/ruby/ext}/grpc/rb_byte_buffer.h +0 -0
  389. data/{ext → src/ruby/ext}/grpc/rb_call.c +80 -18
  390. data/{ext → src/ruby/ext}/grpc/rb_call.h +6 -0
  391. data/src/ruby/ext/grpc/rb_call_credentials.c +315 -0
  392. data/src/ruby/ext/grpc/rb_call_credentials.h +46 -0
  393. data/{ext → src/ruby/ext}/grpc/rb_channel.c +19 -7
  394. data/{ext → src/ruby/ext}/grpc/rb_channel.h +0 -0
  395. data/{ext → src/ruby/ext}/grpc/rb_channel_args.c +2 -0
  396. data/{ext → src/ruby/ext}/grpc/rb_channel_args.h +0 -0
  397. data/src/ruby/ext/grpc/rb_channel_credentials.c +266 -0
  398. data/{ext/grpc/rb_credentials.h → src/ruby/ext/grpc/rb_channel_credentials.h} +3 -3
  399. data/{ext → src/ruby/ext}/grpc/rb_completion_queue.c +3 -1
  400. data/{ext → src/ruby/ext}/grpc/rb_completion_queue.h +0 -0
  401. data/src/ruby/ext/grpc/rb_event_thread.c +153 -0
  402. data/src/ruby/ext/grpc/rb_event_thread.h +37 -0
  403. data/{ext → src/ruby/ext}/grpc/rb_grpc.c +25 -5
  404. data/{ext → src/ruby/ext}/grpc/rb_grpc.h +0 -0
  405. data/{ext → src/ruby/ext}/grpc/rb_server.c +4 -1
  406. data/{ext → src/ruby/ext}/grpc/rb_server.h +0 -0
  407. data/{ext → src/ruby/ext}/grpc/rb_server_credentials.c +2 -0
  408. data/{ext → src/ruby/ext}/grpc/rb_server_credentials.h +0 -0
  409. data/{lib → src/ruby/lib}/grpc.rb +6 -1
  410. data/{lib → src/ruby/lib}/grpc/core/time_consts.rb +0 -0
  411. data/{lib → src/ruby/lib}/grpc/errors.rb +0 -0
  412. data/{lib → src/ruby/lib}/grpc/generic/active_call.rb +4 -6
  413. data/{lib → src/ruby/lib}/grpc/generic/bidi_call.rb +16 -4
  414. data/{lib → src/ruby/lib}/grpc/generic/client_stub.rb +42 -52
  415. data/{lib → src/ruby/lib}/grpc/generic/rpc_desc.rb +0 -0
  416. data/{lib → src/ruby/lib}/grpc/generic/rpc_server.rb +15 -8
  417. data/{lib → src/ruby/lib}/grpc/generic/service.rb +4 -2
  418. data/src/ruby/lib/grpc/grpc.so +0 -0
  419. data/{lib → src/ruby/lib}/grpc/logconfig.rb +0 -0
  420. data/{lib → src/ruby/lib}/grpc/notifier.rb +0 -0
  421. data/{lib → src/ruby/lib}/grpc/version.rb +2 -2
  422. data/src/ruby/pb/README.md +42 -0
  423. data/src/ruby/pb/generate_proto_ruby.sh +51 -0
  424. data/src/ruby/pb/grpc/health/checker.rb +75 -0
  425. data/src/ruby/pb/grpc/health/v1alpha/health.rb +29 -0
  426. data/src/ruby/pb/grpc/health/v1alpha/health_services.rb +28 -0
  427. data/src/ruby/pb/test/client.rb +469 -0
  428. data/src/ruby/pb/test/proto/empty.rb +15 -0
  429. data/src/ruby/pb/test/proto/messages.rb +80 -0
  430. data/src/ruby/pb/test/proto/test.rb +14 -0
  431. data/src/ruby/pb/test/proto/test_services.rb +64 -0
  432. data/src/ruby/pb/test/server.rb +253 -0
  433. data/{bin/math_services.rb → src/ruby/spec/call_credentials_spec.rb} +19 -18
  434. data/{spec → src/ruby/spec}/call_spec.rb +10 -1
  435. data/{spec/credentials_spec.rb → src/ruby/spec/channel_credentials_spec.rb} +38 -12
  436. data/{spec → src/ruby/spec}/channel_spec.rb +14 -9
  437. data/{spec → src/ruby/spec}/client_server_spec.rb +31 -2
  438. data/{spec → src/ruby/spec}/completion_queue_spec.rb +0 -0
  439. data/{spec → src/ruby/spec}/generic/active_call_spec.rb +2 -1
  440. data/{spec → src/ruby/spec}/generic/client_stub_spec.rb +27 -67
  441. data/{spec → src/ruby/spec}/generic/rpc_desc_spec.rb +0 -0
  442. data/{spec → src/ruby/spec}/generic/rpc_server_pool_spec.rb +0 -0
  443. data/{spec → src/ruby/spec}/generic/rpc_server_spec.rb +12 -46
  444. data/{spec → src/ruby/spec}/generic/service_spec.rb +6 -3
  445. data/{spec → src/ruby/spec}/pb/health/checker_spec.rb +8 -8
  446. data/{spec → src/ruby/spec}/server_credentials_spec.rb +0 -0
  447. data/{spec → src/ruby/spec}/server_spec.rb +0 -0
  448. data/{spec → src/ruby/spec}/spec_helper.rb +0 -0
  449. data/{spec → src/ruby/spec}/testdata/README +0 -0
  450. data/{spec → src/ruby/spec}/testdata/ca.pem +0 -0
  451. data/{spec → src/ruby/spec}/testdata/server1.key +0 -0
  452. data/src/ruby/spec/testdata/server1.pem +16 -0
  453. data/{spec → src/ruby/spec}/time_consts_spec.rb +0 -0
  454. metadata +496 -97
  455. data/bin/math.proto +0 -80
  456. data/bin/math.rb +0 -61
  457. data/ext/grpc/rb_credentials.c +0 -294
  458. data/lib/grpc/grpc.so +0 -0
  459. data/spec/testdata/server1.pem +0 -16
@@ -0,0 +1,49 @@
1
+ /*
2
+ *
3
+ * Copyright 2015, 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_INTERNAL_CORE_SECURITY_SECURE_ENDPOINT_H
35
+ #define GRPC_INTERNAL_CORE_SECURITY_SECURE_ENDPOINT_H
36
+
37
+ #include "src/core/iomgr/endpoint.h"
38
+ #include <grpc/support/slice.h>
39
+
40
+ struct tsi_frame_protector;
41
+
42
+ extern int grpc_trace_secure_endpoint;
43
+
44
+ /* Takes ownership of protector and to_wrap, and refs leftover_slices. */
45
+ grpc_endpoint *grpc_secure_endpoint_create(
46
+ struct tsi_frame_protector *protector, grpc_endpoint *to_wrap,
47
+ gpr_slice *leftover_slices, size_t leftover_nslices);
48
+
49
+ #endif /* GRPC_INTERNAL_CORE_SECURITY_SECURE_ENDPOINT_H */
@@ -0,0 +1,756 @@
1
+ /*
2
+ *
3
+ * Copyright 2015, 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/security/security_connector.h"
35
+
36
+ #include <string.h>
37
+
38
+ #include "src/core/security/credentials.h"
39
+ #include "src/core/security/handshake.h"
40
+ #include "src/core/security/secure_endpoint.h"
41
+ #include "src/core/security/security_context.h"
42
+ #include "src/core/support/env.h"
43
+ #include "src/core/support/file.h"
44
+ #include "src/core/support/string.h"
45
+ #include "src/core/transport/chttp2/alpn.h"
46
+
47
+ #include <grpc/support/alloc.h>
48
+ #include <grpc/support/host_port.h>
49
+ #include <grpc/support/log.h>
50
+ #include <grpc/support/slice_buffer.h>
51
+ #include <grpc/support/string_util.h>
52
+ #include "src/core/tsi/fake_transport_security.h"
53
+ #include "src/core/tsi/ssl_transport_security.h"
54
+
55
+ /* -- Constants. -- */
56
+
57
+ #ifndef INSTALL_PREFIX
58
+ static const char *installed_roots_path = "/usr/share/grpc/roots.pem";
59
+ #else
60
+ static const char *installed_roots_path =
61
+ INSTALL_PREFIX "/share/grpc/roots.pem";
62
+ #endif
63
+
64
+ /* -- Cipher suites. -- */
65
+
66
+ /* Defines the cipher suites that we accept by default. All these cipher suites
67
+ are compliant with HTTP2. */
68
+ #define GRPC_SSL_CIPHER_SUITES \
69
+ "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-" \
70
+ "SHA384:ECDHE-RSA-AES256-GCM-SHA384"
71
+
72
+ static gpr_once cipher_suites_once = GPR_ONCE_INIT;
73
+ static const char *cipher_suites = NULL;
74
+
75
+ static void init_cipher_suites(void) {
76
+ char *overridden = gpr_getenv("GRPC_SSL_CIPHER_SUITES");
77
+ cipher_suites = overridden != NULL ? overridden : GRPC_SSL_CIPHER_SUITES;
78
+ }
79
+
80
+ static const char *ssl_cipher_suites(void) {
81
+ gpr_once_init(&cipher_suites_once, init_cipher_suites);
82
+ return cipher_suites;
83
+ }
84
+
85
+ /* -- Common methods. -- */
86
+
87
+ /* Returns the first property with that name. */
88
+ const tsi_peer_property *tsi_peer_get_property_by_name(const tsi_peer *peer,
89
+ const char *name) {
90
+ size_t i;
91
+ if (peer == NULL) return NULL;
92
+ for (i = 0; i < peer->property_count; i++) {
93
+ const tsi_peer_property *property = &peer->properties[i];
94
+ if (name == NULL && property->name == NULL) {
95
+ return property;
96
+ }
97
+ if (name != NULL && property->name != NULL &&
98
+ strcmp(property->name, name) == 0) {
99
+ return property;
100
+ }
101
+ }
102
+ return NULL;
103
+ }
104
+
105
+ void grpc_security_connector_shutdown(grpc_exec_ctx *exec_ctx,
106
+ grpc_security_connector *connector) {
107
+ grpc_security_connector_handshake_list *tmp;
108
+ if (!connector->is_client_side) {
109
+ gpr_mu_lock(&connector->mu);
110
+ while (connector->handshaking_handshakes) {
111
+ tmp = connector->handshaking_handshakes;
112
+ grpc_security_handshake_shutdown(
113
+ exec_ctx, connector->handshaking_handshakes->handshake);
114
+ connector->handshaking_handshakes = tmp->next;
115
+ gpr_free(tmp);
116
+ }
117
+ gpr_mu_unlock(&connector->mu);
118
+ }
119
+ }
120
+
121
+ void grpc_security_connector_do_handshake(grpc_exec_ctx *exec_ctx,
122
+ grpc_security_connector *sc,
123
+ grpc_endpoint *nonsecure_endpoint,
124
+ grpc_security_handshake_done_cb cb,
125
+ void *user_data) {
126
+ if (sc == NULL || nonsecure_endpoint == NULL) {
127
+ cb(exec_ctx, user_data, GRPC_SECURITY_ERROR, NULL, NULL);
128
+ } else {
129
+ sc->vtable->do_handshake(exec_ctx, sc, nonsecure_endpoint, cb, user_data);
130
+ }
131
+ }
132
+
133
+ void grpc_security_connector_check_peer(grpc_exec_ctx *exec_ctx,
134
+ grpc_security_connector *sc,
135
+ tsi_peer peer,
136
+ grpc_security_peer_check_cb cb,
137
+ void *user_data) {
138
+ if (sc == NULL) {
139
+ cb(exec_ctx, user_data, GRPC_SECURITY_ERROR, NULL);
140
+ tsi_peer_destruct(&peer);
141
+ } else {
142
+ sc->vtable->check_peer(exec_ctx, sc, peer, cb, user_data);
143
+ }
144
+ }
145
+
146
+ void grpc_channel_security_connector_check_call_host(
147
+ grpc_exec_ctx *exec_ctx, grpc_channel_security_connector *sc,
148
+ const char *host, grpc_auth_context *auth_context,
149
+ grpc_security_call_host_check_cb cb, void *user_data) {
150
+ if (sc == NULL || sc->check_call_host == NULL) {
151
+ cb(exec_ctx, user_data, GRPC_SECURITY_ERROR);
152
+ } else {
153
+ sc->check_call_host(exec_ctx, sc, host, auth_context, cb, user_data);
154
+ }
155
+ }
156
+
157
+ #ifdef GRPC_SECURITY_CONNECTOR_REFCOUNT_DEBUG
158
+ grpc_security_connector *grpc_security_connector_ref(
159
+ grpc_security_connector *sc, const char *file, int line,
160
+ const char *reason) {
161
+ if (sc == NULL) return NULL;
162
+ gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG,
163
+ "SECURITY_CONNECTOR:%p ref %d -> %d %s", sc,
164
+ (int)sc->refcount.count, (int)sc->refcount.count + 1, reason);
165
+ #else
166
+ grpc_security_connector *grpc_security_connector_ref(
167
+ grpc_security_connector *sc) {
168
+ if (sc == NULL) return NULL;
169
+ #endif
170
+ gpr_ref(&sc->refcount);
171
+ return sc;
172
+ }
173
+
174
+ #ifdef GRPC_SECURITY_CONNECTOR_REFCOUNT_DEBUG
175
+ void grpc_security_connector_unref(grpc_security_connector *sc,
176
+ const char *file, int line,
177
+ const char *reason) {
178
+ if (sc == NULL) return;
179
+ gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG,
180
+ "SECURITY_CONNECTOR:%p unref %d -> %d %s", sc,
181
+ (int)sc->refcount.count, (int)sc->refcount.count - 1, reason);
182
+ #else
183
+ void grpc_security_connector_unref(grpc_security_connector *sc) {
184
+ if (sc == NULL) return;
185
+ #endif
186
+ if (gpr_unref(&sc->refcount)) sc->vtable->destroy(sc);
187
+ }
188
+
189
+ static void connector_pointer_arg_destroy(void *p) {
190
+ GRPC_SECURITY_CONNECTOR_UNREF(p, "connector_pointer_arg");
191
+ }
192
+
193
+ static void *connector_pointer_arg_copy(void *p) {
194
+ return GRPC_SECURITY_CONNECTOR_REF(p, "connector_pointer_arg");
195
+ }
196
+
197
+ grpc_arg grpc_security_connector_to_arg(grpc_security_connector *sc) {
198
+ grpc_arg result;
199
+ result.type = GRPC_ARG_POINTER;
200
+ result.key = GRPC_SECURITY_CONNECTOR_ARG;
201
+ result.value.pointer.destroy = connector_pointer_arg_destroy;
202
+ result.value.pointer.copy = connector_pointer_arg_copy;
203
+ result.value.pointer.p = sc;
204
+ return result;
205
+ }
206
+
207
+ grpc_security_connector *grpc_security_connector_from_arg(const grpc_arg *arg) {
208
+ if (strcmp(arg->key, GRPC_SECURITY_CONNECTOR_ARG)) return NULL;
209
+ if (arg->type != GRPC_ARG_POINTER) {
210
+ gpr_log(GPR_ERROR, "Invalid type %d for arg %s", arg->type,
211
+ GRPC_SECURITY_CONNECTOR_ARG);
212
+ return NULL;
213
+ }
214
+ return arg->value.pointer.p;
215
+ }
216
+
217
+ grpc_security_connector *grpc_find_security_connector_in_args(
218
+ const grpc_channel_args *args) {
219
+ size_t i;
220
+ if (args == NULL) return NULL;
221
+ for (i = 0; i < args->num_args; i++) {
222
+ grpc_security_connector *sc =
223
+ grpc_security_connector_from_arg(&args->args[i]);
224
+ if (sc != NULL) return sc;
225
+ }
226
+ return NULL;
227
+ }
228
+
229
+ /* -- Fake implementation. -- */
230
+
231
+ static void fake_channel_destroy(grpc_security_connector *sc) {
232
+ grpc_channel_security_connector *c = (grpc_channel_security_connector *)sc;
233
+ grpc_call_credentials_unref(c->request_metadata_creds);
234
+ gpr_free(sc);
235
+ }
236
+
237
+ static void fake_server_destroy(grpc_security_connector *sc) {
238
+ gpr_mu_destroy(&sc->mu);
239
+ gpr_free(sc);
240
+ }
241
+
242
+ static void fake_check_peer(grpc_exec_ctx *exec_ctx,
243
+ grpc_security_connector *sc, tsi_peer peer,
244
+ grpc_security_peer_check_cb cb, void *user_data) {
245
+ const char *prop_name;
246
+ grpc_security_status status = GRPC_SECURITY_OK;
247
+ grpc_auth_context *auth_context = NULL;
248
+ if (peer.property_count != 1) {
249
+ gpr_log(GPR_ERROR, "Fake peers should only have 1 property.");
250
+ status = GRPC_SECURITY_ERROR;
251
+ goto end;
252
+ }
253
+ prop_name = peer.properties[0].name;
254
+ if (prop_name == NULL ||
255
+ strcmp(prop_name, TSI_CERTIFICATE_TYPE_PEER_PROPERTY)) {
256
+ gpr_log(GPR_ERROR, "Unexpected property in fake peer: %s.",
257
+ prop_name == NULL ? "<EMPTY>" : prop_name);
258
+ status = GRPC_SECURITY_ERROR;
259
+ goto end;
260
+ }
261
+ if (strncmp(peer.properties[0].value.data, TSI_FAKE_CERTIFICATE_TYPE,
262
+ peer.properties[0].value.length)) {
263
+ gpr_log(GPR_ERROR, "Invalid value for cert type property.");
264
+ status = GRPC_SECURITY_ERROR;
265
+ goto end;
266
+ }
267
+ auth_context = grpc_auth_context_create(NULL);
268
+ grpc_auth_context_add_cstring_property(
269
+ auth_context, GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME,
270
+ GRPC_FAKE_TRANSPORT_SECURITY_TYPE);
271
+
272
+ end:
273
+ cb(exec_ctx, user_data, status, auth_context);
274
+ grpc_auth_context_unref(auth_context);
275
+ tsi_peer_destruct(&peer);
276
+ }
277
+
278
+ static void fake_channel_check_call_host(grpc_exec_ctx *exec_ctx,
279
+ grpc_channel_security_connector *sc,
280
+ const char *host,
281
+ grpc_auth_context *auth_context,
282
+ grpc_security_call_host_check_cb cb,
283
+ void *user_data) {
284
+ cb(exec_ctx, user_data, GRPC_SECURITY_OK);
285
+ }
286
+
287
+ static void fake_channel_do_handshake(grpc_exec_ctx *exec_ctx,
288
+ grpc_security_connector *sc,
289
+ grpc_endpoint *nonsecure_endpoint,
290
+ grpc_security_handshake_done_cb cb,
291
+ void *user_data) {
292
+ grpc_do_security_handshake(exec_ctx, tsi_create_fake_handshaker(1), sc,
293
+ nonsecure_endpoint, cb, user_data);
294
+ }
295
+
296
+ static void fake_server_do_handshake(grpc_exec_ctx *exec_ctx,
297
+ grpc_security_connector *sc,
298
+ grpc_endpoint *nonsecure_endpoint,
299
+ grpc_security_handshake_done_cb cb,
300
+ void *user_data) {
301
+ grpc_do_security_handshake(exec_ctx, tsi_create_fake_handshaker(0), sc,
302
+ nonsecure_endpoint, cb, user_data);
303
+ }
304
+
305
+ static grpc_security_connector_vtable fake_channel_vtable = {
306
+ fake_channel_destroy, fake_channel_do_handshake, fake_check_peer};
307
+
308
+ static grpc_security_connector_vtable fake_server_vtable = {
309
+ fake_server_destroy, fake_server_do_handshake, fake_check_peer};
310
+
311
+ grpc_channel_security_connector *grpc_fake_channel_security_connector_create(
312
+ grpc_call_credentials *request_metadata_creds) {
313
+ grpc_channel_security_connector *c = gpr_malloc(sizeof(*c));
314
+ memset(c, 0, sizeof(*c));
315
+ gpr_ref_init(&c->base.refcount, 1);
316
+ c->base.is_client_side = 1;
317
+ c->base.url_scheme = GRPC_FAKE_SECURITY_URL_SCHEME;
318
+ c->base.vtable = &fake_channel_vtable;
319
+ c->request_metadata_creds =
320
+ grpc_call_credentials_ref(request_metadata_creds);
321
+ c->check_call_host = fake_channel_check_call_host;
322
+ return c;
323
+ }
324
+
325
+ grpc_security_connector *grpc_fake_server_security_connector_create(void) {
326
+ grpc_security_connector *c = gpr_malloc(sizeof(grpc_security_connector));
327
+ memset(c, 0, sizeof(grpc_security_connector));
328
+ gpr_ref_init(&c->refcount, 1);
329
+ c->is_client_side = 0;
330
+ c->vtable = &fake_server_vtable;
331
+ c->url_scheme = GRPC_FAKE_SECURITY_URL_SCHEME;
332
+ gpr_mu_init(&c->mu);
333
+ return c;
334
+ }
335
+
336
+ /* --- Ssl implementation. --- */
337
+
338
+ typedef struct {
339
+ grpc_channel_security_connector base;
340
+ tsi_ssl_handshaker_factory *handshaker_factory;
341
+ char *target_name;
342
+ char *overridden_target_name;
343
+ } grpc_ssl_channel_security_connector;
344
+
345
+ typedef struct {
346
+ grpc_security_connector base;
347
+ tsi_ssl_handshaker_factory *handshaker_factory;
348
+ } grpc_ssl_server_security_connector;
349
+
350
+ static void ssl_channel_destroy(grpc_security_connector *sc) {
351
+ grpc_ssl_channel_security_connector *c =
352
+ (grpc_ssl_channel_security_connector *)sc;
353
+ grpc_call_credentials_unref(c->base.request_metadata_creds);
354
+ if (c->handshaker_factory != NULL) {
355
+ tsi_ssl_handshaker_factory_destroy(c->handshaker_factory);
356
+ }
357
+ if (c->target_name != NULL) gpr_free(c->target_name);
358
+ if (c->overridden_target_name != NULL) gpr_free(c->overridden_target_name);
359
+ gpr_free(sc);
360
+ }
361
+
362
+ static void ssl_server_destroy(grpc_security_connector *sc) {
363
+ grpc_ssl_server_security_connector *c =
364
+ (grpc_ssl_server_security_connector *)sc;
365
+
366
+ if (c->handshaker_factory != NULL) {
367
+ tsi_ssl_handshaker_factory_destroy(c->handshaker_factory);
368
+ }
369
+ gpr_mu_destroy(&sc->mu);
370
+ gpr_free(sc);
371
+ }
372
+
373
+ static grpc_security_status ssl_create_handshaker(
374
+ tsi_ssl_handshaker_factory *handshaker_factory, int is_client,
375
+ const char *peer_name, tsi_handshaker **handshaker) {
376
+ tsi_result result = TSI_OK;
377
+ if (handshaker_factory == NULL) return GRPC_SECURITY_ERROR;
378
+ result = tsi_ssl_handshaker_factory_create_handshaker(
379
+ handshaker_factory, is_client ? peer_name : NULL, handshaker);
380
+ if (result != TSI_OK) {
381
+ gpr_log(GPR_ERROR, "Handshaker creation failed with error %s.",
382
+ tsi_result_to_string(result));
383
+ return GRPC_SECURITY_ERROR;
384
+ }
385
+ return GRPC_SECURITY_OK;
386
+ }
387
+
388
+ static void ssl_channel_do_handshake(grpc_exec_ctx *exec_ctx,
389
+ grpc_security_connector *sc,
390
+ grpc_endpoint *nonsecure_endpoint,
391
+ grpc_security_handshake_done_cb cb,
392
+ void *user_data) {
393
+ grpc_ssl_channel_security_connector *c =
394
+ (grpc_ssl_channel_security_connector *)sc;
395
+ tsi_handshaker *handshaker;
396
+ grpc_security_status status = ssl_create_handshaker(
397
+ c->handshaker_factory, 1,
398
+ c->overridden_target_name != NULL ? c->overridden_target_name
399
+ : c->target_name,
400
+ &handshaker);
401
+ if (status != GRPC_SECURITY_OK) {
402
+ cb(exec_ctx, user_data, status, NULL, NULL);
403
+ } else {
404
+ grpc_do_security_handshake(exec_ctx, handshaker, sc, nonsecure_endpoint, cb,
405
+ user_data);
406
+ }
407
+ }
408
+
409
+ static void ssl_server_do_handshake(grpc_exec_ctx *exec_ctx,
410
+ grpc_security_connector *sc,
411
+ grpc_endpoint *nonsecure_endpoint,
412
+ grpc_security_handshake_done_cb cb,
413
+ void *user_data) {
414
+ grpc_ssl_server_security_connector *c =
415
+ (grpc_ssl_server_security_connector *)sc;
416
+ tsi_handshaker *handshaker;
417
+ grpc_security_status status =
418
+ ssl_create_handshaker(c->handshaker_factory, 0, NULL, &handshaker);
419
+ if (status != GRPC_SECURITY_OK) {
420
+ cb(exec_ctx, user_data, status, NULL, NULL);
421
+ } else {
422
+ grpc_do_security_handshake(exec_ctx, handshaker, sc, nonsecure_endpoint, cb,
423
+ user_data);
424
+ }
425
+ }
426
+
427
+ static int ssl_host_matches_name(const tsi_peer *peer, const char *peer_name) {
428
+ char *allocated_name = NULL;
429
+ int r;
430
+
431
+ if (strchr(peer_name, ':') != NULL) {
432
+ char *ignored_port;
433
+ gpr_split_host_port(peer_name, &allocated_name, &ignored_port);
434
+ gpr_free(ignored_port);
435
+ peer_name = allocated_name;
436
+ if (!peer_name) return 0;
437
+ }
438
+ r = tsi_ssl_peer_matches_name(peer, peer_name);
439
+ gpr_free(allocated_name);
440
+ return r;
441
+ }
442
+
443
+ grpc_auth_context *tsi_ssl_peer_to_auth_context(const tsi_peer *peer) {
444
+ size_t i;
445
+ grpc_auth_context *ctx = NULL;
446
+ const char *peer_identity_property_name = NULL;
447
+
448
+ /* The caller has checked the certificate type property. */
449
+ GPR_ASSERT(peer->property_count >= 1);
450
+ ctx = grpc_auth_context_create(NULL);
451
+ grpc_auth_context_add_cstring_property(
452
+ ctx, GRPC_TRANSPORT_SECURITY_TYPE_PROPERTY_NAME,
453
+ GRPC_SSL_TRANSPORT_SECURITY_TYPE);
454
+ for (i = 0; i < peer->property_count; i++) {
455
+ const tsi_peer_property *prop = &peer->properties[i];
456
+ if (prop->name == NULL) continue;
457
+ if (strcmp(prop->name, TSI_X509_SUBJECT_COMMON_NAME_PEER_PROPERTY) == 0) {
458
+ /* If there is no subject alt name, have the CN as the identity. */
459
+ if (peer_identity_property_name == NULL) {
460
+ peer_identity_property_name = GRPC_X509_CN_PROPERTY_NAME;
461
+ }
462
+ grpc_auth_context_add_property(ctx, GRPC_X509_CN_PROPERTY_NAME,
463
+ prop->value.data, prop->value.length);
464
+ } else if (strcmp(prop->name,
465
+ TSI_X509_SUBJECT_ALTERNATIVE_NAME_PEER_PROPERTY) == 0) {
466
+ peer_identity_property_name = GRPC_X509_SAN_PROPERTY_NAME;
467
+ grpc_auth_context_add_property(ctx, GRPC_X509_SAN_PROPERTY_NAME,
468
+ prop->value.data, prop->value.length);
469
+ }
470
+ }
471
+ if (peer_identity_property_name != NULL) {
472
+ GPR_ASSERT(grpc_auth_context_set_peer_identity_property_name(
473
+ ctx, peer_identity_property_name) == 1);
474
+ }
475
+ return ctx;
476
+ }
477
+
478
+ static grpc_security_status ssl_check_peer(grpc_security_connector *sc,
479
+ const char *peer_name,
480
+ const tsi_peer *peer,
481
+ grpc_auth_context **auth_context) {
482
+ /* Check the ALPN. */
483
+ const tsi_peer_property *p =
484
+ tsi_peer_get_property_by_name(peer, TSI_SSL_ALPN_SELECTED_PROTOCOL);
485
+ if (p == NULL) {
486
+ gpr_log(GPR_ERROR, "Missing selected ALPN property.");
487
+ return GRPC_SECURITY_ERROR;
488
+ }
489
+ if (!grpc_chttp2_is_alpn_version_supported(p->value.data, p->value.length)) {
490
+ gpr_log(GPR_ERROR, "Invalid ALPN value.");
491
+ return GRPC_SECURITY_ERROR;
492
+ }
493
+
494
+ /* Check the peer name if specified. */
495
+ if (peer_name != NULL && !ssl_host_matches_name(peer, peer_name)) {
496
+ gpr_log(GPR_ERROR, "Peer name %s is not in peer certificate", peer_name);
497
+ return GRPC_SECURITY_ERROR;
498
+ }
499
+ *auth_context = tsi_ssl_peer_to_auth_context(peer);
500
+ return GRPC_SECURITY_OK;
501
+ }
502
+
503
+ static void ssl_channel_check_peer(
504
+ grpc_exec_ctx *exec_ctx, grpc_security_connector *sc, tsi_peer peer,
505
+ grpc_security_peer_check_cb cb, void *user_data) {
506
+ grpc_ssl_channel_security_connector *c =
507
+ (grpc_ssl_channel_security_connector *)sc;
508
+ grpc_security_status status;
509
+ grpc_auth_context *auth_context = NULL;
510
+ status = ssl_check_peer(sc, c->overridden_target_name != NULL
511
+ ? c->overridden_target_name
512
+ : c->target_name,
513
+ &peer, &auth_context);
514
+ cb(exec_ctx, user_data, status, auth_context);
515
+ grpc_auth_context_unref(auth_context);
516
+ tsi_peer_destruct(&peer);
517
+ }
518
+
519
+ static void ssl_server_check_peer(
520
+ grpc_exec_ctx *exec_ctx, grpc_security_connector *sc, tsi_peer peer,
521
+ grpc_security_peer_check_cb cb, void *user_data) {
522
+ grpc_auth_context *auth_context = NULL;
523
+ grpc_security_status status = ssl_check_peer(sc, NULL, &peer, &auth_context);
524
+ tsi_peer_destruct(&peer);
525
+ cb(exec_ctx, user_data, status, auth_context);
526
+ grpc_auth_context_unref(auth_context);
527
+ }
528
+
529
+ static void add_shalow_auth_property_to_peer(tsi_peer *peer,
530
+ const grpc_auth_property *prop,
531
+ const char *tsi_prop_name) {
532
+ tsi_peer_property *tsi_prop = &peer->properties[peer->property_count++];
533
+ tsi_prop->name = (char *)tsi_prop_name;
534
+ tsi_prop->value.data = prop->value;
535
+ tsi_prop->value.length = prop->value_length;
536
+ }
537
+
538
+ tsi_peer tsi_shallow_peer_from_ssl_auth_context(
539
+ const grpc_auth_context *auth_context) {
540
+ size_t max_num_props = 0;
541
+ grpc_auth_property_iterator it;
542
+ const grpc_auth_property *prop;
543
+ tsi_peer peer;
544
+ memset(&peer, 0, sizeof(peer));
545
+
546
+ it = grpc_auth_context_property_iterator(auth_context);
547
+ while (grpc_auth_property_iterator_next(&it) != NULL) max_num_props++;
548
+
549
+ if (max_num_props > 0) {
550
+ peer.properties = gpr_malloc(max_num_props * sizeof(tsi_peer_property));
551
+ it = grpc_auth_context_property_iterator(auth_context);
552
+ while ((prop = grpc_auth_property_iterator_next(&it)) != NULL) {
553
+ if (strcmp(prop->name, GRPC_X509_SAN_PROPERTY_NAME) == 0) {
554
+ add_shalow_auth_property_to_peer(
555
+ &peer, prop, TSI_X509_SUBJECT_ALTERNATIVE_NAME_PEER_PROPERTY);
556
+ } else if (strcmp(prop->name, GRPC_X509_CN_PROPERTY_NAME) == 0) {
557
+ add_shalow_auth_property_to_peer(
558
+ &peer, prop, TSI_X509_SUBJECT_COMMON_NAME_PEER_PROPERTY);
559
+ }
560
+ }
561
+ }
562
+ return peer;
563
+ }
564
+
565
+ void tsi_shallow_peer_destruct(tsi_peer *peer) {
566
+ if (peer->properties != NULL) gpr_free(peer->properties);
567
+ }
568
+
569
+ static void ssl_channel_check_call_host(grpc_exec_ctx *exec_ctx,
570
+ grpc_channel_security_connector *sc,
571
+ const char *host,
572
+ grpc_auth_context *auth_context,
573
+ grpc_security_call_host_check_cb cb,
574
+ void *user_data) {
575
+ grpc_ssl_channel_security_connector *c =
576
+ (grpc_ssl_channel_security_connector *)sc;
577
+ grpc_security_status status = GRPC_SECURITY_ERROR;
578
+ tsi_peer peer = tsi_shallow_peer_from_ssl_auth_context(auth_context);
579
+ if (ssl_host_matches_name(&peer, host)) status = GRPC_SECURITY_OK;
580
+
581
+ /* If the target name was overridden, then the original target_name was
582
+ 'checked' transitively during the previous peer check at the end of the
583
+ handshake. */
584
+ if (c->overridden_target_name != NULL && strcmp(host, c->target_name) == 0) {
585
+ status = GRPC_SECURITY_OK;
586
+ }
587
+ cb(exec_ctx, user_data, status);
588
+ tsi_shallow_peer_destruct(&peer);
589
+ }
590
+
591
+ static grpc_security_connector_vtable ssl_channel_vtable = {
592
+ ssl_channel_destroy, ssl_channel_do_handshake, ssl_channel_check_peer};
593
+
594
+ static grpc_security_connector_vtable ssl_server_vtable = {
595
+ ssl_server_destroy, ssl_server_do_handshake, ssl_server_check_peer};
596
+
597
+ static gpr_slice default_pem_root_certs;
598
+
599
+ static void init_default_pem_root_certs(void) {
600
+ /* First try to load the roots from the environment. */
601
+ char *default_root_certs_path =
602
+ gpr_getenv(GRPC_DEFAULT_SSL_ROOTS_FILE_PATH_ENV_VAR);
603
+ if (default_root_certs_path == NULL) {
604
+ default_pem_root_certs = gpr_empty_slice();
605
+ } else {
606
+ default_pem_root_certs = gpr_load_file(default_root_certs_path, 0, NULL);
607
+ gpr_free(default_root_certs_path);
608
+ }
609
+
610
+ /* Fall back to installed certs if needed. */
611
+ if (GPR_SLICE_IS_EMPTY(default_pem_root_certs)) {
612
+ default_pem_root_certs = gpr_load_file(installed_roots_path, 0, NULL);
613
+ }
614
+ }
615
+
616
+ size_t grpc_get_default_ssl_roots(const unsigned char **pem_root_certs) {
617
+ /* TODO(jboeuf@google.com): Maybe revisit the approach which consists in
618
+ loading all the roots once for the lifetime of the process. */
619
+ static gpr_once once = GPR_ONCE_INIT;
620
+ gpr_once_init(&once, init_default_pem_root_certs);
621
+ *pem_root_certs = GPR_SLICE_START_PTR(default_pem_root_certs);
622
+ return GPR_SLICE_LENGTH(default_pem_root_certs);
623
+ }
624
+
625
+ grpc_security_status grpc_ssl_channel_security_connector_create(
626
+ grpc_call_credentials *request_metadata_creds,
627
+ const grpc_ssl_config *config, const char *target_name,
628
+ const char *overridden_target_name, grpc_channel_security_connector **sc) {
629
+ size_t num_alpn_protocols = grpc_chttp2_num_alpn_versions();
630
+ const unsigned char **alpn_protocol_strings =
631
+ gpr_malloc(sizeof(const char *) * num_alpn_protocols);
632
+ unsigned char *alpn_protocol_string_lengths =
633
+ gpr_malloc(sizeof(unsigned char) * num_alpn_protocols);
634
+ tsi_result result = TSI_OK;
635
+ grpc_ssl_channel_security_connector *c;
636
+ size_t i;
637
+ const unsigned char *pem_root_certs;
638
+ size_t pem_root_certs_size;
639
+ char *port;
640
+
641
+ for (i = 0; i < num_alpn_protocols; i++) {
642
+ alpn_protocol_strings[i] =
643
+ (const unsigned char *)grpc_chttp2_get_alpn_version_index(i);
644
+ alpn_protocol_string_lengths[i] =
645
+ (unsigned char)strlen(grpc_chttp2_get_alpn_version_index(i));
646
+ }
647
+
648
+ if (config == NULL || target_name == NULL) {
649
+ gpr_log(GPR_ERROR, "An ssl channel needs a config and a target name.");
650
+ goto error;
651
+ }
652
+ if (config->pem_root_certs == NULL) {
653
+ pem_root_certs_size = grpc_get_default_ssl_roots(&pem_root_certs);
654
+ if (pem_root_certs == NULL || pem_root_certs_size == 0) {
655
+ gpr_log(GPR_ERROR, "Could not get default pem root certs.");
656
+ goto error;
657
+ }
658
+ } else {
659
+ pem_root_certs = config->pem_root_certs;
660
+ pem_root_certs_size = config->pem_root_certs_size;
661
+ }
662
+
663
+ c = gpr_malloc(sizeof(grpc_ssl_channel_security_connector));
664
+ memset(c, 0, sizeof(grpc_ssl_channel_security_connector));
665
+
666
+ gpr_ref_init(&c->base.base.refcount, 1);
667
+ c->base.base.vtable = &ssl_channel_vtable;
668
+ c->base.base.is_client_side = 1;
669
+ c->base.base.url_scheme = GRPC_SSL_URL_SCHEME;
670
+ c->base.request_metadata_creds =
671
+ grpc_call_credentials_ref(request_metadata_creds);
672
+ c->base.check_call_host = ssl_channel_check_call_host;
673
+ gpr_split_host_port(target_name, &c->target_name, &port);
674
+ gpr_free(port);
675
+ if (overridden_target_name != NULL) {
676
+ c->overridden_target_name = gpr_strdup(overridden_target_name);
677
+ }
678
+ result = tsi_create_ssl_client_handshaker_factory(
679
+ config->pem_private_key, config->pem_private_key_size,
680
+ config->pem_cert_chain, config->pem_cert_chain_size, pem_root_certs,
681
+ pem_root_certs_size, ssl_cipher_suites(), alpn_protocol_strings,
682
+ alpn_protocol_string_lengths, (uint16_t)num_alpn_protocols,
683
+ &c->handshaker_factory);
684
+ if (result != TSI_OK) {
685
+ gpr_log(GPR_ERROR, "Handshaker factory creation failed with %s.",
686
+ tsi_result_to_string(result));
687
+ ssl_channel_destroy(&c->base.base);
688
+ *sc = NULL;
689
+ goto error;
690
+ }
691
+ *sc = &c->base;
692
+ gpr_free((void *)alpn_protocol_strings);
693
+ gpr_free(alpn_protocol_string_lengths);
694
+ return GRPC_SECURITY_OK;
695
+
696
+ error:
697
+ gpr_free((void *)alpn_protocol_strings);
698
+ gpr_free(alpn_protocol_string_lengths);
699
+ return GRPC_SECURITY_ERROR;
700
+ }
701
+
702
+ grpc_security_status grpc_ssl_server_security_connector_create(
703
+ const grpc_ssl_server_config *config, grpc_security_connector **sc) {
704
+ size_t num_alpn_protocols = grpc_chttp2_num_alpn_versions();
705
+ const unsigned char **alpn_protocol_strings =
706
+ gpr_malloc(sizeof(const char *) * num_alpn_protocols);
707
+ unsigned char *alpn_protocol_string_lengths =
708
+ gpr_malloc(sizeof(unsigned char) * num_alpn_protocols);
709
+ tsi_result result = TSI_OK;
710
+ grpc_ssl_server_security_connector *c;
711
+ size_t i;
712
+
713
+ for (i = 0; i < num_alpn_protocols; i++) {
714
+ alpn_protocol_strings[i] =
715
+ (const unsigned char *)grpc_chttp2_get_alpn_version_index(i);
716
+ alpn_protocol_string_lengths[i] =
717
+ (unsigned char)strlen(grpc_chttp2_get_alpn_version_index(i));
718
+ }
719
+
720
+ if (config == NULL || config->num_key_cert_pairs == 0) {
721
+ gpr_log(GPR_ERROR, "An SSL server needs a key and a cert.");
722
+ goto error;
723
+ }
724
+ c = gpr_malloc(sizeof(grpc_ssl_server_security_connector));
725
+ memset(c, 0, sizeof(grpc_ssl_server_security_connector));
726
+
727
+ gpr_ref_init(&c->base.refcount, 1);
728
+ c->base.url_scheme = GRPC_SSL_URL_SCHEME;
729
+ c->base.vtable = &ssl_server_vtable;
730
+ result = tsi_create_ssl_server_handshaker_factory(
731
+ (const unsigned char **)config->pem_private_keys,
732
+ config->pem_private_keys_sizes,
733
+ (const unsigned char **)config->pem_cert_chains,
734
+ config->pem_cert_chains_sizes, config->num_key_cert_pairs,
735
+ config->pem_root_certs, config->pem_root_certs_size,
736
+ config->force_client_auth, ssl_cipher_suites(), alpn_protocol_strings,
737
+ alpn_protocol_string_lengths, (uint16_t)num_alpn_protocols,
738
+ &c->handshaker_factory);
739
+ if (result != TSI_OK) {
740
+ gpr_log(GPR_ERROR, "Handshaker factory creation failed with %s.",
741
+ tsi_result_to_string(result));
742
+ ssl_server_destroy(&c->base);
743
+ *sc = NULL;
744
+ goto error;
745
+ }
746
+ gpr_mu_init(&c->base.mu);
747
+ *sc = &c->base;
748
+ gpr_free((void *)alpn_protocol_strings);
749
+ gpr_free(alpn_protocol_string_lengths);
750
+ return GRPC_SECURITY_OK;
751
+
752
+ error:
753
+ gpr_free((void *)alpn_protocol_strings);
754
+ gpr_free(alpn_protocol_string_lengths);
755
+ return GRPC_SECURITY_ERROR;
756
+ }