Class: Radius::Auth
- Inherits:
-
Object
- Object
- Radius::Auth
- Defined in:
- lib/radius/auth.rb
Instance Attribute Summary collapse
-
#packet ⇒ Object
readonly
We can inspect and alter the contents of the internal RADIUS packet here (although this is probably not required for simple work).
Instance Method Summary collapse
-
#check_passwd(name, pwd, secret) ⇒ Object
Verifies a username/password pair against the RADIUS server associated with the Auth object.
-
#gen_authenticator ⇒ Object
Generate an authenticator, placing it in the @packet object's authenticator attribute.
-
#initialize(radhost, myip, timeout, dictfilename = File.dirname(__FILE__) + "/../../dictionary") ⇒ Auth
constructor
This method initializes the Auth object, given a dictionary filename to read, the RADIUS host to connect to, and a timeout value in seconds for the connection.
- #recv_check_passwd ⇒ Object
-
#recv_packet ⇒ Object
Receive a packet from the server via UDP.
- #send_check_passwd(name, pwd, secret) ⇒ Object
-
#send_packet ⇒ Object
Sends a packet to the server via UDP.
Constructor Details
#initialize(radhost, myip, timeout, dictfilename = File.dirname(__FILE__) + "/../../dictionary") ⇒ Auth
This method initializes the Auth object, given a dictionary filename to read, the RADIUS host to connect to, and a timeout value in seconds for the connection. =====Parameters
dictfilenameDictionary filename to read
radhostname of RADIUS server optionally followed by port number
myipthe client's own IP address (NAS IP address)
timeoutTimeout time
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
# File 'lib/radius/auth.rb', line 46 def initialize(radhost, myip, timeout, dictfilename = File.dirname(__FILE__) + "/../../dictionary") @dict = Radius::Dictionary.new if dictfilename != nil File.open(dictfilename) do |fn| @dict.read(fn) end end @packet = Radius::Packet.new(@dict) # this is probably better than starting identifiers at 0 @packet.identifier = Kernel.rand(65535) @myip = myip @host, @port = radhost.split(":") @port = Socket.getservbyname("radius", "udp") unless @port @port = 1812 unless @port @port = @port.to_i # just in case @timeout = timeout @sock = UDPSocket.open @sock.connect(@host, @port) end |
Instance Attribute Details
#packet ⇒ Object (readonly)
We can inspect and alter the contents of the internal RADIUS packet here (although this is probably not required for simple work)
36 37 38 |
# File 'lib/radius/auth.rb', line 36 def packet @packet end |
Instance Method Details
#check_passwd(name, pwd, secret) ⇒ Object
Verifies a username/password pair against the RADIUS server associated with the Auth object.
=====Parameters
nameThe user name to verify
pwdThe password associated with this name
secretThe RADIUS secret of the system
=====Return value returns true or false depending on whether or not the attempt succeeded or failed.
76 77 78 79 |
# File 'lib/radius/auth.rb', line 76 def check_passwd(name, pwd, secret) send_check_passwd(name, pwd, secret) recv_check_passwd end |
#gen_authenticator ⇒ Object
Generate an authenticator, placing it in the @packet object's authenticator attribute. It will try to use /dev/urandom if possible, or the system rand call if that's not available.
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
# File 'lib/radius/auth.rb', line 98 def gen_authenticator # get authenticator data from /dev/urandom if possible if (File.exist?("/dev/urandom")) File.open("/dev/urandom") do |urandom| @packet.authenticator = urandom.read(16) end else # use the Kernel:rand method. This is quite probably not # as secure as using /dev/urandom, be wary... @packet.authenticator = [rand(65536), rand(65536), rand(65536), rand(65536), rand(65536), rand(65536), rand(65536), rand(65536)].pack("n8") end return(@packet.authenticator) end |
#recv_check_passwd ⇒ Object
90 91 92 93 |
# File 'lib/radius/auth.rb', line 90 def recv_check_passwd recv_packet return(@packet.code == 'Access-Accept') end |
#recv_packet ⇒ Object
Receive a packet from the server via UDP.
122 123 124 125 126 127 128 129 |
# File 'lib/radius/auth.rb', line 122 def recv_packet if select([@sock], nil, nil, @timeout) == nil raise "Timed out waiting for response packet from server" end data = @sock.recvfrom(65536) @packet.unpack(data[0]) return(@packet) end |
#send_check_passwd(name, pwd, secret) ⇒ Object
81 82 83 84 85 86 87 88 |
# File 'lib/radius/auth.rb', line 81 def send_check_passwd(name, pwd, secret) @packet.code = 'Access-Request' gen_authenticator @packet.set_attr('User-Name', name) @packet.set_attr('NAS-IP-Address', @myip) @packet.set_password(pwd, secret) send_packet end |
#send_packet ⇒ Object
Sends a packet to the server via UDP.
115 116 117 118 119 |
# File 'lib/radius/auth.rb', line 115 def send_packet data = @packet.pack @packet.identifier = (@packet.identifier + 1) & 0xff @sock.send(data, 0) end |