diff --git a/app.json b/app.json new file mode 100644 index 00000000..45928450 --- /dev/null +++ b/app.json @@ -0,0 +1,130 @@ +{ + "name": "huboard-web", + "scripts": { + }, + "env": { + "AWS_ACCESS_KEY_ID": { + "required": true + }, + "AWS_S3_BUCKET": { + "required": true + }, + "AWS_SECRET_ACCESS_KEY": { + "required": true + }, + "BUILDPACK_URL": { + "required": true + }, + "CLOUDFRONT_URL": { + "required": true + }, + "COUCH_DATABASE": { + "required": true + }, + "COUCH_URL": { + "required": true + }, + "ELASTICSEARCH_URL": { + "required": true + }, + "GITHUB_API_ENDPOINT": { + "required": true + }, + "GITHUB_AUTH_STRATEGY": { + "required": true + }, + "GITHUB_CLIENT_ID": { + "required": true + }, + "GITHUB_SECRET": { + "required": true + }, + "GITHUB_WEB_ENDPOINT": { + "required": true + }, + "GITHUB_WEBHOOK_ENDPOINT": { + "required": true + }, + "HEROKU_APP_ID": { + "required": true + }, + "HEROKU_APP_NAME": { + "required": true + }, + "HEROKU_PARENT_APP_NAME": { + "required": true + }, + "HEROKU_RELEASE_VERSION": { + "required": true + }, + "HEROKU_SLUG_COMMIT": { + "required": true + }, + "HEROKU_SLUG_DESCRIPTION": { + "required": true + }, + "HUBOARD_ENV": { + "required": true + }, + "LANG": { + "required": true + }, + "MAX_THREADS": { + "required": true + }, + "RACK_ENV": { + "required": true + }, + "RAILS_ENV": { + "required": true + }, + "RAILS_SERVE_STATIC_FILES": { + "required": true + }, + "RAYGUN_APIKEY": { + "required": true + }, + "REDIS_URL": { + "required": true + }, + "SECRET_KEY": { + "required": true + }, + "SECRET_KEY_BASE": { + "required": true + }, + "SEGEMENTIO_KEY": { + "required": true + }, + "SEGMENTIO_KEY": { + "required": true + }, + "SESSION_SECRET": { + "required": true + }, + "SOCKET_BACKEND": { + "required": true + }, + "STRIPE_API": { + "required": true + }, + "STRIPE_PUBLISHABLE_API": { + "required": true + }, + "STRIPE_SECRET_KEY": { + "required": true + }, + "WARDEN_GITHUB_VERIFIER_SECRET": { + "required": true + } + }, + "addons": [ + "rediscloud", + "memcachier" + ], + "buildpacks": [ + { + "url": "https://github.com/heroku/heroku-buildpack-multi" + } + ] +} diff --git a/config/initializers/warden.rb b/config/initializers/warden.rb index 5c83027a..2db9a758 100644 --- a/config/initializers/warden.rb +++ b/config/initializers/warden.rb @@ -21,3 +21,58 @@ Warden::Manager.serialize_from_session { |key| Warden::GitHub::Verifier.load(key) } Warden::Manager.serialize_into_session { |user| Warden::GitHub::Verifier.dump(user) } +require 'uri' + +module Warden + module GitHub + class Config + alias_method :base_normalized_uri, :normalized_uri + + def normalized_uri(uri_or_path) + uri = base_normalized_uri(uri_or_path) + + app_name = ENV["HEROKU_APP_NAME"] + parent_app_name = ENV["HEROKU_PARENT_APP_NAME"] + Rails.logger.info "Warden Override: #{app_name} => #{parent_app_name}" + if parent_app_name && parent_app_name != app_name + uri.host.sub! app_name, parent_app_name + uri.query = URI.encode_www_form("APP_NAME" => app_name) + end + + Rails.logger.info "Warden Override: #{uri}" + uri + end + end + end +end + +class Huboard + class Warden + class AppRedirect + def initialize(app, params={}) + @app = app + @params = params + end + + def call(env) + uri = Addressable::URI.parse(env['REQUEST_URI']) + + app_name = uri.query_values['APP_NAME'] if uri.query_values + parent_app_name = ENV['HEROKU_APP_NAME'] + Rails.logger.info "AppRedirect: #{parent_app_name} => #{app_name}" if app_name + + if app_name && parent_app_name + uri.query_values = uri.query_values(Array).reject { |kvp| kvp[0] == 'APP_NAME' } unless !uri.query_values + + app_redirect = "#{env['rack.url_scheme']}://#{env['HTTP_HOST'].sub(parent_app_name, app_name)}#{uri}" + Rails.logger.info "AppRedirect to #{app_redirect}" + return [302, {"Location" => app_redirect}, self] + end + + @app.call env + end + end + end +end + +Rails.application.middleware.insert_before Warden::Manager, Huboard::Warden::AppRedirect