diff --git a/Gemfile b/Gemfile index a15645b..e71c640 100644 --- a/Gemfile +++ b/Gemfile @@ -1,10 +1,13 @@ source "https://rubygems.org" gem 'sinatra' +gem 'encryption' +gem 'public_suffix' group :test do gem 'minitest' gem 'mina' + gem 'rerun' end group :production do diff --git a/Gemfile.lock b/Gemfile.lock index 7bd4cfb..cce9bd5 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -2,16 +2,29 @@ GEM remote: https://rubygems.org/ specs: daemons (1.2.3) + encryption (1.1.8) eventmachine (1.0.8) + ffi (1.9.14) + listen (3.1.5) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + ruby_dep (~> 1.2) mina (0.3.7) open4 (~> 1.3.4) rake minitest (5.7.0) open4 (1.3.4) + public_suffix (2.0.3) rack (1.6.4) rack-protection (1.5.3) rack rake (10.4.2) + rb-fsevent (0.9.8) + rb-inotify (0.9.7) + ffi (>= 0.5.0) + rerun (0.11.0) + listen (~> 3.0) + ruby_dep (1.5.0) sinatra (1.4.6) rack (~> 1.4) rack-protection (~> 1.4) @@ -26,10 +39,13 @@ PLATFORMS ruby DEPENDENCIES + encryption mina minitest + public_suffix + rerun sinatra thin BUNDLED WITH - 1.10.5 + 1.13.6 diff --git a/app.rb b/app.rb index 84bf23e..40a7e96 100644 --- a/app.rb +++ b/app.rb @@ -2,6 +2,8 @@ require 'rubygems' require 'bundler/setup' require 'sinatra' require 'yaml' +require 'encryption' +require './lightsaber' def get_url(domain_object, rel_route) if domain_object.is_a? Hash @@ -11,6 +13,22 @@ def get_url(domain_object, rel_route) end end +get '/lightsaber' do + # pass unless request.host == 'lightsaber.captnemo.in' + + erb :index +end + +post '/lightsaber/encrypt' do + domain = request.params['domain'] + status = request.params['status'] + redirect = request.params['redirect_url'] + root = request.params['root'] + + puts [domain, status, redirect, root] + Lightsaber.encrypt(domain, status, redirect, root) +end + get '/*' do hostname = request.host route = params[:splat][0] diff --git a/keys/private.pem b/keys/private.pem new file mode 100644 index 0000000..5618ce8 --- /dev/null +++ b/keys/private.pem @@ -0,0 +1,30 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,9C69FE6141CA092A + +ES5GygH8ozr/+ZwWYCXltOFIZYNhjxOEqrbANraZBfpzNpsrERoc96GHEiKcnxro +tACEsRj7M+ywmRYBnXh+3i+mCcfFgfeqxITo7WO9U1kP9eo8woUTKrFDND6YrwA9 +RU47j1xOifPmUnx2sFXiwRe2eDGrxgf1K/13ADEnQZDnIi8rjFgv6Ix6RfzvmFH0 +90b13e3JuLHb/QwN0LDet9W1ceIhinxO6vwYW9C6Plst4JgejIzmvz9vP8TsuIaH +1VKjb/3SaAONVmE1T2vpa2K51jlnRMuLQZKuZwA6J7HvSoUcbhEjwH8+4ifZjAUz +aq0YbWHE8kvJvQ+mFxvmZvfUso9PSqU6bTIcpW2wJ8hqjeQjzqaBc2V0viw2lIcn +aIMIL10z81D36H4BLKiI+kxhqQUYR3GWCGLlVYLGO+yDXFdnfLb3vcUgyiWkJMfk +8R8Y/1zvDctvBrqAvo1Ee0R1P6kLrXYla2oOSUzJ+anXUCvtch2XWTp1hp3d7QyQ +udOxXUrVFVt9fITyj8WzwFbl4b24dz78iT1MSGXQ9vnv3Y0QTjRIiavTOwVy6RZb +1vJVqK3BUWxVyn8vGZJNeonUY485rA9Cm653SYvxLnxsPqq+kPLCFSxTfV1zPWrB +WuHlAXowulVx1SkEDoF1rxDVc4zq307+tiTqR8Y4o9cmRdcHWs3Xd6S50q1uZlHL +B5qitVk22jdaCHPO3cqYlCN96mN/K4LBdMiyz9tupy8eXWM7eRtdmacT3mLWZNi1 +/OOhN1tehSUOUdQudgZzI8wNsmS46Y2hSQBOoV4iyK4sIWRK7TuRzNHHNj3IaZOH +oyk7uWcVBj+gQWm0QSqPe4hwDiUkyacrtnIzo2OPhatioUDqOC6iGAAG0KbLH+sr +Svp1yuYUl31xo0IQac+hu9Ti2Jjt4vwttCDgGHwpzdXBNg8aOzVH+nJlbiMCVZz/ +4ZwHamdPNPZcvPxIIHQ8VkAHVm2AsfUaPSSlVOeJZSykz39PA6jIjqTLqdPSOdtz +8b+1v+6llUfXZ3Z0+HPm/aMtxAIMqKe5B+hDFGLP7Gqo/09t+zyKn2m4Hw6vD5lG +yhXwhwQ3tC7ZwKRJghhxYiwXAuinFANEKpsthOrbDAu3M+7sihShPuBGyD17KZ/Z +vMGxQGn8Cy/a8d7eeCQrKP6vgnZCvtHtEaJBuNNXNfOMMIQkYDJhNinWTwdhX8gB +I8KiHTtkaP6a9xygpPzRCZT497TyP9zMgQrlx3KQe83vMKkgcvvEOBXE7kGpbj5X +dddvlQOQzi/caey9bJ5D68HW4Hrs/670q6qiyEaLgLQgQDGSvZdYtbB8rdUXbT0f +UUrAoOR+8aBj2lFKL2ZNI8yz0kkPvjmw1MKf0grAcdpl5jkAYYR7GnECHmR+hM4H +vesHc8TWOBflWT8796jV/b9NCV8L1w4Rzgb3ETucN8DlroNbka57Y6+hRJw5YR9R +xKHJxDyUkbWU2AzQc+ERZV69pOvFlj0dIc39hCu1DTGdyWyd5ljSnqGmiKfrrMoA +x9c2kSK3DgUuZa5rDVkOvm1/5I+NthvGTm2ktRv9iKkbsR0hFcXTic9suZCKsrvi +-----END RSA PRIVATE KEY----- diff --git a/keys/public.pem b/keys/public.pem new file mode 100644 index 0000000..f52d9ac --- /dev/null +++ b/keys/public.pem @@ -0,0 +1,9 @@ +-----BEGIN PUBLIC KEY----- +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArw/B62WeQ+5XQbfVAZNb +S0Opia9+pAyBnODE1eMpB6/3heE/HdTIexYP9B0uuwbM/aQyEBEs60u8G8JvwSMd ++FO7nLT0PcC2uQi9RrNeuapkirWo9+QRso1Gd06N0vZAwZVf8Zn7qGBY4k3wGMbP +Aw+ujQH1G2aBpoOqH2bqf0nSG+15jUSaQNOyhL8q+4GmBpu8hWHxCSU5uTOFUszn +J8bAIKuokhl/pPsyXVMxGkWs81d7/oXvZfvJkw9aeGrKgOmsEsYJlI7QNH8j0tC/ +ED5H0f+uaKDz7rsDYCeUvKfgd9m5PI7utLDL7Di4C8/c/bGf129SIoyufb32nWqG +IwIDAQAB +-----END PUBLIC KEY----- diff --git a/lightsaber.rb b/lightsaber.rb new file mode 100644 index 0000000..ec8325f --- /dev/null +++ b/lightsaber.rb @@ -0,0 +1,27 @@ +require 'public_suffix' +require 'json' +require 'base64' + +class Lightsaber + def self.encrypt(domain, status, redirect, root) + status = status.to_s + raise 'Either redirect or root must be provided' if redirect.nil? and root.nil? + raise 'Invalid Status' if (status!='301' and status !='302') + raise 'Invalid Domain' unless PublicSuffix.valid?(domain, ignore_private: true) + + str = prepare_private_hash(domain, status, redirect, root) + + public_key = Encryption::PublicKey.new('keys/public.pem') + return Base64.encode64 public_key.encrypt str + end + + def self.prepare_private_hash(domain, status, redirect, root) + h = Hash.new + if redirect.nil? + h[domain] = {status: status, root: root, contact: '@captn3m0'} + else + h[domain] = {status: status, redirect: redirect, contact: '@captn3m0'} + end + str = h.to_json + end +end \ No newline at end of file diff --git a/redirects.yml b/redirects.yml index 6cf7516..f6ecb66 100644 --- a/redirects.yml +++ b/redirects.yml @@ -15,3 +15,9 @@ fb.captnemo.in: https://facebook.com/captn3m0 where.rzp.io: https://goo.gl/maps/1A9nhMPzehS2 where.razorpay.com: https://goo.gl/maps/1A9nhMPzehS2 +# encrypted: +# - domain: +# location: https://google.com +# status: 3xx +# root: https://twitter.com +# contact: @captn3m0 \ No newline at end of file diff --git a/views/index.erb b/views/index.erb new file mode 100644 index 0000000..6608734 --- /dev/null +++ b/views/index.erb @@ -0,0 +1,55 @@ + + + + + + +
+
+ +
+
+

Encryption

+

You can find more about lightsaber at + lightsaber.captnemo.in. +

+

This page exists to help you with the encryption

+
+
+ + + + +

You must fill either the Redirect URL or the Root

+ + + + + + +
+
+
+
+ + \ No newline at end of file