[txt-records] Initial basic version with direct URLs

This commit is contained in:
Nemo 2016-12-03 03:55:22 +05:30
parent 618a5cc0c2
commit 70ec73aebb
5 changed files with 47 additions and 31 deletions

View File

@ -1,7 +1,7 @@
source "https://rubygems.org" source "https://rubygems.org"
gem 'sinatra' gem 'sinatra'
gem 'dnsruby'
group :test do group :test do
gem 'minitest' gem 'minitest'
gem 'mina' gem 'mina'

View File

@ -1,35 +1,37 @@
GEM GEM
remote: https://rubygems.org/ remote: https://rubygems.org/
specs: specs:
daemons (1.2.3) daemons (1.2.4)
eventmachine (1.0.8) dnsruby (1.60.0)
mina (0.3.7) eventmachine (1.2.1)
mina (1.0.3)
open4 (~> 1.3.4) open4 (~> 1.3.4)
rake rake
minitest (5.7.0) minitest (5.10.1)
open4 (1.3.4) open4 (1.3.4)
rack (1.6.4) rack (1.6.5)
rack-protection (1.5.3) rack-protection (1.5.3)
rack rack
rake (10.4.2) rake (11.3.0)
sinatra (1.4.6) sinatra (1.4.7)
rack (~> 1.4) rack (~> 1.5)
rack-protection (~> 1.4) rack-protection (~> 1.4)
tilt (>= 1.3, < 3) tilt (>= 1.3, < 3)
thin (1.6.3) thin (1.7.0)
daemons (~> 1.0, >= 1.0.9) daemons (~> 1.0, >= 1.0.9)
eventmachine (~> 1.0) eventmachine (~> 1.0, >= 1.0.4)
rack (~> 1.0) rack (>= 1, < 3)
tilt (2.0.1) tilt (2.0.5)
PLATFORMS PLATFORMS
ruby ruby
DEPENDENCIES DEPENDENCIES
dnsruby
mina mina
minitest minitest
sinatra sinatra
thin thin
BUNDLED WITH BUNDLED WITH
1.10.5 1.13.6

View File

@ -1,5 +1,7 @@
require 'rubygems'
require 'uri' require 'uri'
require 'rack/response' require 'rack/response'
require 'dnsruby'
# This is the class that resolves a given URL # This is the class that resolves a given URL
# to what we need to redirect to # to what we need to redirect to
@ -17,21 +19,31 @@ class Lightsaber
end end
end end
def get_response_from_yml def get_response_from_dns (host)
res = Rack::Response.new
YAML::load_file('redirects.yml').each do |code, zone| res = not_setup_response
if zone.has_key? @url.host.to_s
url = get_url(zone[@url.host], @url.path) ret = Dnsruby::Resolver.new.query("_redirect.#{host}", 'TXT')
if url ret.answer.rrsets.each do |rrset|
res.redirect url, code rrset.rrs.each do |rr|
else if is_valid_lightsaber_record? rr.data
res.status = 400 url = get_redirect_from_dns_record rr.data
res.body = "Invalid configuration for #{@url.host}" if url =~ /\A#{URI::regexp}\z/
res = Rack::Response.new
res.redirect url
end
end end
return res
end end
end end
res
end
def get_redirect_from_dns_record(data)
data[6..-1]
end
def is_valid_lightsaber_record? (data)
data[0..5] === 'v=lr1;'
end end
def not_setup_response def not_setup_response
@ -42,10 +54,6 @@ class Lightsaber
def get_response def get_response
get_response_from_dns @url.host
yml_res = get_response_from_yml
return yml_res unless yml_res.nil?
not_setup_response
end end
end end

View File

@ -14,4 +14,4 @@
302: 302:
fb.captnemo.in: https://facebook.com/captn3m0 fb.captnemo.in: https://facebook.com/captn3m0
where.rzp.io: https://goo.gl/maps/1A9nhMPzehS2 where.rzp.io: https://goo.gl/maps/1A9nhMPzehS2
where.razorpay.com: https://goo.gl/maps/1A9nhMPzehS2 where.razorpay.com: https://goo.gl/maps/1A9nhMPzehS2

View File

@ -2,6 +2,7 @@ require 'minitest/autorun'
require 'resolv' require 'resolv'
require 'yaml' require 'yaml'
require 'pp' require 'pp'
require_relative './lightsaber'
class TestConfig < Minitest::Test class TestConfig < Minitest::Test
REDIRECTS = [301, 302] REDIRECTS = [301, 302]
@ -15,6 +16,11 @@ class TestConfig < Minitest::Test
end end
end end
def test_txt_record
saber = Lightsaber.new 'http://localhost:9292/test'
pp saber.get_response_from_dns 'captnemo.in'
end
def test_each_domain def test_each_domain
@config.each do |section, zone| @config.each do |section, zone|
zone.each do |domain, redirect| zone.each do |domain, redirect|