Classe: Mongo::Server::PpendingConnection Private

Herda:
ConnectionBase mostrar tudo
Estendido por:
Encaminhável
Definido em:
build/ruby-driver-v2.19/lib/mongo/server/pending_connection.rb

Visão geral

Esta classe faz parte de uma API privada. Evite usar essa classe, se possível, pois ela pode ser removida ou alterada no futuro.

Esta classe encapsula conexões durante a negociação e a autenticação.

Desde:

  • 2.0.0

Resumo constante

Constantes herdadas de ConnectionBase

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

Constantes incluídas do Loggable

Loggable::Prefix

Recolhimento do Resumo do atributo de instância

Atributos herdados de ConnectionBase

#description, #options, #server

Atributos incluídos no Monitoramento::publicável

#monitoring

Atributos herdados de ConnectionCommon

#compressor, #pid

Recolhimento do Resumo do método de instância

Métodos herdados de ConnectionBase

#app_metadata, #dispatch, # generação, #service_id

Métodos incluídos do monitoramento::publicável

#publish_cmap_event, #publish_event, #publish_sdam_event

Métodos incluídos no Loggable

#log_debug, #log_error, #log_fatal, #log_info, #log_WARN, #logger

Métodos herdados de ConnectionCommon

#connected?, #handshake_command, #handshake_document

Detalhes do construtor

#inicializar(soquete, servidor, monitoramento, opções = {}) ➤ PpendingConnection

Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.

Retorna uma nova instância de PingConnection.

Desde:

  • 2.0.0



27
28
29
30
31
32
33
# File 'build/ruby-driver-v2.19/lib/mongo/server/pending_connection.rb', linha 27

def inicializar(soquete, Servidor, Monitoramento, opções = {})
  @socket = soquete
  @opções = opções
  @server = Servidor
  @monitoring = Monitoramento
  @id = opções[:id]
end

Detalhes do atributo da instância

#IDInteiro (somente leitura)

Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no futuro.

Retorna O ID da conexão. Este é o mesmo ID que o do objeto de Conexão regular para o qual esta instância de PingConnection foi criada.

Retorna:

  • (Inteiro)

    A ID da conexão. Este é o mesmo ID que o do objeto de Conexão regular para o qual esta instância de PingConnection foi criada.

Desde:

  • 2.0.0



38
39
40
# File 'build/ruby-driver-v2.19/lib/mongo/server/pending_connection.rb', linha 38

def id
  @id
end

Detalhes do método de instância

#handshake_and_authenticate!Objeto

Este método faz parte de uma API privada. Evite usar esse método, se possível, pois ele pode ser removido ou alterado no 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
# File 'build/ruby-driver-v2.19/lib/mongo/server/pending_connection.rb', linha 40

def handshake_and_authenticate!
  speculative_auth_doc = nada
  se opções[: user] || opções[:auth_mech]
    # Para criar uma instância de autenticação, precisamos especificar o mecanismo,
    # mas, neste ponto, não sabemos o mecanismo que, em última análise,
    # será utilizado (já que depende dos dados retornados por
    # a negociação, especificamente a versão do servidor).
    # No entanto, sabemos que apenas 4.4+ servidores suportam especulativo
    # autenticação, e esses servidores também geralmente suportam
    # SCRAM-SHA-256. Esperemos que as contas de usuário criadas para 4.4+
    # servidores geralmente permitiriam a autenticação SCRAM-SHA-256 ;
    # contas de usuário migradas dos servidores anteriores à4.4 só podem permitir
    # SCRAM-SHA-1. O uso de SCRAM-SHA-256 por padrão é, portanto,
    # sensível e também é exigida pela especificação de autenticação especulativa.
    # Se nenhum mecanismo foi especificado e estamos falando com um 3.0+
    servidor, enviaremos documento de autenticação especulativo , o servidor irá
    # ignore e realizaremos a autenticação usando explícito
    # comando depois de ter padronizado o mecanismo mais tarde para CR.
    # Se nenhum mecanismo foi especificado e estamos falando com um 4.4+
    # servidor e a conta de usuário não permite SCRAM-SHA-256, vamos
    # autenticar em um comando separado com SCRAM-SHA-1 após
    # passando pela negociação do mecanismo SCRAM.
    default_options = Opções::Editado.Novo(:auth_mech => :scram256)
    speculative_auth_user = auth::Usuário.Novo(default_options.mesclar(opções))
    especative_auth = auth.obter(speculative_auth_user, auto)
    speculative_auth_doc = especative_auth.conversa.speculative_auth_document
  end

  Resultado = aperto de mão!(speculative_auth_doc: speculative_auth_doc)

  se Descrição.desconhecido?
    aumentar Erro::InternalDriverError, "A descrição da conexão não pode ser desconhecida após a negociação bem-sucedida: #{descrição.inspecionar}"
  end

  começar
    se speculative_auth_doc && (speculative_auth_result = Resultado['speculativeAuthenticate'])
      a menos que Descrição.características.scram_sha_1_enabled?
        aumentar Erro::InvalidServerAuthResponse, "Autenticação especulativa bem-sucedida em um servidor pré-3.0 "
      end
      caso speculative_auth_user.Mecanismo
      quando :mongodb_x509
        # Concluído
      # Padronizamos o mecanismo de autenticação para SCRAM256, mas se o usuário especificar
      # SCRAM explicitamente, podemos autenticar especulativamente
      # com SCRAM.
      quando :scram, :scram256
        autenticar!(
          speculative_auth_client_nonce: especative_auth.conversa.client_nonce,
          speculative_auth_mech: speculative_auth_user.Mecanismo,
          speculative_auth_result: speculative_auth_result,
        )
      mais
        aumentar Erro::InternalDriverError, "Autenticação especulativa inesperadamente bem-sucedida para o mecanismo # {speculative_auth_user.engine.inspect}"
      end
    elsif !Descrição.árbitro?
      autenticar!
    end
  salvar mongo::Erro, mongo::Erro::AuthError => exc
    exc.service_id = service_id
    aumentar
  end

  se Descrição.desconhecido?
    aumentar Erro::InternalDriverError, "A descrição da conexão não pode ser desconhecida após a autenticação bem-sucedida: #{descrição.inspect}"
  end

  se Servidor.load_balancer? && !Descrição.mongos?
    aumentar Erro::RuimBalancerTarget, "A operação de balanceamento de carga requer conexão a mongos, mas o servidor em #{endereço.seed} se reportou como #{descrição.server_type.to_s.gsub('_', ' ')}"
  end
end