martes, 25 de agosto de 2009

Limitación de tamaño en el plugin Spreadsheet

Exportando datos a excel con el plugin spreadsheet he visto que hay una limitación de tamaño, que impide generar ficheros de más de 7 megas.

Buscando y rebuscando por ahí, he encontrado un parche que lo soluciona perfectamente. Tendrás que instalar la gema ruby-ole para que funcione:

sudo gem install ruby-ole

y modificar el código del fichero workbook.rb:

require 'rubygems'
require 'ole/file_system'


def store_ole_file
# OLEWriter.open(@file){ |ole|
# ole.set_size(@biffsize)
# ole.write_header
# ole.print(@data)
# @worksheets.each{ |sheet|
# ole.print(sheet.data)
# }
# }
Ole::Storage.open @file, 'wb+' do |ole|
ole.file.open 'Book', 'w' do |f|
f.write @data
@worksheets.each { |sheet| f.write sheet.data }
end
end
end

miércoles, 5 de agosto de 2009

Autenticación contra Radius

Después de mucho buscar y mucho probar, he conseguido validar contra un servidor Radius de un cliente.

Partiendo de la libreria http://rubyforge.org/projects/ruby-radius/, y con un tcpdump esnifando paquetes UDP, al final he conseguido validar.

He tenido que modificar el fichero auth.rb de la libreria:

-- attr_reader :@packet
++ attr_reader :packet

y en packet.rb, en el metodo "each":

-- @attributes.each_pair {
-- |key, value|
-- yield(key, value)
-- }

++ sorted_attributes = @attributes.keys.sort_by{|item| ++@dict.attr_num(item)}
++ sorted_attributes.each{|item|
++ key = item
++ value = @attributes[key]
++
++ yield(key, value)
++ }

para que se envien ordenados los atributos del paquete Radius.

Ahora puedes hacer una clase como:

require 'radius/auth'

class RadiusAuthentication
def initialize(hostname, secret)
@hostname, @secret = hostname, secret
@dictionary = File.join(File.dirname(__FILE__), 'dictionary')
end

def authenticate(username, password, nasip=nil, timeout=nil)
nasip = nasip || '127.0.0.1'
timeout = timeout || 10
rad = Radius::Auth.new(@dictionary, @hostname, nasip, timeout)
return rad.check_passwd(username, password, @secret)
end
end

y en tu código de aplicación:

rad = RadiusAuthentication.new(RADIUS_SERVER, RADIUS_SECRET)
success = rad.authenticate(login, password)


Y así validas la password contra el servidor Radius. Utiliza tcpdump para ver los paquetes UDP enviados y recibidos:

tcpdump udp and port 1812 -vvv