diff --git a/sentry.rb b/sentry.rb index 321f9de..04ec982 100644 --- a/sentry.rb +++ b/sentry.rb @@ -2,6 +2,9 @@ require_relative 'hyde/hyde' require 'xmpp4r' require 'net/smtp' require 'json' +require 'uri' + +norxondor_gorgonax = URI::MailTo::EMAIL_REGEXP CONFIG = JSON.load_file(Dir.pwd+"/.config.json") @@ -13,16 +16,23 @@ SMTP_PASS = CONFIG["pass"] SMTP_TLS = CONFIG["tls"] SMTP_STARTTLS = CONFIG["starttls"] SMTP_AUTH = CONFIG["auth"].to_sym +JABBER_SERVER = CONFIG["jabber-server"] +HTTP_SERVER_ROOT = CONFIG['http-server-root'] + Pending = {} +Pending_by_username = {} def myroot(req) if req.ssl? then - return "https://#{req.host}:#{req.port}" + return "https://#{HTTP_SERVER_ROOT}" else - return "http://#{req.host}:#{req.port}" + return "http://#{HTTP_SERVER_ROOT}" end end +def register(username,password) + cl = Jabber::Client.new(Jabber::JID.new( + def sendmail(code,email) smtp = Net::SMTP.new(SMTP_SERVER, SMTP_PORT) msg_headers = '' @@ -49,19 +59,26 @@ server = Hyde::Server.new Port: 8001 do end path "api" do post 'register' do |ctx| + server_uri = myroot ctx.request # Add pending user key = (1..32).map { |x| "0123456789ABCDEF"[(rand()*15).round] }.join user = ctx.request.query['user'] password = ctx.request.query['password'] email = ctx.request.query['email'] expires_on = Time.now+60*60*2 - Pending[key] = { + unless user.match /^[\w_-]+$/ and + email.match norxondor_gorgonax and + password.match /^.{8,}$/ then + redirect server_uri+"/register/error.html" + end + if Pending_by_username[user] then + redirect server_uri+"/register/error.html" + end + Pending_by_username[user] = Pending[key] = { "user" => user, "password" => password, - "email" => email, - "expires_one" => expires_on + "expires_on" => expires_on } - server_uri = myroot ctx.request begin sendmail(key,email) redirect server_uri+"/register/validate.html" @@ -73,11 +90,18 @@ server = Hyde::Server.new Port: 8001 do server_uri = myroot ctx.request key = ctx.request.query['key'] if Pending.has_key? key then - # do things here - puts Pending[key], "successfully verified" + if Pending[key].expires_on < Time.now then + puts "#{Pending.delete key} expired" + redirect server_uri+"/register/error.html" + end + cl = Jabber::Client.new(Jabber::JID.new(Pending[key]["user"]+"@"+JABBER_SERVER)) + cl.connect + cl.register(Pending[key]["password"]) + cl.close + puts "#{Pending[key]} successfully verified" redirect server_uri+"/register/success.html" else - puts Pending[key], "failed to verify" + puts "#{Pending[key]} failed to verify" redirect server_uri+"/register/error.html" end end diff --git a/static/index.html b/static/index.html index 26450dd..1b12f7c 100644 --- a/static/index.html +++ b/static/index.html @@ -24,6 +24,13 @@ +

Requirements:

+ +

Review the source code of this registration page