summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAzul <azul@leap.se>2014-04-18 11:55:40 +0200
committerAzul <azul@leap.se>2014-04-18 12:30:52 +0200
commit9216ab8252246a263c5d17f6755a7d3887145f94 (patch)
tree1fc3af536bb621c175640eeed9dbedd9b99876a4
parent40dfa63aa6fc7aa3614f2a7952d088d8ff067f70 (diff)
change service level configuration strategy
The changes to the configuration required some non minor changes to the platform and also added some flexibility we don't require yet - and thus some new possibilities for errors. So instead we still use the allow_..._certs and ..._cert_prefix options. They basically provide the framework in which service levels can operate. The service level configuration will not include the cert prefix anymore. It only states if the service level is rate limited or not. This avoids conflicts between the two configuration options. I also removed the anonymous service level entirely. It was also turning a boolean decision (do we provide anonymous eip or not) into something way more complex. Instead I added the AnonymousServiceLevel class to handle the corner cases for people who are not logged in. Furthermore i renamed the UnauthenticatedUser to AnonymousUser so it matches the Anonymous Service Level nicely. It's also shorter and more intuitive.
-rw-r--r--app/controllers/controller_extension/authentication.rb6
-rw-r--r--app/controllers/v1/certs_controller.rb6
-rw-r--r--app/models/anonymous_service_level.rb31
-rw-r--r--app/models/anonymous_user.rb (renamed from app/models/unauthenticated_user.rb)4
-rw-r--r--app/models/service_level.rb30
-rw-r--r--app/views/users/_change_service_level.html.haml4
-rw-r--r--config/defaults.yml21
-rw-r--r--test/functional/v1/certs_controller_test.rb30
-rw-r--r--test/functional/v1/services_controller_test.rb23
-rw-r--r--test/unit/anonymous_user_test.rb23
-rw-r--r--test/unit/unauthenticated_user_test.rb7
11 files changed, 120 insertions, 65 deletions
diff --git a/app/controllers/controller_extension/authentication.rb b/app/controllers/controller_extension/authentication.rb
index 2bc0aee..1f73f38 100644
--- a/app/controllers/controller_extension/authentication.rb
+++ b/app/controllers/controller_extension/authentication.rb
@@ -8,7 +8,7 @@ module ControllerExtension::Authentication
end
def current_user
- @current_user ||= token_authenticate || warden.user || unauthenticated
+ @current_user ||= token_authenticate || warden.user || anonymous
end
def logged_in?
@@ -75,7 +75,7 @@ module ControllerExtension::Authentication
protected
- def unauthenticated
- UnauthenticatedUser.new
+ def anonymous
+ AnonymousUser.new
end
end
diff --git a/app/controllers/v1/certs_controller.rb b/app/controllers/v1/certs_controller.rb
index 580c90c..73409ef 100644
--- a/app/controllers/v1/certs_controller.rb
+++ b/app/controllers/v1/certs_controller.rb
@@ -1,6 +1,6 @@
class V1::CertsController < ApplicationController
- before_filter :require_eip_access
+ before_filter :require_login, :unless => :anonymous_certs_allowed?
# GET /cert
def show
@@ -10,8 +10,8 @@ class V1::CertsController < ApplicationController
protected
- def require_eip_access
- access_denied unless service_level.provides?(:eip)
+ def anonymous_certs_allowed?
+ APP_CONFIG[:allow_anonymous_certs]
end
def service_level
diff --git a/app/models/anonymous_service_level.rb b/app/models/anonymous_service_level.rb
new file mode 100644
index 0000000..c51ce9e
--- /dev/null
+++ b/app/models/anonymous_service_level.rb
@@ -0,0 +1,31 @@
+class AnonymousServiceLevel
+
+ delegate :to_json, to: :config_hash
+
+ def cert_prefix
+ if APP_CONFIG[:allow_limited_certs]
+ APP_CONFIG[:limited_cert_prefix]
+ else
+ APP_CONFIG[:unlimited_cert_prefix]
+ end
+ end
+
+ def description
+ if APP_CONFIG[:allow_anonymous_certs]
+ "anonymous access to the VPN"
+ else
+ "please login to access our services"
+ end
+ end
+
+ protected
+
+ def config_hash
+ { name: "anonymous",
+ description: description,
+ cost: 0,
+ eip_rate_limit: APP_CONFIG[:allow_limited_certs]
+ }
+ end
+
+end
diff --git a/app/models/unauthenticated_user.rb b/app/models/anonymous_user.rb
index 7845a6f..360a577 100644
--- a/app/models/unauthenticated_user.rb
+++ b/app/models/anonymous_user.rb
@@ -1,8 +1,8 @@
# The nil object for the user class
-class UnauthenticatedUser < Object
+class AnonymousUser < Object
def effective_service_level
- ServiceLevel.new id: APP_CONFIG[:unauthenticated_service_level]
+ AnonymousServiceLevel.new
end
def is_admin?
diff --git a/app/models/service_level.rb b/app/models/service_level.rb
index d0bd9b3..06ad202 100644
--- a/app/models/service_level.rb
+++ b/app/models/service_level.rb
@@ -4,29 +4,35 @@ class ServiceLevel
@id = attributes[:id] || APP_CONFIG[:default_service_level]
end
- def self.authenticated_select_options
- APP_CONFIG[:service_levels].map { |id,config_hash| [config_hash[:description], id] if config_hash[:name] != 'anonymous'}.compact
+ def self.select_options
+ APP_CONFIG[:service_levels].map do |id,config_hash|
+ [config_hash[:description], id]
+ end
end
def id
@id
end
- def config_hash
- @config_hash || APP_CONFIG[:service_levels][@id].with_indifferent_access
- end
-
delegate :to_json, to: :config_hash
- def provides?(service)
- services.include? service.to_s
+ def cert_prefix
+ if limited_cert?
+ APP_CONFIG[:limited_cert_prefix]
+ else
+ APP_CONFIG[:unlimited_cert_prefix]
+ end
end
- def services
- config_hash[:services] || []
+ protected
+
+ def limited_cert?
+ APP_CONFIG[:allow_limited_certs] &&
+ (!APP_CONFIG[:allow_unlimited_certs] || config_hash[:eip_rate_limit])
end
- def cert_prefix
- config_hash[:cert_prefix]
+ def config_hash
+ @config_hash || APP_CONFIG[:service_levels][@id].with_indifferent_access
end
+
end
diff --git a/app/views/users/_change_service_level.html.haml b/app/views/users/_change_service_level.html.haml
index 61e67d9..42315a2 100644
--- a/app/views/users/_change_service_level.html.haml
+++ b/app/views/users/_change_service_level.html.haml
@@ -8,11 +8,11 @@
%legend= t(:service_level)
- if @user != current_user
= t(:desired_service_level)
- = f.select :desired_service_level_code, ServiceLevel.authenticated_select_options, :selected => @user.desired_service_level.id
+ = f.select :desired_service_level_code, ServiceLevel.select_options, :selected => @user.desired_service_level.id
- if @user != current_user
%p
= t(:effective_service_level)
- = f.select :effective_service_level_code, ServiceLevel.authenticated_select_options, :selected => @user.effective_service_level.id
+ = f.select :effective_service_level_code, ServiceLevel.select_options, :selected => @user.effective_service_level.id
.control-group
.controls
= f.submit t(:save), :class => 'btn', :data => {"loading-text" => "Saving..."}
diff --git a/config/defaults.yml b/config/defaults.yml
index 383aa1c..a7b70a3 100644
--- a/config/defaults.yml
+++ b/config/defaults.yml
@@ -7,6 +7,11 @@ cert_options: &cert_options
client_cert_lifespan: 2
client_cert_bit_size: 2024
client_cert_hash: "SHA256"
+ allow_limited_certs: false
+ allow_unlimited_certs: true
+ allow_anonymous_certs: false
+ limited_cert_prefix: "LIMITED"
+ unlimited_cert_prefix: "UNLIMITED"
downloads: &downloads
client_download_domain: https://dl.bitmask.net
@@ -44,33 +49,19 @@ common: &common
service_levels: &service_levels
service_levels:
- 0:
- name: anonymous
- cert_prefix: "LIMITED"
- description: "anonymous account, with rate limited VPN"
- services:
- - eip
1:
name: free
- cert_prefix: "LIMITED"
description: "free account, with rate limited VPN"
cost: 0
+ eip_rate_limit: true
quota: 100
- services:
- - eip
- - email
2:
name: premium
- cert_prefix: "UNLIMITED"
description: "premium account, with unlimited vpn"
cost:
USD: 10
EUR: 10
- services:
- - eip
- - email
default_service_level: 1
- unauthenticated_service_level: 0
development:
<<: *downloads
diff --git a/test/functional/v1/certs_controller_test.rb b/test/functional/v1/certs_controller_test.rb
index 3631947..fb8e9c4 100644
--- a/test/functional/v1/certs_controller_test.rb
+++ b/test/functional/v1/certs_controller_test.rb
@@ -2,19 +2,23 @@ require 'test_helper'
class V1::CertsControllerTest < ActionController::TestCase
- test "send limited cert without login" do
- cert = expect_cert('LIMITED')
- get :show
- assert_response :success
- assert_equal cert.to_s, @response.body
+ test "send unlimited cert without login" do
+ with_config allow_anonymous_certs: true do
+ cert = expect_cert('UNLIMITED')
+ get :show
+ assert_response :success
+ assert_equal cert.to_s, @response.body
+ end
end
test "send limited cert" do
- login
- cert = expect_cert('LIMITED')
- get :show
- assert_response :success
- assert_equal cert.to_s, @response.body
+ with_config allow_limited_certs: true do
+ login
+ cert = expect_cert('LIMITED')
+ get :show
+ assert_response :success
+ assert_equal cert.to_s, @response.body
+ end
end
test "send unlimited cert" do
@@ -26,10 +30,8 @@ class V1::CertsControllerTest < ActionController::TestCase
end
test "redirect if no eip service offered" do
- with_config({service_levels: {0 => {services: []}}}) do
- get :show
- assert_response :redirect
- end
+ get :show
+ assert_response :redirect
end
protected
diff --git a/test/functional/v1/services_controller_test.rb b/test/functional/v1/services_controller_test.rb
index bcb7abc..b81103f 100644
--- a/test/functional/v1/services_controller_test.rb
+++ b/test/functional/v1/services_controller_test.rb
@@ -2,23 +2,32 @@ require 'test_helper'
class V1::ServicesControllerTest < ActionController::TestCase
- test "anonymous user can request service info" do
+ test "anonymous user gets login required service info" do
get :show, format: :json
assert_json_response name: 'anonymous',
- cert_prefix: 'LIMITED',
- description: 'anonymous account, with rate limited VPN',
- services: ["eip"]
+ eip_rate_limit: false,
+ description: 'please login to access our services',
+ cost: 0
+ end
+
+ test "anonymous user gets vpn service info" do
+ with_config allow_anonymous_certs: true do
+ get :show, format: :json
+ assert_json_response name: 'anonymous',
+ eip_rate_limit: false,
+ description: 'anonymous access to the VPN',
+ cost: 0
+ end
end
test "user can see their service info" do
login
get :show, format: :json
assert_json_response name: 'free',
- cert_prefix: 'LIMITED',
+ eip_rate_limit: true,
description: 'free account, with rate limited VPN',
cost: 0,
- quota: 100,
- services: ["eip", "email"]
+ quota: 100
end
end
diff --git a/test/unit/anonymous_user_test.rb b/test/unit/anonymous_user_test.rb
new file mode 100644
index 0000000..6e94d39
--- /dev/null
+++ b/test/unit/anonymous_user_test.rb
@@ -0,0 +1,23 @@
+require 'test_helper'
+
+class AnonymousUserTest < ActiveSupport::TestCase
+
+ setup do
+ @anonymous = AnonymousUser.new
+ end
+
+ test "has nil values" do
+ assert_nil @anonymous.id
+ assert_nil @anonymous.email_address
+ assert_nil @anonymous.login
+ end
+
+ test "has no messages" do
+ assert_equal [], @anonymous.messages
+ end
+
+ test "has anonymous service level" do
+ assert @anonymous.effective_service_level.is_a? AnonymousServiceLevel
+ end
+
+end
diff --git a/test/unit/unauthenticated_user_test.rb b/test/unit/unauthenticated_user_test.rb
deleted file mode 100644
index e5fafb8..0000000
--- a/test/unit/unauthenticated_user_test.rb
+++ /dev/null
@@ -1,7 +0,0 @@
-require 'test_helper'
-
-class UnauthenticatedUserTest < ActiveSupport::TestCase
- # test "the truth" do
- # assert true
- # end
-end