libcouchbase 0.0.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 (561) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.gitmodules +3 -0
  4. data/.rspec +1 -0
  5. data/.travis.yml +35 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE +24 -0
  8. data/README.md +389 -0
  9. data/Rakefile +75 -0
  10. data/ext/README.md +6 -0
  11. data/ext/Rakefile +20 -0
  12. data/ext/libcouchbase/.gitignore +130 -0
  13. data/ext/libcouchbase/.travis.yml +19 -0
  14. data/ext/libcouchbase/CMakeLists.txt +429 -0
  15. data/ext/libcouchbase/CONTRIBUTING.md +124 -0
  16. data/ext/libcouchbase/LICENSE +202 -0
  17. data/ext/libcouchbase/README.markdown +163 -0
  18. data/ext/libcouchbase/RELEASE_NOTES.markdown +2691 -0
  19. data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +27 -0
  20. data/ext/libcouchbase/cmake/Modules/CopyPDB.cmake +42 -0
  21. data/ext/libcouchbase/cmake/Modules/DistScript.cmake +17 -0
  22. data/ext/libcouchbase/cmake/Modules/DownloadLcbDep.cmake +20 -0
  23. data/ext/libcouchbase/cmake/Modules/FindCouchbaseHdrHistogram.cmake +15 -0
  24. data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibev.cmake +73 -0
  25. data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibevent.cmake +52 -0
  26. data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibuv.cmake +56 -0
  27. data/ext/libcouchbase/cmake/Modules/FindCouchbaseSnappy.cmake +11 -0
  28. data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +29 -0
  29. data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +133 -0
  30. data/ext/libcouchbase/cmake/Modules/GetPlatformCCInfo.cmake +45 -0
  31. data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +70 -0
  32. data/ext/libcouchbase/cmake/config-cmake.h.in +60 -0
  33. data/ext/libcouchbase/cmake/configure +357 -0
  34. data/ext/libcouchbase/cmake/defs.mk.in +8 -0
  35. data/ext/libcouchbase/cmake/dtrace-instr-link.pl +38 -0
  36. data/ext/libcouchbase/cmake/source_files.cmake +73 -0
  37. data/ext/libcouchbase/configure.pl +1 -0
  38. data/ext/libcouchbase/contrib/cJSON/cJSON.c +624 -0
  39. data/ext/libcouchbase/contrib/cJSON/cJSON.h +158 -0
  40. data/ext/libcouchbase/contrib/cbsasl/CMakeLists.txt +9 -0
  41. data/ext/libcouchbase/contrib/cbsasl/COPYING +202 -0
  42. data/ext/libcouchbase/contrib/cbsasl/include/cbsasl/cbsasl.h +217 -0
  43. data/ext/libcouchbase/contrib/cbsasl/src/client.c +205 -0
  44. data/ext/libcouchbase/contrib/cbsasl/src/common.c +46 -0
  45. data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/hmac.c +67 -0
  46. data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/hmac.h +33 -0
  47. data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/md5.c +296 -0
  48. data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/md5.h +45 -0
  49. data/ext/libcouchbase/contrib/cbsasl/src/hash.c +573 -0
  50. data/ext/libcouchbase/contrib/cbsasl/src/hash.h +15 -0
  51. data/ext/libcouchbase/contrib/cbsasl/src/util.h +31 -0
  52. data/ext/libcouchbase/contrib/cliopts/CMakeLists.txt +2 -0
  53. data/ext/libcouchbase/contrib/cliopts/cliopts.c +747 -0
  54. data/ext/libcouchbase/contrib/cliopts/cliopts.h +493 -0
  55. data/ext/libcouchbase/contrib/genhash/genhash.c +372 -0
  56. data/ext/libcouchbase/contrib/genhash/genhash.h +235 -0
  57. data/ext/libcouchbase/contrib/gtest-1.7.0/CHANGES +157 -0
  58. data/ext/libcouchbase/contrib/gtest-1.7.0/CMakeLists.txt +252 -0
  59. data/ext/libcouchbase/contrib/gtest-1.7.0/CONTRIBUTORS +37 -0
  60. data/ext/libcouchbase/contrib/gtest-1.7.0/LICENSE +28 -0
  61. data/ext/libcouchbase/contrib/gtest-1.7.0/MINIFY.sh +15 -0
  62. data/ext/libcouchbase/contrib/gtest-1.7.0/README +435 -0
  63. data/ext/libcouchbase/contrib/gtest-1.7.0/cmake/internal_utils.cmake +227 -0
  64. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-death-test.h +294 -0
  65. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-message.h +250 -0
  66. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-param-test.h +1421 -0
  67. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-param-test.h.pump +487 -0
  68. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-printers.h +855 -0
  69. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-spi.h +232 -0
  70. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-test-part.h +179 -0
  71. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-typed-test.h +259 -0
  72. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest.h +2291 -0
  73. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest_pred_impl.h +358 -0
  74. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest_prod.h +58 -0
  75. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h +319 -0
  76. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h +206 -0
  77. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-internal.h +1158 -0
  78. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h +233 -0
  79. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h +5143 -0
  80. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h.pump +301 -0
  81. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h +619 -0
  82. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-port.h +1947 -0
  83. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-string.h +167 -0
  84. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-tuple.h +1012 -0
  85. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-tuple.h.pump +339 -0
  86. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h +3331 -0
  87. data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h.pump +297 -0
  88. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-all.cc +48 -0
  89. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-death-test.cc +1344 -0
  90. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-filepath.cc +382 -0
  91. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-internal-inl.h +1218 -0
  92. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-port.cc +805 -0
  93. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-printers.cc +363 -0
  94. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-test-part.cc +110 -0
  95. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-typed-test.cc +110 -0
  96. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest.cc +5015 -0
  97. data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest_main.cc +38 -0
  98. data/ext/libcouchbase/contrib/http_parser/LICENSE-MIT +23 -0
  99. data/ext/libcouchbase/contrib/http_parser/README.md +178 -0
  100. data/ext/libcouchbase/contrib/http_parser/http_parser.c +2060 -0
  101. data/ext/libcouchbase/contrib/http_parser/http_parser.h +321 -0
  102. data/ext/libcouchbase/contrib/jsonsl/LICENSE +20 -0
  103. data/ext/libcouchbase/contrib/jsonsl/jsonsl.c +1452 -0
  104. data/ext/libcouchbase/contrib/jsonsl/jsonsl.h +971 -0
  105. data/ext/libcouchbase/contrib/lcb-jsoncpp/CMakeLists.txt +6 -0
  106. data/ext/libcouchbase/contrib/lcb-jsoncpp/LICENSE +55 -0
  107. data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp-forwards.h +255 -0
  108. data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp.cpp +4892 -0
  109. data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp.h +1961 -0
  110. data/ext/libcouchbase/contrib/snappy/CMakeLists.txt +8 -0
  111. data/ext/libcouchbase/contrib/snappy/COPYING +28 -0
  112. data/ext/libcouchbase/contrib/snappy/snappy-c.cc +90 -0
  113. data/ext/libcouchbase/contrib/snappy/snappy-c.h +138 -0
  114. data/ext/libcouchbase/contrib/snappy/snappy-internal.h +150 -0
  115. data/ext/libcouchbase/contrib/snappy/snappy-lcb-msvc.h +5 -0
  116. data/ext/libcouchbase/contrib/snappy/snappy-sinksource.cc +71 -0
  117. data/ext/libcouchbase/contrib/snappy/snappy-sinksource.h +137 -0
  118. data/ext/libcouchbase/contrib/snappy/snappy-stubs-internal.cc +42 -0
  119. data/ext/libcouchbase/contrib/snappy/snappy-stubs-internal.h +491 -0
  120. data/ext/libcouchbase/contrib/snappy/snappy-stubs-public.h +98 -0
  121. data/ext/libcouchbase/contrib/snappy/snappy.cc +1307 -0
  122. data/ext/libcouchbase/contrib/snappy/snappy.h +184 -0
  123. data/ext/libcouchbase/contrib/win32-defs/iocpdefs.h +133 -0
  124. data/ext/libcouchbase/contrib/win32-defs/mingwdefs.h +4396 -0
  125. data/ext/libcouchbase/contrib/win32-defs/win_stdint.h +258 -0
  126. data/ext/libcouchbase/example/CMakeLists.txt +37 -0
  127. data/ext/libcouchbase/example/README.markdown +47 -0
  128. data/ext/libcouchbase/example/db/db.c +167 -0
  129. data/ext/libcouchbase/example/db/vb.c +227 -0
  130. data/ext/libcouchbase/example/instancepool/main.cc +102 -0
  131. data/ext/libcouchbase/example/instancepool/pool.cc +102 -0
  132. data/ext/libcouchbase/example/instancepool/pool.h +69 -0
  133. data/ext/libcouchbase/example/libeventdirect/main.c +148 -0
  134. data/ext/libcouchbase/example/mcc/mcc.cc +246 -0
  135. data/ext/libcouchbase/example/minimal/minimal.c +130 -0
  136. data/ext/libcouchbase/example/observe/observe.c +146 -0
  137. data/ext/libcouchbase/example/subdoc/subdoc-multi.cc +132 -0
  138. data/ext/libcouchbase/example/subdoc/subdoc-simple.cc +191 -0
  139. data/ext/libcouchbase/example/tick/tick.c +119 -0
  140. data/ext/libcouchbase/example/views/views-example.cc +83 -0
  141. data/ext/libcouchbase/include/libcouchbase/_cxxwrap.h +150 -0
  142. data/ext/libcouchbase/include/libcouchbase/api-legacy.h +1689 -0
  143. data/ext/libcouchbase/include/libcouchbase/api3.h +2 -0
  144. data/ext/libcouchbase/include/libcouchbase/assert.h +44 -0
  145. data/ext/libcouchbase/include/libcouchbase/cbft.h +109 -0
  146. data/ext/libcouchbase/include/libcouchbase/cntl-private.h +356 -0
  147. data/ext/libcouchbase/include/libcouchbase/cntl.h +937 -0
  148. data/ext/libcouchbase/include/libcouchbase/configuration.h.in +23 -0
  149. data/ext/libcouchbase/include/libcouchbase/couchbase.h +3677 -0
  150. data/ext/libcouchbase/include/libcouchbase/deprecated.h +300 -0
  151. data/ext/libcouchbase/include/libcouchbase/error.h +595 -0
  152. data/ext/libcouchbase/include/libcouchbase/http.h +1 -0
  153. data/ext/libcouchbase/include/libcouchbase/iops.h +1050 -0
  154. data/ext/libcouchbase/include/libcouchbase/ixmgmt.h +263 -0
  155. data/ext/libcouchbase/include/libcouchbase/kvbuf.h +132 -0
  156. data/ext/libcouchbase/include/libcouchbase/n1ql.h +364 -0
  157. data/ext/libcouchbase/include/libcouchbase/pktfwd.h +270 -0
  158. data/ext/libcouchbase/include/libcouchbase/plugins/io/bsdio-inl.c +367 -0
  159. data/ext/libcouchbase/include/libcouchbase/plugins/io/wsaerr-inl.c +76 -0
  160. data/ext/libcouchbase/include/libcouchbase/plugins/io/wsaerr.h +199 -0
  161. data/ext/libcouchbase/include/libcouchbase/subdoc.h +312 -0
  162. data/ext/libcouchbase/include/libcouchbase/sysdefs.h +98 -0
  163. data/ext/libcouchbase/include/libcouchbase/vbucket.h +643 -0
  164. data/ext/libcouchbase/include/libcouchbase/views.h +298 -0
  165. data/ext/libcouchbase/include/libcouchbase/visibility.h +65 -0
  166. data/ext/libcouchbase/include/memcached/COPYING +30 -0
  167. data/ext/libcouchbase/include/memcached/README +10 -0
  168. data/ext/libcouchbase/include/memcached/protocol_binary.h +1916 -0
  169. data/ext/libcouchbase/include/memcached/vbucket.h +42 -0
  170. data/ext/libcouchbase/packaging/README +7 -0
  171. data/ext/libcouchbase/packaging/abicheck/.gitignore +4 -0
  172. data/ext/libcouchbase/packaging/abicheck/Makefile +17 -0
  173. data/ext/libcouchbase/packaging/abicheck/README.md +27 -0
  174. data/ext/libcouchbase/packaging/abicheck/template.xml +3 -0
  175. data/ext/libcouchbase/packaging/deb/compat +1 -0
  176. data/ext/libcouchbase/packaging/deb/control +73 -0
  177. data/ext/libcouchbase/packaging/deb/copyright +10 -0
  178. data/ext/libcouchbase/packaging/deb/libcouchbase-dev.docs +3 -0
  179. data/ext/libcouchbase/packaging/deb/package.mk +31 -0
  180. data/ext/libcouchbase/packaging/deb/rules +46 -0
  181. data/ext/libcouchbase/packaging/deb/source/format +1 -0
  182. data/ext/libcouchbase/packaging/distinfo/README +1 -0
  183. data/ext/libcouchbase/packaging/distinfo/distinfo.cmake.in +4 -0
  184. data/ext/libcouchbase/packaging/dllversion.rc.in +39 -0
  185. data/ext/libcouchbase/packaging/libcouchbase.pc.in +10 -0
  186. data/ext/libcouchbase/packaging/nuget/libcouchbase.autopkg +76 -0
  187. data/ext/libcouchbase/packaging/parse-git-describe.pl +166 -0
  188. data/ext/libcouchbase/packaging/rpm/libcouchbase.spec.in +108 -0
  189. data/ext/libcouchbase/packaging/rpm/package.mk +40 -0
  190. data/ext/libcouchbase/plugins/io/iocp/CMakeLists.txt +9 -0
  191. data/ext/libcouchbase/plugins/io/iocp/iocp_iops.c +466 -0
  192. data/ext/libcouchbase/plugins/io/iocp/iocp_iops.h +217 -0
  193. data/ext/libcouchbase/plugins/io/iocp/iocp_loop.c +295 -0
  194. data/ext/libcouchbase/plugins/io/iocp/iocp_timer.c +79 -0
  195. data/ext/libcouchbase/plugins/io/iocp/iocp_util.c +229 -0
  196. data/ext/libcouchbase/plugins/io/libev/CMakeLists.txt +29 -0
  197. data/ext/libcouchbase/plugins/io/libev/libev_io_opts.h +65 -0
  198. data/ext/libcouchbase/plugins/io/libev/plugin-libev.c +289 -0
  199. data/ext/libcouchbase/plugins/io/libevent/CMakeLists.txt +29 -0
  200. data/ext/libcouchbase/plugins/io/libevent/libevent_io_opts.h +67 -0
  201. data/ext/libcouchbase/plugins/io/libevent/plugin-libevent.c +292 -0
  202. data/ext/libcouchbase/plugins/io/libuv/CMakeLists.txt +42 -0
  203. data/ext/libcouchbase/plugins/io/libuv/libuv_compat.h +212 -0
  204. data/ext/libcouchbase/plugins/io/libuv/libuv_io_opts.h +118 -0
  205. data/ext/libcouchbase/plugins/io/libuv/plugin-internal.h +148 -0
  206. data/ext/libcouchbase/plugins/io/libuv/plugin-libuv.c +648 -0
  207. data/ext/libcouchbase/plugins/io/select/CMakeLists.txt +11 -0
  208. data/ext/libcouchbase/plugins/io/select/plugin-select.c +448 -0
  209. data/ext/libcouchbase/plugins/io/select/select_io_opts.h +39 -0
  210. data/ext/libcouchbase/src/README.md +103 -0
  211. data/ext/libcouchbase/src/aspend.h +106 -0
  212. data/ext/libcouchbase/src/auth.cc +74 -0
  213. data/ext/libcouchbase/src/auth.h +54 -0
  214. data/ext/libcouchbase/src/bootstrap.c +269 -0
  215. data/ext/libcouchbase/src/bootstrap.h +129 -0
  216. data/ext/libcouchbase/src/bucketconfig/bc_cccp.c +495 -0
  217. data/ext/libcouchbase/src/bucketconfig/bc_file.c +347 -0
  218. data/ext/libcouchbase/src/bucketconfig/bc_http.c +630 -0
  219. data/ext/libcouchbase/src/bucketconfig/bc_http.h +82 -0
  220. data/ext/libcouchbase/src/bucketconfig/bc_mcraw.c +150 -0
  221. data/ext/libcouchbase/src/bucketconfig/clconfig.h +681 -0
  222. data/ext/libcouchbase/src/bucketconfig/confmon.c +474 -0
  223. data/ext/libcouchbase/src/callbacks.c +378 -0
  224. data/ext/libcouchbase/src/cbft.cc +210 -0
  225. data/ext/libcouchbase/src/cntl.cc +847 -0
  226. data/ext/libcouchbase/src/config_static.h +159 -0
  227. data/ext/libcouchbase/src/connspec.cc +462 -0
  228. data/ext/libcouchbase/src/connspec.h +105 -0
  229. data/ext/libcouchbase/src/ctx-log-inl.h +27 -0
  230. data/ext/libcouchbase/src/dump.c +98 -0
  231. data/ext/libcouchbase/src/getconfig.c +100 -0
  232. data/ext/libcouchbase/src/gethrtime.c +109 -0
  233. data/ext/libcouchbase/src/handler.c +922 -0
  234. data/ext/libcouchbase/src/hashset.c +164 -0
  235. data/ext/libcouchbase/src/hashset.h +86 -0
  236. data/ext/libcouchbase/src/hashtable.c +75 -0
  237. data/ext/libcouchbase/src/hdr_timings.c +92 -0
  238. data/ext/libcouchbase/src/hostlist.cc +301 -0
  239. data/ext/libcouchbase/src/hostlist.h +171 -0
  240. data/ext/libcouchbase/src/http/http-priv.h +307 -0
  241. data/ext/libcouchbase/src/http/http.cc +633 -0
  242. data/ext/libcouchbase/src/http/http.h +34 -0
  243. data/ext/libcouchbase/src/http/http_io.cc +307 -0
  244. data/ext/libcouchbase/src/instance.cc +722 -0
  245. data/ext/libcouchbase/src/internal.h +244 -0
  246. data/ext/libcouchbase/src/iofactory.c +575 -0
  247. data/ext/libcouchbase/src/jsparse/parser.cc +519 -0
  248. data/ext/libcouchbase/src/jsparse/parser.h +173 -0
  249. data/ext/libcouchbase/src/lcbht/lcbht.c +282 -0
  250. data/ext/libcouchbase/src/lcbht/lcbht.h +199 -0
  251. data/ext/libcouchbase/src/lcbio/connect.c +557 -0
  252. data/ext/libcouchbase/src/lcbio/connect.h +364 -0
  253. data/ext/libcouchbase/src/lcbio/ctx.c +611 -0
  254. data/ext/libcouchbase/src/lcbio/ctx.h +405 -0
  255. data/ext/libcouchbase/src/lcbio/iotable.c +290 -0
  256. data/ext/libcouchbase/src/lcbio/iotable.h +84 -0
  257. data/ext/libcouchbase/src/lcbio/ioutils.c +350 -0
  258. data/ext/libcouchbase/src/lcbio/ioutils.h +203 -0
  259. data/ext/libcouchbase/src/lcbio/lcbio.h +51 -0
  260. data/ext/libcouchbase/src/lcbio/manager.c +584 -0
  261. data/ext/libcouchbase/src/lcbio/manager.h +156 -0
  262. data/ext/libcouchbase/src/lcbio/protoctx.c +84 -0
  263. data/ext/libcouchbase/src/lcbio/rw-inl.h +115 -0
  264. data/ext/libcouchbase/src/lcbio/ssl.h +149 -0
  265. data/ext/libcouchbase/src/lcbio/timer-ng.h +179 -0
  266. data/ext/libcouchbase/src/lcbio/timer.c +132 -0
  267. data/ext/libcouchbase/src/legacy.c +430 -0
  268. data/ext/libcouchbase/src/list.c +144 -0
  269. data/ext/libcouchbase/src/list.h +127 -0
  270. data/ext/libcouchbase/src/logging.c +244 -0
  271. data/ext/libcouchbase/src/logging.h +86 -0
  272. data/ext/libcouchbase/src/mc/compress.c +90 -0
  273. data/ext/libcouchbase/src/mc/compress.h +61 -0
  274. data/ext/libcouchbase/src/mc/forward.c +186 -0
  275. data/ext/libcouchbase/src/mc/forward.h +90 -0
  276. data/ext/libcouchbase/src/mc/iovcursor-inl.h +279 -0
  277. data/ext/libcouchbase/src/mc/iovcursor.h +66 -0
  278. data/ext/libcouchbase/src/mc/mcreq-flush-inl.h +111 -0
  279. data/ext/libcouchbase/src/mc/mcreq.c +954 -0
  280. data/ext/libcouchbase/src/mc/mcreq.h +977 -0
  281. data/ext/libcouchbase/src/mcserver/mcserver.c +784 -0
  282. data/ext/libcouchbase/src/mcserver/mcserver.h +121 -0
  283. data/ext/libcouchbase/src/mcserver/negotiate.c +656 -0
  284. data/ext/libcouchbase/src/mcserver/negotiate.h +119 -0
  285. data/ext/libcouchbase/src/n1ql/ixmgmt.cc +860 -0
  286. data/ext/libcouchbase/src/n1ql/n1ql-internal.h +22 -0
  287. data/ext/libcouchbase/src/n1ql/n1ql.cc +729 -0
  288. data/ext/libcouchbase/src/n1ql/params.cc +215 -0
  289. data/ext/libcouchbase/src/netbuf/netbuf-defs.h +89 -0
  290. data/ext/libcouchbase/src/netbuf/netbuf-mblock.h +235 -0
  291. data/ext/libcouchbase/src/netbuf/netbuf.c +929 -0
  292. data/ext/libcouchbase/src/netbuf/netbuf.h +452 -0
  293. data/ext/libcouchbase/src/newconfig.c +385 -0
  294. data/ext/libcouchbase/src/nodeinfo.cc +194 -0
  295. data/ext/libcouchbase/src/operations/cbflush.c +71 -0
  296. data/ext/libcouchbase/src/operations/counter.c +116 -0
  297. data/ext/libcouchbase/src/operations/durability-cas.c +224 -0
  298. data/ext/libcouchbase/src/operations/durability-seqno.c +157 -0
  299. data/ext/libcouchbase/src/operations/durability.c +668 -0
  300. data/ext/libcouchbase/src/operations/durability_internal.h +199 -0
  301. data/ext/libcouchbase/src/operations/get.c +409 -0
  302. data/ext/libcouchbase/src/operations/observe-seqno.c +96 -0
  303. data/ext/libcouchbase/src/operations/observe.c +340 -0
  304. data/ext/libcouchbase/src/operations/pktfwd.c +86 -0
  305. data/ext/libcouchbase/src/operations/remove.c +83 -0
  306. data/ext/libcouchbase/src/operations/stats.c +461 -0
  307. data/ext/libcouchbase/src/operations/store.c +360 -0
  308. data/ext/libcouchbase/src/operations/subdoc.cc +510 -0
  309. data/ext/libcouchbase/src/operations/touch.c +81 -0
  310. data/ext/libcouchbase/src/packetutils.c +60 -0
  311. data/ext/libcouchbase/src/packetutils.h +147 -0
  312. data/ext/libcouchbase/src/probes.d +211 -0
  313. data/ext/libcouchbase/src/rdb/bigalloc.c +225 -0
  314. data/ext/libcouchbase/src/rdb/bigalloc.h +73 -0
  315. data/ext/libcouchbase/src/rdb/chunkalloc.c +174 -0
  316. data/ext/libcouchbase/src/rdb/libcalloc.c +94 -0
  317. data/ext/libcouchbase/src/rdb/rope.c +419 -0
  318. data/ext/libcouchbase/src/rdb/rope.h +488 -0
  319. data/ext/libcouchbase/src/retrychk.c +113 -0
  320. data/ext/libcouchbase/src/retryq.c +424 -0
  321. data/ext/libcouchbase/src/retryq.h +157 -0
  322. data/ext/libcouchbase/src/ringbuffer.c +442 -0
  323. data/ext/libcouchbase/src/ringbuffer.h +100 -0
  324. data/ext/libcouchbase/src/settings.c +95 -0
  325. data/ext/libcouchbase/src/settings.h +188 -0
  326. data/ext/libcouchbase/src/simplestring.c +211 -0
  327. data/ext/libcouchbase/src/simplestring.h +228 -0
  328. data/ext/libcouchbase/src/sllist-inl.h +197 -0
  329. data/ext/libcouchbase/src/sllist.h +76 -0
  330. data/ext/libcouchbase/src/ssl/CMakeLists.txt +23 -0
  331. data/ext/libcouchbase/src/ssl/ssl_c.c +415 -0
  332. data/ext/libcouchbase/src/ssl/ssl_common.c +454 -0
  333. data/ext/libcouchbase/src/ssl/ssl_e.c +408 -0
  334. data/ext/libcouchbase/src/ssl/ssl_iot_common.h +180 -0
  335. data/ext/libcouchbase/src/ssobuf.h +82 -0
  336. data/ext/libcouchbase/src/strcodecs/base64.c +123 -0
  337. data/ext/libcouchbase/src/strcodecs/strcodecs.h +285 -0
  338. data/ext/libcouchbase/src/timings.c +208 -0
  339. data/ext/libcouchbase/src/trace.h +105 -0
  340. data/ext/libcouchbase/src/utilities.c +171 -0
  341. data/ext/libcouchbase/src/vbucket/CMakeLists.txt +2 -0
  342. data/ext/libcouchbase/src/vbucket/aliases.h +35 -0
  343. data/ext/libcouchbase/src/vbucket/crc32.h +83 -0
  344. data/ext/libcouchbase/src/vbucket/hash.h +30 -0
  345. data/ext/libcouchbase/src/vbucket/json-inl.h +112 -0
  346. data/ext/libcouchbase/src/vbucket/ketama.c +66 -0
  347. data/ext/libcouchbase/src/vbucket/rfc1321/global.h +32 -0
  348. data/ext/libcouchbase/src/vbucket/rfc1321/md5.h +35 -0
  349. data/ext/libcouchbase/src/vbucket/rfc1321/md5c-inl.h +335 -0
  350. data/ext/libcouchbase/src/vbucket/vbucket.c +1543 -0
  351. data/ext/libcouchbase/src/views/docreq.c +194 -0
  352. data/ext/libcouchbase/src/views/docreq.h +83 -0
  353. data/ext/libcouchbase/src/views/viewreq.c +358 -0
  354. data/ext/libcouchbase/src/views/viewreq.h +36 -0
  355. data/ext/libcouchbase/src/wait.c +161 -0
  356. data/ext/libcouchbase/tests/CMakeLists.txt +140 -0
  357. data/ext/libcouchbase/tests/basic/t_base64.cc +81 -0
  358. data/ext/libcouchbase/tests/basic/t_ccbc103.cc +95 -0
  359. data/ext/libcouchbase/tests/basic/t_connstr.cc +404 -0
  360. data/ext/libcouchbase/tests/basic/t_creds.cc +32 -0
  361. data/ext/libcouchbase/tests/basic/t_ctlcodes.cc +92 -0
  362. data/ext/libcouchbase/tests/basic/t_hashset.cc +262 -0
  363. data/ext/libcouchbase/tests/basic/t_host.cc +198 -0
  364. data/ext/libcouchbase/tests/basic/t_jsparse.cc +137 -0
  365. data/ext/libcouchbase/tests/basic/t_jsparse.h +589 -0
  366. data/ext/libcouchbase/tests/basic/t_list.cc +155 -0
  367. data/ext/libcouchbase/tests/basic/t_logger.cc +65 -0
  368. data/ext/libcouchbase/tests/basic/t_misc.cc +24 -0
  369. data/ext/libcouchbase/tests/basic/t_n1qlstrings.cc +18 -0
  370. data/ext/libcouchbase/tests/basic/t_netbuf.cc +446 -0
  371. data/ext/libcouchbase/tests/basic/t_packet.cc +222 -0
  372. data/ext/libcouchbase/tests/basic/t_ringbuffer.cc +278 -0
  373. data/ext/libcouchbase/tests/basic/t_slist.cc +429 -0
  374. data/ext/libcouchbase/tests/basic/t_strerror.cc +64 -0
  375. data/ext/libcouchbase/tests/basic/t_string.cc +112 -0
  376. data/ext/libcouchbase/tests/basic/t_urlencode.cc +132 -0
  377. data/ext/libcouchbase/tests/check-all.cc +608 -0
  378. data/ext/libcouchbase/tests/htparse/t_basic.cc +193 -0
  379. data/ext/libcouchbase/tests/ioserver/connection.cc +166 -0
  380. data/ext/libcouchbase/tests/ioserver/future.cc +50 -0
  381. data/ext/libcouchbase/tests/ioserver/ioserver.cc +104 -0
  382. data/ext/libcouchbase/tests/ioserver/ioserver.h +478 -0
  383. data/ext/libcouchbase/tests/ioserver/socket.cc +88 -0
  384. data/ext/libcouchbase/tests/ioserver/ssl_connection.cc +145 -0
  385. data/ext/libcouchbase/tests/ioserver/threads-pthreads.cc +119 -0
  386. data/ext/libcouchbase/tests/ioserver/threads-win32.cc +117 -0
  387. data/ext/libcouchbase/tests/ioserver/threads.h +66 -0
  388. data/ext/libcouchbase/tests/iotests/iotests.h +15 -0
  389. data/ext/libcouchbase/tests/iotests/mock-environment.cc +524 -0
  390. data/ext/libcouchbase/tests/iotests/mock-environment.h +385 -0
  391. data/ext/libcouchbase/tests/iotests/mock-unit-test.cc +67 -0
  392. data/ext/libcouchbase/tests/iotests/mock-unit-test.h +61 -0
  393. data/ext/libcouchbase/tests/iotests/serverparams.h +76 -0
  394. data/ext/libcouchbase/tests/iotests/t_arithmetic.cc +143 -0
  395. data/ext/libcouchbase/tests/iotests/t_behavior.cc +226 -0
  396. data/ext/libcouchbase/tests/iotests/t_configcache.cc +117 -0
  397. data/ext/libcouchbase/tests/iotests/t_confmon.cc +241 -0
  398. data/ext/libcouchbase/tests/iotests/t_durability.cc +1059 -0
  399. data/ext/libcouchbase/tests/iotests/t_forward.cc +110 -0
  400. data/ext/libcouchbase/tests/iotests/t_get.cc +512 -0
  401. data/ext/libcouchbase/tests/iotests/t_http.cc +438 -0
  402. data/ext/libcouchbase/tests/iotests/t_iops.cc +175 -0
  403. data/ext/libcouchbase/tests/iotests/t_lock.cc +275 -0
  404. data/ext/libcouchbase/tests/iotests/t_misc.cc +713 -0
  405. data/ext/libcouchbase/tests/iotests/t_mutate.cc +609 -0
  406. data/ext/libcouchbase/tests/iotests/t_n1ql.cc +270 -0
  407. data/ext/libcouchbase/tests/iotests/t_netfail.cc +654 -0
  408. data/ext/libcouchbase/tests/iotests/t_obseqno.cc +157 -0
  409. data/ext/libcouchbase/tests/iotests/t_regression.cc +321 -0
  410. data/ext/libcouchbase/tests/iotests/t_sched.cc +88 -0
  411. data/ext/libcouchbase/tests/iotests/t_serverops.cc +230 -0
  412. data/ext/libcouchbase/tests/iotests/t_smoke.cc +528 -0
  413. data/ext/libcouchbase/tests/iotests/t_subdoc.cc +822 -0
  414. data/ext/libcouchbase/tests/iotests/t_syncmode.cc +64 -0
  415. data/ext/libcouchbase/tests/iotests/t_views.cc +405 -0
  416. data/ext/libcouchbase/tests/iotests/testutil.cc +250 -0
  417. data/ext/libcouchbase/tests/iotests/testutil.h +163 -0
  418. data/ext/libcouchbase/tests/mc/mctest.h +119 -0
  419. data/ext/libcouchbase/tests/mc/pktmaker.h +101 -0
  420. data/ext/libcouchbase/tests/mc/t_alloc.cc +269 -0
  421. data/ext/libcouchbase/tests/mc/t_context.cc +100 -0
  422. data/ext/libcouchbase/tests/mc/t_flush.cc +185 -0
  423. data/ext/libcouchbase/tests/mc/t_forward.cc +239 -0
  424. data/ext/libcouchbase/tests/mc/t_ioflush.cc +102 -0
  425. data/ext/libcouchbase/tests/mc/t_iovcursor.cc +173 -0
  426. data/ext/libcouchbase/tests/mocksupport/procutil.c +305 -0
  427. data/ext/libcouchbase/tests/mocksupport/procutil.h +89 -0
  428. data/ext/libcouchbase/tests/mocksupport/server.c +391 -0
  429. data/ext/libcouchbase/tests/mocksupport/server.h +72 -0
  430. data/ext/libcouchbase/tests/mocksupport/timeout.c +69 -0
  431. data/ext/libcouchbase/tests/nonio_tests.cc +23 -0
  432. data/ext/libcouchbase/tests/rdb/rdbtest.h +133 -0
  433. data/ext/libcouchbase/tests/rdb/t_basic.cc +128 -0
  434. data/ext/libcouchbase/tests/rdb/t_bigalloc.cc +93 -0
  435. data/ext/libcouchbase/tests/rdb/t_refs.cc +112 -0
  436. data/ext/libcouchbase/tests/socktests/socktest.cc +347 -0
  437. data/ext/libcouchbase/tests/socktests/socktest.h +448 -0
  438. data/ext/libcouchbase/tests/socktests/t_basic.cc +143 -0
  439. data/ext/libcouchbase/tests/socktests/t_ctx.cc +73 -0
  440. data/ext/libcouchbase/tests/socktests/t_manager.cc +179 -0
  441. data/ext/libcouchbase/tests/socktests/t_putex.cc +256 -0
  442. data/ext/libcouchbase/tests/socktests/t_read.cc +187 -0
  443. data/ext/libcouchbase/tests/socktests/t_reentrant.cc +143 -0
  444. data/ext/libcouchbase/tests/socktests/t_ssl.cc +80 -0
  445. data/ext/libcouchbase/tests/socktests/t_write.cc +95 -0
  446. data/ext/libcouchbase/tests/start_mock.bat +15 -0
  447. data/ext/libcouchbase/tests/start_mock.sh +42 -0
  448. data/ext/libcouchbase/tests/unit_tests.cc +43 -0
  449. data/ext/libcouchbase/tests/vbucket/confdata/bad.json +101 -0
  450. data/ext/libcouchbase/tests/vbucket/confdata/full_25.json +363 -0
  451. data/ext/libcouchbase/tests/vbucket/confdata/memd_25.json +90 -0
  452. data/ext/libcouchbase/tests/vbucket/confdata/memd_30.json +1 -0
  453. data/ext/libcouchbase/tests/vbucket/confdata/memd_45.json +1 -0
  454. data/ext/libcouchbase/tests/vbucket/confdata/terse_25.json +291 -0
  455. data/ext/libcouchbase/tests/vbucket/confdata/terse_30.json +1 -0
  456. data/ext/libcouchbase/tests/vbucket/t_config.cc +341 -0
  457. data/ext/libcouchbase/tools/CMakeLists.txt +51 -0
  458. data/ext/libcouchbase/tools/cbc-handlers.h +462 -0
  459. data/ext/libcouchbase/tools/cbc-n1qlback.cc +439 -0
  460. data/ext/libcouchbase/tools/cbc-pillowfight.cc +822 -0
  461. data/ext/libcouchbase/tools/cbc.cc +1541 -0
  462. data/ext/libcouchbase/tools/common/histogram.cc +43 -0
  463. data/ext/libcouchbase/tools/common/histogram.h +23 -0
  464. data/ext/libcouchbase/tools/common/my_inttypes.h +22 -0
  465. data/ext/libcouchbase/tools/common/options.cc +420 -0
  466. data/ext/libcouchbase/tools/common/options.h +81 -0
  467. data/ext/libcouchbase/tools/docgen/docgen.h +469 -0
  468. data/ext/libcouchbase/tools/docgen/loc.h +210 -0
  469. data/ext/libcouchbase/tools/docgen/placeholders.h +211 -0
  470. data/ext/libcouchbase/tools/docgen/seqgen.h +94 -0
  471. data/lib/libcouchbase.rb +36 -0
  472. data/lib/libcouchbase/bucket.rb +819 -0
  473. data/lib/libcouchbase/callbacks.rb +72 -0
  474. data/lib/libcouchbase/connection.rb +790 -0
  475. data/lib/libcouchbase/design_docs.rb +86 -0
  476. data/lib/libcouchbase/error.rb +68 -0
  477. data/lib/libcouchbase/ext/libcouchbase.rb +1135 -0
  478. data/lib/libcouchbase/ext/libcouchbase/cmdbase.rb +23 -0
  479. data/lib/libcouchbase/ext/libcouchbase/cmdcounter.rb +36 -0
  480. data/lib/libcouchbase/ext/libcouchbase/cmdendure.rb +26 -0
  481. data/lib/libcouchbase/ext/libcouchbase/cmdfts.rb +24 -0
  482. data/lib/libcouchbase/ext/libcouchbase/cmdget.rb +30 -0
  483. data/lib/libcouchbase/ext/libcouchbase/cmdgetreplica.rb +49 -0
  484. data/lib/libcouchbase/ext/libcouchbase/cmdhttp.rb +58 -0
  485. data/lib/libcouchbase/ext/libcouchbase/cmdn1ql.rb +40 -0
  486. data/lib/libcouchbase/ext/libcouchbase/cmdobseqno.rb +33 -0
  487. data/lib/libcouchbase/ext/libcouchbase/cmdobserve.rb +30 -0
  488. data/lib/libcouchbase/ext/libcouchbase/cmdstore.rb +40 -0
  489. data/lib/libcouchbase/ext/libcouchbase/cmdstoredur.rb +45 -0
  490. data/lib/libcouchbase/ext/libcouchbase/cmdsubdoc.rb +49 -0
  491. data/lib/libcouchbase/ext/libcouchbase/cmdverbosity.rb +29 -0
  492. data/lib/libcouchbase/ext/libcouchbase/cmdviewquery.rb +61 -0
  493. data/lib/libcouchbase/ext/libcouchbase/contigbuf.rb +14 -0
  494. data/lib/libcouchbase/ext/libcouchbase/create_st.rb +15 -0
  495. data/lib/libcouchbase/ext/libcouchbase/create_st0.rb +23 -0
  496. data/lib/libcouchbase/ext/libcouchbase/create_st1.rb +26 -0
  497. data/lib/libcouchbase/ext/libcouchbase/create_st2.rb +32 -0
  498. data/lib/libcouchbase/ext/libcouchbase/create_st3.rb +26 -0
  499. data/lib/libcouchbase/ext/libcouchbase/crst_u.rb +20 -0
  500. data/lib/libcouchbase/ext/libcouchbase/durability_opts_st_v.rb +11 -0
  501. data/lib/libcouchbase/ext/libcouchbase/durability_opts_t.rb +14 -0
  502. data/lib/libcouchbase/ext/libcouchbase/durabilityopt_sv0.rb +63 -0
  503. data/lib/libcouchbase/ext/libcouchbase/enums.rb +991 -0
  504. data/lib/libcouchbase/ext/libcouchbase/fragbuf.rb +18 -0
  505. data/lib/libcouchbase/ext/libcouchbase/ftshandle.rb +7 -0
  506. data/lib/libcouchbase/ext/libcouchbase/histogram.rb +34 -0
  507. data/lib/libcouchbase/ext/libcouchbase/http_request_t.rb +7 -0
  508. data/lib/libcouchbase/ext/libcouchbase/keybuf.rb +20 -0
  509. data/lib/libcouchbase/ext/libcouchbase/multicmd_ctx.rb +30 -0
  510. data/lib/libcouchbase/ext/libcouchbase/mutation_token.rb +17 -0
  511. data/lib/libcouchbase/ext/libcouchbase/n1qlhandle.rb +7 -0
  512. data/lib/libcouchbase/ext/libcouchbase/n1qlparams.rb +7 -0
  513. data/lib/libcouchbase/ext/libcouchbase/respbase.rb +29 -0
  514. data/lib/libcouchbase/ext/libcouchbase/respcounter.rb +32 -0
  515. data/lib/libcouchbase/ext/libcouchbase/respendure.rb +49 -0
  516. data/lib/libcouchbase/ext/libcouchbase/respfts.rb +40 -0
  517. data/lib/libcouchbase/ext/libcouchbase/respget.rb +44 -0
  518. data/lib/libcouchbase/ext/libcouchbase/resphttp.rb +48 -0
  519. data/lib/libcouchbase/ext/libcouchbase/respmcversion.rb +38 -0
  520. data/lib/libcouchbase/ext/libcouchbase/respn1ql.rb +41 -0
  521. data/lib/libcouchbase/ext/libcouchbase/respobseqno.rb +52 -0
  522. data/lib/libcouchbase/ext/libcouchbase/respobserve.rb +41 -0
  523. data/lib/libcouchbase/ext/libcouchbase/respserverbase.rb +32 -0
  524. data/lib/libcouchbase/ext/libcouchbase/respstats.rb +38 -0
  525. data/lib/libcouchbase/ext/libcouchbase/respstore.rb +32 -0
  526. data/lib/libcouchbase/ext/libcouchbase/respstoredur.rb +38 -0
  527. data/lib/libcouchbase/ext/libcouchbase/respsubdoc.rb +35 -0
  528. data/lib/libcouchbase/ext/libcouchbase/respviewquery.rb +67 -0
  529. data/lib/libcouchbase/ext/libcouchbase/sdentry.rb +22 -0
  530. data/lib/libcouchbase/ext/libcouchbase/sdspec.rb +26 -0
  531. data/lib/libcouchbase/ext/libcouchbase/t.rb +7 -0
  532. data/lib/libcouchbase/ext/libcouchbase/valbuf.rb +22 -0
  533. data/lib/libcouchbase/ext/libcouchbase/valbuf_u_buf.rb +14 -0
  534. data/lib/libcouchbase/ext/libcouchbase/viewhandle.rb +7 -0
  535. data/lib/libcouchbase/ext/libcouchbase_iocp.rb +26 -0
  536. data/lib/libcouchbase/ext/libcouchbase_libuv.rb +18 -0
  537. data/lib/libcouchbase/ext/tasks.rb +87 -0
  538. data/lib/libcouchbase/n1ql.rb +73 -0
  539. data/lib/libcouchbase/query_full_text.rb +147 -0
  540. data/lib/libcouchbase/query_n1ql.rb +121 -0
  541. data/lib/libcouchbase/query_view.rb +129 -0
  542. data/lib/libcouchbase/results_fiber.rb +262 -0
  543. data/lib/libcouchbase/results_native.rb +211 -0
  544. data/lib/libcouchbase/version.rb +5 -0
  545. data/libcouchbase.gemspec +61 -0
  546. data/spec/bucket_spec.rb +270 -0
  547. data/spec/connection_spec.rb +277 -0
  548. data/spec/design_docs_spec.rb +23 -0
  549. data/spec/error_spec.rb +26 -0
  550. data/spec/fts_spec.rb +129 -0
  551. data/spec/n1ql_spec.rb +201 -0
  552. data/spec/results_libuv_spec.rb +229 -0
  553. data/spec/results_native_spec.rb +259 -0
  554. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/design.json +1 -0
  555. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/data-0000.cbb +0 -0
  556. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/failover.json +1 -0
  557. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/meta.json +1 -0
  558. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/seqno.json +1 -0
  559. data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/snapshot_markers.json +1 -0
  560. data/spec/view_spec.rb +195 -0
  561. metadata +775 -0
@@ -0,0 +1,23 @@
1
+ IF(APPLE)
2
+ IF(NOT OpenSSL_DIR)
3
+ EXECUTE_PROCESS(COMMAND brew --prefix openssl
4
+ OUTPUT_VARIABLE OPENSSL_ROOT_DIR
5
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
6
+ MESSAGE(STATUS "Found OpenSSL Prefix: ${OPENSSL_ROOT_DIR}")
7
+ ENDIF()
8
+ ENDIF()
9
+
10
+ FIND_PACKAGE(OpenSSL)
11
+ IF(OPENSSL_FOUND AND (NOT LCB_NO_SSL))
12
+ INCLUDE_DIRECTORIES(${OPENSSL_INCLUDE_DIR})
13
+ ADD_DEFINITIONS(${OPENSSL_DEFINITIONS})
14
+ ADD_LIBRARY(lcbssl OBJECT ssl_e.c ssl_c.c ssl_common.c)
15
+ SET(lcb_ssl_libs ${OPENSSL_LIBRARIES} PARENT_SCOPE)
16
+ SET(lcb_ssl_objs $<TARGET_OBJECTS:lcbssl> PARENT_SCOPE)
17
+ LCB_UTIL(lcbssl)
18
+ MESSAGE(STATUS "SSL Found")
19
+ ELSE()
20
+ SET(LCB_NO_SSL ON PARENT_SCOPE)
21
+ SET(lcb_ssl_libs "" PARENT_SCOPE)
22
+ MESSAGE(STATUS "SSL Not Found")
23
+ ENDIF()
@@ -0,0 +1,415 @@
1
+ /* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2014 Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #include "ssl_iot_common.h"
19
+ #include "sllist.h"
20
+ #include "sllist-inl.h"
21
+
22
+ /* throw-away write buffer structure (for encoded data) */
23
+ typedef struct {
24
+ void *parent;
25
+ char buf[1];
26
+ } my_WBUF;
27
+
28
+ /* throw-away write buffer structure (for application data) */
29
+ typedef struct {
30
+ sllist_node slnode;
31
+ lcb_ioC_write2_callback cb;
32
+ void *uarg;
33
+ void *iovroot_;
34
+ lcb_IOV *iov;
35
+ lcb_size_t niov;
36
+ } my_WCTX;
37
+
38
+ typedef struct {
39
+ IOTSSL_COMMON_FIELDS
40
+ lcb_sockdata_t *sd; /**< Socket pointer */
41
+ lcbio_pTIMER as_read; /**< For callbacks when SSL_pending > 0 */
42
+ lcbio_pTIMER as_write; /**< For callbacks when SSL_writes succeeds */
43
+ lcb_IOV urd_iov; /**< User-defined buffer to read in applicataion data */
44
+ void *urd_arg; /**< User-defined argument for read callback */
45
+ my_WCTX *wctx_cached;
46
+ lcb_ioC_read2_callback urd_cb; /**< User defined read callback */
47
+ sllist_root writes; /**< List of pending user writes */
48
+
49
+ /**
50
+ * Whether a current read request is active. This read request refers to
51
+ * this module reading raw data from the actual underlying socket. The
52
+ * presence of a user-level (i.e. lcbio-invoked) read request is determined
53
+ * by the presence of a non-NULL urd_cb value
54
+ */
55
+ int rdactive;
56
+
57
+ int closed; /**< Pending delivery of close */
58
+ int entered;
59
+ } lcbio_CSSL;
60
+
61
+ #define CS_FROM_IOPS(iops) (lcbio_CSSL *)IOTSSL_FROM_IOPS(iops)
62
+ #define SCHEDULE_WANT_SAFE(cs) if (!(cs)->entered) { schedule_wants(cs); }
63
+
64
+ static void appdata_encode(lcbio_CSSL *);
65
+ static void appdata_free_flushed(lcbio_CSSL *);
66
+ static void appdata_read(lcbio_CSSL *);
67
+ static void schedule_wants(lcbio_CSSL *cs);
68
+ static int maybe_set_error(lcbio_CSSL *cs, int rv)
69
+ {
70
+ return iotssl_maybe_error((lcbio_XSSL *)cs, rv);
71
+ }
72
+
73
+ /* This function goes through all the pending copies of data that was scheduled
74
+ * for write and where the current IOV position is at the end (or niov==0).
75
+ * For each of those routines this function will invoke its write callback
76
+ */
77
+ static void
78
+ appdata_free_flushed(lcbio_CSSL *cs)
79
+ {
80
+ sllist_iterator iter;
81
+ SLLIST_ITERFOR(&cs->writes, &iter) {
82
+ my_WCTX *cur = SLLIST_ITEM(iter.cur, my_WCTX, slnode);
83
+ if (cur->niov && cs->error == 0) {
84
+ break;
85
+ }
86
+ /* invoke the callback */
87
+ cur->cb(cs->sd, cs->error?-1:0, cur->uarg);
88
+ sllist_iter_remove(&cs->writes, &iter);
89
+ free(cur->iovroot_);
90
+ if (cs->wctx_cached) {
91
+ free(cur);
92
+ } else {
93
+ cs->wctx_cached = cur;
94
+ }
95
+ }
96
+ }
97
+
98
+ /* This function will attempt to encode pending user data into SSL data. This
99
+ * will be output to the wbio. */
100
+ static void
101
+ appdata_encode(lcbio_CSSL *cs)
102
+ {
103
+ sllist_node *cur;
104
+
105
+ /* each element here represents a used-defined write buffer */
106
+ SLLIST_FOREACH(&cs->writes, cur) {
107
+ my_WCTX *ctx = SLLIST_ITEM(cur, my_WCTX, slnode);
108
+
109
+ for (; ctx->niov && cs->error == 0; ctx->niov--, ctx->iov++) {
110
+ int rv;
111
+
112
+ assert(ctx->iov->iov_len);
113
+ rv = SSL_write(cs->ssl, ctx->iov->iov_base, ctx->iov->iov_len);
114
+ if (rv > 0) {
115
+ continue;
116
+ } else if (maybe_set_error(cs, rv) == 0) {
117
+ /* SSL_ERROR_WANT_READ. Should schedule a read here.
118
+ * XXX: Note that this buffer will not be returned to the user
119
+ * until the _next_ time the appdata_free_flushed function is
120
+ * invoked; the call chain for appdata_free_flushed is like this:
121
+ *
122
+ * start_write2 => async_schedule(async_write) => appdata_free_flushed.
123
+ * OR
124
+ * start_write2 => write_callback => appdata_free_flushed
125
+ */
126
+ SCHEDULE_WANT_SAFE(cs)
127
+ return;
128
+ } else {
129
+ IOTSSL_ERRNO(cs) = EINVAL;
130
+ }
131
+ }
132
+ }
133
+ }
134
+
135
+ static void
136
+ async_write(void *arg)
137
+ {
138
+ lcbio_CSSL *cs = arg;
139
+ appdata_encode(cs);
140
+ appdata_free_flushed(cs);
141
+ }
142
+
143
+ /* Called when SSL data has been written to the socket */
144
+ static void
145
+ write_callback(lcb_sockdata_t *sd, int status, void *arg)
146
+ {
147
+ my_WBUF *wb = arg;
148
+ lcbio_CSSL *cs = wb->parent;
149
+
150
+ if (status) {
151
+ IOTSSL_ERRNO(cs) = IOT_ERRNO(cs->orig);
152
+ cs->error = 1;
153
+ }
154
+
155
+ free(wb);
156
+
157
+ appdata_free_flushed(cs);
158
+ lcbio_table_unref(&cs->base_);
159
+ (void) sd;
160
+ }
161
+
162
+ /* Read application data from SSL's rbio buffer. Invokes the user callback
163
+ * for the current read operation if there is data */
164
+ static void
165
+ appdata_read(lcbio_CSSL *cs)
166
+ {
167
+ /* either an error or an actual read event */
168
+ int nr;
169
+ lcb_ioC_read2_callback cb = cs->urd_cb;
170
+ if (!cb) {
171
+ return;
172
+ }
173
+ assert(!cs->rdactive);
174
+ nr = SSL_read(cs->ssl, cs->urd_iov.iov_base, cs->urd_iov.iov_len);
175
+ if (nr > 0) {
176
+ /* nothing */
177
+ } else if (cs->closed || nr == 0) {
178
+ nr = 0;
179
+ } else if (maybe_set_error(cs, nr) == 0) {
180
+ return;
181
+ }
182
+
183
+ cs->urd_cb = NULL;
184
+ cb(cs->sd, nr, cs->urd_arg);
185
+ }
186
+
187
+ /* Invoked when SSL data has been read from the socket */
188
+ static void
189
+ read_callback(lcb_sockdata_t *sd, lcb_ssize_t nr, void *arg)
190
+ {
191
+ lcbio_CSSL *cs = arg;
192
+ cs->rdactive = 0;
193
+ cs->entered++;
194
+
195
+ if (nr > 0) {
196
+ BUF_MEM *mb;
197
+
198
+ BIO_clear_retry_flags(cs->rbio);
199
+ BIO_get_mem_ptr(cs->rbio, &mb);
200
+ mb->length += nr;
201
+
202
+ } else if (nr == 0) {
203
+ cs->closed = 1;
204
+ cs->error = 1;
205
+
206
+ } else {
207
+ cs->error = 1;
208
+ IOTSSL_ERRNO(cs) = IOT_ERRNO(cs->orig);
209
+ }
210
+
211
+ appdata_encode(cs);
212
+ appdata_read(cs);
213
+
214
+ cs->entered--;
215
+ schedule_wants(cs);
216
+ lcbio_table_unref(&cs->base_);
217
+ (void) sd;
218
+ }
219
+
220
+
221
+ /* This function schedules any I/O on the actual socket. It writes encoded
222
+ * data and requests to read decoded data */
223
+ static void
224
+ schedule_wants(lcbio_CSSL *cs)
225
+ {
226
+ size_t npend = BIO_ctrl_pending(cs->wbio);
227
+ char dummy;
228
+
229
+ int has_appdata = 0;
230
+
231
+ if (SSL_peek(cs->ssl, &dummy, 1) == 1) {
232
+ has_appdata = 1;
233
+ }
234
+
235
+ if (npend) {
236
+ /* Have pending data to write. The buffer is copied here because the
237
+ * BIO structure doesn't support "lockdown" semantics like netbuf/rdb
238
+ * do. We might transplant this with a different sort of BIO eventually..
239
+ */
240
+ my_WBUF *wb = malloc(sizeof(*wb) + npend);
241
+ lcb_IOV iov;
242
+ BIO_read(cs->wbio, wb->buf, npend);
243
+ iov.iov_base = wb->buf;
244
+ iov.iov_len = npend;
245
+ wb->parent = cs;
246
+
247
+ /* Increment the reference count. This is decremented when we get back
248
+ * the callback. The goal is that a pending internal SSL_write() should
249
+ * keep the object alive despite the user having called lcbio_table_unref()
250
+ * on us.
251
+ */
252
+ lcbio_table_ref(&cs->base_);
253
+ IOT_V1(cs->orig).write2(
254
+ IOT_ARG(cs->orig), cs->sd, &iov, 1, wb, write_callback);
255
+ }
256
+
257
+ /* Only schedule additional reads if we're not already in the process of a
258
+ * read */
259
+
260
+ if (cs->rdactive == 0) {
261
+ if (cs->error) {
262
+ /* This can happen if we got an SSL error in performing something
263
+ * within this callback.
264
+ *
265
+ * In this case, just signal "as-if" a read happened. appdata_read
266
+ * will do the right thing if there is no read callback, and will
267
+ * return an error if SSL_read() fails (which it should).
268
+ */
269
+ lcbio_async_signal(cs->as_read);
270
+
271
+ } else if (SSL_want_read(cs->ssl) || (cs->urd_cb && has_appdata == 0)) {
272
+ /* request more data from the socket */
273
+ BUF_MEM *mb;
274
+ lcb_IOV iov;
275
+
276
+ cs->rdactive = 1;
277
+ BIO_get_mem_ptr(cs->rbio, &mb);
278
+ iotssl_bm_reserve(mb);
279
+ iov.iov_base = mb->data + mb->length;
280
+ iov.iov_len = mb->max - mb->length;
281
+ lcbio_table_ref(&cs->base_);
282
+ IOT_V1(cs->orig).read2(
283
+ IOT_ARG(cs->orig), cs->sd, &iov, 1, cs, read_callback);
284
+ }
285
+
286
+ }
287
+ }
288
+
289
+ static int
290
+ Cssl_read2(lcb_io_opt_t iops, lcb_sockdata_t *sd, lcb_IOV *iov, lcb_size_t niov,
291
+ void *uarg, lcb_ioC_read2_callback callback)
292
+ {
293
+ lcbio_CSSL *cs = CS_FROM_IOPS(iops);
294
+ cs->urd_iov = *iov;
295
+ cs->urd_arg = uarg;
296
+ cs->urd_cb = callback;
297
+
298
+ IOTSSL_PENDING_PRECHECK(cs->ssl);
299
+ if (IOTSSL_IS_PENDING(cs->ssl)) {
300
+ /* have data to be read. Fast path here */
301
+ lcbio_async_signal(cs->as_read);
302
+ } else {
303
+ SCHEDULE_WANT_SAFE(cs);
304
+ }
305
+
306
+ (void) niov; (void) sd;
307
+ return 0;
308
+ }
309
+
310
+ static int
311
+ Cssl_write2(lcb_io_opt_t io, lcb_sockdata_t *sd, lcb_IOV *iov, lcb_size_t niov,
312
+ void *uarg, lcb_ioC_write2_callback callback)
313
+ {
314
+ lcbio_CSSL *cs = CS_FROM_IOPS(io);
315
+ my_WCTX *wc;
316
+
317
+ /* We keep one of these cached inside the cs structure so we don't have
318
+ * to make a new malloc for each write */
319
+ if (cs->wctx_cached) {
320
+ wc = cs->wctx_cached;
321
+ cs->wctx_cached = NULL;
322
+ memset(wc, 0, sizeof *wc);
323
+ } else {
324
+ wc = calloc(1, sizeof(*wc));
325
+ }
326
+
327
+ /* assign the common parameters */
328
+ wc->uarg = uarg;
329
+ wc->cb = callback;
330
+
331
+ /* If the socket does not have a pending error and there are no other
332
+ * writes before this, then try to write the current buffer immediately. */
333
+ if (cs->error == 0 && SLLIST_IS_EMPTY(&cs->writes)) {
334
+ unsigned ii;
335
+ for (ii = 0; ii < niov; ++ii) {
336
+ int rv = SSL_write(cs->ssl, iov->iov_base, iov->iov_len);
337
+ if (rv > 0) {
338
+ iov++;
339
+ niov--;
340
+ } else {
341
+ maybe_set_error(cs, rv);
342
+ break;
343
+ }
344
+ }
345
+ }
346
+
347
+ /* We add this now in order for the SLLIST_IS_EMPTY to be false before, if
348
+ * no other items were pending */
349
+ sllist_append(&cs->writes, &wc->slnode);
350
+
351
+ /* If we have some IOVs remaining then it means we couldn't write all the
352
+ * data. If so, reschedule and place in the queue for later */
353
+ if (niov && cs->error == 0) {
354
+ wc->niov = niov;
355
+ wc->iov = malloc(sizeof (*iov) * wc->niov);
356
+ wc->iovroot_ = wc->iov;
357
+ memcpy(wc->iov, iov, sizeof (*iov) * niov);
358
+ /* This function will try to schedule the proper events. We need at least
359
+ * one SSL_write() in order to advance the state machine. In the future
360
+ * we could determine if we performed a previous SSL_write above */
361
+ appdata_encode(cs);
362
+ }
363
+
364
+ /* In most cases we will want to deliver the "flushed" notification */
365
+ lcbio_async_signal(cs->as_write);
366
+ (void) sd;
367
+ return 0;
368
+ }
369
+
370
+ static unsigned
371
+ Cssl_close(lcb_io_opt_t io, lcb_sockdata_t *sd)
372
+ {
373
+ lcbio_CSSL *cs = CS_FROM_IOPS(io);
374
+ IOT_V1(cs->orig).close(IOT_ARG(cs->orig), sd);
375
+ cs->error = 1;
376
+ if (!SLLIST_IS_EMPTY(&cs->writes)) {
377
+ /* It is possible that a prior call to SSL_write returned an SSL_want_read
378
+ * and the next subsequent call to the underlying read API returned an
379
+ * error. For this reason we signal to the as_write function (which
380
+ * then calls the appdata_free_flushed function) in case we have such
381
+ * leftover data.
382
+ */
383
+ lcbio_async_signal(cs->as_write);
384
+ }
385
+ return 0;
386
+ }
387
+
388
+ static void
389
+ Cssl_dtor(void *arg)
390
+ {
391
+ lcbio_CSSL *cs = arg;
392
+ assert(SLLIST_IS_EMPTY(&cs->writes));
393
+ lcbio_timer_destroy(cs->as_read);
394
+ lcbio_timer_destroy(cs->as_write);
395
+ iotssl_destroy_common((lcbio_XSSL *)cs);
396
+ free(cs->wctx_cached);
397
+ free(arg);
398
+ }
399
+
400
+ lcbio_pTABLE
401
+ lcbio_Cssl_new(lcbio_pTABLE orig, lcb_sockdata_t *sd, SSL_CTX *sctx)
402
+ {
403
+ lcbio_CSSL *ret = calloc(1, sizeof(*ret));
404
+ lcbio_pTABLE iot = &ret->base_;
405
+ ret->sd = sd;
406
+ ret->as_read = lcbio_timer_new(orig, ret, (void (*)(void*))appdata_read);
407
+ ret->as_write = lcbio_timer_new(orig, ret, async_write);
408
+ ret->base_.dtor = Cssl_dtor;
409
+
410
+ iot->u_io.completion.read2 = Cssl_read2;
411
+ iot->u_io.completion.write2 = Cssl_write2;
412
+ iot->u_io.completion.close = Cssl_close;
413
+ iotssl_init_common((lcbio_XSSL *)ret, orig, sctx);
414
+ return iot;
415
+ }
@@ -0,0 +1,454 @@
1
+ /* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2014 Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ /**
19
+ * This file contains the common bucket of routines necessary for interfacing
20
+ * with OpenSSL.
21
+ */
22
+ #include "ssl_iot_common.h"
23
+ #include "settings.h"
24
+ #include "logging.h"
25
+ #include <openssl/err.h>
26
+
27
+ #define LOGARGS(ssl, lvl) \
28
+ ((lcbio_SOCKET*)SSL_get_app_data(ssl))->settings, "SSL", lvl, __FILE__, __LINE__
29
+ static char *global_event = "dummy event for ssl";
30
+
31
+ /******************************************************************************
32
+ ******************************************************************************
33
+ ** Boilerplate lcbio_TABLE Wrappers **
34
+ ******************************************************************************
35
+ ******************************************************************************/
36
+ static void loop_run(lcb_io_opt_t io) {
37
+ lcbio_XSSL *xs = IOTSSL_FROM_IOPS(io);
38
+ IOT_START(xs->orig);
39
+ }
40
+ static void loop_stop(lcb_io_opt_t io) {
41
+ lcbio_XSSL *xs = IOTSSL_FROM_IOPS(io);
42
+ IOT_STOP(xs->orig);
43
+ }
44
+ static void *create_event(lcb_io_opt_t io) {
45
+ (void)io;
46
+ return global_event;
47
+ }
48
+ static void destroy_event(lcb_io_opt_t io, void *event) {
49
+ (void) io; (void) event;
50
+ }
51
+ static void *create_timer(lcb_io_opt_t io) {
52
+ lcbio_XSSL *xs = IOTSSL_FROM_IOPS(io);
53
+ return xs->orig->timer.create(IOT_ARG(xs->orig));
54
+ }
55
+ static int schedule_timer(lcb_io_opt_t io, void *timer, lcb_uint32_t us,
56
+ void *arg, lcb_ioE_callback callback) {
57
+ lcbio_XSSL *xs = IOTSSL_FROM_IOPS(io);
58
+ return xs->orig->timer.schedule(IOT_ARG(xs->orig), timer, us, arg, callback);
59
+ }
60
+ static void destroy_timer(lcb_io_opt_t io, void *timer) {
61
+ lcbio_XSSL *xs = IOTSSL_FROM_IOPS(io);
62
+ xs->orig->timer.destroy(IOT_ARG(xs->orig), timer);
63
+ }
64
+ static void cancel_timer(lcb_io_opt_t io, void *timer) {
65
+ lcbio_XSSL *xs = IOTSSL_FROM_IOPS(io);
66
+ xs->orig->timer.cancel(IOT_ARG(xs->orig), timer);
67
+ }
68
+ static int Eis_closed(lcb_io_opt_t io, lcb_socket_t sock, int flags) {
69
+ lcbio_XSSL *xs = IOTSSL_FROM_IOPS(io);
70
+ return xs->orig->u_io.v0.io.is_closed(IOT_ARG(xs->orig), sock, flags);
71
+ }
72
+ static int Cis_closed(lcb_io_opt_t io, lcb_sockdata_t *sd, int flags) {
73
+ lcbio_XSSL *xs = IOTSSL_FROM_IOPS(io);
74
+ return xs->orig->u_io.completion.is_closed(IOT_ARG(xs->orig), sd, flags);
75
+ }
76
+
77
+ /******************************************************************************
78
+ ******************************************************************************
79
+ ** Common Routines for lcbio_TABLE Emulation **
80
+ ******************************************************************************
81
+ ******************************************************************************/
82
+ void
83
+ iotssl_init_common(lcbio_XSSL *xs, lcbio_TABLE *orig, SSL_CTX *sctx)
84
+ {
85
+ lcbio_TABLE *base = &xs->base_;
86
+ xs->iops_dummy_ = calloc(1, sizeof(*xs->iops_dummy_));
87
+ xs->iops_dummy_->v.v0.cookie = xs;
88
+ xs->orig = orig;
89
+ base->model = xs->orig->model;
90
+ base->p = xs->iops_dummy_;
91
+ base->refcount = 1;
92
+ base->loop.start = loop_run;
93
+ base->loop.stop = loop_stop;
94
+ base->timer.create = create_timer;
95
+ base->timer.destroy = destroy_timer;
96
+ base->timer.schedule = schedule_timer;
97
+ base->timer.cancel = cancel_timer;
98
+
99
+ if (orig->model == LCB_IOMODEL_EVENT) {
100
+ base->u_io.v0.ev.create = create_event;
101
+ base->u_io.v0.ev.destroy = destroy_event;
102
+ base->u_io.v0.io.is_closed = Eis_closed;
103
+ } else {
104
+ base->u_io.completion.is_closed = Cis_closed;
105
+ }
106
+
107
+ lcbio_table_ref(xs->orig);
108
+
109
+ xs->error = 0;
110
+ xs->ssl = SSL_new(sctx);
111
+
112
+ xs->rbio = BIO_new(BIO_s_mem());
113
+ xs->wbio = BIO_new(BIO_s_mem());
114
+
115
+ SSL_set_bio(xs->ssl, xs->rbio, xs->wbio);
116
+ SSL_set_read_ahead(xs->ssl, 0);
117
+
118
+ /* Indicate that we are a client */
119
+ SSL_set_connect_state(xs->ssl);
120
+ }
121
+
122
+ void
123
+ iotssl_destroy_common(lcbio_XSSL *xs)
124
+ {
125
+ free(xs->iops_dummy_);
126
+ SSL_free(xs->ssl);
127
+ lcbio_table_unref(xs->orig);
128
+ }
129
+
130
+ void
131
+ iotssl_bm_reserve(BUF_MEM *bm)
132
+ {
133
+ int oldlen;
134
+ oldlen = bm->length;
135
+ while (bm->max - bm->length < 4096) {
136
+ /* there's also a BUF_MEM_grow_clean() but that actually clears the
137
+ * used portion of the buffer */
138
+ BUF_MEM_grow(bm, bm->max + 4096);
139
+ }
140
+ bm->length = oldlen;
141
+ }
142
+
143
+ void
144
+ iotssl_log_errors(lcbio_XSSL *xs)
145
+ {
146
+ unsigned long curerr;
147
+ while ((curerr = ERR_get_error())) {
148
+ char errbuf[4096];
149
+ ERR_error_string_n(curerr, errbuf, sizeof errbuf);
150
+ lcb_log(LOGARGS(xs->ssl, LCB_LOG_ERROR), "%s", errbuf);
151
+
152
+ if (xs->errcode != LCB_SUCCESS) {
153
+ continue; /* Already set */
154
+ }
155
+
156
+ if (ERR_GET_LIB(curerr) == ERR_LIB_SSL) {
157
+ switch (ERR_GET_REASON(curerr)) {
158
+ case SSL_R_CERTIFICATE_VERIFY_FAILED:
159
+ case SSL_R_MISSING_VERIFY_MESSAGE:
160
+ xs->errcode = LCB_SSL_CANTVERIFY;
161
+ break;
162
+
163
+ case SSL_R_BAD_PROTOCOL_VERSION_NUMBER:
164
+ case SSL_R_UNKNOWN_PROTOCOL:
165
+ case SSL_R_WRONG_VERSION_NUMBER:
166
+ case SSL_R_UNKNOWN_SSL_VERSION:
167
+ case SSL_R_UNSUPPORTED_SSL_VERSION:
168
+ xs->errcode = LCB_PROTOCOL_ERROR;
169
+ break;
170
+ default:
171
+ xs->errcode = LCB_SSL_ERROR;
172
+ }
173
+ }
174
+ }
175
+ }
176
+
177
+ static void
178
+ log_global_errors(lcb_settings *settings)
179
+ {
180
+ unsigned long curerr;
181
+ while ((curerr = ERR_get_error())) {
182
+ char errbuf[4096];
183
+ ERR_error_string_n(curerr, errbuf, sizeof errbuf);
184
+ lcb_log(settings, "SSL", LCB_LOG_ERROR, __FILE__, __LINE__, "SSL Error: %ld, %s", curerr, errbuf);
185
+ }
186
+ }
187
+
188
+ int
189
+ iotssl_maybe_error(lcbio_XSSL *xs, int rv)
190
+ {
191
+ assert(rv < 1);
192
+ if (rv == -1) {
193
+ int err = SSL_get_error(xs->ssl, rv);
194
+ if (err == SSL_ERROR_WANT_READ || err == SSL_ERROR_WANT_WRITE) {
195
+ /* this is ok. */
196
+ return 0;
197
+ }
198
+ }
199
+ iotssl_log_errors(xs);
200
+ return -1;
201
+ }
202
+
203
+ /******************************************************************************
204
+ ******************************************************************************
205
+ ** Higher Level SSL_CTX Wrappers **
206
+ ******************************************************************************
207
+ ******************************************************************************/
208
+ static void
209
+ log_callback(const SSL *ssl, int where, int ret)
210
+ {
211
+ const char *retstr = "";
212
+ int should_log = 0;
213
+ lcbio_SOCKET *sock = SSL_get_app_data(ssl);
214
+ /* Ignore low-level SSL stuff */
215
+
216
+ if (where & SSL_CB_ALERT) {
217
+ should_log = 1;
218
+ }
219
+ if (where == SSL_CB_HANDSHAKE_START || where == SSL_CB_HANDSHAKE_DONE) {
220
+ should_log = 1;
221
+ }
222
+ if ((where & SSL_CB_EXIT) && ret == 0) {
223
+ should_log = 1;
224
+ }
225
+
226
+ if (!should_log) {
227
+ return;
228
+ }
229
+
230
+ retstr = SSL_alert_type_string(ret);
231
+ lcb_log(LOGARGS(ssl, LCB_LOG_TRACE), "sock=%p: ST(0x%x). %s. R(0x%x)%s",
232
+ (void*)sock, where, SSL_state_string_long(ssl), ret, retstr);
233
+
234
+ if (where == SSL_CB_HANDSHAKE_DONE) {
235
+ lcb_log(LOGARGS(ssl, LCB_LOG_DEBUG), "sock=%p. Using SSL version %s. Cipher=%s", (void*)sock, SSL_get_version(ssl), SSL_get_cipher_name(ssl));
236
+ }
237
+ }
238
+
239
+ #if 0
240
+ static void
241
+ msg_callback(int write_p, int version, int ctype, const void *buf, size_t n,
242
+ SSL *ssl, void *arg)
243
+ {
244
+ printf("Got message (%s). V=0x%x. T=%d. N=%lu\n",
245
+ write_p ? ">" : "<", version, ctype, n);
246
+ (void)ssl; (void)arg; (void)buf;
247
+ }
248
+ #endif
249
+
250
+ struct lcbio_SSLCTX {
251
+ SSL_CTX *ctx;
252
+ };
253
+
254
+ lcbio_pSSLCTX
255
+ lcbio_ssl_new(const char *cafile, int noverify, lcb_error_t *errp,
256
+ lcb_settings *settings)
257
+ {
258
+ lcb_error_t err_s;
259
+ lcbio_pSSLCTX ret;
260
+
261
+ if (!errp) {
262
+ errp = &err_s;
263
+ }
264
+
265
+ ret = calloc(1, sizeof(*ret));
266
+ if (!ret) {
267
+ *errp = LCB_CLIENT_ENOMEM;
268
+ goto GT_ERR;
269
+ }
270
+ ret->ctx = SSL_CTX_new(SSLv23_client_method());
271
+ if (!ret->ctx) {
272
+ *errp = LCB_SSL_ERROR;
273
+ goto GT_ERR;
274
+
275
+ }
276
+ SSL_CTX_set_cipher_list(ret->ctx, "DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:AES256-SHA:EDH-RSA-DES-CBC3-SHA:EDH-DSS-DES-CBC3-SHA:DES-CBC3-SHA:DES-CBC3-MD5:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA:AES128-SHA:DHE-RSA-SEED-SHA:DHE-DSS-SEED-SHA:SEED-SHA:RC2-CBC-MD5:RC4-SHA:RC4-MD5:RC4-MD5:EDH-RSA-DES-CBC-SHA:EDH-DSS-DES-CBC-SHA:DES-CBC-SHA:DES-CBC-MD5:EXP-EDH-RSA-DES-CBC-SHA:EXP-EDH-DSS-DES-CBC-SHA:EXP-DES-CBC-SHA:EXP-RC2-CBC-MD5:EXP-RC2-CBC-MD5:EXP-RC4-MD5:EXP-RC4-MD5");
277
+ // SSL_CTX_set_cipher_list(ret->ctx, "!NULL");
278
+
279
+ if (cafile) {
280
+ if (!SSL_CTX_load_verify_locations(ret->ctx, cafile, NULL)) {
281
+ *errp = LCB_SSL_ERROR;
282
+ goto GT_ERR;
283
+ }
284
+ }
285
+
286
+ if (noverify) {
287
+ SSL_CTX_set_verify(ret->ctx, SSL_VERIFY_NONE, NULL);
288
+ } else {
289
+ SSL_CTX_set_verify(ret->ctx, SSL_VERIFY_PEER, NULL);
290
+ }
291
+
292
+ SSL_CTX_set_info_callback(ret->ctx, log_callback);
293
+ #if 0
294
+ SSL_CTX_set_msg_callback(ret->ctx, msg_callback);
295
+ #endif
296
+
297
+ /* this will allow us to do SSL_write and use a different buffer if the
298
+ * first one fails. This is helpful in the scenario where an initial
299
+ * SSL_write() returns an SSL_ERROR_WANT_READ in the ssl_e.c plugin. In
300
+ * such a scenario the correct behavior is to return EWOULDBLOCK. However
301
+ * we have no guarantee that the next time we get a write request we would
302
+ * be using the same buffer.
303
+ */
304
+ SSL_CTX_set_mode(ret->ctx, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER);
305
+ SSL_CTX_set_options(ret->ctx, SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3);
306
+ return ret;
307
+
308
+ GT_ERR:
309
+ log_global_errors(settings);
310
+ if (ret) {
311
+ if (ret->ctx) {
312
+ SSL_CTX_free(ret->ctx);
313
+ }
314
+ free(ret);
315
+ }
316
+ return NULL;
317
+ }
318
+
319
+ static void
320
+ noop_dtor(lcbio_PROTOCTX *arg) {
321
+ free(arg);
322
+ }
323
+
324
+ lcb_error_t
325
+ lcbio_ssl_apply(lcbio_SOCKET *sock, lcbio_pSSLCTX sctx)
326
+ {
327
+ lcbio_pTABLE old_iot = sock->io, new_iot;
328
+ lcbio_PROTOCTX *sproto;
329
+
330
+ if (old_iot->model == LCB_IOMODEL_EVENT) {
331
+ new_iot = lcbio_Essl_new(old_iot, sock->u.fd, sctx->ctx);
332
+ } else {
333
+ new_iot = lcbio_Cssl_new(old_iot, sock->u.sd, sctx->ctx);
334
+ }
335
+
336
+ if (new_iot) {
337
+ sproto = calloc(1, sizeof(*sproto));
338
+ sproto->id = LCBIO_PROTOCTX_SSL;
339
+ sproto->dtor = noop_dtor;
340
+ lcbio_protoctx_add(sock, sproto);
341
+ lcbio_table_unref(old_iot);
342
+ sock->io = new_iot;
343
+ /* just for logging */
344
+ SSL_set_app_data(((lcbio_XSSL *)new_iot)->ssl, sock);
345
+ return LCB_SUCCESS;
346
+
347
+ } else {
348
+ return LCB_ERROR;
349
+ }
350
+ }
351
+
352
+ int
353
+ lcbio_ssl_check(lcbio_SOCKET *sock)
354
+ {
355
+ return lcbio_protoctx_get(sock, LCBIO_PROTOCTX_SSL) != NULL;
356
+ }
357
+
358
+ lcb_error_t
359
+ lcbio_ssl_get_error(lcbio_SOCKET *sock)
360
+ {
361
+ lcbio_XSSL *xs = (lcbio_XSSL *)sock->io;
362
+ return xs->errcode;
363
+ }
364
+
365
+ void
366
+ lcbio_ssl_free(lcbio_pSSLCTX ctx)
367
+ {
368
+ SSL_CTX_free(ctx->ctx);
369
+ free(ctx);
370
+ }
371
+
372
+
373
+ /**
374
+ * According to https://www.openssl.org/docs/crypto/threads.html we need
375
+ * to install two functions for locking support, a function that returns
376
+ * a thread ID, and a function which performs locking/unlocking. However later
377
+ * on in the link it says it will select a default implementation to return
378
+ * the thread ID, and thus we only need supply the locking function.
379
+ */
380
+ #if defined(_POSIX_THREADS)
381
+ #include <pthread.h>
382
+ typedef pthread_mutex_t ossl_LOCKTYPE;
383
+ static void ossl_lock_init(ossl_LOCKTYPE *l) { pthread_mutex_init(l, NULL); }
384
+ static void ossl_lock_acquire(ossl_LOCKTYPE *l) { pthread_mutex_lock(l); }
385
+ static void ossl_lock_release(ossl_LOCKTYPE *l) { pthread_mutex_unlock(l); }
386
+ #elif defined(_WIN32)
387
+ #include <windows.h>
388
+ typedef CRITICAL_SECTION ossl_LOCKTYPE;
389
+ static void ossl_lock_init(ossl_LOCKTYPE *l) { InitializeCriticalSection(l); }
390
+ static void ossl_lock_acquire(ossl_LOCKTYPE *l) { EnterCriticalSection(l); }
391
+ static void ossl_lock_release(ossl_LOCKTYPE *l) { LeaveCriticalSection(l); }
392
+ #else
393
+ typedef char ossl_LOCKTYPE;
394
+ #define ossl_lock_init(l)
395
+ #define ossl_lock_acquire(l)
396
+ #define ossl_lock_release(l)
397
+ #endif
398
+
399
+
400
+ static ossl_LOCKTYPE *ossl_locks;
401
+ static void
402
+ ossl_lockfn(int mode, int lkid, const char *f, int line)
403
+ {
404
+ ossl_LOCKTYPE *l = ossl_locks + lkid;
405
+
406
+ if (mode & CRYPTO_LOCK) {
407
+ ossl_lock_acquire(l);
408
+ } else {
409
+ ossl_lock_release(l);
410
+ }
411
+
412
+ (void)f;
413
+ (void)line;
414
+ }
415
+
416
+ static void
417
+ ossl_init_locks(void)
418
+ {
419
+ unsigned ii, nlocks;
420
+ if (CRYPTO_get_locking_callback() != NULL) {
421
+ /* Someone already set the callback before us. Don't destroy it! */
422
+ return;
423
+ }
424
+ nlocks = CRYPTO_num_locks();
425
+ ossl_locks = malloc(sizeof(*ossl_locks) * nlocks);
426
+ for (ii = 0; ii < nlocks; ii++) {
427
+ ossl_lock_init(ossl_locks + ii);
428
+ }
429
+ CRYPTO_set_locking_callback(ossl_lockfn);
430
+ }
431
+
432
+ static volatile int ossl_initialized = 0;
433
+ void lcbio_ssl_global_init(void)
434
+ {
435
+ if (ossl_initialized) {
436
+ return;
437
+ }
438
+ ossl_initialized = 1;
439
+ SSL_library_init();
440
+ SSL_load_error_strings();
441
+ ossl_init_locks();
442
+ }
443
+
444
+ lcb_error_t
445
+ lcbio_sslify_if_needed(lcbio_SOCKET *sock, lcb_settings *settings)
446
+ {
447
+ if (!(settings->sslopts & LCB_SSL_ENABLED)) {
448
+ return LCB_SUCCESS; /*not needed*/
449
+ }
450
+ if (lcbio_ssl_check(sock)) {
451
+ return LCB_SUCCESS; /*already ssl*/
452
+ }
453
+ return lcbio_ssl_apply(sock, settings->ssl_ctx);
454
+ }