cyclid-ui 0.2.4 → 0.2.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cd6a99f9802100c3fe15f93e3803c624106d7c62
4
- data.tar.gz: 83257bb0735724017e9f6f6276e34a359ecd9d72
3
+ metadata.gz: 858197a4f94db4bbeb1e4960410c1fda2605918e
4
+ data.tar.gz: 7d97dd2d8908244cfd2243d0e180f4fa4818c72d
5
5
  SHA512:
6
- metadata.gz: 3d0377e09d764eaa4faca71fbc86667d25f854581bf3c7866392f17d81c97531fe5d760b81a5c0e6cc258b82d28cb42e01bcc328d8c1ea3e9be003285063848e
7
- data.tar.gz: e547570fe202d684e48be60f3dc36f79835c18c76c89f192bc54c76f3ac5ff18da8ad03cd337ec42b9904afecc43bba6105ef03cf1a93f8230b7dba32dad9c5e
6
+ metadata.gz: 448e078b6f05216fb65078bdd758b4ebf430b9a7851a659f194fccc03c90ab757f66566aceba5cc232c22e611ed791fffb0176e61575e460db313190ff347bd8
7
+ data.tar.gz: 7af9088a91c768294cc16a41840f60dcd30faf40bb79f0915bc047fe0258c9a3b819234ef4010b50b4e3aea3e0dc0bdc89f3a333da398b2e65181cd89bb3fc91
@@ -55,16 +55,24 @@ module Cyclid
55
55
  # Sinatra application
56
56
  class App < Sinatra::Application
57
57
  use Rack::Deflater
58
- use Rack::Session::Pool,
58
+ use Rack::Session::Cookie,
59
59
  expire_after: 31_557_600,
60
- secret: ENV['COOKIE_SECRET'] || '8f54749dcb0ae0843cdd9669b797d311'
60
+ secret: ENV['COOKIE_SECRET'] || '8f54749dcb0ae0843cdd9669b797d311',
61
+ domain: Cyclid.config.domain
61
62
  use Rack::Csrf,
62
63
  raise: true,
63
64
  skip: ['POST:/login',
64
- 'POST:/unauthenticated']
65
+ 'POST:/unauthenticated',
66
+ 'POST:/user/.*/invalidate']
65
67
 
66
68
  helpers Helpers
67
69
 
70
+ if production?
71
+ error do
72
+ redirect to '/'
73
+ end
74
+ end
75
+
68
76
  register Sinatra::Flash
69
77
 
70
78
  configure do
@@ -145,6 +153,11 @@ module Cyclid
145
153
  use Controllers::User
146
154
  use Controllers::Health
147
155
  use Controllers::Default
156
+
157
+ # Catch-all route
158
+ get '*' do
159
+ redirect to '/'
160
+ end
148
161
  end
149
162
  end
150
163
  end
@@ -20,7 +20,7 @@ module Cyclid
20
20
  module UI
21
21
  # Cyclid UI configuration
22
22
  class Config
23
- attr_reader :memcached, :log, :server_api, :client_api, :signup
23
+ attr_reader :memcached, :log, :server_api, :client_api, :signup, :domain
24
24
 
25
25
  def initialize(path)
26
26
  # Try to load the configuration file. If it can't be loaded, we'll
@@ -58,6 +58,9 @@ module Cyclid
58
58
 
59
59
  # URL of the signup link, if one is defined
60
60
  @signup = manage['signup'] || nil
61
+
62
+ # Our domain; used when setting cookies
63
+ @domain = manage['domain'] || nil
61
64
  rescue StandardError => ex
62
65
  abort "Failed to load configuration file #{path}: #{ex}"
63
66
  end
@@ -65,6 +65,7 @@ module Cyclid
65
65
  response.set_cookie('cyclid.token',
66
66
  value: token_data['token'],
67
67
  expires: Time.now + 21_600_000, # +6 hours
68
+ domain: Cyclid.config.domain,
68
69
  path: '/',
69
70
  http_only: false) # Must be available for AJAX
70
71
 
@@ -13,11 +13,15 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
+ require 'sinatra/cross_origin'
17
+
16
18
  module Cyclid
17
19
  module UI
18
20
  module Controllers
19
21
  # Sinatra controller for user related endpoints
20
22
  class User < Base
23
+ register Sinatra::CrossOrigin
24
+
21
25
  get '/user/:username' do
22
26
  authenticate!
23
27
 
@@ -37,6 +41,20 @@ module Cyclid
37
41
  mustache :user
38
42
  end
39
43
 
44
+ post '/user/:username/invalidate' do
45
+ cross_origin
46
+
47
+ username = params[:username]
48
+
49
+ payload = parse_request_body
50
+ token = payload['token']
51
+
52
+ # Ensure the User is removed from Memcached
53
+ Models::User.invalidate(username: username, token: token)
54
+
55
+ 200
56
+ end
57
+
40
58
  get '/user/:username/intro' do
41
59
  authenticate!
42
60
 
@@ -13,6 +13,8 @@
13
13
  # See the License for the specific language governing permissions and
14
14
  # limitations under the License.
15
15
 
16
+ require 'oj'
17
+
16
18
  module Cyclid
17
19
  module UI
18
20
  # Various helper methods for Sinatra controllers
@@ -32,6 +34,31 @@ module Cyclid
32
34
  flash[:login_error] = 'Invalid username or password'
33
35
  halt 401, flash.now[:login_error]
34
36
  end
37
+
38
+ # Safely parse & validate the request body
39
+ def parse_request_body
40
+ # Parse the the request
41
+ begin
42
+ request.body.rewind
43
+
44
+ if request.content_type == 'application/json' or \
45
+ request.content_type == 'text/json'
46
+
47
+ data = Oj.load request.body.read
48
+ else
49
+ halt(415, "unsupported content type #{request.content_type}")
50
+ end
51
+ rescue Oj::ParseError, YAML::Exception => ex
52
+ Cyclid.logger.debug ex.message
53
+ halt(400, ex.message)
54
+ end
55
+
56
+ # Sanity check the request
57
+ halt(400, 'request body can not be empty') if data.nil?
58
+ halt(400, 'request body is invalid') unless data.is_a?(Hash)
59
+
60
+ return data
61
+ end
35
62
  end
36
63
 
37
64
  # Sinatra Warden AuthN/AuthZ helpers
@@ -90,6 +90,20 @@ module Cyclid
90
90
 
91
91
  user_data
92
92
  end
93
+
94
+ def self.invalidate(args)
95
+ username = args[:username] || args['username']
96
+ memcache = Memcache.new(server: Cyclid.config.memcached)
97
+ begin
98
+ user_fetch(args)
99
+ memcache.expire(username)
100
+ rescue Memcached::ServerIsMarkedDead => ex
101
+ Cyclid.logger.fatal "cannot connect to memcached: #{ex}"
102
+ # If Memcache is down there is nothing to expire
103
+ rescue StandardError => ex
104
+ Cyclid.logger.debug "user invalidate failed: #{ex}"
105
+ end
106
+ end
93
107
  end
94
108
  end
95
109
  end
@@ -3,7 +3,7 @@
3
3
  <div class="col-md-8">
4
4
  <h1>Welcome to Cyclid!</h1>
5
5
  <p><span style="font-size:140%;">You currently don't belong to any organizations. Without an organization, you won't be able to run any jobs!</span></p>
6
- <p>You can either <a href="{{signup}}/organization">create a new organization</a>, or ask someone to add you to an existing organization.</p>
6
+ <p>You can either <a href="{{signup}}/manage/{{username}}">create a new organization</a>, or ask someone to add you to an existing organization.</p>
7
7
  <hr>
8
8
  <p>While you're here, there are some useful links which can help you get the most from Cyclid:</p>
9
9
  <ul style="line-height: 1.75;">
@@ -51,7 +51,7 @@
51
51
  {{#organization}}
52
52
  <li role="separator" class="divider"></li>
53
53
  {{/organization}}
54
- <li><a href="{{signup}}/organization" target="_blank">Create a new Organization</a></li>
54
+ <li><a href="{{signup}}/manage/{{username}}" target="_blank">Manage your Organizations</a></li>
55
55
  {{/signup}}
56
56
  </ul>
57
57
  </li>
@@ -24,7 +24,7 @@
24
24
  <dt>Email</dt><dd id="user_email"></dd>
25
25
  <dt>Organizations</dt><dd id="user_org_list"></dd>
26
26
  {{#signup}}
27
- <dd><a href="{{signup}}/organization" target="_blank">Create a new Organization</a></dd>
27
+ <dd><a href="{{signup}}/manage/{{username}}" target="_blank">Manage your Organizations</a></dd>
28
28
  {{/signup}}
29
29
  </div>
30
30
  </div>
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  module Cyclid
3
3
  module UI
4
- VERSION = '0.2.4'
4
+ VERSION = '0.2.5'
5
5
  end
6
6
  end
@@ -179,7 +179,7 @@ function ji_get_failed(xhr) {
179
179
  // the worst (cyclid.token is invalid) and force re-authentication, too.
180
180
  if(xhr.status == 401 || xhr.status == 0){
181
181
  console.log(`Failed to retrieve job list: status was ${xhr.status}`);
182
- window.location = '/login';
182
+ window.location = '/';
183
183
  } else {
184
184
  var failure_message = `<p>
185
185
  <h2>Failed to retrieve job</h2><br>
@@ -76,7 +76,7 @@ function org_job_list_failed(xhr) {
76
76
  // the worst (cyclid.token is invalid) and force re-authentication, too.
77
77
  if(xhr.status == 401 || xhr.status == 0){
78
78
  console.log(`Failed to retrieve job list: status was ${xhr.status}`);
79
- window.location = '/login';
79
+ window.location = '/';
80
80
  } else {
81
81
  var failure_message = `Failed to retrieve job list<br>
82
82
  <strong>${xhr.status}:</strong> ${xhr.responseText}`;
@@ -10,7 +10,7 @@ function user_get_failed(xhr){
10
10
  // the worst (cyclid.token is invalid) and force re-authentication, too.
11
11
  if(xhr.status == 401 || xhr.status == 0){
12
12
  console.log(`Failed to retrieve job list: status was ${xhr.status}`);
13
- window.location = '/login';
13
+ window.location = '/';
14
14
  } else {
15
15
  var failure_message = `Failed to retrieve user details<br>
16
16
  <strong>${xhr.status}:</strong> ${xhr.responseText}`;
@@ -41,7 +41,7 @@ function user_update_details(user){
41
41
  config_org.click(function(e) {
42
42
  var org = $(this).data('org');
43
43
 
44
- var config = `server: ${gblAPIURL}\n` +
44
+ var config = `url: ${gblAPIURL}\n` +
45
45
  `organization: ${org}\n` +
46
46
  `username: ${user.username}\n` +
47
47
  `secret: ${user.secret}\n`;
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cyclid-ui
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.2.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kristian Van Der Vliet
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-02-28 00:00:00.000000000 Z
11
+ date: 2017-05-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: require_all