62 lines
1.8 KiB
Ruby
62 lines
1.8 KiB
Ruby
# -*- coding: binary -*-
|
|
require 'net/ssh/buffer'
|
|
require 'net/ssh/errors'
|
|
require 'net/ssh/loggable'
|
|
require 'net/ssh/authentication/constants'
|
|
|
|
module Net; module SSH; module Authentication; module Methods
|
|
|
|
# The base class of all user authentication methods. It provides a few
|
|
# bits of common functionality.
|
|
class Abstract
|
|
include Constants, Loggable
|
|
|
|
# The authentication session object
|
|
attr_reader :session
|
|
|
|
# The key manager object. Not all authentication methods will require
|
|
# this.
|
|
attr_reader :key_manager
|
|
|
|
# Instantiates a new authentication method.
|
|
def initialize(session, options={})
|
|
@session = session
|
|
@key_manager = options[:key_manager]
|
|
@options = options
|
|
self.logger = session.logger
|
|
end
|
|
|
|
# Returns the session-id, as generated during the first key exchange of
|
|
# an SSH connection.
|
|
def session_id
|
|
session.transport.algorithms.session_id
|
|
end
|
|
|
|
# Sends a message via the underlying transport layer abstraction. This
|
|
# will block until the message is completely sent.
|
|
def send_message(msg)
|
|
session.transport.send_message(msg)
|
|
end
|
|
|
|
# Creates a new USERAUTH_REQUEST packet. The extra arguments on the end
|
|
# must be either boolean values or strings, and are tacked onto the end
|
|
# of the packet. The new packet is returned, ready for sending.
|
|
def userauth_request(username, next_service, auth_method, *others)
|
|
buffer = Net::SSH::Buffer.from(:byte, USERAUTH_REQUEST,
|
|
:string, username, :string, next_service, :string, auth_method)
|
|
|
|
others.each do |value|
|
|
case value
|
|
when true, false then buffer.write_bool(value)
|
|
when String then buffer.write_string(value)
|
|
else raise ArgumentError, "don't know how to write #{value.inspect}"
|
|
end
|
|
end
|
|
|
|
buffer
|
|
end
|
|
|
|
end
|
|
|
|
end; end; end; end
|