libcouchbase 0.3.3 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
}
|