libcouchbase 0.3.3 → 1.0.0
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.
- checksums.yaml +4 -4
- data/ext/libcouchbase/CMakeLists.txt +6 -8
- data/ext/libcouchbase/README.markdown +2 -2
- data/ext/libcouchbase/RELEASE_NOTES.markdown +229 -2
- data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +11 -0
- data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +18 -0
- data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +3 -2
- data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +3 -3
- data/ext/libcouchbase/cmake/config-cmake.h.in +4 -0
- data/ext/libcouchbase/cmake/defs.mk.in +0 -2
- data/ext/libcouchbase/cmake/source_files.cmake +21 -5
- data/ext/libcouchbase/contrib/cJSON/cJSON.c +1 -1
- data/ext/libcouchbase/contrib/cbsasl/src/client.c +2 -0
- data/ext/libcouchbase/example/users/README +48 -0
- data/ext/libcouchbase/example/users/users.c +147 -0
- data/ext/libcouchbase/include/libcouchbase/auth.h +175 -31
- data/ext/libcouchbase/include/libcouchbase/cntl.h +82 -1
- data/ext/libcouchbase/include/libcouchbase/couchbase.h +45 -3
- data/ext/libcouchbase/include/libcouchbase/error.h +19 -1
- data/ext/libcouchbase/include/libcouchbase/iops.h +3 -0
- data/ext/libcouchbase/include/libcouchbase/n1ql.h +31 -1
- data/ext/libcouchbase/include/libcouchbase/plugins/io/bsdio-inl.c +4 -1
- data/ext/libcouchbase/include/libcouchbase/subdoc.h +36 -2
- data/ext/libcouchbase/include/libcouchbase/views.h +7 -1
- data/ext/libcouchbase/include/libcouchbase/visibility.h +1 -0
- data/ext/libcouchbase/include/memcached/protocol_binary.h +24 -1146
- data/ext/libcouchbase/packaging/parse-git-describe.pl +1 -1
- data/ext/libcouchbase/plugins/io/libev/libev_io_opts.h +3 -2
- data/ext/libcouchbase/src/README.md +0 -2
- data/ext/libcouchbase/src/auth-priv.h +23 -4
- data/ext/libcouchbase/src/auth.cc +51 -43
- data/ext/libcouchbase/src/bootstrap.cc +244 -0
- data/ext/libcouchbase/src/bootstrap.h +58 -38
- data/ext/libcouchbase/src/bucketconfig/bc_cccp.cc +120 -158
- data/ext/libcouchbase/src/bucketconfig/bc_file.cc +281 -0
- data/ext/libcouchbase/src/bucketconfig/bc_http.cc +526 -0
- data/ext/libcouchbase/src/bucketconfig/bc_http.h +50 -25
- data/ext/libcouchbase/src/bucketconfig/bc_static.cc +150 -0
- data/ext/libcouchbase/src/bucketconfig/clconfig.h +410 -386
- data/ext/libcouchbase/src/bucketconfig/confmon.cc +393 -0
- data/ext/libcouchbase/src/cbft.cc +22 -27
- data/ext/libcouchbase/src/cntl.cc +56 -22
- data/ext/libcouchbase/src/connspec.cc +47 -6
- data/ext/libcouchbase/src/connspec.h +27 -0
- data/ext/libcouchbase/src/dns-srv.cc +147 -0
- data/ext/libcouchbase/src/dump.cc +3 -3
- data/ext/libcouchbase/src/errmap.cc +173 -0
- data/ext/libcouchbase/src/errmap.h +198 -0
- data/ext/libcouchbase/src/getconfig.cc +7 -33
- data/ext/libcouchbase/src/handler.cc +118 -7
- data/ext/libcouchbase/src/hostlist.cc +0 -36
- data/ext/libcouchbase/src/hostlist.h +44 -62
- data/ext/libcouchbase/src/http/http-priv.h +125 -112
- data/ext/libcouchbase/src/http/http.cc +27 -35
- data/ext/libcouchbase/src/http/http.h +1 -34
- data/ext/libcouchbase/src/http/http_io.cc +28 -36
- data/ext/libcouchbase/src/instance.cc +131 -34
- data/ext/libcouchbase/src/internal.h +58 -26
- data/ext/libcouchbase/src/jsparse/parser.cc +136 -210
- data/ext/libcouchbase/src/jsparse/parser.h +84 -98
- data/ext/libcouchbase/src/lcbht/lcbht.cc +177 -0
- data/ext/libcouchbase/src/lcbht/lcbht.h +174 -163
- data/ext/libcouchbase/src/lcbio/connect.cc +569 -0
- data/ext/libcouchbase/src/lcbio/connect.h +16 -7
- data/ext/libcouchbase/src/lcbio/ctx.c +1 -1
- data/ext/libcouchbase/src/lcbio/iotable.h +101 -16
- data/ext/libcouchbase/src/lcbio/{ioutils.c → ioutils.cc} +30 -51
- data/ext/libcouchbase/src/lcbio/ioutils.h +29 -90
- data/ext/libcouchbase/src/lcbio/manager.cc +543 -0
- data/ext/libcouchbase/src/lcbio/manager.h +133 -96
- data/ext/libcouchbase/src/lcbio/protoctx.c +2 -2
- data/ext/libcouchbase/src/lcbio/timer-cxx.h +87 -0
- data/ext/libcouchbase/src/mc/mcreq.c +11 -2
- data/ext/libcouchbase/src/mc/mcreq.h +9 -2
- data/ext/libcouchbase/src/mcserver/mcserver.cc +175 -43
- data/ext/libcouchbase/src/mcserver/mcserver.h +9 -13
- data/ext/libcouchbase/src/mcserver/negotiate.cc +181 -62
- data/ext/libcouchbase/src/mcserver/negotiate.h +1 -3
- data/ext/libcouchbase/src/mctx-helper.h +51 -0
- data/ext/libcouchbase/src/n1ql/ixmgmt.cc +1 -2
- data/ext/libcouchbase/src/n1ql/n1ql.cc +74 -42
- data/ext/libcouchbase/src/netbuf/netbuf.c +4 -4
- data/ext/libcouchbase/src/newconfig.cc +6 -6
- data/ext/libcouchbase/src/nodeinfo.cc +2 -2
- data/ext/libcouchbase/src/operations/{cbflush.c → cbflush.cc} +7 -15
- data/ext/libcouchbase/src/operations/{counter.c → counter.cc} +0 -0
- data/ext/libcouchbase/src/operations/durability.cc +6 -26
- data/ext/libcouchbase/src/operations/durability_internal.h +6 -3
- data/ext/libcouchbase/src/operations/{get.c → get.cc} +24 -26
- data/ext/libcouchbase/src/operations/{observe.c → observe.cc} +68 -93
- data/ext/libcouchbase/src/operations/{pktfwd.c → pktfwd.cc} +0 -0
- data/ext/libcouchbase/src/operations/{remove.c → remove.cc} +0 -0
- data/ext/libcouchbase/src/operations/stats.cc +3 -8
- data/ext/libcouchbase/src/operations/{store.c → store.cc} +27 -32
- data/ext/libcouchbase/src/operations/subdoc.cc +129 -42
- data/ext/libcouchbase/src/operations/{touch.c → touch.cc} +0 -0
- data/ext/libcouchbase/src/packetutils.h +30 -2
- data/ext/libcouchbase/src/probes.d +1 -1
- data/ext/libcouchbase/src/rdb/rope.c +1 -1
- data/ext/libcouchbase/src/{retrychk.c → retrychk.cc} +2 -3
- data/ext/libcouchbase/src/retryq.cc +52 -14
- data/ext/libcouchbase/src/retryq.h +3 -3
- data/ext/libcouchbase/src/settings.c +5 -0
- data/ext/libcouchbase/src/settings.h +11 -0
- data/ext/libcouchbase/src/ssl/ssl_c.c +1 -0
- data/ext/libcouchbase/src/ssl/ssl_common.c +2 -0
- data/ext/libcouchbase/src/ssl/ssl_e.c +0 -1
- data/ext/libcouchbase/src/strcodecs/strcodecs.h +1 -1
- data/ext/libcouchbase/src/trace.h +4 -4
- data/ext/libcouchbase/src/vbucket/vbucket.c +6 -10
- data/ext/libcouchbase/src/views/{docreq.c → docreq.cc} +48 -54
- data/ext/libcouchbase/src/views/docreq.h +24 -30
- data/ext/libcouchbase/src/views/viewreq.cc +318 -0
- data/ext/libcouchbase/src/views/viewreq.h +43 -13
- data/ext/libcouchbase/tests/basic/t_connstr.cc +88 -50
- data/ext/libcouchbase/tests/basic/t_creds.cc +47 -5
- data/ext/libcouchbase/tests/basic/t_host.cc +67 -75
- data/ext/libcouchbase/tests/basic/t_jsparse.cc +27 -82
- data/ext/libcouchbase/tests/basic/t_misc.cc +1 -1
- data/ext/libcouchbase/tests/basic/t_n1qlstrings.cc +0 -1
- data/ext/libcouchbase/tests/htparse/t_basic.cc +58 -78
- data/ext/libcouchbase/tests/ioserver/connection.cc +1 -1
- data/ext/libcouchbase/tests/ioserver/ioserver.cc +19 -6
- data/ext/libcouchbase/tests/iotests/mock-environment.cc +28 -2
- data/ext/libcouchbase/tests/iotests/mock-environment.h +51 -1
- data/ext/libcouchbase/tests/iotests/t_behavior.cc +1 -7
- data/ext/libcouchbase/tests/iotests/t_confmon.cc +97 -115
- data/ext/libcouchbase/tests/iotests/t_durability.cc +0 -1
- data/ext/libcouchbase/tests/iotests/t_eerrs.cc +119 -0
- data/ext/libcouchbase/tests/iotests/t_errmap.cc +178 -0
- data/ext/libcouchbase/tests/iotests/t_misc.cc +3 -3
- data/ext/libcouchbase/tests/iotests/t_netfail.cc +1 -1
- data/ext/libcouchbase/tests/iotests/t_obseqno.cc +0 -1
- data/ext/libcouchbase/tests/iotests/t_subdoc.cc +18 -11
- data/ext/libcouchbase/tests/mc/t_alloc.cc +9 -9
- data/ext/libcouchbase/tests/socktests/socktest.cc +7 -10
- data/ext/libcouchbase/tests/socktests/socktest.h +2 -3
- data/ext/libcouchbase/tests/socktests/t_basic.cc +6 -6
- data/ext/libcouchbase/tests/socktests/t_manager.cc +5 -6
- data/ext/libcouchbase/tests/socktests/t_ssl.cc +1 -1
- data/ext/libcouchbase/tests/vbucket/confdata/ketama_expected.json +2562 -0
- data/ext/libcouchbase/tests/vbucket/confdata/memd_ketama_config.json +31 -0
- data/ext/libcouchbase/tests/vbucket/t_config.cc +35 -5
- data/ext/libcouchbase/tools/CMakeLists.txt +2 -2
- data/ext/libcouchbase/tools/cbc-handlers.h +128 -0
- data/ext/libcouchbase/tools/cbc-n1qlback.cc +64 -10
- data/ext/libcouchbase/tools/cbc-pillowfight.cc +2 -2
- data/ext/libcouchbase/tools/cbc.cc +143 -10
- data/ext/libcouchbase/tools/docgen/loc.h +1 -1
- data/lib/libcouchbase/connection.rb +4 -3
- data/lib/libcouchbase/version.rb +1 -1
- metadata +37 -28
- data/ext/libcouchbase/include/memcached/vbucket.h +0 -42
- data/ext/libcouchbase/src/bootstrap.c +0 -269
- data/ext/libcouchbase/src/bucketconfig/bc_file.c +0 -347
- data/ext/libcouchbase/src/bucketconfig/bc_http.c +0 -630
- data/ext/libcouchbase/src/bucketconfig/bc_mcraw.c +0 -150
- data/ext/libcouchbase/src/bucketconfig/confmon.c +0 -474
- data/ext/libcouchbase/src/lcbht/lcbht.c +0 -282
- data/ext/libcouchbase/src/lcbio/connect.c +0 -557
- data/ext/libcouchbase/src/lcbio/manager.c +0 -584
- data/ext/libcouchbase/src/packetutils.c +0 -37
- data/ext/libcouchbase/src/simplestring.c +0 -211
- data/ext/libcouchbase/src/simplestring.h +0 -228
- data/ext/libcouchbase/src/ssobuf.h +0 -82
- data/ext/libcouchbase/src/views/viewreq.c +0 -358
- data/ext/libcouchbase/tests/basic/t_string.cc +0 -112
|
@@ -350,7 +350,7 @@ static const char *parse_object(cJSON *item,const char *value);
|
|
|
350
350
|
static char *print_object(cJSON *item,int depth,int fmt);
|
|
351
351
|
|
|
352
352
|
/* Utility to jump whitespace and cr/lf */
|
|
353
|
-
static const char *skip(const char *in) {while (in && (unsigned char)*in<=32) in++; return in;}
|
|
353
|
+
static const char *skip(const char *in) {while (in && *in && (unsigned char)*in<=32) in++; return in;}
|
|
354
354
|
|
|
355
355
|
/* Parse an object - create a new root, and populate. */
|
|
356
356
|
cJSON *cJSON_Parse(const char *value)
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
This sample demonstrates how to manage user accounts.
|
|
2
|
+
|
|
3
|
+
$ cc -lcouchbase users.c
|
|
4
|
+
|
|
5
|
+
$ ./a.out couchbase://192.168.1.194 Administrator password
|
|
6
|
+
1. Create account 'cbtestuser' with predefined set of roles
|
|
7
|
+
HTTP status: 200
|
|
8
|
+
Server: Couchbase Server
|
|
9
|
+
Pragma: no-cache
|
|
10
|
+
Date: Fri, 23 Jun 2017 12:39:52 GMT
|
|
11
|
+
Content-Type: application/json
|
|
12
|
+
Content-Length: 2
|
|
13
|
+
Cache-Control: no-cache
|
|
14
|
+
""
|
|
15
|
+
2. Retrieve list of all accounts in the cluster
|
|
16
|
+
HTTP status: 200
|
|
17
|
+
Transfer-Encoding: chunked
|
|
18
|
+
Server: Couchbase Server
|
|
19
|
+
Pragma: no-cache
|
|
20
|
+
Date: Fri, 23 Jun 2017 12:39:52 GMT
|
|
21
|
+
Content-Type: application/json
|
|
22
|
+
Cache-Control: no-cache
|
|
23
|
+
[
|
|
24
|
+
{
|
|
25
|
+
"name": "TestUser",
|
|
26
|
+
"id": "cbtestuser",
|
|
27
|
+
"domain": "local",
|
|
28
|
+
"roles": [
|
|
29
|
+
{
|
|
30
|
+
"role": "bucket_admin",
|
|
31
|
+
"bucket_name": "default"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"role": "cluster_admin"
|
|
35
|
+
}
|
|
36
|
+
]
|
|
37
|
+
}
|
|
38
|
+
]
|
|
39
|
+
|
|
40
|
+
3. Remove account 'cbtestuser'
|
|
41
|
+
HTTP status: 200
|
|
42
|
+
Server: Couchbase Server
|
|
43
|
+
Pragma: no-cache
|
|
44
|
+
Date: Fri, 23 Jun 2017 12:39:52 GMT
|
|
45
|
+
Content-Type: application/json
|
|
46
|
+
Content-Length: 2
|
|
47
|
+
Cache-Control: no-cache
|
|
48
|
+
""
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2017 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
|
+
* @file
|
|
20
|
+
*
|
|
21
|
+
* This is an example file showing how to create and list user accounts
|
|
22
|
+
* on Couchbase Cluster 5.
|
|
23
|
+
*
|
|
24
|
+
* https://developer.couchbase.com/documentation/server/current/rest-api/rbac.html
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
#include <stdio.h>
|
|
28
|
+
#include <stdlib.h>
|
|
29
|
+
#include <string.h>
|
|
30
|
+
|
|
31
|
+
#include <libcouchbase/couchbase.h>
|
|
32
|
+
|
|
33
|
+
static void die(lcb_t instance, const char *msg, lcb_error_t err)
|
|
34
|
+
{
|
|
35
|
+
fprintf(stderr, "%s. Received code 0x%X (%s)\n", msg, err, lcb_strerror(instance, err));
|
|
36
|
+
exit(EXIT_FAILURE);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
void http_callback(lcb_t instance, int cbtype, const lcb_RESPBASE *r)
|
|
40
|
+
{
|
|
41
|
+
const lcb_RESPHTTP *resp = (const lcb_RESPHTTP *)r;
|
|
42
|
+
|
|
43
|
+
printf("HTTP status: %d\n", resp->htstatus);
|
|
44
|
+
if (resp->headers) {
|
|
45
|
+
for (const char *const *cur = resp->headers; *cur; cur += 2) {
|
|
46
|
+
printf("%s: %s\n", cur[0], cur[1]);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (resp->nbody) {
|
|
50
|
+
printf("%*s\n", (int)resp->nbody, (char *)resp->body);
|
|
51
|
+
}
|
|
52
|
+
if (resp->rc != LCB_SUCCESS) {
|
|
53
|
+
die(instance, "Failed to execute HTTP request", resp->rc);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
int main(int argc, char *argv[])
|
|
58
|
+
{
|
|
59
|
+
lcb_error_t err;
|
|
60
|
+
lcb_t instance;
|
|
61
|
+
struct lcb_create_st create_options = {0};
|
|
62
|
+
|
|
63
|
+
create_options.version = 3;
|
|
64
|
+
|
|
65
|
+
if (argc < 3) {
|
|
66
|
+
fprintf(stderr, "Usage: %s couchbase://host/bucket ADMIN_NAME ADMIN_PASSWORD\n", argv[0]);
|
|
67
|
+
exit(EXIT_FAILURE);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
create_options.v.v3.connstr = argv[1];
|
|
71
|
+
create_options.v.v3.username = argv[2];
|
|
72
|
+
create_options.v.v3.passwd = argv[3];
|
|
73
|
+
|
|
74
|
+
err = lcb_create(&instance, &create_options);
|
|
75
|
+
if (err != LCB_SUCCESS) {
|
|
76
|
+
die(NULL, "Failed create couchbase handle", err);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
err = lcb_connect(instance);
|
|
80
|
+
if (err != LCB_SUCCESS) {
|
|
81
|
+
die(instance, "Failed schedule connection", err);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
lcb_wait(instance);
|
|
85
|
+
|
|
86
|
+
err = lcb_get_bootstrap_status(instance);
|
|
87
|
+
if (err != LCB_SUCCESS) {
|
|
88
|
+
die(instance, "Failed bootstrap from cluster", err);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
lcb_install_callback3(instance, LCB_CALLBACK_HTTP, http_callback);
|
|
92
|
+
|
|
93
|
+
printf("1. Create account 'cbtestuser' with predefined set of roles\n");
|
|
94
|
+
{
|
|
95
|
+
lcb_CMDHTTP cmd = {0};
|
|
96
|
+
char *path = "/settings/rbac/users/local/cbtestuser";
|
|
97
|
+
char *body = "name=TestUser&password=cbtestuserpwd&roles=cluster_admin,bucket_admin[default]";
|
|
98
|
+
|
|
99
|
+
cmd.type = LCB_HTTP_TYPE_MANAGEMENT;
|
|
100
|
+
cmd.method = LCB_HTTP_METHOD_PUT;
|
|
101
|
+
cmd.content_type = "application/x-www-form-urlencoded";
|
|
102
|
+
LCB_CMD_SET_KEY(&cmd, path, strlen(path));
|
|
103
|
+
cmd.body = body;
|
|
104
|
+
cmd.nbody = strlen(body);
|
|
105
|
+
|
|
106
|
+
err = lcb_http3(instance, NULL, &cmd);
|
|
107
|
+
if (err != LCB_SUCCESS) {
|
|
108
|
+
die(instance, "Failed schedule command to upsert user", err);
|
|
109
|
+
}
|
|
110
|
+
lcb_wait(instance);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
printf("2. Retrieve list of all accounts in the cluster\n");
|
|
114
|
+
{
|
|
115
|
+
lcb_CMDHTTP cmd = {0};
|
|
116
|
+
char *path = "/settings/rbac/users/local";
|
|
117
|
+
|
|
118
|
+
cmd.type = LCB_HTTP_TYPE_MANAGEMENT;
|
|
119
|
+
cmd.method = LCB_HTTP_METHOD_GET;
|
|
120
|
+
LCB_CMD_SET_KEY(&cmd, path, strlen(path));
|
|
121
|
+
|
|
122
|
+
err = lcb_http3(instance, NULL, &cmd);
|
|
123
|
+
if (err != LCB_SUCCESS) {
|
|
124
|
+
die(instance, "Failed schedule command to upsert user", err);
|
|
125
|
+
}
|
|
126
|
+
lcb_wait(instance);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
printf("3. Remove account 'cbtestuser'\n");
|
|
130
|
+
{
|
|
131
|
+
lcb_CMDHTTP cmd = {0};
|
|
132
|
+
char *path = "/settings/rbac/users/local/cbtestuser";
|
|
133
|
+
|
|
134
|
+
cmd.type = LCB_HTTP_TYPE_MANAGEMENT;
|
|
135
|
+
cmd.method = LCB_HTTP_METHOD_DELETE;
|
|
136
|
+
LCB_CMD_SET_KEY(&cmd, path, strlen(path));
|
|
137
|
+
|
|
138
|
+
err = lcb_http3(instance, NULL, &cmd);
|
|
139
|
+
if (err != LCB_SUCCESS) {
|
|
140
|
+
die(instance, "Failed schedule command to upsert user", err);
|
|
141
|
+
}
|
|
142
|
+
lcb_wait(instance);
|
|
143
|
+
}
|
|
144
|
+
/* Now that we're all done, close down the connection handle */
|
|
145
|
+
lcb_destroy(instance);
|
|
146
|
+
return 0;
|
|
147
|
+
}
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
#ifndef LCB_AUTH_H
|
|
2
2
|
#define LCB_AUTH_H
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* @file
|
|
6
|
+
* Credentials store for Couchbase
|
|
7
|
+
*/
|
|
8
|
+
|
|
4
9
|
#ifdef __cplusplus
|
|
5
10
|
namespace lcb { class Authenticator; }
|
|
6
11
|
typedef lcb::Authenticator lcb_AUTHENTICATOR;
|
|
@@ -10,20 +15,109 @@ typedef struct lcb_AUTHENTICATOR_Cdummy lcb_AUTHENTICATOR;
|
|
|
10
15
|
#endif
|
|
11
16
|
|
|
12
17
|
/**
|
|
13
|
-
* @
|
|
18
|
+
* @ingroup lcb-public-api
|
|
19
|
+
* @defgroup lcb-auth Authentication
|
|
20
|
+
*
|
|
21
|
+
* @details
|
|
22
|
+
*
|
|
23
|
+
* The @ref lcb_AUTHENTICATOR object is how the library stores credentials
|
|
24
|
+
* internally, and may be used in cases where you'd like to manage credentials
|
|
25
|
+
* in an object separate from the library. This interface also provides better
|
|
26
|
+
* clarification between 'old style' (Classic) and new style (RBAC) auth.
|
|
27
|
+
*
|
|
28
|
+
* If you don't have a specific need to have credentials managed in their own.
|
|
29
|
+
* @ref lcb_create_st3::username and @ref lcb_create_st3::passwd fields (note
|
|
30
|
+
* that `username` is only valid on clusters 5.0 and higher):
|
|
31
|
+
*
|
|
32
|
+
* @code{.c}
|
|
33
|
+
* crst.v.v3.username = "user"; // Only for newer clusters
|
|
34
|
+
* crst.v.v3.passwd = "s3cr3t";
|
|
35
|
+
* lcb_create(&instance, &crst);
|
|
36
|
+
* @endcode
|
|
14
37
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* the
|
|
18
|
-
*
|
|
38
|
+
* If you are connecting to a cluster older than 5.0 and would like to issue
|
|
39
|
+
* N1QL queries against multiple password-protected buckets, you can use
|
|
40
|
+
* the @ref LCB_CNTL_BUCKET_CRED setting to "add" more bucket:password pairs
|
|
41
|
+
* to the library. The library will then send these credentials whenever you
|
|
42
|
+
* issue a query with the @ref LCB_CMD_F_MULTIAUTH flag set.
|
|
43
|
+
*
|
|
44
|
+
* @code{.c}
|
|
45
|
+
* lcb_BUCKETCRED creds;
|
|
46
|
+
* creds[0] = "secondBucket";
|
|
47
|
+
* creds[1] = "secondPass";
|
|
48
|
+
* lcb_cntl(instance, LCB_CNTL_SET, LCB_CNTL_BUCKET_CRED, creds);
|
|
49
|
+
* @endcode
|
|
50
|
+
*
|
|
51
|
+
* Or if you have a JSON encoder handy (or are interfacing from a higher level
|
|
52
|
+
* language) you can use the lcb_cntl_string() variant:
|
|
53
|
+
*
|
|
54
|
+
* @code{.c}
|
|
55
|
+
* JsonArray *arr = new_json_array();
|
|
56
|
+
* json_array_push_string("secondBucket");
|
|
57
|
+
* json_array_push_string("secondPass");
|
|
58
|
+
* char *s = json_encode(arr);
|
|
59
|
+
* lcb_cntl_string(instance, "bucket_cred", s);
|
|
60
|
+
* @endcode
|
|
61
|
+
*
|
|
62
|
+
* The json functions in the above example are mockups of however you would
|
|
63
|
+
* actually create a JSON array.
|
|
64
|
+
*
|
|
65
|
+
* @addtogroup lcb-auth
|
|
66
|
+
* @{
|
|
19
67
|
*/
|
|
20
68
|
|
|
21
69
|
/**
|
|
22
|
-
* @
|
|
70
|
+
* @class lcb_AUTHENTICATOR
|
|
71
|
+
* Opaque pointer containing credentials for the library.
|
|
72
|
+
*/
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* @uncommitted
|
|
76
|
+
*
|
|
23
77
|
* Creates a new authenticator object. You may destroy it using lcbauth_unref().
|
|
24
78
|
* The returned object initially has a refcount of 1.
|
|
25
79
|
*
|
|
26
80
|
* @return A new authenticator object.
|
|
81
|
+
*
|
|
82
|
+
* You must set the mode on this object before adding credentials to it. See
|
|
83
|
+
* @ref lcbauth_set_mode().
|
|
84
|
+
*
|
|
85
|
+
* Once you have added all the credentials to the object, you may assign it
|
|
86
|
+
* (or a copy, see lcbauth_clone()) to a library handle via lcb_set_auth().
|
|
87
|
+
*
|
|
88
|
+
* Setting RBAC Auth:
|
|
89
|
+
*
|
|
90
|
+
* @code{.c}
|
|
91
|
+
* lcb_AUTHENTICATOR *auth = lcbauth_new();
|
|
92
|
+
* lcbauth_set_mode(auth, LCBAUTH_MODE_RBAC);
|
|
93
|
+
* lcbauth_add_pass(auth, "mark", "secret", LCBAUTH_F_CLUSTER);
|
|
94
|
+
*
|
|
95
|
+
* lcb_t instance;
|
|
96
|
+
* lcb_create_st crst = { 0 };
|
|
97
|
+
* crst.version = 3;
|
|
98
|
+
* crst.v.v3.connstr = "couchbase://cbhost.com/myBucket";
|
|
99
|
+
* lcb_create(&instance, &crst);
|
|
100
|
+
* lcb_set_auth(instance, auth);
|
|
101
|
+
* lcbauth_unref(auth);
|
|
102
|
+
* @endcode
|
|
103
|
+
*
|
|
104
|
+
* Setting multi-bucket classic auth, also with cluster administrative
|
|
105
|
+
* credentials:
|
|
106
|
+
*
|
|
107
|
+
* @code{.c}
|
|
108
|
+
* lcb_AUTHENTICATOR *auth = lcbauth_new();
|
|
109
|
+
* lcbauth_set_mode(auth, LCBAUTH_MODE_CLASSIC);
|
|
110
|
+
* lcbauth_add_pass(auth, "myBucket", "secret", LCBAUTH_F_BUCKET);
|
|
111
|
+
* lcbauth_add_pass(auth, "otherBucket", "otherSecret", LCBAUTH_F_BUCKET);
|
|
112
|
+
* lcbauth_add_pass(auth, "Administrator", "password", LCBAUTH_F_CLUSTER);
|
|
113
|
+
* lcb_t instance;
|
|
114
|
+
* lcb_create_st crst = { 0 };
|
|
115
|
+
* crst.version = 3;
|
|
116
|
+
* crst.v.v3.connstr = "couchbase://cbhost.com/myBucket";
|
|
117
|
+
* lcb_create(&instance, &crst);
|
|
118
|
+
* lcb_set_auth(instance, auth);
|
|
119
|
+
* lcbauth_unref(auth);
|
|
120
|
+
* @endcode
|
|
27
121
|
*/
|
|
28
122
|
LIBCOUCHBASE_API
|
|
29
123
|
lcb_AUTHENTICATOR *
|
|
@@ -36,18 +130,34 @@ typedef enum {
|
|
|
36
130
|
/** User/Password is administrative; for cluster */
|
|
37
131
|
LCBAUTH_F_CLUSTER = 1<<1,
|
|
38
132
|
|
|
39
|
-
/**
|
|
133
|
+
/**
|
|
134
|
+
* User is bucket name. Password is bucket password. This flag is only
|
|
135
|
+
* used for legacy authentication. Using it with RBAC authentication will
|
|
136
|
+
* return an error
|
|
137
|
+
*/
|
|
40
138
|
LCBAUTH_F_BUCKET = 1<<2
|
|
41
139
|
} lcbauth_ADDPASSFLAGS;
|
|
42
140
|
|
|
43
141
|
/**
|
|
44
|
-
* @
|
|
142
|
+
* @uncommitted
|
|
45
143
|
*
|
|
46
144
|
* Add a set of credentials
|
|
47
145
|
* @param auth
|
|
48
146
|
* @param user the username (or bucketname, if LCBAUTH_F_BUCKET is passed)
|
|
49
147
|
* @param pass the password. If the password is NULL, the credential is removed
|
|
50
|
-
* @param flags one of @ref LCBAUTH_F_CLUSTER or @ref LCBAUTH_F_BUCKET.
|
|
148
|
+
* @param flags one of @ref LCBAUTH_F_CLUSTER or @ref LCBAUTH_F_BUCKET. If both
|
|
149
|
+
* flags are combined then the credential will be used for both bucket-level
|
|
150
|
+
* and cluster-level administrative operations
|
|
151
|
+
* (using @ref LCB_HTTP_TYPE_MANAGEMENT).
|
|
152
|
+
* @return LCB_OPTIONS_CONFLICT if @ref LCBAUTH_F_BUCKET is used in conjunction
|
|
153
|
+
* with @ref LCBAUTH_MODE_RBAC.
|
|
154
|
+
*
|
|
155
|
+
* @note
|
|
156
|
+
* You must set the mode of the authenticator using @ref lcbauth_set_mode()
|
|
157
|
+
* before calling this function
|
|
158
|
+
*
|
|
159
|
+
* @note when using @ref LCBAUTH_MODE_RBAC, only @ref LCBAUTH_F_CLUSTER is
|
|
160
|
+
* supported.
|
|
51
161
|
*/
|
|
52
162
|
LIBCOUCHBASE_API
|
|
53
163
|
lcb_error_t
|
|
@@ -56,44 +166,78 @@ lcbauth_add_pass(lcb_AUTHENTICATOR *auth, const char *user, const char *pass, in
|
|
|
56
166
|
/**
|
|
57
167
|
* @volatile
|
|
58
168
|
*
|
|
59
|
-
*
|
|
60
|
-
* password, or an explicit cluster password.
|
|
169
|
+
* Increments the refcount on the authenticator object
|
|
61
170
|
* @param auth
|
|
62
|
-
*
|
|
63
|
-
*
|
|
171
|
+
*
|
|
172
|
+
* The only time you would want to call this function is when sharing a single
|
|
173
|
+
* @ref lcb_AUTHENTICATOR with multiple @ref lcb_t instances. While doing
|
|
174
|
+
* so is theoretically possible, it is not supported or tested.
|
|
64
175
|
*/
|
|
176
|
+
LIBCOUCHBASE_API
|
|
65
177
|
void
|
|
66
|
-
|
|
67
|
-
|
|
178
|
+
lcbauth_ref(lcb_AUTHENTICATOR *auth);
|
|
68
179
|
|
|
69
180
|
/**
|
|
70
|
-
* @
|
|
181
|
+
* @uncomitted
|
|
71
182
|
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
* @
|
|
76
|
-
* (or is unknown to the authenticator)
|
|
183
|
+
* Decrements the refcount on the authenticator object, freeing it if there
|
|
184
|
+
* are no more owners.
|
|
185
|
+
*
|
|
186
|
+
* @param auth
|
|
77
187
|
*/
|
|
78
|
-
|
|
79
|
-
|
|
188
|
+
LIBCOUCHBASE_API
|
|
189
|
+
void
|
|
190
|
+
lcbauth_unref(lcb_AUTHENTICATOR *auth);
|
|
80
191
|
|
|
81
192
|
/**
|
|
82
193
|
* @uncomitted
|
|
83
|
-
*
|
|
84
|
-
*
|
|
194
|
+
*
|
|
195
|
+
* Makes a copy of an existing lcb_AUTHENTICATOR object. The returned
|
|
196
|
+
* authenticator object has a reference count of 1.
|
|
197
|
+
* @param src the authenticator object to clone
|
|
198
|
+
* @return the cloned authenticator.
|
|
199
|
+
*
|
|
200
|
+
* This function is useful when you wish to copy an existing set of credentials
|
|
201
|
+
* for use with a new client.
|
|
85
202
|
*/
|
|
86
203
|
LIBCOUCHBASE_API
|
|
87
|
-
|
|
88
|
-
|
|
204
|
+
lcb_AUTHENTICATOR *
|
|
205
|
+
lcbauth_clone(const lcb_AUTHENTICATOR *src);
|
|
206
|
+
|
|
207
|
+
typedef enum {
|
|
208
|
+
/**
|
|
209
|
+
* Use "bucket-specific" credentials when authenticating. This is the
|
|
210
|
+
* only way of authenticating up to server version 5.0
|
|
211
|
+
*/
|
|
212
|
+
LCBAUTH_MODE_CLASSIC = 0,
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Use role-based access control. This allows the same user to have
|
|
216
|
+
* access to multiple buckets with a single set of credentials.
|
|
217
|
+
*
|
|
218
|
+
* Note that if this option is selected, it becomes impossible to use
|
|
219
|
+
* @ref LCBAUTH_F_BUCKET with lcbauth_add_pass()
|
|
220
|
+
*/
|
|
221
|
+
LCBAUTH_MODE_RBAC = 1
|
|
222
|
+
} lcbauth_MODE;
|
|
89
223
|
|
|
90
224
|
/**
|
|
91
|
-
*
|
|
92
|
-
*
|
|
225
|
+
* @uncomitted
|
|
226
|
+
*
|
|
227
|
+
* Set the mode of this authenticator.
|
|
228
|
+
* @param src the authenticator
|
|
229
|
+
* @param mode the mode to use.
|
|
230
|
+
* @return error if the authenticator already contains credentials.
|
|
231
|
+
*
|
|
232
|
+
* @note
|
|
233
|
+
* This function should be called as early as possible. It is not possible to
|
|
234
|
+
* change the mode after credentials have been added
|
|
93
235
|
*/
|
|
94
236
|
LIBCOUCHBASE_API
|
|
95
|
-
|
|
96
|
-
|
|
237
|
+
lcb_error_t
|
|
238
|
+
lcbauth_set_mode(lcb_AUTHENTICATOR *src, lcbauth_MODE mode);
|
|
239
|
+
|
|
240
|
+
/** @} */
|
|
97
241
|
|
|
98
242
|
#ifdef __cplusplus
|
|
99
243
|
}
|