类:Mongo::Crypt::EncryptionIO Private

继承:
对象
  • 对象
显示全部
定义于:
lib/ Mongo/crypt/encryption_io.rb

Overview

此类是私有 API 的一部分。 应尽可能避免使用此类,因为它将来可能会被删除或更改。

一个类,用于实现驱动程序和 MongoDB 服务器或 mongocryptd 之间的 I/O 方法。

常量摘要折叠

SOCKET_TIMEOUT =

此常量是私有 API 的一部分。 应尽可能避免使用此常量,因为它将来可能会被删除或更改。

用于 TLS 套接字连接、读取和写入的超时时间。 规范中没有规定具体的超时时间。 有关此超时时间的讨论和更新,请参阅规范 - 1394 。

10

实例方法摘要折叠

构造函数详情

#initialize (client: nil, mongocryptd_client: nil, key_vault_namespace:, key_vault_client:, metadata_client:, mongocryptd_options: {}) ⇒ EncryptionIO

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

注意:

用于自动加密时,所有参数均为必填项。 用于显式加密时,仅需要 key_vault_namespace 和 key_vault_client 参数。

注意:

该类要求 key_vault_client 和 key_vault_namespace 选项不为零且格式正确。

创建一个新的 EncryptionIO 对象,其中包含有关如何连接到密钥保管库的信息。

参数:

  • 客户端 ( Mongo::Client ) (默认为: nil

    用于连接到存储加密文档的集合的客户端,默认值为 nil。

  • mongocryptd_client ( Mongo::Client ) (默认为: nil

    连接到 mongocryptd 的客户端,默认为 nil。

  • key_vault_client ( Mongo::Client )

    客户端已连接到密钥保管库集合。

  • metadata_client ( Mongo::Client | nil )

    用于获取集合元数据的客户端。

  • key_vault_namespace ( string )

    格式为 db_name.collection_name 的密钥保管库命名空间。

  • mongocryptd_options 哈希 (默认为: {}

    与 mongocryptd 相关的选项。

选项哈希 ( mongocryptd_options: ):

  • :mongocryptd_bypass_spawn 布尔值
  • :mongocryptd_spawn_path string
  • :mongocryptd_spawn_args ( Array<String> )


57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/ Mongo/crypt/encryption_io.rb', line 57

def 初始化(
  客户端: nil, mongocryptd_client: nil, key_vault_namespace:,
  key_vault_client:, metadata_client:, mongocryptd_options: {}
)
  validate_key_vault_client!(key_vault_client)
  validate_key_vault_namespace!(key_vault_namespace)

  @client = 客户端
  @mongocryptd_client = mongocryptd_client
  @key_vault_db_name, @key_vault_collection_name = key_vault_namespace.拆分('  ')
  @key_vault_client = key_vault_client
  @metadata_client = 
  @options = mongocryptd_options
end

实例方法详细信息

# add_key_alt_name (ID, key_alt_name, timeout_ms: nil) ⇒ 对象

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

将 key_alt_name 添加到具有给定 ID 的密钥保管库集合中密钥文档的 key_alt_names 数组。



185
186
187
188
189
190
191
# File 'lib/ Mongo/crypt/encryption_io.rb', line 185

def add_key_alt_name(id, key_alt_name, timeout_ms: nil)
  key_vault_collection.find_one_and_update(
    { _id: id },
    { ' $addToSet ' => { keyAltNames: key_alt_name } },
    timeout_ms: timeout_ms
  )
end

# collection_info (db_name, 过滤, timeout_ms: nil) ⇒ 哈希

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

获取与提供的筛选器匹配的集合的集合信息

参数:

  • 筛选器 哈希
  • :timeout_ms ( Integer )

    操作超时(以毫秒为单位)。 必须是非负整数。 0 的显式值表示无限。 未设置默认值,这意味着未启用该功能。

返回:

  • (哈希)

    集合信息



105
106
107
108
109
110
111
112
113
114
115
# File 'lib/ Mongo/crypt/encryption_io.rb', line 105

def collection_info(db_name, 筛选器, timeout_ms: nil)
  除非 @metadata_client
    提高 ArgumentError, ' collection_info 要求将 metadata_client 传递给构造函数,但事实并非如此'
  end

  @metadata_client
    .请使用(db_name)
    .database
    .list_collections(过滤器: 筛选器, deserialize_as_bson: true, timeout_ms: timeout_ms)
    .first
end

# delete_key (ID, timeout_ms: nil) ⇒ 对象

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

从密钥保管库集合中删除具有给定 ID 的密钥文档。



195
196
197
# File 'lib/ Mongo/crypt/encryption_io.rb', line 195

def delete_key(id, timeout_ms: nil)
  key_vault_collection.delete_one(_id: id, timeout_ms: timeout_ms)
end

# feed_kms (kms_context, tls_options, timeout_ms: nil) ⇒ 对象

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

获取有关远程 KMS 加密密钥的信息并将其提供给 KmsContext 对象

参数:

  • kms_context ( Mongo::Crypt::KmsContext )

    与一个远程 KMS 数据密钥对应的 KmsContext 对象。 包含有关建立 TLS 连接的端点以及要在该连接上发送的消息的信息。

  • tls_options。 (哈希)

    用于连接到 KMS 提供商的 TLS 选项。 选项与 Mongo::Client 的选项相同。

  • :timeout_ms ( Integer )

    操作超时(以毫秒为单位)。 必须是非负整数。 0 的显式值表示无限。 未设置默认值,这意味着未启用该功能。



161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
# File 'lib/ Mongo/crypt/encryption_io.rb', line 161

def feed_kms(kms_context, tls_options, timeout_ms: nil)
  with_ssl_socket(kms_context.端点, tls_options) do |ssl_socket|
    超时.超时(timeout_ms || SOCKET_TIMEOUT, 错误::SocketTimeoutError,
      '套接字写入操作超时'
    ) do
      ssl_socket.syswrite(kms_context.message)
    end

    bytes_needed = kms_context.bytes_needed
    while bytes_needed > 0 do
      字节 = 超时.超时(timeout_ms || SOCKET_TIMEOUT, 错误::SocketTimeoutError,
        '套接字读取操作超时'
      ) do
        ssl_socket.sysread(bytes_needed)
      end

      kms_context.提要(字节)
      bytes_needed = kms_context.bytes_needed
    end
  end
end

# find_keys (过滤, timeout_ms: nil) ⇒ Array<BSON::Document>

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

使用提供的筛选器查询密钥保管库集合中的密钥

参数:

  • 筛选器 哈希
  • :timeout_ms ( Integer )

    操作超时(以毫秒为单位)。 必须是非负整数。 0 的显式值表示无限。 未设置默认值,这意味着未启用该功能。

返回:

  • ( Array<BSON::Document> )

    查询结果



81
82
83
# File 'lib/ Mongo/crypt/encryption_io.rb', line 81

def find_keys(筛选器, timeout_ms: nil)
  key_vault_collection.find(筛选器, timeout_ms: timeout_ms).to_a
end

# get_key (ID, timeout_ms: nil) ⇒ 对象

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

查找具有给定 ID 的单个密钥文档。



200
201
202
# File 'lib/ Mongo/crypt/encryption_io.rb', line 200

def get_key(id, timeout_ms: nil)
  key_vault_collection.find(_id: id, timeout_ms: timeout_ms).first
end

# get_key_by_alt_name (key_alt_name, timeout_ms: nil) ⇒ 对象

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

返回密钥保管库集合中具有给定 key_alt_name 的密钥文档。



206
207
208
# File 'lib/ Mongo/crypt/encryption_io.rb', line 206

def get_key_by_alt_name(key_alt_name, timeout_ms: nil)
  key_vault_collection.find(keyAltNames: key_alt_name, timeout_ms: timeout_ms).first
end

# get_keys (timeout_ms: nil) ⇒ 对象

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

查找密钥保管库集合中的所有文档。



211
212
213
# File 'lib/ Mongo/crypt/encryption_io.rb', line 211

def get_keys(timeout_ms: nil)
  key_vault_collection.find(nil, timeout_ms: timeout_ms)
end

# insert_data_key (文档, timeout_ms: nil) ⇒ Mongo::Operation::Insert::Result

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

将文档插入密钥保管库集合

参数:

  • 文档 哈希
  • :timeout_ms ( Integer )

    操作超时(以毫秒为单位)。 必须是非负整数。 0 的显式值表示无限。 未设置默认值,这意味着未启用该功能。

返回:



93
94
95
# File 'lib/ Mongo/crypt/encryption_io.rb', line 93

def insert_data_key(文档, timeout_ms: nil)
  key_vault_collection.insert_one(文档, timeout_ms: timeout_ms)
end

#mark_command (cmd, timeout_ms: nil) 哈希

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

将命令发送到 mongocryptd 以标记意图加密标记

参数:

  • cmd 哈希
  • :timeout_ms ( Integer )

    操作超时(以毫秒为单位)。 必须是非负整数。 0 的显式值表示无限。 未设置默认值,这意味着未启用该功能。

返回:

  • (哈希)

    标记的命令



125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# File 'lib/ Mongo/crypt/encryption_io.rb', line 125

def mark_command(cmd, timeout_ms: nil)
  除非 @mongocryptd_client
    提高 ArgumentError, ' mark_command 要求将 mongocryptd_client 传递给构造函数,但事实并非如此'
  end

  # 确保来自 mongocryptd 的响应使用 { mode: :bson } 进行反序列化
  # 以防止在命令中丢失类型信息
  选项 = {
    execution_options: { deserialize_as_bson: true },
    timeout_ms: timeout_ms
  }

  开始
    响应 = @mongocryptd_client.database.命令(cmd, 选项)
  救援 错误::NoServerAvailable => e
    提高 e if @options[:mongocryptd_bypass_spawn]

    spawn_mongocryptd
    响应 = @mongocryptd_client.database.命令(cmd, 选项)
  end

  return 响应.first
end

# remove_key_alt_name (ID, key_alt_name, timeout_ms: nil) ⇒ 对象

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

从具有给定 ID 的密钥保管库集合中的密钥文档的 key_alt_names 数组中删除 key_alt_name。



217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
# File 'lib/ Mongo/crypt/encryption_io.rb', line 217

def remove_key_alt_name(id, key_alt_name, timeout_ms: nil)
  key_vault_collection.find_one_and_update(
    { _id: id },
    [
      {
        ' $set ' => {
          keyAltNames: {
            ' $cond ' => [
              { '$eq' => [ ' $keyAltNames ', [ key_alt_name ] ] },
              ' $$REMOVE ',
              {
                ' $filter ' => {
                  输入: ' $keyAltNames ',
                  条件: { '$ne' =>  [ ' $$this ', key_alt_name ] }
                }
              }
            ]
          }
        }
      }
    ],
    timeout_ms: timeout_ms
  )
end

#update_data_keys(updates, timeout_ms: nil) ⇒ BulkWrite::Result

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

使用批量写入将给定请求应用于密钥保管库集合。

参数:

  • requests ( Array<Hash> )

    批量写入请求。

返回:



247
248
249
# File 'lib/ Mongo/crypt/encryption_io.rb', line 247

def update_data_keys(更新, timeout_ms: nil)
  key_vault_collection.bulk_write(更新, timeout_ms: timeout_ms)
end