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

Registrable::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

#metadatos_de_la_aplicación, #envío, #generación, #id_del_servicio

Métodos incluidos en Monitoring::Publishable

#publicar_evento_cmap, #publicar_evento, #publicar_evento_sdam

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 forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.

Devuelve una nueva instancia de PendingConnection.

Desde:

  • 2.0.0



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

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

Detalles de los atributos de instancia

#idInteger (solo lectura)

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.

Devuelve el ID de la conexión. Es el mismo ID que el del objeto Connection normal 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



38
39
40
# Archivo 'lib/mongo/server/pending_connection.rb', línea 38

def ID
  @id
end

Detalles del método de instancia

#handshake_and_authenticate!Objeto

Este método forma parte de una API privada. Debe evitarlo si es posible, ya que podría eliminarse o modificarse en el futuro.

Desde:

  • 2.0.0



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
# Archivo 'lib/mongo/server/pending_connection.rb', línea 40

def ¡apretón de manos y autenticación!
  speculative_auth_doc = nulo
  si opciones[Usuario/a] || opciones[:mecánica de autenticación]
    # Para crear una instancia de Auth, necesitamos especificar el mecanismo,
    # pero en este momento no conocemos 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;
    # Las cuentas de usuario migradas desde servidores anteriores a4.4 solo pueden permitir
    # 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 con una 3.0+.
    # servidor, enviaremos un documento de autorización especulativa, el servidor
    # ignóralo y realizaremos la autenticación explícitamente
    # comando después de haber establecido el mecanismo por defecto posteriormente en CR.
    # 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(:mecánica de autenticación => :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, "Ladescripción de la conexión no puede ser desconocida después de un protocolo de enlace exitoso: #{description.inspect}"
  end

  begin
    si speculative_auth_doc && (resultado de autenticación especulativa = Resultado['Autenticación especulativa '])
      a menos que Descripción.Funcionalidades.scram_sha_1_enabled?
        propagar Error::RespuestaDeAutenticaciónDeServidorInválida, "Laautenticación especulativa tuvo éxito en un3.0 servidor anterior a"
      end
      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 :largarse, :scram256
        ¡Autenticar!(
          speculative_auth_client_nonce: auth especulativo.conversación.client_nonce,
          mechanism_auth_especulativo: speculative_auth_user.mecanismo,
          speculative_auth_result: resultado de autenticación especulativa,
        )
      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 => Excª
    Excª.service_id = service_id
    propagar
  end

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

  si Server.load_balancer? && !Descripción.mongos?
    propagar Error::BadLoadBalancerTarget, "La operación equilibrada en carga requiere estar conectada a un mongos, pero el servidor en #{dirección.semilla} se reportó como #{descripción.tipo_servidor.to_s.gsub('_', ' ')}"
  end
end