bson_ext 1.10.2 → 1.11.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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +2 -1
- data/VERSION +1 -1
- data/ext/cbson/cbson.c +21 -17
- data/ext/cbson/version.h +1 -1
- data/ext/csasl/csasl.c +167 -0
- data/ext/csasl/extconf.rb +8 -0
- metadata +6 -4
- metadata.gz.sig +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1adf4cc8e415e8905f01a81bb7a843cc480e0718
|
4
|
+
data.tar.gz: 4fc4a02485a5732bbc114186a6187d8e0ded4e7c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 19e73866ad7299986a2ecb705de815d9074be2c903000b7c04b44a4e901c3810078b07f1137ebc84966b0ec4fd32ce1cc2a6a1dbc37f0d6c13943c62b34d27f0
|
7
|
+
data.tar.gz: 7a8a5c6c39a00b27a929eadbf06753785b7f0dc03fe713409532f3024be0284860951e933fd36e21b7de1618d3dee0bff67ab7d9d61d221595c672436bd65bea
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
@@ -1 +1,2 @@
|
|
1
|
-
|
1
|
+
}������Օ�ؖ�"fg����͛��6�az��3_
|
2
|
+
�#��-}zeUI *��\;��?X�1i�)�rFiӳ��)��I�xF�����,�u����E|}���Z�s>+���yT������)'_8a��J�rJ5͊�q�W��#��
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.11.1
|
data/ext/cbson/cbson.c
CHANGED
@@ -22,6 +22,7 @@
|
|
22
22
|
|
23
23
|
#include "ruby.h"
|
24
24
|
#include "version.h"
|
25
|
+
#include <arpa/inet.h>
|
25
26
|
|
26
27
|
/* Ensure compatibility with early releases of Ruby 1.8.5 */
|
27
28
|
#ifndef RSTRING_PTR
|
@@ -115,7 +116,7 @@ struct deserialize_opts {
|
|
115
116
|
#define STR_NEW(p,n) \
|
116
117
|
({ \
|
117
118
|
VALUE _str = rb_enc_str_new((p), (n), rb_utf8_encoding()); \
|
118
|
-
rb_encoding* internal_encoding = rb_default_internal_encoding()
|
119
|
+
rb_encoding* internal_encoding = rb_default_internal_encoding();\
|
119
120
|
if (internal_encoding) { \
|
120
121
|
_str = rb_str_export_to_enc(_str, internal_encoding); \
|
121
122
|
} \
|
@@ -167,11 +168,11 @@ static void write_utf8(bson_buffer_t buffer, VALUE string, int allow_null) {
|
|
167
168
|
}
|
168
169
|
#define FREE_INTSTRING(buffer) free(buffer)
|
169
170
|
#else
|
170
|
-
#define INT2STRING(buffer, i)
|
171
|
-
{
|
171
|
+
#define INT2STRING(buffer, i) \
|
172
|
+
{ \
|
172
173
|
int vslength = snprintf(NULL, 0, "%d", i) + 1; \
|
173
|
-
*buffer = malloc(vslength);
|
174
|
-
snprintf(*buffer, vslength, "%d", i);
|
174
|
+
*buffer = malloc(vslength); \
|
175
|
+
snprintf(*buffer, vslength, "%d", i); \
|
175
176
|
}
|
176
177
|
#define FREE_INTSTRING(buffer) free(buffer)
|
177
178
|
#endif
|
@@ -435,10 +436,10 @@ static int write_element(VALUE key, VALUE value, VALUE extra, int allow_id) {
|
|
435
436
|
const char* cls = rb_obj_classname(value);
|
436
437
|
if (strcmp(cls, "BSON::Binary") == 0 ||
|
437
438
|
strcmp(cls, "ByteBuffer") == 0) {
|
438
|
-
const char subtype = strcmp(cls, "ByteBuffer") ?
|
439
|
-
(const char)FIX2INT(rb_funcall(value, rb_intern("subtype"), 0)) : 2;
|
440
439
|
VALUE string_data = rb_funcall(value, rb_intern("to_s"), 0);
|
441
440
|
int length = RSTRING_LENINT(string_data);
|
441
|
+
const char subtype = strcmp(cls, "ByteBuffer") ?
|
442
|
+
(const char)FIX2INT(rb_funcall(value, rb_intern("subtype"), 0)) : 2;
|
442
443
|
write_name_and_type(buffer, key, 0x05);
|
443
444
|
if (subtype == 2) {
|
444
445
|
const int other_length = length + 4;
|
@@ -453,8 +454,8 @@ static int write_element(VALUE key, VALUE value, VALUE extra, int allow_id) {
|
|
453
454
|
break;
|
454
455
|
}
|
455
456
|
if (strcmp(cls, "BSON::ObjectId") == 0) {
|
456
|
-
VALUE as_array = rb_funcall(value, rb_intern("to_a"), 0);
|
457
457
|
int i;
|
458
|
+
VALUE as_array = rb_funcall(value, rb_intern("to_a"), 0);
|
458
459
|
write_name_and_type(buffer, key, 0x07);
|
459
460
|
for (i = 0; i < 12; i++) {
|
460
461
|
char byte = (char)FIX2INT(rb_ary_entry(as_array, i));
|
@@ -658,9 +659,10 @@ static void write_doc(bson_buffer_t buffer, VALUE hash, VALUE check_keys, VALUE
|
|
658
659
|
|
659
660
|
// we have to check for an OrderedHash and handle that specially
|
660
661
|
if (strcmp(rb_obj_classname(hash), "BSON::OrderedHash") == 0) {
|
661
|
-
VALUE keys = rb_funcall(hash, rb_intern("keys"), 0);
|
662
662
|
int i;
|
663
|
-
|
663
|
+
VALUE keys = rb_funcall(hash, rb_intern("keys"), 0);
|
664
|
+
|
665
|
+
for(i = 0; i < RARRAY_LEN(keys); i++) {
|
664
666
|
VALUE key = rb_ary_entry(keys, i);
|
665
667
|
VALUE value = rb_hash_aref(hash, key);
|
666
668
|
|
@@ -739,10 +741,11 @@ static VALUE get_value(const char* buffer, int* position,
|
|
739
741
|
int size;
|
740
742
|
memcpy(&size, buffer + *position, 4);
|
741
743
|
if (strcmp(buffer + *position + 5, "$ref") == 0) { // DBRef
|
742
|
-
int offset = *position + 10;
|
743
744
|
VALUE argv[2];
|
744
|
-
int collection_length = *(int*)(buffer + offset) - 1;
|
745
745
|
unsigned char id_type;
|
746
|
+
int offset = *position + 10;
|
747
|
+
int collection_length = *(int*)(buffer + offset) - 1;
|
748
|
+
|
746
749
|
offset += 4;
|
747
750
|
|
748
751
|
argv[0] = STR_NEW(buffer + offset, collection_length);
|
@@ -766,9 +769,9 @@ static VALUE get_value(const char* buffer, int* position,
|
|
766
769
|
|
767
770
|
value = rb_ary_new();
|
768
771
|
while (*position < end) {
|
772
|
+
VALUE to_append;
|
769
773
|
unsigned char type = (unsigned char)buffer[(*position)++];
|
770
774
|
int key_size = (int)strlen(buffer + *position);
|
771
|
-
VALUE to_append;
|
772
775
|
|
773
776
|
*position += key_size + 1; // just skip the key, they're in order.
|
774
777
|
to_append = get_value(buffer, position, type, opts);
|
@@ -847,11 +850,11 @@ static VALUE get_value(const char* buffer, int* position,
|
|
847
850
|
int pattern_length = (int)strlen(buffer + *position);
|
848
851
|
VALUE pattern = STR_NEW(buffer + *position, pattern_length);
|
849
852
|
int flags_length;
|
850
|
-
VALUE argv[3];
|
853
|
+
VALUE argv[3], flags_str;
|
851
854
|
*position += pattern_length + 1;
|
852
855
|
|
853
856
|
flags_length = (int)strlen(buffer + *position);
|
854
|
-
|
857
|
+
flags_str = STR_NEW(buffer + *position, flags_length);
|
855
858
|
argv[0] = pattern;
|
856
859
|
argv[1] = flags_str;
|
857
860
|
value = rb_class_new_instance(2, argv, BSONRegex);
|
@@ -951,13 +954,13 @@ static VALUE get_value(const char* buffer, int* position,
|
|
951
954
|
}
|
952
955
|
|
953
956
|
static VALUE elements_to_hash(const char* buffer, int max, struct deserialize_opts * opts) {
|
954
|
-
VALUE hash = rb_class_new_instance(0, NULL, OrderedHash);
|
955
957
|
int position = 0;
|
958
|
+
VALUE hash = rb_class_new_instance(0, NULL, OrderedHash);
|
956
959
|
while (position < max) {
|
960
|
+
VALUE value;
|
957
961
|
unsigned char type = (unsigned char)buffer[position++];
|
958
962
|
int name_length = (int)strlen(buffer + position);
|
959
963
|
VALUE name = STR_NEW(buffer + position, name_length);
|
960
|
-
VALUE value;
|
961
964
|
position += name_length + 1;
|
962
965
|
value = get_value(buffer, &position, type, opts);
|
963
966
|
rb_funcall(hash, element_assignment_method, 2, name, value);
|
@@ -969,6 +972,7 @@ static VALUE method_deserialize(VALUE self, VALUE bson, VALUE opts) {
|
|
969
972
|
const char* buffer = RSTRING_PTR(bson);
|
970
973
|
int remaining = RSTRING_LENINT(bson);
|
971
974
|
struct deserialize_opts deserialize_opts;
|
975
|
+
|
972
976
|
deserialize_opts.compile_regex = 1;
|
973
977
|
if (rb_funcall(opts, rb_intern("has_key?"), 1, ID2SYM(rb_intern("compile_regex"))) == Qtrue &&
|
974
978
|
rb_hash_aref(opts, ID2SYM(rb_intern("compile_regex"))) == Qfalse) {
|
data/ext/cbson/version.h
CHANGED
data/ext/csasl/csasl.c
ADDED
@@ -0,0 +1,167 @@
|
|
1
|
+
// Copyright (C) 2014 MongoDB, Inc.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
|
15
|
+
#include <ruby.h>
|
16
|
+
#include <sasl/sasl.h>
|
17
|
+
#include <sasl/saslutil.h>
|
18
|
+
|
19
|
+
static void mongo_sasl_conn_free(void* data) {
|
20
|
+
sasl_conn_t *conn = (sasl_conn_t*) data;
|
21
|
+
// Ideally we would use sasl_client_done() but that's only available as of cyrus sasl 2.1.25
|
22
|
+
if(conn) sasl_done();
|
23
|
+
}
|
24
|
+
|
25
|
+
static sasl_conn_t* mongo_sasl_context(VALUE self) {
|
26
|
+
sasl_conn_t* conn;
|
27
|
+
VALUE context;
|
28
|
+
context = rb_iv_get(self, "@context");
|
29
|
+
Data_Get_Struct(context, sasl_conn_t, conn);
|
30
|
+
return conn;
|
31
|
+
}
|
32
|
+
|
33
|
+
static VALUE a_init(VALUE self, VALUE user_name, VALUE host_name, VALUE service_name, VALUE canonicalize_host_name)
|
34
|
+
{
|
35
|
+
if (sasl_client_init(NULL) == SASL_OK) {
|
36
|
+
rb_iv_set(self, "@valid", Qtrue);
|
37
|
+
rb_iv_set(self, "@user_name", user_name);
|
38
|
+
rb_iv_set(self, "@host_name", host_name);
|
39
|
+
rb_iv_set(self, "@service_name", service_name);
|
40
|
+
rb_iv_set(self, "@canonicalize_host_name", canonicalize_host_name);
|
41
|
+
}
|
42
|
+
|
43
|
+
else {
|
44
|
+
rb_iv_set(self, "@valid", Qfalse);
|
45
|
+
}
|
46
|
+
|
47
|
+
return self;
|
48
|
+
}
|
49
|
+
|
50
|
+
static VALUE valid(VALUE self) {
|
51
|
+
return rb_iv_get(self, "@valid");
|
52
|
+
}
|
53
|
+
|
54
|
+
int is_sasl_failure(int result)
|
55
|
+
{
|
56
|
+
if (result < 0) {
|
57
|
+
return 1;
|
58
|
+
}
|
59
|
+
|
60
|
+
return 0;
|
61
|
+
}
|
62
|
+
|
63
|
+
static int sasl_interact(VALUE self, int id, const char **result, unsigned *len) {
|
64
|
+
switch (id) {
|
65
|
+
case SASL_CB_AUTHNAME:
|
66
|
+
case SASL_CB_USER:
|
67
|
+
{
|
68
|
+
VALUE user_name;
|
69
|
+
user_name = rb_iv_get(self, "@user_name");
|
70
|
+
*result = RSTRING_PTR(user_name);
|
71
|
+
if (len) {
|
72
|
+
*len = RSTRING_LEN(user_name);
|
73
|
+
}
|
74
|
+
return SASL_OK;
|
75
|
+
}
|
76
|
+
}
|
77
|
+
|
78
|
+
return SASL_FAIL;
|
79
|
+
}
|
80
|
+
|
81
|
+
static VALUE initialize_challenge(VALUE self) {
|
82
|
+
int result;
|
83
|
+
char encoded_payload[4096];
|
84
|
+
const char *raw_payload;
|
85
|
+
unsigned int raw_payload_len, encoded_payload_len;
|
86
|
+
const char *mechanism_list = "GSSAPI";
|
87
|
+
const char *mechanism_selected = "GSSAPI";
|
88
|
+
VALUE context;
|
89
|
+
sasl_conn_t *conn;
|
90
|
+
sasl_callback_t client_interact [] = {
|
91
|
+
{ SASL_CB_AUTHNAME, (int (*)(void))sasl_interact, (void*)self },
|
92
|
+
{ SASL_CB_USER, (int (*)(void))sasl_interact, (void*)self },
|
93
|
+
{ SASL_CB_LIST_END, NULL, NULL }
|
94
|
+
};
|
95
|
+
|
96
|
+
const char *servicename = RSTRING_PTR(rb_iv_get(self, "@service_name"));
|
97
|
+
const char *hostname = RSTRING_PTR(rb_iv_get(self, "@host_name"));
|
98
|
+
|
99
|
+
result = sasl_client_new(servicename, hostname, NULL, NULL, client_interact, 0, &conn);
|
100
|
+
|
101
|
+
if (result != SASL_OK) {
|
102
|
+
sasl_dispose(&conn);
|
103
|
+
return Qfalse;
|
104
|
+
}
|
105
|
+
|
106
|
+
context = Data_Wrap_Struct(rb_cObject, NULL, mongo_sasl_conn_free, conn);
|
107
|
+
rb_iv_set(self, "@context", context);
|
108
|
+
|
109
|
+
result = sasl_client_start(conn, mechanism_list, NULL, &raw_payload, &raw_payload_len, &mechanism_selected);
|
110
|
+
if (is_sasl_failure(result)) {
|
111
|
+
return Qfalse;
|
112
|
+
}
|
113
|
+
|
114
|
+
if (result != SASL_CONTINUE) {
|
115
|
+
return Qfalse;
|
116
|
+
}
|
117
|
+
|
118
|
+
result = sasl_encode64(raw_payload, raw_payload_len, encoded_payload, sizeof(encoded_payload), &encoded_payload_len);
|
119
|
+
if (is_sasl_failure(result)) {
|
120
|
+
return Qfalse;
|
121
|
+
}
|
122
|
+
|
123
|
+
encoded_payload[encoded_payload_len] = 0;
|
124
|
+
return rb_str_new(encoded_payload, encoded_payload_len);
|
125
|
+
}
|
126
|
+
|
127
|
+
static VALUE evaluate_challenge(VALUE self, VALUE rb_payload) {
|
128
|
+
char base_payload[4096], payload[4096];
|
129
|
+
const char *step_payload, *out;
|
130
|
+
unsigned int step_payload_len, payload_len, base_payload_len, outlen;
|
131
|
+
int result;
|
132
|
+
sasl_conn_t *conn = mongo_sasl_context(self);
|
133
|
+
|
134
|
+
StringValue(rb_payload);
|
135
|
+
step_payload = RSTRING_PTR(rb_payload);
|
136
|
+
step_payload_len = RSTRING_LEN(rb_payload);
|
137
|
+
|
138
|
+
result = sasl_decode64(step_payload, step_payload_len, base_payload, sizeof(base_payload), &base_payload_len);
|
139
|
+
if (is_sasl_failure(result)) {
|
140
|
+
return Qfalse;
|
141
|
+
}
|
142
|
+
|
143
|
+
result = sasl_client_step(conn, base_payload, base_payload_len, NULL, &out, &outlen);
|
144
|
+
if (is_sasl_failure(result)) {
|
145
|
+
return Qfalse;
|
146
|
+
}
|
147
|
+
|
148
|
+
result = sasl_encode64(out, outlen, payload, sizeof(payload), &payload_len);
|
149
|
+
if (is_sasl_failure(result)) {
|
150
|
+
return Qfalse;
|
151
|
+
}
|
152
|
+
|
153
|
+
return rb_str_new(payload, payload_len);
|
154
|
+
}
|
155
|
+
|
156
|
+
VALUE c_GSSAPI_authenticator;
|
157
|
+
|
158
|
+
void Init_csasl() {
|
159
|
+
VALUE mongo, sasl;
|
160
|
+
mongo = rb_const_get(rb_cObject, rb_intern("Mongo"));
|
161
|
+
sasl = rb_const_get(mongo, rb_intern("Sasl"));
|
162
|
+
c_GSSAPI_authenticator = rb_define_class_under(sasl, "GSSAPIAuthenticator", rb_cObject);
|
163
|
+
rb_define_method(c_GSSAPI_authenticator, "initialize", a_init, 4);
|
164
|
+
rb_define_method(c_GSSAPI_authenticator, "initialize_challenge", initialize_challenge, 0);
|
165
|
+
rb_define_method(c_GSSAPI_authenticator, "evaluate_challenge", evaluate_challenge, 1);
|
166
|
+
rb_define_method(rb_cObject, "valid?", valid, 0);
|
167
|
+
}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bson_ext
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.11.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Emily Stolfo
|
@@ -34,7 +34,7 @@ cert_chain:
|
|
34
34
|
JrZM8w8wGbIOeLtoQqa7HB/jOYbTahH7KMNh2LHAbOR93hNIJxVRa4iwxiMQ75tN
|
35
35
|
9WUIAJ4AEtjwRg1Bz0OwDo3aucPCBpx77+/FWhv7JYY=
|
36
36
|
-----END CERTIFICATE-----
|
37
|
-
date: 2014-
|
37
|
+
date: 2014-09-15 00:00:00.000000000 Z
|
38
38
|
dependencies:
|
39
39
|
- !ruby/object:Gem::Dependency
|
40
40
|
name: bson
|
@@ -42,14 +42,14 @@ dependencies:
|
|
42
42
|
requirements:
|
43
43
|
- - "~>"
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
version: 1.
|
45
|
+
version: 1.11.1
|
46
46
|
type: :runtime
|
47
47
|
prerelease: false
|
48
48
|
version_requirements: !ruby/object:Gem::Requirement
|
49
49
|
requirements:
|
50
50
|
- - "~>"
|
51
51
|
- !ruby/object:Gem::Version
|
52
|
-
version: 1.
|
52
|
+
version: 1.11.1
|
53
53
|
description: C extensions to accelerate the Ruby BSON serialization. For more information
|
54
54
|
about BSON, see http://bsonspec.org. For information about MongoDB, see http://www.mongodb.org.
|
55
55
|
email: mongodb-dev@googlegroups.com
|
@@ -68,6 +68,8 @@ files:
|
|
68
68
|
- ext/cbson/encoding_helpers.h
|
69
69
|
- ext/cbson/extconf.rb
|
70
70
|
- ext/cbson/version.h
|
71
|
+
- ext/csasl/csasl.c
|
72
|
+
- ext/csasl/extconf.rb
|
71
73
|
homepage: http://www.mongodb.org
|
72
74
|
licenses:
|
73
75
|
- Apache License Version 2.0
|
metadata.gz.sig
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
.k�B��m�$�Ĕ׃���/�_$V{�%T��β*9.�9,l�j۫�Z���W\��q5t�O�ڢ�E�o�sxQi�3�!���~L�LP+pW�մ`~eV��#UG,Ҵ������p��SL�(\K���?L���iӉj8-��8a:�;rS�HD?�K���=�C��dr��q�Zu,(����7��4�����e��CӪ�e��l@qI8�F_ҬM�pP(O�J��f�J� R7�?���.�\�����#%H
|