@ohos-ports/confluentinc-kafka-javascript 1.10.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (628) hide show
  1. package/CHANGELOG.md +457 -0
  2. package/LICENSE.kafkajs +31 -0
  3. package/LICENSE.node-rdkafka +25 -0
  4. package/LICENSE.txt +20 -0
  5. package/README.md +133 -0
  6. package/binding.gyp +184 -0
  7. package/build/Release/confluent-kafka-javascript.node +0 -0
  8. package/build/deps/librdkafka++.so.1 +0 -0
  9. package/build/deps/librdkafka.Makefile +6 -0
  10. package/build/deps/librdkafka.so.1 +0 -0
  11. package/build/deps/librdkafka.target.mk +55 -0
  12. package/deps/librdkafka/.clang-format +136 -0
  13. package/deps/librdkafka/.clang-format-cpp +103 -0
  14. package/deps/librdkafka/.dir-locals.el +10 -0
  15. package/deps/librdkafka/.formatignore +35 -0
  16. package/deps/librdkafka/.gdbmacros +19 -0
  17. package/deps/librdkafka/CHANGELOG.md +2477 -0
  18. package/deps/librdkafka/CMakeLists.txt +291 -0
  19. package/deps/librdkafka/CODE_OF_CONDUCT.md +46 -0
  20. package/deps/librdkafka/CONFIGURATION.md +212 -0
  21. package/deps/librdkafka/CONTRIBUTING.md +431 -0
  22. package/deps/librdkafka/Doxyfile +2375 -0
  23. package/deps/librdkafka/INTRODUCTION.md +2752 -0
  24. package/deps/librdkafka/LICENSE +26 -0
  25. package/deps/librdkafka/LICENSE.cjson +22 -0
  26. package/deps/librdkafka/LICENSE.crc32c +28 -0
  27. package/deps/librdkafka/LICENSE.fnv1a +18 -0
  28. package/deps/librdkafka/LICENSE.hdrhistogram +27 -0
  29. package/deps/librdkafka/LICENSE.lz4 +26 -0
  30. package/deps/librdkafka/LICENSE.murmur2 +25 -0
  31. package/deps/librdkafka/LICENSE.nanopb +22 -0
  32. package/deps/librdkafka/LICENSE.opentelemetry +203 -0
  33. package/deps/librdkafka/LICENSE.pycrc +23 -0
  34. package/deps/librdkafka/LICENSE.queue +31 -0
  35. package/deps/librdkafka/LICENSE.regexp +5 -0
  36. package/deps/librdkafka/LICENSE.snappy +36 -0
  37. package/deps/librdkafka/LICENSE.tinycthread +26 -0
  38. package/deps/librdkafka/LICENSE.wingetopt +49 -0
  39. package/deps/librdkafka/LICENSES.txt +625 -0
  40. package/deps/librdkafka/Makefile +125 -0
  41. package/deps/librdkafka/README.md +201 -0
  42. package/deps/librdkafka/README.win32 +26 -0
  43. package/deps/librdkafka/STATISTICS.md +624 -0
  44. package/deps/librdkafka/configure +214 -0
  45. package/deps/librdkafka/configure.self +341 -0
  46. package/deps/librdkafka/dev-conf.sh +123 -0
  47. package/deps/librdkafka/lds-gen.py +73 -0
  48. package/deps/librdkafka/mainpage.doxy +40 -0
  49. package/deps/librdkafka/mklove/Makefile.base +329 -0
  50. package/deps/librdkafka/mklove/modules/configure.atomics +144 -0
  51. package/deps/librdkafka/mklove/modules/configure.base +2484 -0
  52. package/deps/librdkafka/mklove/modules/configure.builtin +70 -0
  53. package/deps/librdkafka/mklove/modules/configure.cc +186 -0
  54. package/deps/librdkafka/mklove/modules/configure.cxx +8 -0
  55. package/deps/librdkafka/mklove/modules/configure.fileversion +65 -0
  56. package/deps/librdkafka/mklove/modules/configure.gitversion +29 -0
  57. package/deps/librdkafka/mklove/modules/configure.good_cflags +18 -0
  58. package/deps/librdkafka/mklove/modules/configure.host +132 -0
  59. package/deps/librdkafka/mklove/modules/configure.lib +49 -0
  60. package/deps/librdkafka/mklove/modules/configure.libcurl +99 -0
  61. package/deps/librdkafka/mklove/modules/configure.libsasl2 +36 -0
  62. package/deps/librdkafka/mklove/modules/configure.libssl +147 -0
  63. package/deps/librdkafka/mklove/modules/configure.libzstd +58 -0
  64. package/deps/librdkafka/mklove/modules/configure.parseversion +95 -0
  65. package/deps/librdkafka/mklove/modules/configure.pic +16 -0
  66. package/deps/librdkafka/mklove/modules/configure.socket +20 -0
  67. package/deps/librdkafka/mklove/modules/configure.zlib +61 -0
  68. package/deps/librdkafka/mklove/modules/patches/README.md +8 -0
  69. package/deps/librdkafka/mklove/modules/patches/libcurl.0000-no-runtime-linking-check.patch +11 -0
  70. package/deps/librdkafka/mklove/modules/patches/libssl.0000-osx-rand-include-fix-OpenSSL-PR16409.patch +56 -0
  71. package/deps/librdkafka/service.yml +182 -0
  72. package/deps/librdkafka/src/CMakeLists.txt +379 -0
  73. package/deps/librdkafka/src/Makefile +105 -0
  74. package/deps/librdkafka/src/README.lz4.md +30 -0
  75. package/deps/librdkafka/src/cJSON.c +3191 -0
  76. package/deps/librdkafka/src/cJSON.h +306 -0
  77. package/deps/librdkafka/src/crc32c.c +430 -0
  78. package/deps/librdkafka/src/crc32c.h +38 -0
  79. package/deps/librdkafka/src/generate_proto.sh +66 -0
  80. package/deps/librdkafka/src/librdkafka_cgrp_synch.png +0 -0
  81. package/deps/librdkafka/src/lz4.c +2727 -0
  82. package/deps/librdkafka/src/lz4.h +842 -0
  83. package/deps/librdkafka/src/lz4frame.c +2078 -0
  84. package/deps/librdkafka/src/lz4frame.h +692 -0
  85. package/deps/librdkafka/src/lz4frame_static.h +47 -0
  86. package/deps/librdkafka/src/lz4hc.c +1631 -0
  87. package/deps/librdkafka/src/lz4hc.h +413 -0
  88. package/deps/librdkafka/src/nanopb/pb.h +917 -0
  89. package/deps/librdkafka/src/nanopb/pb_common.c +388 -0
  90. package/deps/librdkafka/src/nanopb/pb_common.h +49 -0
  91. package/deps/librdkafka/src/nanopb/pb_decode.c +1727 -0
  92. package/deps/librdkafka/src/nanopb/pb_decode.h +193 -0
  93. package/deps/librdkafka/src/nanopb/pb_encode.c +1000 -0
  94. package/deps/librdkafka/src/nanopb/pb_encode.h +185 -0
  95. package/deps/librdkafka/src/opentelemetry/common.pb.c +32 -0
  96. package/deps/librdkafka/src/opentelemetry/common.pb.h +170 -0
  97. package/deps/librdkafka/src/opentelemetry/metrics.options +2 -0
  98. package/deps/librdkafka/src/opentelemetry/metrics.pb.c +67 -0
  99. package/deps/librdkafka/src/opentelemetry/metrics.pb.h +966 -0
  100. package/deps/librdkafka/src/opentelemetry/resource.pb.c +12 -0
  101. package/deps/librdkafka/src/opentelemetry/resource.pb.h +58 -0
  102. package/deps/librdkafka/src/queue.h +850 -0
  103. package/deps/librdkafka/src/rd.h +592 -0
  104. package/deps/librdkafka/src/rdaddr.c +255 -0
  105. package/deps/librdkafka/src/rdaddr.h +202 -0
  106. package/deps/librdkafka/src/rdatomic.h +262 -0
  107. package/deps/librdkafka/src/rdavg.h +260 -0
  108. package/deps/librdkafka/src/rdavl.c +210 -0
  109. package/deps/librdkafka/src/rdavl.h +250 -0
  110. package/deps/librdkafka/src/rdbase64.c +200 -0
  111. package/deps/librdkafka/src/rdbase64.h +43 -0
  112. package/deps/librdkafka/src/rdbuf.c +1884 -0
  113. package/deps/librdkafka/src/rdbuf.h +375 -0
  114. package/deps/librdkafka/src/rdcrc32.c +114 -0
  115. package/deps/librdkafka/src/rdcrc32.h +170 -0
  116. package/deps/librdkafka/src/rddl.c +179 -0
  117. package/deps/librdkafka/src/rddl.h +43 -0
  118. package/deps/librdkafka/src/rdendian.h +175 -0
  119. package/deps/librdkafka/src/rdfloat.h +67 -0
  120. package/deps/librdkafka/src/rdfnv1a.c +113 -0
  121. package/deps/librdkafka/src/rdfnv1a.h +35 -0
  122. package/deps/librdkafka/src/rdgz.c +120 -0
  123. package/deps/librdkafka/src/rdgz.h +46 -0
  124. package/deps/librdkafka/src/rdhdrhistogram.c +721 -0
  125. package/deps/librdkafka/src/rdhdrhistogram.h +87 -0
  126. package/deps/librdkafka/src/rdhttp.c +831 -0
  127. package/deps/librdkafka/src/rdhttp.h +101 -0
  128. package/deps/librdkafka/src/rdinterval.h +177 -0
  129. package/deps/librdkafka/src/rdkafka.c +7287 -0
  130. package/deps/librdkafka/src/rdkafka.h +11795 -0
  131. package/deps/librdkafka/src/rdkafka_admin.c +10165 -0
  132. package/deps/librdkafka/src/rdkafka_admin.h +658 -0
  133. package/deps/librdkafka/src/rdkafka_assignment.c +1282 -0
  134. package/deps/librdkafka/src/rdkafka_assignment.h +73 -0
  135. package/deps/librdkafka/src/rdkafka_assignor.c +1800 -0
  136. package/deps/librdkafka/src/rdkafka_assignor.h +402 -0
  137. package/deps/librdkafka/src/rdkafka_aux.c +409 -0
  138. package/deps/librdkafka/src/rdkafka_aux.h +174 -0
  139. package/deps/librdkafka/src/rdkafka_background.c +222 -0
  140. package/deps/librdkafka/src/rdkafka_broker.c +6736 -0
  141. package/deps/librdkafka/src/rdkafka_broker.h +851 -0
  142. package/deps/librdkafka/src/rdkafka_buf.c +543 -0
  143. package/deps/librdkafka/src/rdkafka_buf.h +1525 -0
  144. package/deps/librdkafka/src/rdkafka_cert.c +576 -0
  145. package/deps/librdkafka/src/rdkafka_cert.h +62 -0
  146. package/deps/librdkafka/src/rdkafka_cgrp.c +8310 -0
  147. package/deps/librdkafka/src/rdkafka_cgrp.h +589 -0
  148. package/deps/librdkafka/src/rdkafka_conf.c +5177 -0
  149. package/deps/librdkafka/src/rdkafka_conf.h +746 -0
  150. package/deps/librdkafka/src/rdkafka_confval.h +97 -0
  151. package/deps/librdkafka/src/rdkafka_coord.c +623 -0
  152. package/deps/librdkafka/src/rdkafka_coord.h +132 -0
  153. package/deps/librdkafka/src/rdkafka_error.c +228 -0
  154. package/deps/librdkafka/src/rdkafka_error.h +80 -0
  155. package/deps/librdkafka/src/rdkafka_event.c +502 -0
  156. package/deps/librdkafka/src/rdkafka_event.h +126 -0
  157. package/deps/librdkafka/src/rdkafka_feature.c +898 -0
  158. package/deps/librdkafka/src/rdkafka_feature.h +104 -0
  159. package/deps/librdkafka/src/rdkafka_fetcher.c +3820 -0
  160. package/deps/librdkafka/src/rdkafka_fetcher.h +62 -0
  161. package/deps/librdkafka/src/rdkafka_header.c +220 -0
  162. package/deps/librdkafka/src/rdkafka_header.h +76 -0
  163. package/deps/librdkafka/src/rdkafka_idempotence.c +807 -0
  164. package/deps/librdkafka/src/rdkafka_idempotence.h +144 -0
  165. package/deps/librdkafka/src/rdkafka_int.h +1505 -0
  166. package/deps/librdkafka/src/rdkafka_interceptor.c +842 -0
  167. package/deps/librdkafka/src/rdkafka_interceptor.h +104 -0
  168. package/deps/librdkafka/src/rdkafka_lz4.c +450 -0
  169. package/deps/librdkafka/src/rdkafka_lz4.h +49 -0
  170. package/deps/librdkafka/src/rdkafka_metadata.c +2347 -0
  171. package/deps/librdkafka/src/rdkafka_metadata.h +350 -0
  172. package/deps/librdkafka/src/rdkafka_metadata_cache.c +1183 -0
  173. package/deps/librdkafka/src/rdkafka_mock.c +4514 -0
  174. package/deps/librdkafka/src/rdkafka_mock.h +867 -0
  175. package/deps/librdkafka/src/rdkafka_mock_cgrp.c +1877 -0
  176. package/deps/librdkafka/src/rdkafka_mock_handlers.c +5255 -0
  177. package/deps/librdkafka/src/rdkafka_mock_int.h +1005 -0
  178. package/deps/librdkafka/src/rdkafka_mock_sharegrp.c +1207 -0
  179. package/deps/librdkafka/src/rdkafka_msg.c +2619 -0
  180. package/deps/librdkafka/src/rdkafka_msg.h +629 -0
  181. package/deps/librdkafka/src/rdkafka_msgbatch.h +62 -0
  182. package/deps/librdkafka/src/rdkafka_msgset.h +105 -0
  183. package/deps/librdkafka/src/rdkafka_msgset_reader.c +2099 -0
  184. package/deps/librdkafka/src/rdkafka_msgset_writer.c +1474 -0
  185. package/deps/librdkafka/src/rdkafka_offset.c +1565 -0
  186. package/deps/librdkafka/src/rdkafka_offset.h +150 -0
  187. package/deps/librdkafka/src/rdkafka_op.c +1219 -0
  188. package/deps/librdkafka/src/rdkafka_op.h +1065 -0
  189. package/deps/librdkafka/src/rdkafka_partition.c +5109 -0
  190. package/deps/librdkafka/src/rdkafka_partition.h +1215 -0
  191. package/deps/librdkafka/src/rdkafka_pattern.c +228 -0
  192. package/deps/librdkafka/src/rdkafka_pattern.h +70 -0
  193. package/deps/librdkafka/src/rdkafka_plugin.c +213 -0
  194. package/deps/librdkafka/src/rdkafka_plugin.h +41 -0
  195. package/deps/librdkafka/src/rdkafka_proto.h +739 -0
  196. package/deps/librdkafka/src/rdkafka_protocol.h +131 -0
  197. package/deps/librdkafka/src/rdkafka_queue.c +1351 -0
  198. package/deps/librdkafka/src/rdkafka_queue.h +1235 -0
  199. package/deps/librdkafka/src/rdkafka_range_assignor.c +1748 -0
  200. package/deps/librdkafka/src/rdkafka_request.c +7298 -0
  201. package/deps/librdkafka/src/rdkafka_request.h +761 -0
  202. package/deps/librdkafka/src/rdkafka_roundrobin_assignor.c +123 -0
  203. package/deps/librdkafka/src/rdkafka_sasl.c +589 -0
  204. package/deps/librdkafka/src/rdkafka_sasl.h +63 -0
  205. package/deps/librdkafka/src/rdkafka_sasl_cyrus.c +722 -0
  206. package/deps/librdkafka/src/rdkafka_sasl_int.h +89 -0
  207. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.c +1833 -0
  208. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer.h +52 -0
  209. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.c +1827 -0
  210. package/deps/librdkafka/src/rdkafka_sasl_oauthbearer_oidc.h +52 -0
  211. package/deps/librdkafka/src/rdkafka_sasl_plain.c +142 -0
  212. package/deps/librdkafka/src/rdkafka_sasl_scram.c +858 -0
  213. package/deps/librdkafka/src/rdkafka_sasl_win32.c +550 -0
  214. package/deps/librdkafka/src/rdkafka_share_acknowledgement.c +1445 -0
  215. package/deps/librdkafka/src/rdkafka_share_acknowledgement.h +373 -0
  216. package/deps/librdkafka/src/rdkafka_ssl.c +2235 -0
  217. package/deps/librdkafka/src/rdkafka_ssl.h +86 -0
  218. package/deps/librdkafka/src/rdkafka_sticky_assignor.c +4785 -0
  219. package/deps/librdkafka/src/rdkafka_subscription.c +411 -0
  220. package/deps/librdkafka/src/rdkafka_telemetry.c +761 -0
  221. package/deps/librdkafka/src/rdkafka_telemetry.h +52 -0
  222. package/deps/librdkafka/src/rdkafka_telemetry_decode.c +1307 -0
  223. package/deps/librdkafka/src/rdkafka_telemetry_decode.h +59 -0
  224. package/deps/librdkafka/src/rdkafka_telemetry_encode.c +1309 -0
  225. package/deps/librdkafka/src/rdkafka_telemetry_encode.h +459 -0
  226. package/deps/librdkafka/src/rdkafka_timer.c +407 -0
  227. package/deps/librdkafka/src/rdkafka_timer.h +117 -0
  228. package/deps/librdkafka/src/rdkafka_topic.c +2382 -0
  229. package/deps/librdkafka/src/rdkafka_topic.h +369 -0
  230. package/deps/librdkafka/src/rdkafka_transport.c +1309 -0
  231. package/deps/librdkafka/src/rdkafka_transport.h +99 -0
  232. package/deps/librdkafka/src/rdkafka_transport_int.h +100 -0
  233. package/deps/librdkafka/src/rdkafka_txnmgr.c +3256 -0
  234. package/deps/librdkafka/src/rdkafka_txnmgr.h +171 -0
  235. package/deps/librdkafka/src/rdkafka_zstd.c +226 -0
  236. package/deps/librdkafka/src/rdkafka_zstd.h +57 -0
  237. package/deps/librdkafka/src/rdlist.c +593 -0
  238. package/deps/librdkafka/src/rdlist.h +444 -0
  239. package/deps/librdkafka/src/rdlog.c +89 -0
  240. package/deps/librdkafka/src/rdlog.h +41 -0
  241. package/deps/librdkafka/src/rdmap.c +508 -0
  242. package/deps/librdkafka/src/rdmap.h +492 -0
  243. package/deps/librdkafka/src/rdmurmur2.c +167 -0
  244. package/deps/librdkafka/src/rdmurmur2.h +35 -0
  245. package/deps/librdkafka/src/rdports.c +61 -0
  246. package/deps/librdkafka/src/rdports.h +38 -0
  247. package/deps/librdkafka/src/rdposix.h +250 -0
  248. package/deps/librdkafka/src/rdrand.c +151 -0
  249. package/deps/librdkafka/src/rdrand.h +72 -0
  250. package/deps/librdkafka/src/rdregex.c +156 -0
  251. package/deps/librdkafka/src/rdregex.h +43 -0
  252. package/deps/librdkafka/src/rdsignal.h +57 -0
  253. package/deps/librdkafka/src/rdstring.c +645 -0
  254. package/deps/librdkafka/src/rdstring.h +98 -0
  255. package/deps/librdkafka/src/rdsysqueue.h +404 -0
  256. package/deps/librdkafka/src/rdtime.h +356 -0
  257. package/deps/librdkafka/src/rdtypes.h +86 -0
  258. package/deps/librdkafka/src/rdunittest.c +564 -0
  259. package/deps/librdkafka/src/rdunittest.h +232 -0
  260. package/deps/librdkafka/src/rdunittest_acknowledge.c +1177 -0
  261. package/deps/librdkafka/src/rdunittest_fetcher.c +1211 -0
  262. package/deps/librdkafka/src/rdunittest_msgset_errors.c +1521 -0
  263. package/deps/librdkafka/src/rdvarint.c +134 -0
  264. package/deps/librdkafka/src/rdvarint.h +165 -0
  265. package/deps/librdkafka/src/rdwin32.h +382 -0
  266. package/deps/librdkafka/src/rdxxhash.c +1030 -0
  267. package/deps/librdkafka/src/rdxxhash.h +328 -0
  268. package/deps/librdkafka/src/regexp.c +1352 -0
  269. package/deps/librdkafka/src/regexp.h +41 -0
  270. package/deps/librdkafka/src/snappy.c +1866 -0
  271. package/deps/librdkafka/src/snappy.h +62 -0
  272. package/deps/librdkafka/src/snappy_compat.h +138 -0
  273. package/deps/librdkafka/src/statistics_schema.json +444 -0
  274. package/deps/librdkafka/src/tinycthread.c +932 -0
  275. package/deps/librdkafka/src/tinycthread.h +503 -0
  276. package/deps/librdkafka/src/tinycthread_extra.c +210 -0
  277. package/deps/librdkafka/src/tinycthread_extra.h +218 -0
  278. package/deps/librdkafka/src/win32_config.h +58 -0
  279. package/deps/librdkafka/src-cpp/CMakeLists.txt +90 -0
  280. package/deps/librdkafka/src-cpp/ConfImpl.cpp +84 -0
  281. package/deps/librdkafka/src-cpp/ConsumerImpl.cpp +244 -0
  282. package/deps/librdkafka/src-cpp/HandleImpl.cpp +436 -0
  283. package/deps/librdkafka/src-cpp/HeadersImpl.cpp +48 -0
  284. package/deps/librdkafka/src-cpp/KafkaConsumerImpl.cpp +296 -0
  285. package/deps/librdkafka/src-cpp/Makefile +55 -0
  286. package/deps/librdkafka/src-cpp/MessageImpl.cpp +38 -0
  287. package/deps/librdkafka/src-cpp/MetadataImpl.cpp +170 -0
  288. package/deps/librdkafka/src-cpp/ProducerImpl.cpp +197 -0
  289. package/deps/librdkafka/src-cpp/QueueImpl.cpp +70 -0
  290. package/deps/librdkafka/src-cpp/README.md +16 -0
  291. package/deps/librdkafka/src-cpp/RdKafka.cpp +59 -0
  292. package/deps/librdkafka/src-cpp/TopicImpl.cpp +124 -0
  293. package/deps/librdkafka/src-cpp/TopicPartitionImpl.cpp +57 -0
  294. package/deps/librdkafka/src-cpp/rdkafkacpp.h +3797 -0
  295. package/deps/librdkafka/src-cpp/rdkafkacpp_int.h +1641 -0
  296. package/deps/librdkafka/tests/0000-unittests.c +72 -0
  297. package/deps/librdkafka/tests/0001-multiobj.c +102 -0
  298. package/deps/librdkafka/tests/0002-unkpart.c +244 -0
  299. package/deps/librdkafka/tests/0003-msgmaxsize.c +173 -0
  300. package/deps/librdkafka/tests/0004-conf.c +934 -0
  301. package/deps/librdkafka/tests/0005-order.c +133 -0
  302. package/deps/librdkafka/tests/0006-symbols.c +163 -0
  303. package/deps/librdkafka/tests/0007-autotopic.c +136 -0
  304. package/deps/librdkafka/tests/0008-reqacks.c +179 -0
  305. package/deps/librdkafka/tests/0009-mock_cluster.c +272 -0
  306. package/deps/librdkafka/tests/0011-produce_batch.c +753 -0
  307. package/deps/librdkafka/tests/0012-produce_consume.c +537 -0
  308. package/deps/librdkafka/tests/0013-null-msgs.c +473 -0
  309. package/deps/librdkafka/tests/0014-reconsume-191.c +512 -0
  310. package/deps/librdkafka/tests/0015-offset_seeks.c +172 -0
  311. package/deps/librdkafka/tests/0016-client_swname.c +181 -0
  312. package/deps/librdkafka/tests/0017-compression.c +140 -0
  313. package/deps/librdkafka/tests/0018-cgrp_term.c +444 -0
  314. package/deps/librdkafka/tests/0019-list_groups.c +289 -0
  315. package/deps/librdkafka/tests/0020-destroy_hang.c +162 -0
  316. package/deps/librdkafka/tests/0021-rkt_destroy.c +72 -0
  317. package/deps/librdkafka/tests/0022-consume_batch.c +331 -0
  318. package/deps/librdkafka/tests/0025-timers.c +147 -0
  319. package/deps/librdkafka/tests/0026-consume_pause.c +547 -0
  320. package/deps/librdkafka/tests/0028-long_topicnames.c +79 -0
  321. package/deps/librdkafka/tests/0029-assign_offset.c +202 -0
  322. package/deps/librdkafka/tests/0030-offset_commit.c +589 -0
  323. package/deps/librdkafka/tests/0031-get_offsets.c +235 -0
  324. package/deps/librdkafka/tests/0033-regex_subscribe.c +536 -0
  325. package/deps/librdkafka/tests/0034-offset_reset.c +398 -0
  326. package/deps/librdkafka/tests/0035-api_version.c +73 -0
  327. package/deps/librdkafka/tests/0036-partial_fetch.c +87 -0
  328. package/deps/librdkafka/tests/0037-destroy_hang_local.c +85 -0
  329. package/deps/librdkafka/tests/0038-performance.c +121 -0
  330. package/deps/librdkafka/tests/0039-event.c +284 -0
  331. package/deps/librdkafka/tests/0040-io_event.c +257 -0
  332. package/deps/librdkafka/tests/0041-fetch_max_bytes.c +97 -0
  333. package/deps/librdkafka/tests/0042-many_topics.c +252 -0
  334. package/deps/librdkafka/tests/0043-no_connection.c +77 -0
  335. package/deps/librdkafka/tests/0044-partition_cnt.c +94 -0
  336. package/deps/librdkafka/tests/0045-subscribe_update.c +1010 -0
  337. package/deps/librdkafka/tests/0046-rkt_cache.c +65 -0
  338. package/deps/librdkafka/tests/0047-partial_buf_tmout.c +98 -0
  339. package/deps/librdkafka/tests/0048-partitioner.c +283 -0
  340. package/deps/librdkafka/tests/0049-consume_conn_close.c +162 -0
  341. package/deps/librdkafka/tests/0050-subscribe_adds.c +145 -0
  342. package/deps/librdkafka/tests/0051-assign_adds.c +126 -0
  343. package/deps/librdkafka/tests/0052-msg_timestamps.c +238 -0
  344. package/deps/librdkafka/tests/0053-stats_cb.cpp +527 -0
  345. package/deps/librdkafka/tests/0054-offset_time.cpp +236 -0
  346. package/deps/librdkafka/tests/0055-producer_latency.c +539 -0
  347. package/deps/librdkafka/tests/0056-balanced_group_mt.c +315 -0
  348. package/deps/librdkafka/tests/0057-invalid_topic.cpp +112 -0
  349. package/deps/librdkafka/tests/0058-log.cpp +123 -0
  350. package/deps/librdkafka/tests/0059-bsearch.cpp +241 -0
  351. package/deps/librdkafka/tests/0060-op_prio.cpp +163 -0
  352. package/deps/librdkafka/tests/0061-consumer_lag.cpp +295 -0
  353. package/deps/librdkafka/tests/0062-stats_event.c +126 -0
  354. package/deps/librdkafka/tests/0063-clusterid.cpp +180 -0
  355. package/deps/librdkafka/tests/0064-interceptors.c +529 -0
  356. package/deps/librdkafka/tests/0065-yield.cpp +140 -0
  357. package/deps/librdkafka/tests/0066-plugins.cpp +143 -0
  358. package/deps/librdkafka/tests/0067-empty_topic.cpp +151 -0
  359. package/deps/librdkafka/tests/0068-produce_timeout.c +136 -0
  360. package/deps/librdkafka/tests/0069-consumer_add_parts.c +119 -0
  361. package/deps/librdkafka/tests/0070-null_empty.cpp +197 -0
  362. package/deps/librdkafka/tests/0072-headers_ut.c +448 -0
  363. package/deps/librdkafka/tests/0073-headers.c +381 -0
  364. package/deps/librdkafka/tests/0074-producev.c +87 -0
  365. package/deps/librdkafka/tests/0075-retry.c +290 -0
  366. package/deps/librdkafka/tests/0076-produce_retry.c +452 -0
  367. package/deps/librdkafka/tests/0077-compaction.c +366 -0
  368. package/deps/librdkafka/tests/0078-c_from_cpp.cpp +96 -0
  369. package/deps/librdkafka/tests/0079-fork.c +93 -0
  370. package/deps/librdkafka/tests/0080-admin_ut.c +3095 -0
  371. package/deps/librdkafka/tests/0081-admin.c +5633 -0
  372. package/deps/librdkafka/tests/0082-fetch_max_bytes.cpp +137 -0
  373. package/deps/librdkafka/tests/0083-cb_event.c +233 -0
  374. package/deps/librdkafka/tests/0084-destroy_flags.c +208 -0
  375. package/deps/librdkafka/tests/0085-headers.cpp +392 -0
  376. package/deps/librdkafka/tests/0086-purge.c +368 -0
  377. package/deps/librdkafka/tests/0088-produce_metadata_timeout.c +162 -0
  378. package/deps/librdkafka/tests/0089-max_poll_interval.c +511 -0
  379. package/deps/librdkafka/tests/0090-idempotence.c +171 -0
  380. package/deps/librdkafka/tests/0091-max_poll_interval_timeout.c +295 -0
  381. package/deps/librdkafka/tests/0092-mixed_msgver.c +103 -0
  382. package/deps/librdkafka/tests/0093-holb.c +200 -0
  383. package/deps/librdkafka/tests/0094-idempotence_msg_timeout.c +231 -0
  384. package/deps/librdkafka/tests/0095-all_brokers_down.cpp +122 -0
  385. package/deps/librdkafka/tests/0097-ssl_verify.cpp +674 -0
  386. package/deps/librdkafka/tests/0098-consumer-txn.cpp +1218 -0
  387. package/deps/librdkafka/tests/0099-commit_metadata.c +194 -0
  388. package/deps/librdkafka/tests/0100-thread_interceptors.cpp +195 -0
  389. package/deps/librdkafka/tests/0101-fetch-from-follower.cpp +446 -0
  390. package/deps/librdkafka/tests/0102-static_group_rebalance.c +836 -0
  391. package/deps/librdkafka/tests/0103-transactions.c +1383 -0
  392. package/deps/librdkafka/tests/0104-fetch_from_follower_mock.c +625 -0
  393. package/deps/librdkafka/tests/0105-transactions_mock.c +3930 -0
  394. package/deps/librdkafka/tests/0106-cgrp_sess_timeout.c +318 -0
  395. package/deps/librdkafka/tests/0107-topic_recreate.c +259 -0
  396. package/deps/librdkafka/tests/0109-auto_create_topics.cpp +278 -0
  397. package/deps/librdkafka/tests/0110-batch_size.cpp +182 -0
  398. package/deps/librdkafka/tests/0111-delay_create_topics.cpp +127 -0
  399. package/deps/librdkafka/tests/0112-assign_unknown_part.c +87 -0
  400. package/deps/librdkafka/tests/0113-cooperative_rebalance.cpp +3473 -0
  401. package/deps/librdkafka/tests/0114-sticky_partitioning.cpp +176 -0
  402. package/deps/librdkafka/tests/0115-producer_auth.cpp +182 -0
  403. package/deps/librdkafka/tests/0116-kafkaconsumer_close.cpp +216 -0
  404. package/deps/librdkafka/tests/0117-mock_errors.c +331 -0
  405. package/deps/librdkafka/tests/0118-commit_rebalance.c +154 -0
  406. package/deps/librdkafka/tests/0119-consumer_auth.cpp +167 -0
  407. package/deps/librdkafka/tests/0120-asymmetric_subscription.c +185 -0
  408. package/deps/librdkafka/tests/0121-clusterid.c +115 -0
  409. package/deps/librdkafka/tests/0122-buffer_cleaning_after_rebalance.c +227 -0
  410. package/deps/librdkafka/tests/0123-connections_max_idle.c +98 -0
  411. package/deps/librdkafka/tests/0124-openssl_invalid_engine.c +69 -0
  412. package/deps/librdkafka/tests/0125-immediate_flush.c +144 -0
  413. package/deps/librdkafka/tests/0126-oauthbearer_oidc.c +1164 -0
  414. package/deps/librdkafka/tests/0127-fetch_queue_backoff.cpp +165 -0
  415. package/deps/librdkafka/tests/0128-sasl_callback_queue.cpp +217 -0
  416. package/deps/librdkafka/tests/0129-fetch_aborted_msgs.c +79 -0
  417. package/deps/librdkafka/tests/0130-store_offsets.c +178 -0
  418. package/deps/librdkafka/tests/0131-connect_timeout.c +81 -0
  419. package/deps/librdkafka/tests/0132-strategy_ordering.c +179 -0
  420. package/deps/librdkafka/tests/0133-ssl_keys.c +150 -0
  421. package/deps/librdkafka/tests/0134-ssl_provider.c +92 -0
  422. package/deps/librdkafka/tests/0135-sasl_credentials.cpp +279 -0
  423. package/deps/librdkafka/tests/0136-resolve_cb.c +181 -0
  424. package/deps/librdkafka/tests/0137-barrier_batch_consume.c +752 -0
  425. package/deps/librdkafka/tests/0138-admin_mock.c +281 -0
  426. package/deps/librdkafka/tests/0139-offset_validation_mock.c +950 -0
  427. package/deps/librdkafka/tests/0140-commit_metadata.cpp +108 -0
  428. package/deps/librdkafka/tests/0142-reauthentication.c +931 -0
  429. package/deps/librdkafka/tests/0143-exponential_backoff_mock.c +552 -0
  430. package/deps/librdkafka/tests/0144-idempotence_mock.c +373 -0
  431. package/deps/librdkafka/tests/0145-pause_resume_mock.c +119 -0
  432. package/deps/librdkafka/tests/0146-metadata_mock.c +505 -0
  433. package/deps/librdkafka/tests/0147-consumer_group_consumer_mock.c +1210 -0
  434. package/deps/librdkafka/tests/0148-offset_fetch_commit_error_mock.c +569 -0
  435. package/deps/librdkafka/tests/0149-broker-same-host-port.c +140 -0
  436. package/deps/librdkafka/tests/0150-telemetry_mock.c +651 -0
  437. package/deps/librdkafka/tests/0151-purge-brokers.c +566 -0
  438. package/deps/librdkafka/tests/0152-rebootstrap.c +59 -0
  439. package/deps/librdkafka/tests/0153-memberid.c +128 -0
  440. package/deps/librdkafka/tests/0155-share_group_heartbeat_mock.c +2695 -0
  441. package/deps/librdkafka/tests/0156-share_consumer_fetch_mock.c +1551 -0
  442. package/deps/librdkafka/tests/0157-share_consumer_ack_mock.c +1788 -0
  443. package/deps/librdkafka/tests/0158-share_consumer_transactions_mock.c +467 -0
  444. package/deps/librdkafka/tests/0170-share_consumer_subscription.c +2192 -0
  445. package/deps/librdkafka/tests/0171-share_consumer_consume.c +2150 -0
  446. package/deps/librdkafka/tests/0172-share_consumer_acknowledge.c +1919 -0
  447. package/deps/librdkafka/tests/0173-share_consumer_commit_async.c +2735 -0
  448. package/deps/librdkafka/tests/0174-share_consumer_concurrency.c +1434 -0
  449. package/deps/librdkafka/tests/0175-share_consumer_groups.c +574 -0
  450. package/deps/librdkafka/tests/0176-share_consumer_commit_sync.c +2986 -0
  451. package/deps/librdkafka/tests/0177-share_consumer_transactions.c +1815 -0
  452. package/deps/librdkafka/tests/0178-share_consumer_close.c +2102 -0
  453. package/deps/librdkafka/tests/0179-share_consumer_destroy.c +2482 -0
  454. package/deps/librdkafka/tests/0180-share_consumer_config.c +1677 -0
  455. package/deps/librdkafka/tests/0181-share_consumer_topic_delete.c +354 -0
  456. package/deps/librdkafka/tests/0182-share_consumer_error_handling_mock.c +3358 -0
  457. package/deps/librdkafka/tests/0183-share_consumer_leader_change_mock.c +1234 -0
  458. package/deps/librdkafka/tests/0184-share_consumer_topic_recreate.c +1356 -0
  459. package/deps/librdkafka/tests/0185-share_consumer_max_poll_interval.c +557 -0
  460. package/deps/librdkafka/tests/0186-share_consumer_fatal_error.c +360 -0
  461. package/deps/librdkafka/tests/0190-share_consumer_telemetry.c +387 -0
  462. package/deps/librdkafka/tests/1000-unktopic.c +164 -0
  463. package/deps/librdkafka/tests/8000-idle.cpp +60 -0
  464. package/deps/librdkafka/tests/8001-fetch_from_follower_mock_manual.c +113 -0
  465. package/deps/librdkafka/tests/CMakeLists.txt +193 -0
  466. package/deps/librdkafka/tests/LibrdkafkaTestApp.py +291 -0
  467. package/deps/librdkafka/tests/Makefile +182 -0
  468. package/deps/librdkafka/tests/README.md +514 -0
  469. package/deps/librdkafka/tests/autotest.sh +33 -0
  470. package/deps/librdkafka/tests/backtrace.gdb +30 -0
  471. package/deps/librdkafka/tests/broker_version_tests.py +315 -0
  472. package/deps/librdkafka/tests/buildbox.sh +17 -0
  473. package/deps/librdkafka/tests/cleanup-checker-tests.sh +20 -0
  474. package/deps/librdkafka/tests/cluster_testing.py +203 -0
  475. package/deps/librdkafka/tests/delete-test-topics.sh +56 -0
  476. package/deps/librdkafka/tests/fixtures/oauthbearer/jwt_assertion_template.json +10 -0
  477. package/deps/librdkafka/tests/fixtures/ssl/Makefile +8 -0
  478. package/deps/librdkafka/tests/fixtures/ssl/README.md +13 -0
  479. package/deps/librdkafka/tests/fixtures/ssl/client.keystore.intermediate.p12 +0 -0
  480. package/deps/librdkafka/tests/fixtures/ssl/client.keystore.p12 +0 -0
  481. package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.intermediate.pem +72 -0
  482. package/deps/librdkafka/tests/fixtures/ssl/client2.certificate.pem +50 -0
  483. package/deps/librdkafka/tests/fixtures/ssl/client2.intermediate.key +46 -0
  484. package/deps/librdkafka/tests/fixtures/ssl/client2.key +46 -0
  485. package/deps/librdkafka/tests/fixtures/ssl/create_keys.sh +168 -0
  486. package/deps/librdkafka/tests/fuzzers/Makefile +12 -0
  487. package/deps/librdkafka/tests/fuzzers/README.md +31 -0
  488. package/deps/librdkafka/tests/fuzzers/fuzz_regex.c +74 -0
  489. package/deps/librdkafka/tests/fuzzers/helpers.h +90 -0
  490. package/deps/librdkafka/tests/gen-ssl-certs.sh +165 -0
  491. package/deps/librdkafka/tests/interactive_broker_version.py +170 -0
  492. package/deps/librdkafka/tests/interceptor_test/CMakeLists.txt +16 -0
  493. package/deps/librdkafka/tests/interceptor_test/Makefile +22 -0
  494. package/deps/librdkafka/tests/interceptor_test/interceptor_test.c +314 -0
  495. package/deps/librdkafka/tests/interceptor_test/interceptor_test.h +54 -0
  496. package/deps/librdkafka/tests/java/IncrementalRebalanceCli.java +97 -0
  497. package/deps/librdkafka/tests/java/Makefile +13 -0
  498. package/deps/librdkafka/tests/java/Murmur2Cli.java +46 -0
  499. package/deps/librdkafka/tests/java/README.md +14 -0
  500. package/deps/librdkafka/tests/java/TransactionProducerCli.java +162 -0
  501. package/deps/librdkafka/tests/java/run-class.sh +11 -0
  502. package/deps/librdkafka/tests/librdkafka.suppressions +483 -0
  503. package/deps/librdkafka/tests/lz4_manual_test.sh +59 -0
  504. package/deps/librdkafka/tests/multi-broker-version-test.sh +50 -0
  505. package/deps/librdkafka/tests/parse-refcnt.sh +43 -0
  506. package/deps/librdkafka/tests/performance_plot.py +115 -0
  507. package/deps/librdkafka/tests/plugin_test/Makefile +19 -0
  508. package/deps/librdkafka/tests/plugin_test/plugin_test.c +58 -0
  509. package/deps/librdkafka/tests/requirements.txt +2 -0
  510. package/deps/librdkafka/tests/run-all-tests.sh +81 -0
  511. package/deps/librdkafka/tests/run-consumer-tests.sh +16 -0
  512. package/deps/librdkafka/tests/run-producer-tests.sh +16 -0
  513. package/deps/librdkafka/tests/run-test-batches.py +157 -0
  514. package/deps/librdkafka/tests/run-test.sh +141 -0
  515. package/deps/librdkafka/tests/rusage.c +249 -0
  516. package/deps/librdkafka/tests/sasl_test.py +289 -0
  517. package/deps/librdkafka/tests/scenarios/README.md +6 -0
  518. package/deps/librdkafka/tests/scenarios/ak23.json +6 -0
  519. package/deps/librdkafka/tests/scenarios/default.json +5 -0
  520. package/deps/librdkafka/tests/scenarios/noautocreate.json +5 -0
  521. package/deps/librdkafka/tests/share_telemetry_verify/share-otel-collector-config.yaml +28 -0
  522. package/deps/librdkafka/tests/sockem.c +801 -0
  523. package/deps/librdkafka/tests/sockem.h +85 -0
  524. package/deps/librdkafka/tests/sockem_ctrl.c +145 -0
  525. package/deps/librdkafka/tests/sockem_ctrl.h +61 -0
  526. package/deps/librdkafka/tests/test.c +8376 -0
  527. package/deps/librdkafka/tests/test.conf.example +27 -0
  528. package/deps/librdkafka/tests/test.h +1150 -0
  529. package/deps/librdkafka/tests/testcpp.cpp +131 -0
  530. package/deps/librdkafka/tests/testcpp.h +388 -0
  531. package/deps/librdkafka/tests/testshared.h +416 -0
  532. package/deps/librdkafka/tests/tools/README.md +4 -0
  533. package/deps/librdkafka/tests/tools/stats/README.md +21 -0
  534. package/deps/librdkafka/tests/tools/stats/filter.jq +42 -0
  535. package/deps/librdkafka/tests/tools/stats/graph.py +150 -0
  536. package/deps/librdkafka/tests/tools/stats/requirements.txt +3 -0
  537. package/deps/librdkafka/tests/tools/stats/to_csv.py +124 -0
  538. package/deps/librdkafka/tests/trivup/trivup-0.15.0.tar.gz +0 -0
  539. package/deps/librdkafka/tests/until-fail.sh +87 -0
  540. package/deps/librdkafka/tests/xxxx-assign_partition.c +122 -0
  541. package/deps/librdkafka/tests/xxxx-metadata.cpp +159 -0
  542. package/deps/librdkafka/vcpkg.json +23 -0
  543. package/deps/librdkafka/win32/README.md +5 -0
  544. package/deps/librdkafka/win32/build-package.bat +3 -0
  545. package/deps/librdkafka/win32/build.bat +19 -0
  546. package/deps/librdkafka/win32/common.vcxproj +84 -0
  547. package/deps/librdkafka/win32/interceptor_test/interceptor_test.vcxproj +87 -0
  548. package/deps/librdkafka/win32/librdkafka.autopkg.template +54 -0
  549. package/deps/librdkafka/win32/librdkafka.master.testing.targets +13 -0
  550. package/deps/librdkafka/win32/librdkafka.sln +226 -0
  551. package/deps/librdkafka/win32/librdkafka.vcxproj +282 -0
  552. package/deps/librdkafka/win32/librdkafkacpp/librdkafkacpp.vcxproj +104 -0
  553. package/deps/librdkafka/win32/msbuild.ps1 +58 -0
  554. package/deps/librdkafka/win32/openssl_engine_example/openssl_engine_example.vcxproj +132 -0
  555. package/deps/librdkafka/win32/package-zip.ps1 +46 -0
  556. package/deps/librdkafka/win32/packages/repositories.config +4 -0
  557. package/deps/librdkafka/win32/push-package.bat +4 -0
  558. package/deps/librdkafka/win32/rdkafka_complex_consumer_example_cpp/rdkafka_complex_consumer_example_cpp.vcxproj +67 -0
  559. package/deps/librdkafka/win32/rdkafka_example/rdkafka_example.vcxproj +97 -0
  560. package/deps/librdkafka/win32/rdkafka_performance/rdkafka_performance.vcxproj +97 -0
  561. package/deps/librdkafka/win32/setup-msys2.ps1 +47 -0
  562. package/deps/librdkafka/win32/setup-vcpkg.ps1 +34 -0
  563. package/deps/librdkafka/win32/tests/test.conf.example +25 -0
  564. package/deps/librdkafka/win32/tests/tests.vcxproj +278 -0
  565. package/deps/librdkafka/win32/win_ssl_cert_store/win_ssl_cert_store.vcxproj +132 -0
  566. package/deps/librdkafka/win32/wingetopt.c +564 -0
  567. package/deps/librdkafka/win32/wingetopt.h +101 -0
  568. package/deps/librdkafka/win32/wintime.h +33 -0
  569. package/deps/librdkafka.gyp +83 -0
  570. package/deps/windows-install.py +80 -0
  571. package/index.d.ts +3 -0
  572. package/lib/admin.js +732 -0
  573. package/lib/client.js +679 -0
  574. package/lib/error.js +501 -0
  575. package/lib/index.js +8 -0
  576. package/lib/kafka-consumer-stream.js +399 -0
  577. package/lib/kafka-consumer.js +798 -0
  578. package/lib/kafkajs/_admin.js +1052 -0
  579. package/lib/kafkajs/_common.js +887 -0
  580. package/lib/kafkajs/_consumer.js +2156 -0
  581. package/lib/kafkajs/_consumer_cache.js +310 -0
  582. package/lib/kafkajs/_error.js +298 -0
  583. package/lib/kafkajs/_kafka.js +125 -0
  584. package/lib/kafkajs/_linked-list.js +220 -0
  585. package/lib/kafkajs/_producer.js +863 -0
  586. package/lib/kafkajs/index.js +5 -0
  587. package/lib/producer/high-level-producer.js +400 -0
  588. package/lib/producer-stream.js +337 -0
  589. package/lib/producer.js +405 -0
  590. package/lib/rdkafka.js +44 -0
  591. package/lib/tools/ref-counter.js +53 -0
  592. package/lib/topic-partition.js +91 -0
  593. package/lib/topic.js +43 -0
  594. package/lib/util.js +55 -0
  595. package/librdkafka.js +12 -0
  596. package/package.json +85 -0
  597. package/shim/source_location +54 -0
  598. package/src/admin.cc +1597 -0
  599. package/src/admin.h +112 -0
  600. package/src/binding.cc +76 -0
  601. package/src/binding.h +25 -0
  602. package/src/callbacks.cc +676 -0
  603. package/src/callbacks.h +302 -0
  604. package/src/common.cc +1628 -0
  605. package/src/common.h +192 -0
  606. package/src/config.cc +219 -0
  607. package/src/config.h +61 -0
  608. package/src/connection.cc +703 -0
  609. package/src/connection.h +117 -0
  610. package/src/errors.cc +119 -0
  611. package/src/errors.h +60 -0
  612. package/src/kafka-consumer.cc +1539 -0
  613. package/src/kafka-consumer.h +147 -0
  614. package/src/producer.cc +917 -0
  615. package/src/producer.h +124 -0
  616. package/src/topic.cc +173 -0
  617. package/src/topic.h +54 -0
  618. package/src/workers.cc +1714 -0
  619. package/src/workers.h +690 -0
  620. package/types/config.d.ts +1269 -0
  621. package/types/errors.d.ts +373 -0
  622. package/types/kafkajs.d.ts +568 -0
  623. package/types/rdkafka.d.ts +571 -0
  624. package/util/configure.js +32 -0
  625. package/util/generate-docs.sh +18 -0
  626. package/util/get-env.js +6 -0
  627. package/util/test-compile.js +11 -0
  628. package/util/test-producer-delivery.js +100 -0
@@ -0,0 +1,722 @@
1
+ /*
2
+ * librdkafka - The Apache Kafka C/C++ library
3
+ *
4
+ * Copyright (c) 2015-2022, Magnus Edenhill
5
+ * 2023, Confluent Inc.
6
+ * All rights reserved.
7
+ *
8
+ * Redistribution and use in source and binary forms, with or without
9
+ * modification, are permitted provided that the following conditions are met:
10
+ *
11
+ * 1. Redistributions of source code must retain the above copyright notice,
12
+ * this list of conditions and the following disclaimer.
13
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
14
+ * this list of conditions and the following disclaimer in the documentation
15
+ * and/or other materials provided with the distribution.
16
+ *
17
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27
+ * POSSIBILITY OF SUCH DAMAGE.
28
+ */
29
+
30
+ #include "rdkafka_int.h"
31
+ #include "rdkafka_transport.h"
32
+ #include "rdkafka_transport_int.h"
33
+ #include "rdkafka_sasl.h"
34
+ #include "rdkafka_sasl_int.h"
35
+ #include "rdstring.h"
36
+
37
+ #if defined(__FreeBSD__) || defined(__OpenBSD__)
38
+ #include <sys/wait.h> /* For WIF.. */
39
+ #endif
40
+
41
+ #ifdef __APPLE__
42
+ /* Apple has deprecated most of the SASL API for unknown reason,
43
+ * silence those warnings. */
44
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
45
+ #endif
46
+
47
+ #include <sasl/sasl.h>
48
+
49
+ /**
50
+ * @brief Process-global lock to avoid simultaneous invocation of
51
+ * kinit.cmd when refreshing the tickets, which could lead to
52
+ * kinit cache corruption.
53
+ */
54
+ static mtx_t rd_kafka_sasl_cyrus_kinit_lock;
55
+
56
+ /**
57
+ * @struct Per-client-instance handle
58
+ */
59
+ typedef struct rd_kafka_sasl_cyrus_handle_s {
60
+ rd_kafka_timer_t kinit_refresh_tmr;
61
+ rd_atomic32_t ready; /**< First kinit command has finished, or there
62
+ * is no kinit command. */
63
+ } rd_kafka_sasl_cyrus_handle_t;
64
+
65
+ /**
66
+ * @struct Per-connection state
67
+ */
68
+ typedef struct rd_kafka_sasl_cyrus_state_s {
69
+ sasl_conn_t *conn;
70
+ sasl_callback_t callbacks[16];
71
+ } rd_kafka_sasl_cyrus_state_t;
72
+
73
+
74
+
75
+ /**
76
+ * Handle received frame from broker.
77
+ */
78
+ static int rd_kafka_sasl_cyrus_recv(struct rd_kafka_transport_s *rktrans,
79
+ const void *buf,
80
+ size_t size,
81
+ char *errstr,
82
+ size_t errstr_size) {
83
+ rd_kafka_sasl_cyrus_state_t *state = rktrans->rktrans_sasl.state;
84
+ int r;
85
+ int sendcnt = 0;
86
+
87
+ if (rktrans->rktrans_sasl.complete && size == 0)
88
+ goto auth_successful;
89
+
90
+ do {
91
+ sasl_interact_t *interact = NULL;
92
+ const char *out;
93
+ unsigned int outlen;
94
+
95
+ mtx_lock(&rktrans->rktrans_rkb->rkb_rk->rk_conf.sasl.lock);
96
+ r = sasl_client_step(state->conn, size > 0 ? buf : NULL, size,
97
+ &interact, &out, &outlen);
98
+ mtx_unlock(&rktrans->rktrans_rkb->rkb_rk->rk_conf.sasl.lock);
99
+
100
+ if (r >= 0) {
101
+ /* Note: outlen may be 0 here for an empty response */
102
+ if (rd_kafka_sasl_send(rktrans, out, outlen, errstr,
103
+ errstr_size) == -1)
104
+ return -1;
105
+ sendcnt++;
106
+ }
107
+
108
+ if (r == SASL_INTERACT)
109
+ rd_rkb_dbg(rktrans->rktrans_rkb, SECURITY, "SASL",
110
+ "SASL_INTERACT: %lu %s, %s, %s, %p",
111
+ interact->id, interact->challenge,
112
+ interact->prompt, interact->defresult,
113
+ interact->result);
114
+
115
+ } while (r == SASL_INTERACT);
116
+
117
+ if (r == SASL_CONTINUE)
118
+ return 0; /* Wait for more data from broker */
119
+ else if (r != SASL_OK) {
120
+ rd_snprintf(errstr, errstr_size,
121
+ "SASL handshake failed (step): %s",
122
+ sasl_errdetail(state->conn));
123
+ return -1;
124
+ }
125
+
126
+ if (!rktrans->rktrans_sasl.complete && sendcnt > 0) {
127
+ /* With SaslAuthenticateRequest Kafka protocol framing
128
+ * we'll get a Response back after authentication is done,
129
+ * which should not be processed by Cyrus, but we still
130
+ * need to wait for the response to propgate its error,
131
+ * if any, before authentication is considered done.
132
+ *
133
+ * The legacy framing does not have a final broker->client
134
+ * response. */
135
+ rktrans->rktrans_sasl.complete = 1;
136
+
137
+ if (rktrans->rktrans_rkb->rkb_features &
138
+ RD_KAFKA_FEATURE_SASL_AUTH_REQ) {
139
+ rd_rkb_dbg(rktrans->rktrans_rkb, SECURITY, "SASL",
140
+ "%s authentication complete but awaiting "
141
+ "final response from broker",
142
+ rktrans->rktrans_rkb->rkb_rk->rk_conf.sasl
143
+ .mechanisms);
144
+ return 0;
145
+ }
146
+ }
147
+
148
+ /* Authentication successful */
149
+ auth_successful:
150
+ if (rktrans->rktrans_rkb->rkb_rk->rk_conf.debug &
151
+ RD_KAFKA_DBG_SECURITY) {
152
+ const char *user, *mech, *authsrc;
153
+
154
+ mtx_lock(&rktrans->rktrans_rkb->rkb_rk->rk_conf.sasl.lock);
155
+ if (sasl_getprop(state->conn, SASL_USERNAME,
156
+ (const void **)&user) != SASL_OK)
157
+ user = "(unknown)";
158
+ mtx_unlock(&rktrans->rktrans_rkb->rkb_rk->rk_conf.sasl.lock);
159
+
160
+ if (sasl_getprop(state->conn, SASL_MECHNAME,
161
+ (const void **)&mech) != SASL_OK)
162
+ mech = "(unknown)";
163
+
164
+ if (sasl_getprop(state->conn, SASL_AUTHSOURCE,
165
+ (const void **)&authsrc) != SASL_OK)
166
+ authsrc = "(unknown)";
167
+
168
+ rd_rkb_dbg(rktrans->rktrans_rkb, SECURITY, "SASL",
169
+ "Authenticated as %s using %s (%s)", user, mech,
170
+ authsrc);
171
+ }
172
+
173
+ rd_kafka_sasl_auth_done(rktrans);
174
+
175
+ return 0;
176
+ }
177
+
178
+
179
+
180
+ static ssize_t
181
+ render_callback(const char *key, char *buf, size_t size, void *opaque) {
182
+ rd_kafka_t *rk = opaque;
183
+ rd_kafka_conf_res_t res;
184
+ size_t destsize = size;
185
+
186
+ /* Try config lookup. */
187
+ res = rd_kafka_conf_get(&rk->rk_conf, key, buf, &destsize);
188
+ if (res != RD_KAFKA_CONF_OK)
189
+ return -1;
190
+
191
+ /* Dont include \0 in returned size */
192
+ return (destsize > 0 ? destsize - 1 : destsize);
193
+ }
194
+
195
+
196
+ /**
197
+ * @brief Execute kinit to refresh ticket.
198
+ *
199
+ * @returns 0 on success, -1 on error.
200
+ *
201
+ * @locality rdkafka main thread
202
+ */
203
+ static int rd_kafka_sasl_cyrus_kinit_refresh(rd_kafka_t *rk) {
204
+ rd_kafka_sasl_cyrus_handle_t *handle = rk->rk_sasl.handle;
205
+ int r;
206
+ char *cmd;
207
+ char errstr[128];
208
+ rd_ts_t ts_start;
209
+ int duration;
210
+
211
+ /* Build kinit refresh command line using string rendering and config */
212
+ cmd = rd_string_render(rk->rk_conf.sasl.kinit_cmd, errstr,
213
+ sizeof(errstr), render_callback, rk);
214
+ if (!cmd) {
215
+ rd_kafka_log(rk, LOG_ERR, "SASLREFRESH",
216
+ "Failed to construct kinit command "
217
+ "from sasl.kerberos.kinit.cmd template: %s",
218
+ errstr);
219
+ return -1;
220
+ }
221
+
222
+ /* Execute kinit */
223
+ rd_kafka_dbg(rk, SECURITY, "SASLREFRESH",
224
+ "Refreshing Kerberos ticket with command: %s", cmd);
225
+
226
+ ts_start = rd_clock();
227
+
228
+ /* Prevent multiple simultaneous refreshes by the same process to
229
+ * avoid Kerberos credential cache corruption. */
230
+ mtx_lock(&rd_kafka_sasl_cyrus_kinit_lock);
231
+ r = system(cmd);
232
+ mtx_unlock(&rd_kafka_sasl_cyrus_kinit_lock);
233
+
234
+ duration = (int)((rd_clock() - ts_start) / 1000);
235
+ if (duration > 5000)
236
+ rd_kafka_log(rk, LOG_WARNING, "SASLREFRESH",
237
+ "Slow Kerberos ticket refresh: %dms: %s", duration,
238
+ cmd);
239
+
240
+ /* Regardless of outcome from the kinit command (it can fail
241
+ * even if the ticket is available), we now allow broker connections. */
242
+ if (rd_atomic32_add(&handle->ready, 1) == 1) {
243
+ rd_kafka_dbg(rk, SECURITY, "SASLREFRESH",
244
+ "First kinit command finished: waking up "
245
+ "broker threads");
246
+ rd_kafka_all_brokers_wakeup(rk, RD_KAFKA_BROKER_STATE_INIT,
247
+ "Kerberos ticket refresh");
248
+ }
249
+
250
+ if (r == -1) {
251
+ if (errno == ECHILD) {
252
+ rd_kafka_log(rk, LOG_WARNING, "SASLREFRESH",
253
+ "Kerberos ticket refresh command "
254
+ "returned ECHILD: %s: exit status "
255
+ "unknown, assuming success",
256
+ cmd);
257
+ } else {
258
+ rd_kafka_log(rk, LOG_ERR, "SASLREFRESH",
259
+ "Kerberos ticket refresh failed: %s: %s",
260
+ cmd, rd_strerror(errno));
261
+ rd_free(cmd);
262
+ return -1;
263
+ }
264
+ } else if (WIFSIGNALED(r)) {
265
+ rd_kafka_log(rk, LOG_ERR, "SASLREFRESH",
266
+ "Kerberos ticket refresh failed: %s: "
267
+ "received signal %d",
268
+ cmd, WTERMSIG(r));
269
+ rd_free(cmd);
270
+ return -1;
271
+ } else if (WIFEXITED(r) && WEXITSTATUS(r) != 0) {
272
+ rd_kafka_log(rk, LOG_ERR, "SASLREFRESH",
273
+ "Kerberos ticket refresh failed: %s: "
274
+ "exited with code %d",
275
+ cmd, WEXITSTATUS(r));
276
+ rd_free(cmd);
277
+ return -1;
278
+ }
279
+
280
+ rd_free(cmd);
281
+
282
+ rd_kafka_dbg(rk, SECURITY, "SASLREFRESH",
283
+ "Kerberos ticket refreshed in %dms", duration);
284
+ return 0;
285
+ }
286
+
287
+
288
+ /**
289
+ * @brief Refresh timer callback
290
+ *
291
+ * @locality rdkafka main thread
292
+ */
293
+ static void rd_kafka_sasl_cyrus_kinit_refresh_tmr_cb(rd_kafka_timers_t *rkts,
294
+ void *arg) {
295
+ rd_kafka_t *rk = arg;
296
+
297
+ rd_kafka_sasl_cyrus_kinit_refresh(rk);
298
+ }
299
+
300
+
301
+
302
+ /**
303
+ *
304
+ * libsasl callbacks
305
+ *
306
+ */
307
+ static RD_UNUSED int rd_kafka_sasl_cyrus_cb_getopt(void *context,
308
+ const char *plugin_name,
309
+ const char *option,
310
+ const char **result,
311
+ unsigned *len) {
312
+ rd_kafka_transport_t *rktrans = context;
313
+
314
+ if (!strcmp(option, "client_mech_list"))
315
+ *result = "GSSAPI";
316
+ if (!strcmp(option, "canon_user_plugin"))
317
+ *result = "INTERNAL";
318
+
319
+ if (*result && len)
320
+ *len = strlen(*result);
321
+
322
+ rd_rkb_dbg(rktrans->rktrans_rkb, SECURITY, "LIBSASL",
323
+ "CB_GETOPT: plugin %s, option %s: returning %s", plugin_name,
324
+ option, *result);
325
+
326
+ return SASL_OK;
327
+ }
328
+
329
+ static int
330
+ rd_kafka_sasl_cyrus_cb_log(void *context, int level, const char *message) {
331
+ rd_kafka_transport_t *rktrans = context;
332
+
333
+ /* Provide a more helpful error message in case Kerberos
334
+ * plugins are missing. */
335
+ if (strstr(message, "No worthy mechs found") &&
336
+ strstr(rktrans->rktrans_rkb->rkb_rk->rk_conf.sasl.mechanisms,
337
+ "GSSAPI"))
338
+ message =
339
+ "Cyrus/libsasl2 is missing a GSSAPI module: "
340
+ "make sure the libsasl2-modules-gssapi-mit or "
341
+ "cyrus-sasl-gssapi packages are installed";
342
+
343
+ /* Treat the "client step" log messages as debug. */
344
+ if (level >= LOG_DEBUG || !strncmp(message, "GSSAPI client step ", 19))
345
+ rd_rkb_dbg(rktrans->rktrans_rkb, SECURITY, "LIBSASL", "%s",
346
+ message);
347
+ else
348
+ rd_rkb_log(rktrans->rktrans_rkb, level, "LIBSASL", "%s",
349
+ message);
350
+
351
+ return SASL_OK;
352
+ }
353
+
354
+
355
+ static int rd_kafka_sasl_cyrus_cb_getsimple(void *context,
356
+ int id,
357
+ const char **result,
358
+ unsigned *len) {
359
+ rd_kafka_transport_t *rktrans = context;
360
+
361
+ switch (id) {
362
+ case SASL_CB_USER:
363
+ case SASL_CB_AUTHNAME:
364
+ /* Since cyrus expects the returned pointer to be stable
365
+ * and not have its content changed, but the username
366
+ * and password may be updated at anytime by the application
367
+ * calling sasl_set_credentials(), we need to lock
368
+ * rk_conf.sasl.lock before each call into cyrus-sasl.
369
+ * So when we get here the lock is already held. */
370
+ *result = rktrans->rktrans_rkb->rkb_rk->rk_conf.sasl.username;
371
+ break;
372
+
373
+ default:
374
+ *result = NULL;
375
+ break;
376
+ }
377
+
378
+ if (len)
379
+ *len = *result ? strlen(*result) : 0;
380
+
381
+ rd_rkb_dbg(rktrans->rktrans_rkb, SECURITY, "LIBSASL",
382
+ "CB_GETSIMPLE: id 0x%x: returning %s", id, *result);
383
+
384
+ return *result ? SASL_OK : SASL_FAIL;
385
+ }
386
+
387
+
388
+ static int rd_kafka_sasl_cyrus_cb_getsecret(sasl_conn_t *conn,
389
+ void *context,
390
+ int id,
391
+ sasl_secret_t **psecret) {
392
+ rd_kafka_transport_t *rktrans = context;
393
+ const char *password;
394
+
395
+ /* rk_conf.sasl.lock is already locked */
396
+ password = rktrans->rktrans_rkb->rkb_rk->rk_conf.sasl.password;
397
+
398
+ if (!password) {
399
+ *psecret = NULL;
400
+ } else {
401
+ size_t passlen = strlen(password);
402
+ *psecret = rd_realloc(*psecret, sizeof(**psecret) + passlen);
403
+ (*psecret)->len = passlen;
404
+ memcpy((*psecret)->data, password, passlen);
405
+ }
406
+
407
+ rd_rkb_dbg(rktrans->rktrans_rkb, SECURITY, "LIBSASL",
408
+ "CB_GETSECRET: id 0x%x: returning %s", id,
409
+ *psecret ? "(hidden)" : "NULL");
410
+
411
+ return SASL_OK;
412
+ }
413
+
414
+ static int rd_kafka_sasl_cyrus_cb_chalprompt(void *context,
415
+ int id,
416
+ const char *challenge,
417
+ const char *prompt,
418
+ const char *defres,
419
+ const char **result,
420
+ unsigned *len) {
421
+ rd_kafka_transport_t *rktrans = context;
422
+
423
+ *result = "min_chalprompt";
424
+ *len = strlen(*result);
425
+
426
+ rd_rkb_dbg(rktrans->rktrans_rkb, SECURITY, "LIBSASL",
427
+ "CB_CHALPROMPT: id 0x%x, challenge %s, prompt %s, "
428
+ "default %s: returning %s",
429
+ id, challenge, prompt, defres, *result);
430
+
431
+ return SASL_OK;
432
+ }
433
+
434
+ static int rd_kafka_sasl_cyrus_cb_getrealm(void *context,
435
+ int id,
436
+ const char **availrealms,
437
+ const char **result) {
438
+ rd_kafka_transport_t *rktrans = context;
439
+
440
+ *result = *availrealms;
441
+
442
+ rd_rkb_dbg(rktrans->rktrans_rkb, SECURITY, "LIBSASL",
443
+ "CB_GETREALM: id 0x%x: returning %s", id, *result);
444
+
445
+ return SASL_OK;
446
+ }
447
+
448
+
449
+ static RD_UNUSED int rd_kafka_sasl_cyrus_cb_canon(sasl_conn_t *conn,
450
+ void *context,
451
+ const char *in,
452
+ unsigned inlen,
453
+ unsigned flags,
454
+ const char *user_realm,
455
+ char *out,
456
+ unsigned out_max,
457
+ unsigned *out_len) {
458
+ rd_kafka_transport_t *rktrans = context;
459
+
460
+ if (strstr(rktrans->rktrans_rkb->rkb_rk->rk_conf.sasl.mechanisms,
461
+ "GSSAPI")) {
462
+ *out_len = rd_snprintf(
463
+ out, out_max, "%s",
464
+ rktrans->rktrans_rkb->rkb_rk->rk_conf.sasl.principal);
465
+ } else if (!strcmp(
466
+ rktrans->rktrans_rkb->rkb_rk->rk_conf.sasl.mechanisms,
467
+ "PLAIN")) {
468
+ *out_len = rd_snprintf(out, out_max, "%.*s", inlen, in);
469
+ } else
470
+ out = NULL;
471
+
472
+ rd_rkb_dbg(
473
+ rktrans->rktrans_rkb, SECURITY, "LIBSASL",
474
+ "CB_CANON: flags 0x%x, \"%.*s\" @ \"%s\": returning \"%.*s\"",
475
+ flags, (int)inlen, in, user_realm, (int)(*out_len), out);
476
+
477
+ return out ? SASL_OK : SASL_FAIL;
478
+ }
479
+
480
+
481
+ static void rd_kafka_sasl_cyrus_close(struct rd_kafka_transport_s *rktrans) {
482
+ rd_kafka_sasl_cyrus_state_t *state = rktrans->rktrans_sasl.state;
483
+
484
+ if (!state)
485
+ return;
486
+
487
+ if (state->conn) {
488
+ mtx_lock(&rktrans->rktrans_rkb->rkb_rk->rk_conf.sasl.lock);
489
+ sasl_dispose(&state->conn);
490
+ mtx_unlock(&rktrans->rktrans_rkb->rkb_rk->rk_conf.sasl.lock);
491
+ }
492
+ rd_free(state);
493
+ rktrans->rktrans_sasl.state = NULL;
494
+ }
495
+
496
+
497
+ /**
498
+ * Initialize and start SASL authentication.
499
+ *
500
+ * Returns 0 on successful init and -1 on error.
501
+ *
502
+ * Locality: broker thread
503
+ */
504
+ static int rd_kafka_sasl_cyrus_client_new(rd_kafka_transport_t *rktrans,
505
+ const char *hostname,
506
+ char *errstr,
507
+ size_t errstr_size) {
508
+ int r;
509
+ rd_kafka_sasl_cyrus_state_t *state;
510
+ rd_kafka_broker_t *rkb = rktrans->rktrans_rkb;
511
+ rd_kafka_t *rk = rkb->rkb_rk;
512
+ sasl_callback_t callbacks[16] = {
513
+ // { SASL_CB_GETOPT, (void *)rd_kafka_sasl_cyrus_cb_getopt, rktrans
514
+ // },
515
+ {SASL_CB_LOG, (void *)rd_kafka_sasl_cyrus_cb_log, rktrans},
516
+ {SASL_CB_AUTHNAME, (void *)rd_kafka_sasl_cyrus_cb_getsimple,
517
+ rktrans},
518
+ {SASL_CB_PASS, (void *)rd_kafka_sasl_cyrus_cb_getsecret, rktrans},
519
+ {SASL_CB_ECHOPROMPT, (void *)rd_kafka_sasl_cyrus_cb_chalprompt,
520
+ rktrans},
521
+ {SASL_CB_GETREALM, (void *)rd_kafka_sasl_cyrus_cb_getrealm,
522
+ rktrans},
523
+ {SASL_CB_CANON_USER, (void *)rd_kafka_sasl_cyrus_cb_canon, rktrans},
524
+ {SASL_CB_LIST_END}};
525
+
526
+ state = rd_calloc(1, sizeof(*state));
527
+ rktrans->rktrans_sasl.state = state;
528
+
529
+ /* SASL_CB_USER is needed for PLAIN but breaks GSSAPI */
530
+ if (!strcmp(rk->rk_conf.sasl.mechanisms, "PLAIN")) {
531
+ int endidx;
532
+ /* Find end of callbacks array */
533
+ for (endidx = 0; callbacks[endidx].id != SASL_CB_LIST_END;
534
+ endidx++)
535
+ ;
536
+
537
+ callbacks[endidx].id = SASL_CB_USER;
538
+ callbacks[endidx].proc =
539
+ (void *)rd_kafka_sasl_cyrus_cb_getsimple;
540
+ callbacks[endidx].context = rktrans;
541
+ endidx++;
542
+ callbacks[endidx].id = SASL_CB_LIST_END;
543
+ }
544
+
545
+ memcpy(state->callbacks, callbacks, sizeof(callbacks));
546
+
547
+ mtx_lock(&rktrans->rktrans_rkb->rkb_rk->rk_conf.sasl.lock);
548
+ r = sasl_client_new(rk->rk_conf.sasl.service_name, hostname, NULL,
549
+ NULL, /* no local & remote IP checks */
550
+ state->callbacks, 0, &state->conn);
551
+ mtx_unlock(&rktrans->rktrans_rkb->rkb_rk->rk_conf.sasl.lock);
552
+ if (r != SASL_OK) {
553
+ rd_snprintf(errstr, errstr_size, "%s",
554
+ sasl_errstring(r, NULL, NULL));
555
+ return -1;
556
+ }
557
+
558
+ if (rk->rk_conf.debug & RD_KAFKA_DBG_SECURITY) {
559
+ const char *avail_mechs;
560
+ sasl_listmech(state->conn, NULL, NULL, " ", NULL, &avail_mechs,
561
+ NULL, NULL);
562
+ rd_rkb_dbg(rkb, SECURITY, "SASL",
563
+ "My supported SASL mechanisms: %s", avail_mechs);
564
+ }
565
+
566
+ do {
567
+ const char *out;
568
+ unsigned int outlen;
569
+ const char *mech = NULL;
570
+
571
+ mtx_lock(&rktrans->rktrans_rkb->rkb_rk->rk_conf.sasl.lock);
572
+ r = sasl_client_start(state->conn, rk->rk_conf.sasl.mechanisms,
573
+ NULL, &out, &outlen, &mech);
574
+ mtx_unlock(&rktrans->rktrans_rkb->rkb_rk->rk_conf.sasl.lock);
575
+
576
+ if (r >= 0)
577
+ if (rd_kafka_sasl_send(rktrans, out, outlen, errstr,
578
+ errstr_size))
579
+ return -1;
580
+ } while (r == SASL_INTERACT);
581
+
582
+ if (r == SASL_OK) {
583
+ /* PLAIN is appearantly done here, but we still need to make
584
+ * sure the PLAIN frame is sent and we get a response back (but
585
+ * we must not pass the response to libsasl or it will fail). */
586
+ rktrans->rktrans_sasl.complete = 1;
587
+ return 0;
588
+
589
+ } else if (r != SASL_CONTINUE) {
590
+ rd_snprintf(errstr, errstr_size,
591
+ "SASL handshake failed (start (%d)): %s", r,
592
+ sasl_errdetail(state->conn));
593
+ return -1;
594
+ }
595
+
596
+ return 0;
597
+ }
598
+
599
+
600
+ /**
601
+ * @brief SASL/GSSAPI is ready when at least one kinit command has been
602
+ * executed (regardless of exit status).
603
+ */
604
+ static rd_bool_t rd_kafka_sasl_cyrus_ready(rd_kafka_t *rk) {
605
+ rd_kafka_sasl_cyrus_handle_t *handle = rk->rk_sasl.handle;
606
+ if (!rk->rk_conf.sasl.relogin_min_time)
607
+ return rd_true;
608
+ if (!handle)
609
+ return rd_false;
610
+
611
+ return rd_atomic32_get(&handle->ready) > 0;
612
+ }
613
+
614
+ /**
615
+ * @brief Per-client-instance initializer
616
+ */
617
+ static int
618
+ rd_kafka_sasl_cyrus_init(rd_kafka_t *rk, char *errstr, size_t errstr_size) {
619
+ rd_kafka_sasl_cyrus_handle_t *handle;
620
+
621
+ if (!rk->rk_conf.sasl.relogin_min_time || !rk->rk_conf.sasl.kinit_cmd ||
622
+ strcmp(rk->rk_conf.sasl.mechanisms, "GSSAPI"))
623
+ return 0; /* kinit not configured, no need to start timer */
624
+
625
+ handle = rd_calloc(1, sizeof(*handle));
626
+ rk->rk_sasl.handle = handle;
627
+
628
+ rd_kafka_timer_start(&rk->rk_timers, &handle->kinit_refresh_tmr,
629
+ rk->rk_conf.sasl.relogin_min_time * 1000ll,
630
+ rd_kafka_sasl_cyrus_kinit_refresh_tmr_cb, rk);
631
+
632
+ /* Kick off the timer immediately to refresh the ticket.
633
+ * (Timer is triggered from the main loop). */
634
+ rd_kafka_timer_override_once(&rk->rk_timers, &handle->kinit_refresh_tmr,
635
+ 0 /*immediately*/);
636
+
637
+ return 0;
638
+ }
639
+
640
+
641
+ /**
642
+ * @brief Per-client-instance destructor
643
+ */
644
+ static void rd_kafka_sasl_cyrus_term(rd_kafka_t *rk) {
645
+ rd_kafka_sasl_cyrus_handle_t *handle = rk->rk_sasl.handle;
646
+
647
+ if (!handle)
648
+ return;
649
+
650
+ rd_kafka_timer_stop(&rk->rk_timers, &handle->kinit_refresh_tmr, 1);
651
+ rd_free(handle);
652
+ rk->rk_sasl.handle = NULL;
653
+ }
654
+
655
+
656
+ static int rd_kafka_sasl_cyrus_conf_validate(rd_kafka_t *rk,
657
+ char *errstr,
658
+ size_t errstr_size) {
659
+
660
+ if (strcmp(rk->rk_conf.sasl.mechanisms, "GSSAPI"))
661
+ return 0;
662
+
663
+ if (rk->rk_conf.sasl.relogin_min_time && rk->rk_conf.sasl.kinit_cmd) {
664
+ char *cmd;
665
+ char tmperr[128];
666
+
667
+ cmd = rd_string_render(rk->rk_conf.sasl.kinit_cmd, tmperr,
668
+ sizeof(tmperr), render_callback, rk);
669
+
670
+ if (!cmd) {
671
+ rd_snprintf(errstr, errstr_size,
672
+ "Invalid sasl.kerberos.kinit.cmd value: %s",
673
+ tmperr);
674
+ return -1;
675
+ }
676
+
677
+ rd_free(cmd);
678
+ }
679
+
680
+ return 0;
681
+ }
682
+
683
+
684
+ /**
685
+ * Global SASL termination.
686
+ */
687
+ void rd_kafka_sasl_cyrus_global_term(void) {
688
+ /* NOTE: Should not be called since the application may be using SASL
689
+ * too*/
690
+ /* sasl_done(); */
691
+ mtx_destroy(&rd_kafka_sasl_cyrus_kinit_lock);
692
+ }
693
+
694
+
695
+ /**
696
+ * Global SASL init, called once per runtime.
697
+ */
698
+ int rd_kafka_sasl_cyrus_global_init(void) {
699
+ int r;
700
+
701
+ mtx_init(&rd_kafka_sasl_cyrus_kinit_lock, mtx_plain);
702
+
703
+ r = sasl_client_init(NULL);
704
+ if (r != SASL_OK) {
705
+ fprintf(stderr, "librdkafka: sasl_client_init() failed: %s\n",
706
+ sasl_errstring(r, NULL, NULL));
707
+ return -1;
708
+ }
709
+
710
+ return 0;
711
+ }
712
+
713
+
714
+ const struct rd_kafka_sasl_provider rd_kafka_sasl_cyrus_provider = {
715
+ .name = "Cyrus",
716
+ .init = rd_kafka_sasl_cyrus_init,
717
+ .term = rd_kafka_sasl_cyrus_term,
718
+ .client_new = rd_kafka_sasl_cyrus_client_new,
719
+ .recv = rd_kafka_sasl_cyrus_recv,
720
+ .close = rd_kafka_sasl_cyrus_close,
721
+ .ready = rd_kafka_sasl_cyrus_ready,
722
+ .conf_validate = rd_kafka_sasl_cyrus_conf_validate};