diff --git a/Gemfile b/Gemfile index 4ee3daa8..3e985a3c 100644 --- a/Gemfile +++ b/Gemfile @@ -36,6 +36,7 @@ gem 'base32' gem 'coveralls', require: false gem 'sanitize' gem 'will_paginate' +gem 'simpleidn' platform :mri, :rbx do gem 'magic' # sudo apt-get install file, For OSX: brew install libmagic diff --git a/Gemfile.lock b/Gemfile.lock index a07b695a..ca0b2d7d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -175,6 +175,7 @@ GEM json (~> 1.8) simplecov-html (~> 0.10.0) simplecov-html (0.10.0) + simpleidn (0.0.6) sinatra (1.4.6) rack (~> 1.4) rack-protection (~> 1.4) @@ -277,6 +278,7 @@ DEPENDENCIES shotgun sidekiq simplecov + simpleidn sinatra sinatra-flash sinatra-xsendfile diff --git a/Rakefile b/Rakefile index 49f89cfe..6bd93497 100644 --- a/Rakefile +++ b/Rakefile @@ -69,7 +69,7 @@ desc 'Compile domain map for nginx' task :compile_domain_map => [:environment] do File.open('./files/map.txt', 'w') do |file| Site.exclude(domain: nil).exclude(domain: '').select(:username,:domain).all.collect do |site| - file.write ".#{site.domain} #{site.username};\n" + file.write ".#{site.values[:domain]} #{site.username};\n" end end end diff --git a/app/api.rb b/app/api.rb index ff75e7ba..b9d5ed8e 100644 --- a/app/api.rb +++ b/app/api.rb @@ -102,7 +102,6 @@ end get '/api/info' do if params[:sitename] site = Site[username: params[:sitename]] - api_error 400, 'site_not_found', "could not find site #{params[:sitename]}" if site.nil? || site.is_banned api_success api_info_for(site) else diff --git a/app/settings.rb b/app/settings.rb index 025e251b..816b6280 100644 --- a/app/settings.rb +++ b/app/settings.rb @@ -225,6 +225,16 @@ post '/settings/:username/custom_domain' do @site.domain = params[:domain] + begin + Socket.gethostbyname @site.values[:domain] + rescue SocketError => e + if e.message =~ /name or service not known/i + flash[:error] = 'Domain needs to be valid and already registered.' + redirect "/settings/#{@site.username}#custom_domain" + end + raise e + end + if @site.valid? @site.save_changes flash[:success] = 'The domain has been successfully updated.' diff --git a/models/site.rb b/models/site.rb index 6e5e6ef3..08a22f68 100644 --- a/models/site.rb +++ b/models/site.rb @@ -812,6 +812,14 @@ class Site < Sequel::Model # super # end + def domain=(domain) + super SimpleIDN.to_ascii(domain) + end + + def domain + SimpleIDN.to_unicode values[:domain] + end + def validate super @@ -864,15 +872,10 @@ class Site < Sequel::Model end if !values[:domain].nil? && !values[:domain].empty? - if values[:domain] =~ /neocities\.org/ || values[:domain] =~ /neocitiesops\.net/ errors.add :domain, "Domain is already being used.. by Neocities." end - if !(values[:domain] =~ /^[a-zA-Z0-9.-]+\.[a-zA-Z0-9]+$/i) || values[:domain].length > 90 - errors.add :domain, "Domain provided is not valid. Must take the form of domain.com" - end - site = Site[domain: values[:domain]] if !site.nil? && site.id != self.id errors.add :domain, "Domain provided is already being used by another site, please choose another."