Clase: Mongo::Server::PendingConnection Privado

Hereda:
ConnectionBase Mostrar todo
Ampliado por:
Reenviable
Definido en:
lib/mongo/server/pending_connection.rb

Overview

Esta clase forma parte de una API privada. Evita usar esta clase si es posible, ya que puede ser eliminada o modificada en el futuro.

Esta clase encapsula las conexiones durante el apretón de manos y la autenticación.

Desde:

  • 2.0.0

Resumen constante

Constantes heredadas de ConnectionBase

ConnectionBase::DEFAULT_MAX_BSON_OBJECT_SIZE, ConnectionBase::MAX_BSON_COMMAND_OVERHEAD, ConnectionBase::REDUCED_MAX_BSON_SIZE

Constantes incluidas desde Loggable

Loggable::PREFIX

Resumen de atributos de la instancia colapsar

Atributos heredados de ConnectionBase

#descripción, #opciones, #servidor

Atributos incluidos de supervisión::Publishable

#monitoring

Atributos heredados de ConnectionCommon

#compressor, #pid

Resumen del método de instancia colapsar

Métodos heredados de ConnectionBase

#app_metadata, #dispatch, #generation, #service_id

Métodos incluidos de Monitoring::Publishable

#publish_cmap_event, #publish_event, #publish_sdam_event

Métodos incluidos desde Registrable

#log_debug, #log_error, #log_fatal, #log_info, #log_warn, #logger

Métodos heredados de ConnectionCommon

#¿conectado?, #comando_de_apretón_de_manos, #documento_de_apretón_de_manos

Detalles del Constructor

#initialize(socket, servidor, supervisión, opciones = {}) ⇒ PendingConnection

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Devuelve una nueva instancia de PendingConnection.

Desde:

  • 2.0.0



25
26
27
28
29
30
31
# Archivo 'lib/mongo/server/pending_connection.rb', línea 25

def inicializar(enchufe, Server, Monitoring, opciones = {})
  @socket = enchufe
  @options = opciones
  @server = Server
  @monitoring = Monitoring
  @id = opciones[:id]
end

Detalles de atributo de instancias

#idInteger (solo lectura)

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Devuelve el ID de la conexión. Este es el mismo ID que el del objeto de conexión regular para el que se creó esta instancia de PendingConnection.

Devuelve:

  • (Número entero)

    El ID de la conexión. Este es el mismo ID que el del objeto de conexión regular para el cual se creó esta instancia de PendingConnection.

Desde:

  • 2.0.0



36
37
38
# Archivo 'lib/mongo/server/pending_connection.rb', línea 36

def ID
  @id
end

Detalles del método de instancia

#handshake_and_authenticate!Objeto

Este método es parte de una API privada. Se debe evitar el uso de este método si es posible, ya que podría eliminarse o modificarse en el futuro.

Aumenta:

Desde:

  • 2.0.0



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# Archivo 'lib/mongo/server/pending_connection.rb', línea 38

def ¡apretón de manos y autenticación!
  speculative_auth_doc = nulo
  si opciones[Usuario/a] || opciones[auth_mech]
    # Para crear una instancia de Auth, necesitamos especificar el mecanismo,
    # pero en este punto no se conoce el mecanismo que finalmente
    # se utilizará (ya que esto depende de los datos devueltos por
    # el handshake, específicamente la versión del servidor).
    #
    # Sin embargo, sabemos que solo 4.4+ servidores admiten la especulación
    # autenticación, y esos servidores también suelen admitir
    # SCRAM-SHA-256. Esperamos que las cuentas de usuario creadas para 4.4+
    # los servidores generalmente permitirían la autenticación SCRAM-SHA-256;
    #cuentas de usuario migradas desde servidores anteriores a4.4 pueden permitir sólo
    # SCRAM-SHA-1. El uso de SCRAM-SHA-256 por defecto es entonces
    # es razonable, y también lo exige la especificación de autenticación especulativa.
    #
    # Si no se especificó ningún mecanismo y estamos hablando a un 4.2
    # servidor, enviaremos un documento de autenticación especulativo, el servidor lo hará
    # ignóralo y realizaremos la autenticación explícitamente
    # comando.
    #
    # Si no se especificó ningún mecanismo y estamos hablando con una 4.4+.
    # servidor y la cuenta de usuario no permiten SCRAM-SHA-256, podremos
    # autenticar en un comando separado con SCRAM-SHA-1 después
    # pasando por la negociación del mecanismo SCRAM.
    default_options = opciones::Redactado.Nuevo(auth_mech: :scram256)
    speculative_auth_user = Autenticación::Usuario.Nuevo(default_options.fusionar(opciones))
    auth especulativo = Autenticación.Obtener(speculative_auth_user, sí mismo)
    speculative_auth_doc = auth especulativo.conversación.speculative_auth_document
  end

  Resultado = handshake!(speculative_auth_doc: speculative_auth_doc)

  si Descripción.¿desconocido?
    propagar Error::InternalDriverError,
          "La descripción de la conexión no puede ser desconocida después del handshake exitoso: #{descripción.inspect}"
  end

  begin
    si speculative_auth_doc && (speculative_auth_result = Resultado['speculativeAuthenticate'])
      caso speculative_auth_user.mecanismo
      cuando :mongodb_x509
      # Hecho
      # Utilizamos por defecto el mecanismo de autenticación scram256, pero si el usuario lo especifica
      # scram explícitamente, es posible que podamos autenticarnos de manera especulativa
      # with scram.
      cuando Schram, :scram256
        ¡Autenticar!(
          speculative_auth_client_nonce: auth especulativo.conversación.client_nonce,
          mechanism_auth_especulativo: speculative_auth_user.mecanismo,
          speculative_auth_result: speculative_auth_result
        )
      else
        propagar Error::InternalDriverError,
              "La autenticación especulativa se realizó con éxito inesperadamente para el mecanismo #{usuario_autenticacion_especulativa.mecanismo.inspeccionar}"
      end
    elsif !Descripción.árbitro?
      ¡Autenticar!
    end
  rescate mongo::Error, mongo::Error::AuthError => e
    e.service_id = service_id
    propagar
  end

  si Descripción.¿desconocido?
    propagar Error::InternalDriverError,
          "No se puede tener una descripción de la conexión desconocida después de una autenticación exitosa: #{description.inspect}"
  end

  return a menos que Server.load_balancer? && !Descripción.mongos?

  propagar Error::BadLoadBalancerTarget,
        "La operación balanceada requiere estar conectado a un mongos, pero el servidor en #{address.seed} se reporta como #{description.server_type.to_s.tr(
          '_', ' '
        )}"
end