forest_liana 1.1.35 → 1.2.1

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: 3f2d2369547c1d1b72d396fbea0f5d06a872c948
4
- data.tar.gz: df3a3148c1c6dc1202cf6910d9b8636297b2aa81
3
+ metadata.gz: b1ac7636dfc1feb757f7c5c1632617b8526c55d8
4
+ data.tar.gz: cdbec10534de350dfe9ab812a2895d637fc089aa
5
5
  SHA512:
6
- metadata.gz: 93172e33ebe7538208e944f6eec7c0c19c024d81a0a5c5ca68956029e3458bca2182d7b57a086d65344615c3c9d0bc2729227279d9f2e33170d13711ea35610f
7
- data.tar.gz: 2b33c39a8b1965709d958f7cc0e88b2aa15bb67f4956c8d7f2215586e06ed17d4b4c7df39433d5f09e4d6e561a1e3f1462c21fbea8d0ca21df4bf7fa6a2aeff4
6
+ metadata.gz: 956f4acbc70dac684dadb23eb47db50e0304fe2846f9b6691c3d1b7e32f708102a3ec226db8b4215756fdaa29a8be4116cbc5a543f8c4aed17620c00787a2a5b
7
+ data.tar.gz: dcb47a3daa227866faa6b6fd2529952c0974f8bd916a03ffe44cc45a5dcb5d67a55108589ec06aa18add6504a51291fe8b5b24e4a4ce8f185ae75e179e4a0fef
@@ -32,9 +32,15 @@ module ForestLiana
32
32
 
33
33
  def authenticate_user_from_jwt
34
34
  if request.headers['Authorization']
35
- @jwt_decoded_token = JWT.decode(
36
- request.headers['Authorization'].split[1],
37
- ForestLiana.jwt_signing_key).try(:first)
35
+ begin
36
+ token = request.headers['Authorization'].split.second
37
+ @jwt_decoded_token = JWT.decode(token, ForestLiana.auth_key, true, {
38
+ algorithm: 'HS256',
39
+ leeway: 30
40
+ }).try(:first)
41
+ rescue JWT::ExpiredSignature, JWT::VerificationError
42
+ render json: { error: 'expired_token' }, status: 401
43
+ end
38
44
  else
39
45
  render nothing: true, status: 401
40
46
  end
@@ -0,0 +1,37 @@
1
+ module ForestLiana
2
+ class SessionsController < ActionController::Base
3
+
4
+ def create
5
+ user = ForestLiana.allowed_users.find do |allowed_user|
6
+ allowed_user['email'] == params['email'] &&
7
+ BCrypt::Password.new(allowed_user['password']) == params['password']
8
+ end
9
+
10
+ if user
11
+ token = JWT.encode({
12
+ exp: Time.now.to_i + 2.weeks.to_i,
13
+ data: serialized_user(user)
14
+ } , ForestLiana.auth_key, 'HS256')
15
+
16
+ render json: { token: token }
17
+ else
18
+ render nothing: true, status: 401
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def serialized_user(user)
25
+ {
26
+ type: 'users',
27
+ id: user[:id],
28
+ data: {
29
+ email: user[:email],
30
+ first_name: user[:'first-name'] ,
31
+ last_name: user[:'last-name']
32
+ }
33
+ }
34
+ end
35
+
36
+ end
37
+ end
@@ -3,13 +3,13 @@ module ForestLiana
3
3
  before_filter :find_resource
4
4
 
5
5
  def show
6
- case stat_params[:type].try(:downcase)
6
+ case params[:type].try(:downcase)
7
7
  when 'value'
8
- stat = ValueStatGetter.new(@resource, stat_params)
8
+ stat = ValueStatGetter.new(@resource, params)
9
9
  when 'pie'
10
- stat = PieStatGetter.new(@resource, stat_params)
10
+ stat = PieStatGetter.new(@resource, params)
11
11
  when 'line'
12
- stat = LineStatGetter.new(@resource, stat_params)
12
+ stat = LineStatGetter.new(@resource, params)
13
13
  end
14
14
 
15
15
  stat.perform
@@ -29,18 +29,6 @@ module ForestLiana
29
29
  render json: {status: 404}, status: :not_found
30
30
  end
31
31
  end
32
-
33
- def stat_params
34
- # Avoid to warn/crash if there's no filters.
35
- params[:stat].delete(:filters) if params[:stat][:filters].blank?
36
-
37
- params.require(:stat).permit(:type, :collection, :aggregate, :time_range,
38
- :aggregate_field, :group_by_field,
39
- :group_by_date_field, :filters => [
40
- :field, :value
41
- ])
42
- end
43
-
44
32
  end
45
33
  end
46
34
 
@@ -0,0 +1,33 @@
1
+ module ForestLiana
2
+ class SessionSerializer
3
+ include JSONAPI::Serializer
4
+
5
+ attribute :first_name
6
+ attribute :last_name
7
+ attribute :email
8
+
9
+ def type
10
+ 'users'
11
+ end
12
+
13
+ def format_name(attribute_name)
14
+ attribute_name.to_s
15
+ end
16
+
17
+ def unformat_name(attribute_name)
18
+ attribute_name.to_s.underscore
19
+ end
20
+
21
+ def self_link
22
+ nil
23
+ end
24
+
25
+ def relationship_self_link(attribute_name)
26
+ nil
27
+ end
28
+
29
+ def relationship_related_link(attribute_name)
30
+ nil
31
+ end
32
+ end
33
+ end
@@ -2,21 +2,20 @@ require 'jwt'
2
2
 
3
3
  class ForestLiana::ActivityLogger
4
4
 
5
- def perform(user, action, collection_name, resource_id)
6
- token = JWT.encode({}, ForestLiana.jwt_signing_key, 'HS256')
7
- uri = URI.parse("#{forest_url}/api/projects/#{project_id(user)}/activity-logs")
5
+ def perform(session, action, collection_name, resource_id)
6
+ uri = URI.parse("#{forest_url}/api/activity-logs")
8
7
  http = Net::HTTP.new(uri.host, uri.port)
9
8
  http.use_ssl = true if forest_url.start_with?('https')
10
9
 
11
10
  http.start do |client|
12
11
  request = Net::HTTP::Post.new(uri.path)
13
- request['Content-Type'] = 'application/json'
14
- request['Authorization'] = "Bearer #{token}"
12
+ request['Content-Type'] = 'application/vnd.api+json'
13
+ request['forest-secret-key'] = ForestLiana.secret_key
15
14
  request.body = {
16
- session: user['session'],
17
15
  action: action,
18
16
  collection: collection_name,
19
- resource: resource_id
17
+ resource: resource_id,
18
+ user: session['data']['id']
20
19
  }.to_json
21
20
 
22
21
  client.request(request)
@@ -25,10 +24,6 @@ class ForestLiana::ActivityLogger
25
24
 
26
25
  private
27
26
 
28
- def project_id(user)
29
- user['session']['data']['relationships']['project']['data']['id'];
30
- end
31
-
32
27
  def forest_url
33
28
  ENV['FOREST_URL'] || 'https://forestadmin-server.herokuapp.com';
34
29
  end
@@ -17,7 +17,7 @@ module ForestLiana
17
17
  end
18
18
 
19
19
  def count
20
- @records.to_a.count
20
+ search_query.count
21
21
  end
22
22
 
23
23
  private
data/config/routes.rb CHANGED
@@ -1,4 +1,7 @@
1
1
  ForestLiana::Engine.routes.draw do
2
+ # Login
3
+ post 'sessions' => 'sessions#create'
4
+
2
5
  # Stripe Integration
3
6
  get 'stripe_payments' => 'stripe#payments'
4
7
  get ':collection/:id/stripe_payments' => 'stripe#payments'
data/lib/forest_liana.rb CHANGED
@@ -4,8 +4,15 @@ module ForestLiana
4
4
  module UserSpace
5
5
  end
6
6
 
7
- mattr_accessor :jwt_signing_key
7
+ mattr_accessor :secret_key
8
+ mattr_accessor :auth_key
8
9
  mattr_accessor :integrations
9
10
  mattr_accessor :apimap
11
+ mattr_accessor :allowed_users
12
+
13
+ # Legacy.
14
+ mattr_accessor :jwt_signing_key
15
+
10
16
  self.apimap = []
17
+ self.allowed_users = []
11
18
  end
@@ -4,12 +4,21 @@ module ForestLiana
4
4
  def initialize(app)
5
5
  @app = app
6
6
  @logger = Logger.new(STDOUT)
7
+
8
+ if ForestLiana.jwt_signing_key
9
+ warn "DEPRECATION WARNING: the use of ForestLiana.jwt_signing_key \
10
+ (config/initializers/forest_liana.rb) is deprecated. Use \
11
+ ForestLiana.secret_key and ForestLiana.auth_key instead. \
12
+ More info at: https://github.com/ForestAdmin/forest-rails/releases/tag/1.2.0"
13
+ ForestLiana.secret_key = ForestLiana.jwt_signing_key
14
+ ForestLiana.auth_key = ForestLiana.jwt_signing_key
15
+ end
7
16
  end
8
17
 
9
18
  def perform
10
19
  create_serializers
11
20
 
12
- if ForestLiana.jwt_signing_key
21
+ if ForestLiana.secret_key
13
22
  create_apimap
14
23
  send_apimap
15
24
  end
@@ -61,12 +70,18 @@ module ForestLiana
61
70
  request = Net::HTTP::Post.new(uri.path)
62
71
  request.body = json.to_json
63
72
  request['Content-Type'] = 'application/json'
64
- request['forest-secret-key'] = ForestLiana.jwt_signing_key
73
+ request['forest-secret-key'] = ForestLiana.secret_key
65
74
  response = client.request(request)
66
75
 
67
76
  if response.is_a?(Net::HTTPNotFound)
68
77
  @logger.warn "Forest cannot find your project secret key. " \
69
78
  "Please, run `rails g forest_liana:install`."
79
+ else
80
+ ForestLiana.allowed_users = JSON.parse(response.body)['data'].map do |d|
81
+ user = d['attributes']
82
+ user['id'] = d['id']
83
+ user
84
+ end
70
85
  end
71
86
  end
72
87
  end
@@ -5,6 +5,8 @@ require 'groupdate'
5
5
  require 'net/http'
6
6
  require 'intercom'
7
7
  require 'useragent'
8
+ require 'jwt'
9
+ require 'bcrypt'
8
10
  require_relative 'bootstraper'
9
11
 
10
12
  module ForestLiana
@@ -1,3 +1,3 @@
1
1
  module ForestLiana
2
- VERSION = "1.1.35"
2
+ VERSION = "1.2.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: forest_liana
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.35
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sandro Munda
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-16 00:00:00.000000000 Z
11
+ date: 2016-03-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -136,6 +136,20 @@ dependencies:
136
136
  - - ">="
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: bcrypt
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
139
153
  description: Forest Rails Liana
140
154
  email:
141
155
  - sandro@munda.me
@@ -154,6 +168,7 @@ files:
154
168
  - app/controllers/forest_liana/associations_controller.rb
155
169
  - app/controllers/forest_liana/intercom_controller.rb
156
170
  - app/controllers/forest_liana/resources_controller.rb
171
+ - app/controllers/forest_liana/sessions_controller.rb
157
172
  - app/controllers/forest_liana/stats_controller.rb
158
173
  - app/controllers/forest_liana/stripe_controller.rb
159
174
  - app/deserializers/forest_liana/resource_deserializer.rb
@@ -166,6 +181,7 @@ files:
166
181
  - app/serializers/forest_liana/intercom_attribute_serializer.rb
167
182
  - app/serializers/forest_liana/intercom_conversation_serializer.rb
168
183
  - app/serializers/forest_liana/serializer_factory.rb
184
+ - app/serializers/forest_liana/session_serializer.rb
169
185
  - app/serializers/forest_liana/stat_serializer.rb
170
186
  - app/serializers/forest_liana/stripe_card_serializer.rb
171
187
  - app/serializers/forest_liana/stripe_invoice_serializer.rb