kaui 0.7.2 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +1 -2
- data/Gemfile.lock +59 -38
- data/README.md +12 -9
- data/Rakefile +9 -0
- data/{lib/generators/kaui/install/templates/app/assets/javascripts/kaui/all.js → app/assets/javascripts/application.js} +2 -5
- data/{lib/generators/kaui/install/templates/app/assets/stylesheets/kaui/all.css → app/assets/stylesheets/application.css} +0 -4
- data/app/assets/stylesheets/bootstrap_and_overrides.css +7 -0
- data/app/controllers/kaui/admin_allowed_users_controller.rb +48 -0
- data/app/controllers/kaui/admin_tenants_controller.rb +97 -0
- data/app/controllers/kaui/engine_controller.rb +28 -31
- data/app/controllers/kaui/engine_controller_util.rb +33 -0
- data/app/controllers/kaui/login_proxy_controller.rb +11 -0
- data/app/controllers/kaui/sessions_controller.rb +12 -0
- data/app/controllers/kaui/tenants_controller.rb +60 -0
- data/app/models/kaui/ability.rb +20 -3
- data/app/models/kaui/admin_tenant.rb +10 -0
- data/app/models/kaui/allowed_user.rb +8 -0
- data/app/models/kaui/allowed_user_tenant.rb +6 -0
- data/app/models/kaui/killbill_authenticatable.rb +5 -18
- data/app/models/kaui/tenant.rb +13 -0
- data/app/models/kaui/user.rb +14 -16
- data/app/views/kaui/admin_allowed_users/index.html.erb +23 -0
- data/app/views/kaui/admin_allowed_users/new.html.erb +22 -0
- data/app/views/kaui/admin_allowed_users/show.html.erb +53 -0
- data/app/views/kaui/admin_tenants/index.html.erb +25 -0
- data/app/views/kaui/admin_tenants/new.html.erb +32 -0
- data/app/views/kaui/admin_tenants/show.html.erb +68 -0
- data/app/views/kaui/invoices/show.html.erb +1 -1
- data/app/views/kaui/tenants/index.html.erb +17 -0
- data/config/initializers/killbill_authenticatable.rb +3 -5
- data/config/locales/en.bootstrap.yml +18 -0
- data/config/routes.rb +27 -1
- data/config/symmetric-encryption.yml +135 -0
- data/db/ddl.sql +33 -2
- data/db/migrate/20130812155313_devise_create_kaui_users.rb +1 -3
- data/db/migrate/20150109214021_create_kaui_tenants.rb +12 -0
- data/db/migrate/20150112232813_create_kaui_allowed_users.rb +19 -0
- data/kaui.gemspec +5 -3
- data/lib/kaui.rb +49 -1
- data/lib/kaui/version.rb +1 -1
- data/test/dummy/config/application.rb +3 -0
- data/test/dummy/config/database.yml +9 -0
- data/test/dummy/config/environments/development.rb +2 -2
- data/test/dummy/config/initializers/killbill_client.rb +2 -0
- data/test/dummy/config/symmetric-encryption.yml +135 -0
- data/test/dummy/db/migrate/{20130819152643_devise_create_kaui_users.kaui.rb → 20150116052157_devise_create_kaui_users.kaui.rb} +1 -3
- data/test/dummy/db/migrate/20150116052158_create_kaui_tenants.kaui.rb +13 -0
- data/test/dummy/db/migrate/20150116052159_create_kaui_allowed_users.kaui.rb +20 -0
- data/test/dummy/db/schema.rb +29 -3
- data/test/functional/kaui/admin_allowed_users_controller_test.rb +30 -0
- data/test/functional/kaui/admin_tenants_controller_test.rb +35 -0
- data/test/functional/kaui/functional_test_helper.rb +2 -50
- data/test/functional/kaui/functional_test_helper_nosetup.rb +53 -0
- data/test/functional/kaui/invoices_controller_test.rb +22 -0
- data/test/functional/kaui/tenants_controller_test.rb +60 -0
- data/test/integration/kaui/integration_test_helper.rb +2 -0
- data/test/integration/kaui/navigation_test.rb +1 -2
- data/test/killbill_test_helper.rb +46 -4
- data/test/test_helper.rb +1 -0
- data/test/unit/helpers/kaui/admin_allowed_users_helper_test.rb +6 -0
- data/test/unit/helpers/kaui/admin_tenants_helper_test.rb +6 -0
- data/test/unit/helpers/kaui/tenants_helper_test.rb +6 -0
- data/test/unit/kaui/allowed_user_test.rb +34 -0
- data/test/unit/kaui/tenant_test.rb +19 -0
- data/vendor/assets/javascripts/jquery.dataTables.min.js +155 -0
- metadata +86 -21
- data/app/assets/javascripts/kaui/analytics.js +0 -71
- data/app/assets/stylesheets/kaui/analytics.css +0 -30
- data/test/dummy/app/assets/javascripts/application.js +0 -21
- data/test/dummy/app/assets/stylesheets/application.css +0 -15
- data/test/dummy/app/views/layouts/application.html.erb +0 -48
- data/vendor/assets/javascripts/js/bootstrap-datepicker.cd46d38.js +0 -1211
- data/vendor/assets/javascripts/js/bootstrap.v2.2.1.min.js +0 -6
- data/vendor/assets/javascripts/js/jquery.dataTables.v1.9.3.min.js +0 -156
@@ -0,0 +1,25 @@
|
|
1
|
+
<% if can? :view, Kaui::AdminTenant %>
|
2
|
+
<% unless @tenants.empty? %>
|
3
|
+
<table id="tenants-table" class="table table-condensed">
|
4
|
+
<thead>
|
5
|
+
<tr>
|
6
|
+
<th>Name</th>
|
7
|
+
<th>Tenant Id</th>
|
8
|
+
<th>Api Key</th>
|
9
|
+
</tr>
|
10
|
+
</thead>
|
11
|
+
<tbody>
|
12
|
+
<% @tenants.each do |t| %>
|
13
|
+
<tr>
|
14
|
+
<td><%= link_to t.name, admin_tenant_path(t.id) %></td>
|
15
|
+
<td><%= t.kb_tenant_id %></td>
|
16
|
+
<td><%= t.api_key %></td>
|
17
|
+
</tr>
|
18
|
+
<% end %>
|
19
|
+
</tbody>
|
20
|
+
</table>
|
21
|
+
<% end %>
|
22
|
+
<% end %>
|
23
|
+
<% if can? :create, Kaui::AdminTenant %>
|
24
|
+
<h3><%= link_to 'Configure a New Tenant', new_admin_tenant_path %></h3>
|
25
|
+
<% end %>
|
@@ -0,0 +1,32 @@
|
|
1
|
+
<% if can? :create, Kaui::AdminTenant %>
|
2
|
+
<%= form_for @tenant, url: admin_tenants_path, :html => {:class => 'form-horizontal'} do |f| %>
|
3
|
+
<fieldset>
|
4
|
+
|
5
|
+
<div class="control-group">
|
6
|
+
<%= f.label :name, 'Name', :class => 'control-label' %>
|
7
|
+
<div class="controls">
|
8
|
+
<%= f.text_field :name, :class => 'input-small', :required => true %>
|
9
|
+
</div>
|
10
|
+
</div>
|
11
|
+
|
12
|
+
|
13
|
+
<div class="control-group">
|
14
|
+
<%= f.label :api_key, 'API Key', :class => 'control-label' %>
|
15
|
+
<div class="controls">
|
16
|
+
<%= f.text_field :api_key, :class => 'input-small', :required => true %>
|
17
|
+
</div>
|
18
|
+
</div>
|
19
|
+
|
20
|
+
<div class="control-group">
|
21
|
+
<%= f.label :api_secret, 'API Secret', :class => 'control-label' %>
|
22
|
+
<div class="controls">
|
23
|
+
<%= f.password_field :api_secret, :class => 'input-small', :required => true %>
|
24
|
+
</div>
|
25
|
+
</div>
|
26
|
+
|
27
|
+
<div class="form-actions">
|
28
|
+
<%= button_tag 'Configure a new Tenant', :class => 'btn btn-primary' %>
|
29
|
+
</div>
|
30
|
+
</fieldset>
|
31
|
+
<% end %>
|
32
|
+
<% end %>
|
@@ -0,0 +1,68 @@
|
|
1
|
+
<% if can? :view, Kaui::AdminTenant %>
|
2
|
+
<dl class="dl-horizontal">
|
3
|
+
<dt>Name:</dt>
|
4
|
+
<dd><%= @tenant.name %> </dd>
|
5
|
+
<dt>Tenant ID:</dt>
|
6
|
+
<dd><%= @tenant.kb_tenant_id %> </dd>
|
7
|
+
<dt>API Key:</dt>
|
8
|
+
<dd><%= @tenant.api_key %> </dd>
|
9
|
+
</dl>
|
10
|
+
|
11
|
+
<% unless @tenant.kaui_allowed_users.empty? %>
|
12
|
+
<h3>Allowed Users:</h3>
|
13
|
+
<table id="allowed-users-for-tenant-table" class="table table-condensed">
|
14
|
+
<thead>
|
15
|
+
<tr>
|
16
|
+
<th>Name</th>
|
17
|
+
<th>Description</th>
|
18
|
+
</tr>
|
19
|
+
</thead>
|
20
|
+
<tbody>
|
21
|
+
<% @tenant.kaui_allowed_users.each do |u| %>
|
22
|
+
<tr>
|
23
|
+
<td><%= link_to u.kb_username, admin_allowed_user_path(u.id) %></td>
|
24
|
+
<td><%= u.description %></td>
|
25
|
+
<td>
|
26
|
+
<button type="button" class="btn btn-default btn-sm" id="<%= "allowed-user-remove-#{u.id}" %>">
|
27
|
+
<span class="icon-remove"></span>
|
28
|
+
</button>
|
29
|
+
</td>
|
30
|
+
</tr>
|
31
|
+
<% end %>
|
32
|
+
</tbody>
|
33
|
+
</table>
|
34
|
+
<% end %>
|
35
|
+
<% end %>
|
36
|
+
<% if can? :config_upload, Kaui::AdminTenant %>
|
37
|
+
<%= form_tag({action: :upload_catalog}, method: 'post', multipart: true) do %>
|
38
|
+
|
39
|
+
<%= hidden_field_tag(:id, @tenant.id) %>
|
40
|
+
|
41
|
+
<div class="control-group">
|
42
|
+
<%= label_tag :catalog, 'Tenant Catalog XML', :class => 'control-label' %>
|
43
|
+
<div class="controls">
|
44
|
+
<%= file_field_tag 'catalog' %>
|
45
|
+
</div>
|
46
|
+
</div>
|
47
|
+
<div class="actions">
|
48
|
+
<%= submit_tag 'Upload' %>
|
49
|
+
</div>
|
50
|
+
<% end %>
|
51
|
+
<div class="form-actions">
|
52
|
+
<%= link_to 'Back', :back, :class => 'btn' %>
|
53
|
+
</div>
|
54
|
+
<% end %>
|
55
|
+
|
56
|
+
<%= javascript_tag do %>
|
57
|
+
$(document).ready(function() {
|
58
|
+
$('[id^=allowed-user-remove-]').click(function() {
|
59
|
+
var allowedUser = $(this);
|
60
|
+
$.ajax({ type: "DELETE",
|
61
|
+
url: "<%= remove_allowed_user_path :format => :json %>",
|
62
|
+
data: { allowed_user: { id: this['id'].split('-')[3] }, id: <%= @tenant.id %>},
|
63
|
+
success: function(data) { allowedUser.parent().parent().hide(); return false; },
|
64
|
+
error: function(request, textStatus, errorThrown) { console.log("AJAX FAILED!!!! request.status " + request.status + ", textStatus = " + textStatus); return false; }
|
65
|
+
});
|
66
|
+
});
|
67
|
+
});
|
68
|
+
<% end %>
|
@@ -57,7 +57,7 @@
|
|
57
57
|
<td onClick="hightlightLinkedItems('<%= item.invoice_item_id %>', '<%= item.linked_invoice_item_id %>'); return false;"><%= item.description %></td>
|
58
58
|
<td onClick="hightlightLinkedItems('<%= item.invoice_item_id %>', '<%= item.linked_invoice_item_id %>'); return false;"><%= item.start_date.html_safe if item.start_date %></td>
|
59
59
|
<td onClick="hightlightLinkedItems('<%= item.invoice_item_id %>', '<%= item.linked_invoice_item_id %>'); return false;"><%= item.end_date.html_safe if item.end_date %></td>
|
60
|
-
<td onClick="hightlightLinkedItems('<%= item.invoice_item_id %>', '<%= item.linked_invoice_item_id %>'); return false;"><%= format_date(sub.charged_through_date, @account.
|
60
|
+
<td onClick="hightlightLinkedItems('<%= item.invoice_item_id %>', '<%= item.linked_invoice_item_id %>'); return false;"><%= format_date(sub.charged_through_date, @account.time_zone).html_safe if sub.present? %></td>
|
61
61
|
<td onClick="hightlightLinkedItems('<%= item.invoice_item_id %>', '<%= item.linked_invoice_item_id %>'); return false;"><%= sub.price_list.downcase.capitalize if sub.present? and sub.price_list.present? %></td>
|
62
62
|
<td onClick="hightlightLinkedItems('<%= item.invoice_item_id %>', '<%= item.linked_invoice_item_id %>'); return false;"><%= humanized_money_with_symbol Kaui::InvoiceItem.amount_to_money(item) %> (<%= item.currency %>)</td>
|
63
63
|
<td onClick="hightlightLinkedItems('<%= item.invoice_item_id %>', '<%= item.linked_invoice_item_id %>'); return false;"><%= item.audit_logs.map {|log| log.comments}.compact.join('<br/>') if item.audit_logs.present? %></td>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<% unless @tenants.empty? %>
|
2
|
+
<%= form_for(@tenants, :url => {:action => :select_tenant}, :html => {:method => :post, :class => "form-horizontal"}) do |f| %>
|
3
|
+
<fieldset>
|
4
|
+
<div class="control-group">
|
5
|
+
<%= label_tag :tenant_name, "Available Tenants:", :class => "control-label" %>
|
6
|
+
<div class="controls">
|
7
|
+
<%= select_tag :kb_tenant_id, options_for_select(@tenants.map { |t| [t.name, t.kb_tenant_id] }) %>
|
8
|
+
</div>
|
9
|
+
</div>
|
10
|
+
<div class="form-actions">
|
11
|
+
<%= f.submit 'Chose Tenant', :class => 'btn btn-primary' %>
|
12
|
+
<%= link_to 'Back', :back, :class => 'btn' %>
|
13
|
+
</div>
|
14
|
+
|
15
|
+
</fieldset>
|
16
|
+
<% end %>
|
17
|
+
<% end %>
|
@@ -5,18 +5,16 @@ module Devise
|
|
5
5
|
class KillbillAuthenticatable < Authenticatable
|
6
6
|
# Invoked by warden to execute the strategy
|
7
7
|
def authenticate!
|
8
|
+
|
8
9
|
creds = params[:user] || {}
|
9
10
|
kb_username = creds[:kb_username]
|
10
11
|
kb_password = password
|
11
|
-
api_key = creds[:api_key] || KillBillClient.api_key
|
12
|
-
api_secret = creds[:api_password] || KillBillClient.api_secret
|
13
|
-
|
14
12
|
# Find the associated user object
|
15
|
-
resource = valid_password? && mapping.to.find_for_killbill_authentication(kb_username
|
13
|
+
resource = valid_password? && mapping.to.find_for_killbill_authentication(kb_username)
|
16
14
|
return fail(:not_found_in_database) unless resource
|
17
15
|
|
18
16
|
# Validate the credentials
|
19
|
-
if validate(resource){ resource.valid_killbill_password?(kb_username, kb_password
|
17
|
+
if validate(resource){ resource.valid_killbill_password?(kb_username, kb_password) }
|
20
18
|
# Create the user if needed
|
21
19
|
resource.after_killbill_authentication
|
22
20
|
# Tell warden to halt the strategy and set the user in the appropriate scope
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# Sample localization file for English. Add more files in this directory for other locales.
|
2
|
+
# See https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
|
3
|
+
|
4
|
+
en:
|
5
|
+
helpers:
|
6
|
+
actions: "Actions"
|
7
|
+
links:
|
8
|
+
back: "Back"
|
9
|
+
cancel: "Cancel"
|
10
|
+
confirm: "Are you sure?"
|
11
|
+
destroy: "Delete"
|
12
|
+
new: "New"
|
13
|
+
edit: "Edit"
|
14
|
+
titles:
|
15
|
+
edit: "Edit %{model}"
|
16
|
+
save: "Save %{model}"
|
17
|
+
new: "New %{model}"
|
18
|
+
delete: "Delete %{model}"
|
data/config/routes.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
Kaui::Engine.routes.draw do
|
2
|
+
|
2
3
|
devise_for :users,
|
3
4
|
:class_name => 'Kaui::User',
|
4
5
|
:module => :devise,
|
5
|
-
:controllers => { :sessions => 'kaui/sessions'
|
6
|
+
:controllers => { :sessions => 'kaui/sessions'}
|
6
7
|
|
7
8
|
resources :tag_definitions
|
8
9
|
|
@@ -103,5 +104,30 @@ Kaui::Engine.routes.draw do
|
|
103
104
|
scope "/custom_fields" do
|
104
105
|
match "/pagination" => "custom_fields#pagination", :via => :get, :as => "custom_fields_pagination"
|
105
106
|
end
|
107
|
+
|
108
|
+
scope "/tenants" do
|
109
|
+
match "/" => "tenants#index", :via => :get, :as => "tenants"
|
110
|
+
match "/select_tenant" => "tenants#select_tenant", :via => :post, :as => "select_tenant"
|
111
|
+
end
|
112
|
+
|
113
|
+
scope "/login_proxy" do
|
114
|
+
match "/check_login" => "login_proxy#check_login", :via => :get, :as => "check_login"
|
115
|
+
end
|
116
|
+
|
117
|
+
scope "/home" do
|
118
|
+
match "/" => "home#index", :via => :get, :as => "home"
|
119
|
+
end
|
120
|
+
|
121
|
+
resources :admin_tenants, :only => [ :index, :new, :create, :show ]
|
122
|
+
scope "/admin_tenants" do
|
123
|
+
match "/upload_catalog" => "admin_tenants#upload_catalog", :via => :post, :as => "admin_tenant_upload_catalog"
|
124
|
+
match "/remove_allowed_user" => "admin_tenants#remove_allowed_user", :via => :delete, :as => "remove_allowed_user"
|
125
|
+
end
|
126
|
+
|
127
|
+
resources :admin_allowed_users, :only => [ :index, :new, :create, :show ]
|
128
|
+
scope "/admin_allowed_users" do
|
129
|
+
match "/add_tenant" => "admin_allowed_users#add_tenant", :via => :post, :as => "add_tenant"
|
130
|
+
end
|
131
|
+
|
106
132
|
resources :custom_fields, :only => [ :create, :new, :index, :show ]
|
107
133
|
end
|
@@ -0,0 +1,135 @@
|
|
1
|
+
#
|
2
|
+
# Symmetric Encryption for Ruby
|
3
|
+
#
|
4
|
+
---
|
5
|
+
# For the development and test environments the test symmetric encryption keys
|
6
|
+
# can be placed directly in the source code.
|
7
|
+
# And therefore no RSA private key is required
|
8
|
+
development: &development_defaults
|
9
|
+
key: 1234567890ABCDEF1234567890ABCDEF
|
10
|
+
iv: 1234567890ABCDEF
|
11
|
+
cipher_name: aes-128-cbc
|
12
|
+
encoding: :base64strict
|
13
|
+
private_rsa_key: |
|
14
|
+
-----BEGIN RSA PRIVATE KEY-----
|
15
|
+
MIIEpAIBAAKCAQEAxfbNAn6fc+poM/5mZwpDqO/fD064jcb5HNnCMm0AgXE75nU4
|
16
|
+
J2zrDbLj9bmKTHNdhYiwTCPsnZ9Ngtz4VmBRHkmirA6cclMesWXUHlqfHyCvvEYj
|
17
|
+
bhVMwOu/t07wPzFH7/f2HQLEX4IlwyNvJyq+AMLHVRCbMMfYCUDIEhUlsGxKQryq
|
18
|
+
yk+ga24EMPBLdSf1g1oas9dy7qDtK+91Bh1k7Oo7CrkisRQ70t1Cz+paQSJVZXxv
|
19
|
+
MBP6B8eXReB9YLOaIdsKoqEZ6Z0SEFr3xxudiB4ReYB9qqKeTDV0/VLf2m6TmnUr
|
20
|
+
ZImLJbi/bAxbcU3h9J4sq5Ma+l1t0gsmO0mlbQIDAQABAoIBAAU5AqWbM5e6Sm98
|
21
|
+
ubTkN27AjVD5EbNj2XSiZhYwe//uPddRpl6b6AOfgZYdBAIKVSBNv+DyXa624jOe
|
22
|
+
osqcledHqAwEAqqdeMTTW+pFF8eZdClybELeOv0n+xHZ+kqggTZag1q2lPm0FEz2
|
23
|
+
pVsSLJsWiG29F2sNCq0L0XtwpWLnHJO0U0dUjVtspDpAnQkl+l8WiTJkY0uf+L8z
|
24
|
+
iY6VDtNhf+Cc2TyOnB51nArHQfVt6pSahn8UB7gnjoPBjEPSlSj68XwjNLViFj94
|
25
|
+
NeXdrOQ/kjlsJcuX06jfUulHOlFP+uOft3m/q+8OC0uQm4EmcJ9p+m8E6z5ypUDp
|
26
|
+
kHi7swECgYEA74mktO2725fON43HpHG/fNglTPqlDUdoqUlDg7ovaDiaL+FlnhOb
|
27
|
+
7vUBfJ5FjWkeO6Teg0ElOA03sOAq29ql91kaweSEbSkRb5HLVGo7m3FTKfi8rTpe
|
28
|
+
QufQDjt8kvnAtNSlXQexG3BJpondbMF4hYZSTtGPjkM0MQOqkByUZC0CgYEA05G5
|
29
|
+
M/NnZXpXvpZNCHlDht98bHUAZfKLRe7FTAqLBWAEWG70x8aBhzFn6kOD0jhsVcnt
|
30
|
+
3EwiUD1MIuiWYvyGmwBoRCQGVxW2LuxbBYRSpPgTPKPM9juc3GYs36KTSbA3+44y
|
31
|
+
2Fys8/gQusYQ3YwomxU4ygL5lyxxY14sQ3UAzkECgYEAhjRJ8YyYicmdogZvajTI
|
32
|
+
oju/ekebnbr6ao4/o1f3I59C07ym4FAAN3tRn+5U7YuNgsE2YbdoEOVm5FRT7uWr
|
33
|
+
ws9LbIKJp1cxC59VmjACwW5Wt9dCbpObKEUUjkTJ4NbJHwdctqiOk97vhL0NL9ed
|
34
|
+
nMHK75n9oikI3sU9FIzOnukCgYEAz9FpgZ1K6EQ3om9S9crfyMEIICUBoiKQKb5z
|
35
|
+
sND+Y+Y//nnnGcFkhF7EezmcZ8eiqtYyPl3OqtC7U+LxrgPtWJ4azSwxyiL6lLb4
|
36
|
+
Zb/nykIf60Xe09QUre3zkCzKzuw44XF5gkvuW6tFC6H4+RZu4H8FDHHFp3gxXPEp
|
37
|
+
O43Xn8ECgYBzM7yEM0SUE6DI0WGATtuhVRXL3hjgPqf3TzmsQFMEal2Bu14d/d9f
|
38
|
+
zLks8POWjtQcgn2PGvrHS+aJZYR0okue4Ny5bfk+AohClXDtqZnz45wabYrRq6Xg
|
39
|
+
dTi8xJJHVkoRfcQleui6oqRB3i4iGlu5k8T1+djLLiN9eo0PY1VciQ==
|
40
|
+
-----END RSA PRIVATE KEY-----
|
41
|
+
|
42
|
+
test:
|
43
|
+
<<: *development_defaults
|
44
|
+
|
45
|
+
release:
|
46
|
+
# Since the key to encrypt and decrypt with must NOT be stored along with the
|
47
|
+
# source code, we only hold a RSA key that is used to unlock the file
|
48
|
+
# containing the actual symmetric encryption key
|
49
|
+
private_rsa_key: |
|
50
|
+
-----BEGIN RSA PRIVATE KEY-----
|
51
|
+
MIIEpAIBAAKCAQEAxfbNAn6fc+poM/5mZwpDqO/fD064jcb5HNnCMm0AgXE75nU4
|
52
|
+
J2zrDbLj9bmKTHNdhYiwTCPsnZ9Ngtz4VmBRHkmirA6cclMesWXUHlqfHyCvvEYj
|
53
|
+
bhVMwOu/t07wPzFH7/f2HQLEX4IlwyNvJyq+AMLHVRCbMMfYCUDIEhUlsGxKQryq
|
54
|
+
yk+ga24EMPBLdSf1g1oas9dy7qDtK+91Bh1k7Oo7CrkisRQ70t1Cz+paQSJVZXxv
|
55
|
+
MBP6B8eXReB9YLOaIdsKoqEZ6Z0SEFr3xxudiB4ReYB9qqKeTDV0/VLf2m6TmnUr
|
56
|
+
ZImLJbi/bAxbcU3h9J4sq5Ma+l1t0gsmO0mlbQIDAQABAoIBAAU5AqWbM5e6Sm98
|
57
|
+
ubTkN27AjVD5EbNj2XSiZhYwe//uPddRpl6b6AOfgZYdBAIKVSBNv+DyXa624jOe
|
58
|
+
osqcledHqAwEAqqdeMTTW+pFF8eZdClybELeOv0n+xHZ+kqggTZag1q2lPm0FEz2
|
59
|
+
pVsSLJsWiG29F2sNCq0L0XtwpWLnHJO0U0dUjVtspDpAnQkl+l8WiTJkY0uf+L8z
|
60
|
+
iY6VDtNhf+Cc2TyOnB51nArHQfVt6pSahn8UB7gnjoPBjEPSlSj68XwjNLViFj94
|
61
|
+
NeXdrOQ/kjlsJcuX06jfUulHOlFP+uOft3m/q+8OC0uQm4EmcJ9p+m8E6z5ypUDp
|
62
|
+
kHi7swECgYEA74mktO2725fON43HpHG/fNglTPqlDUdoqUlDg7ovaDiaL+FlnhOb
|
63
|
+
7vUBfJ5FjWkeO6Teg0ElOA03sOAq29ql91kaweSEbSkRb5HLVGo7m3FTKfi8rTpe
|
64
|
+
QufQDjt8kvnAtNSlXQexG3BJpondbMF4hYZSTtGPjkM0MQOqkByUZC0CgYEA05G5
|
65
|
+
M/NnZXpXvpZNCHlDht98bHUAZfKLRe7FTAqLBWAEWG70x8aBhzFn6kOD0jhsVcnt
|
66
|
+
3EwiUD1MIuiWYvyGmwBoRCQGVxW2LuxbBYRSpPgTPKPM9juc3GYs36KTSbA3+44y
|
67
|
+
2Fys8/gQusYQ3YwomxU4ygL5lyxxY14sQ3UAzkECgYEAhjRJ8YyYicmdogZvajTI
|
68
|
+
oju/ekebnbr6ao4/o1f3I59C07ym4FAAN3tRn+5U7YuNgsE2YbdoEOVm5FRT7uWr
|
69
|
+
ws9LbIKJp1cxC59VmjACwW5Wt9dCbpObKEUUjkTJ4NbJHwdctqiOk97vhL0NL9ed
|
70
|
+
nMHK75n9oikI3sU9FIzOnukCgYEAz9FpgZ1K6EQ3om9S9crfyMEIICUBoiKQKb5z
|
71
|
+
sND+Y+Y//nnnGcFkhF7EezmcZ8eiqtYyPl3OqtC7U+LxrgPtWJ4azSwxyiL6lLb4
|
72
|
+
Zb/nykIf60Xe09QUre3zkCzKzuw44XF5gkvuW6tFC6H4+RZu4H8FDHHFp3gxXPEp
|
73
|
+
O43Xn8ECgYBzM7yEM0SUE6DI0WGATtuhVRXL3hjgPqf3TzmsQFMEal2Bu14d/d9f
|
74
|
+
zLks8POWjtQcgn2PGvrHS+aJZYR0okue4Ny5bfk+AohClXDtqZnz45wabYrRq6Xg
|
75
|
+
dTi8xJJHVkoRfcQleui6oqRB3i4iGlu5k8T1+djLLiN9eo0PY1VciQ==
|
76
|
+
-----END RSA PRIVATE KEY-----
|
77
|
+
|
78
|
+
|
79
|
+
# List Symmetric Key files in the order of current / latest first
|
80
|
+
ciphers:
|
81
|
+
-
|
82
|
+
# Filename containing Symmetric Encryption Key encrypted using the
|
83
|
+
# RSA public key derived from the private key above
|
84
|
+
key_filename: config/keys/dummy_release.key
|
85
|
+
iv_filename: config/keys/dummy_release.iv
|
86
|
+
cipher_name: aes-256-cbc
|
87
|
+
# Base64 encode encrypted data without newlines
|
88
|
+
encoding: :base64strict
|
89
|
+
version: 1
|
90
|
+
|
91
|
+
production:
|
92
|
+
# Since the key to encrypt and decrypt with must NOT be stored along with the
|
93
|
+
# source code, we only hold a RSA key that is used to unlock the file
|
94
|
+
# containing the actual symmetric encryption key
|
95
|
+
private_rsa_key: |
|
96
|
+
-----BEGIN RSA PRIVATE KEY-----
|
97
|
+
MIIEpAIBAAKCAQEAy6UmlgZFM2f70i5/xINHdxZVbxPRgUrfO643LGUC1gfZVsNn
|
98
|
+
kus5xoAjZKgdlS2o47X8PYFi8gR96NBWPAQYS9M3p6KDbs9Yt+Imcb0LeHCamMin
|
99
|
+
AvhE5QBlf+A13oYY5xOTrwJMq1hSGB8rC3gbZMgSJBbjAiW+zgwzLzjXaphTwulP
|
100
|
+
8/Ht9PucvZE8arxsmvi7dGXr5B3uDZjAeS9qCl9LOMwHtOLeKD8GvKniN0tLUaSA
|
101
|
+
SWgI3z46KonSiYelzAMdhkwP4K5SqUITp9Uv7SVCoPoM7Xm640BnD0MJWxKH6lVi
|
102
|
+
56YJnT5xuIDC4zGwGdZG4dJS0ep1uSX0ZQ2xhwIDAQABAoIBAQCgn8brlk6G2YG6
|
103
|
+
qoqEibeYqrkAP/WDsXaaMDO8hH/UKaS31rCfJYIQm4lPH3sV60nHMgeey6srkXdu
|
104
|
+
ZsVd2S0AwbyoMHrSsCEeCPahx6aAfPCzibCRmxlcNw/X6RUUS1jhCoP2Ci5HCAbY
|
105
|
+
l9zv0vBocZY9eP/c9cCl7OGCYacnn0zZNf8dRZ6qPkOA8ySejPbgzmhQTt1JAJUw
|
106
|
+
2HaWo0tyCu0cE6FL//b+a+gblLc0e/2Y45BSnWbzXtxSfz/jKrpeqU1fW0lHVxd8
|
107
|
+
dFHLcQTvTu/R1JIVmC0RM9ZnsVTObJ8rTfazHYIt7/IsR+gj5E3MZmDJ7PzNv0kl
|
108
|
+
v01Iml0BAoGBAPpicmI3lTuyAwm8e7XXMbC4T7QinLN9XJeTc87EMM/KKFhiVjtr
|
109
|
+
gzcxUH0EqdfSd5bLU8fjW9H/xgQM82QNQzV2+AWY7wn2Lda1AE7xZYIjpBg+awV9
|
110
|
+
kKnRfDf3ThqKl5nmkmOQtYGNKKwn/u1ZTOSlQ1E2BqISdCNhupPhUZehAoGBANA2
|
111
|
+
WuBoU3IPKge/ELREz4GEdYSaHXZ8R3Au1vTXZQIRCUB/GJEoG2SmXxV1YFJMAm0B
|
112
|
+
6/ZkWvhANf1BU4rcVMYuKJwS9XSFIlW0Npq8uMZKP4A8dnw+bz53XZJr5DsaPoWy
|
113
|
+
jm65UC+Tbqg0mZV0mJ5JMKiH5Ezfu03mJUuYmJgnAoGAVcFOB9GdrRpk6/rALCGO
|
114
|
+
BUa7FakdHmR7R/banSCYzzIf61WSzzsdb9PWC1uDiEWva9gr07RNCHmfqld9LPFV
|
115
|
+
6YPbop8kj7bfMEBB4MfQymfGlf8azICbAW6cKtbqyzBYh/9ud+diIwLjwULZjxUc
|
116
|
+
vtrTWYc1cmD7ofqg2nE7bsECgYEAqCtOyTPaOiS/WNRcpI1zYHPhC0IDDAEjHhvm
|
117
|
+
6IjUf4/M/jfpWsyfG3M5Fzbfnnjf+LV1pWO3Cg2qzaum02BUZGFB0ZWKhRtG+Rv+
|
118
|
+
goptX1L26Rdsx7sR1M1KWYolJAt1dj0ax5mLh3G4Dcm2Rr2Oy0HoOCbSIbkPKsL5
|
119
|
+
Wo6cqT8CgYAwMtF9qJYeEJtjgxuRVwlEUzcvxsNiuuUSFq9RpAXYL+F2U/P0SdQw
|
120
|
+
06nf1JLvkcG2CyMbIB62BnQcuUyGAuhjtbpcsSn4MG00vfDNMPkaxOJ9W4S3mmnt
|
121
|
+
U2mXWYauJDvNdLEr42bVX3bTPTfR4zrIqe+oJJCH61Jcu/3ekpSkkA==
|
122
|
+
-----END RSA PRIVATE KEY-----
|
123
|
+
|
124
|
+
|
125
|
+
# List Symmetric Key files in the order of current / latest first
|
126
|
+
ciphers:
|
127
|
+
-
|
128
|
+
# Filename containing Symmetric Encryption Key encrypted using the
|
129
|
+
# RSA public key derived from the private key above
|
130
|
+
key_filename: config/keys/dummy_production.key
|
131
|
+
iv_filename: config/keys/dummy_production.iv
|
132
|
+
cipher_name: aes-256-cbc
|
133
|
+
# Base64 encode encrypted data without newlines
|
134
|
+
encoding: :base64strict
|
135
|
+
version: 1
|
data/db/ddl.sql
CHANGED
@@ -1,10 +1,41 @@
|
|
1
1
|
CREATE TABLE `kaui_users` (
|
2
2
|
`id` int(11) NOT NULL AUTO_INCREMENT,
|
3
|
-
`kb_tenant_id` varchar(255) DEFAULT NULL,
|
4
3
|
`kb_username` varchar(255) NOT NULL,
|
5
4
|
`kb_session_id` varchar(255) DEFAULT NULL,
|
6
5
|
`created_at` datetime NOT NULL,
|
7
6
|
`updated_at` datetime NOT NULL,
|
8
7
|
PRIMARY KEY (`id`),
|
9
|
-
UNIQUE KEY `
|
8
|
+
UNIQUE KEY `index_kaui_users_on_kb_username` (`kb_username`)
|
10
9
|
) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin;
|
10
|
+
|
11
|
+
CREATE TABLE `kaui_tenants` (
|
12
|
+
`id` int(11) NOT NULL AUTO_INCREMENT,
|
13
|
+
`name` varchar(255) DEFAULT NULL,
|
14
|
+
`kb_tenant_id` varchar(255) DEFAULT NULL,
|
15
|
+
`api_key` varchar(255) DEFAULT NULL,
|
16
|
+
`encrypted_api_secret` varchar(255) DEFAULT NULL,
|
17
|
+
`created_at` datetime NOT NULL,
|
18
|
+
`updated_at` datetime NOT NULL,
|
19
|
+
PRIMARY KEY (`id`)
|
20
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
21
|
+
|
22
|
+
CREATE TABLE `kaui_allowed_users` (
|
23
|
+
`id` int(11) NOT NULL AUTO_INCREMENT,
|
24
|
+
`kb_username` varchar(255) DEFAULT NULL,
|
25
|
+
`description` varchar(255) DEFAULT NULL,
|
26
|
+
`created_at` datetime NOT NULL,
|
27
|
+
`updated_at` datetime NOT NULL,
|
28
|
+
PRIMARY KEY (`id`),
|
29
|
+
KEY `kaui_allowed_users_idx` (`kb_username`)
|
30
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
31
|
+
|
32
|
+
CREATE TABLE `kaui_allowed_user_tenants` (
|
33
|
+
`id` int(11) NOT NULL AUTO_INCREMENT,
|
34
|
+
`kaui_allowed_user_id` int(11) DEFAULT NULL,
|
35
|
+
`kaui_tenant_id` int(11) DEFAULT NULL,
|
36
|
+
`created_at` datetime NOT NULL,
|
37
|
+
`updated_at` datetime NOT NULL,
|
38
|
+
PRIMARY KEY (`id`),
|
39
|
+
UNIQUE KEY `kaui_allowed_users_tenants_uniq` (`kaui_allowed_user_id`,`kaui_tenant_id`)
|
40
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
41
|
+
|
@@ -2,13 +2,11 @@ class DeviseCreateKauiUsers < ActiveRecord::Migration
|
|
2
2
|
def change
|
3
3
|
create_table(:kaui_users) do |t|
|
4
4
|
# From Kill Bill
|
5
|
-
t.string :kb_tenant_id, :null => true
|
6
5
|
t.string :kb_username, :null => false
|
7
6
|
t.string :kb_session_id, :null => true
|
8
|
-
|
9
7
|
t.timestamps
|
10
8
|
end
|
11
9
|
|
12
|
-
add_index :kaui_users, [:
|
10
|
+
add_index :kaui_users, [:kb_username], :unique => true
|
13
11
|
end
|
14
12
|
end
|