darjeelink 0.11.6 → 0.12.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 101d088427d0fd6e5b04fa53a26378bdfd9fed124453a44e5aad4cb39947f6dc
4
- data.tar.gz: cb5689ef762aeb83903c6b9ee04c064db7197929291618d23b65d5c9e3d31be8
3
+ metadata.gz: c7381f9e369767b651245ade42dd0b4114696c5968991d5cf418f5662c7d759e
4
+ data.tar.gz: a523d01d431d7038ed2c843cf119fe1c8113100fcc2d1b90542d91f988f30acc
5
5
  SHA512:
6
- metadata.gz: 8a9566e858d942c788fe036aa7a93b57fbf1d03f23e32c94a263dd5cfeacc28518d9e54625c31a6d73d80a7ed5bc7e3d3e739252013c24759f693d7da49ffd09
7
- data.tar.gz: 38009de0300f215621d19087a508b6bc1464e4b2e0648f8a5cc9c2f81950e09698bb8cc789b662db76dd0042f2134f052f2155357373b2f611a98c0eaa6fec2a
6
+ metadata.gz: '097dc36dca7e4067e30d875e266589227e5536bfd235c9f391ea98fcaadc85dbe4542b0dae1adfb75a66f1bad72b9cfb0aa0454e65b099a2a1adba82678c24f1'
7
+ data.tar.gz: e83bc1c62cb18754f26f3891dae9502e9a3f87f0b20f37ac3f5b776a025552b2530e3724d7a35b471eb44d89051a79f3e5488a01f59b4d15d32bf13df9185720
data/README.md CHANGED
@@ -19,17 +19,48 @@ There is a UTM generator, where you can provide:
19
19
  - a campaign identifier
20
20
  And you can get a link with UTM params all filled in, and shortern it with one click.
21
21
 
22
- ## Development
23
- The recommended approach is to use Vagrant. `vagrant up` will create an isolated darjeelink instance
22
+ ## API
23
+ There is an API available to create short links.
24
+ To create a short link via the API:
24
25
 
25
- ### Setup development environment
26
- Run `cp .env.sample spec/dummy/.env.development`
27
- Nothing else required
26
+ First, create an api token `Darjeelink::ApiToken.create!(username: <username>, active: true)`.
27
+ Then grab the token.
28
28
 
29
- ### Setup test environment
30
- Run `cp .env.sample spec/dummy/.env.test`
31
- Change the database url to be different to the development one i.e. `postgres://darjeelink_dbuser:password@localhost/darjeelink-test`
29
+ Next, make a request
30
+ ```
31
+ POST /api
32
+ Authorization => Token token=<username>:<token>
33
+ {
34
+ short_link: {
35
+ url: 'https://www.example.com',
36
+ shortened_path: 'xmpl' (optional)
37
+ }
38
+ }
39
+ ```
40
+ `url` is the absolute URI that you wish to shorten
41
+ `shortened_path` is the path that you will visit to get redirected to your original link. It is optional. If it is not provided one will be generated automatically
32
42
 
43
+ If successful you will get a response like:
44
+ ```
45
+ STATUS 201
46
+ {
47
+ short_link: <shortened_url>
48
+ }
49
+ ```
50
+
51
+ If unsuccessful you will get a response like
52
+ ```
53
+ STATUS 400
54
+ {
55
+ error: "information on what went wrong"
56
+ }
57
+ ```
58
+
59
+ If authorization failed you will get a response like
60
+ ```
61
+ STATUS 401
62
+ {}
63
+ ```
33
64
  ## Installation
34
65
  ### Gemfile
35
66
  Add these lines to your app's Gemfile
@@ -67,7 +98,35 @@ In `config/initializers/darjeelink.rb` edit the `config.source_mediums` hash.
67
98
 
68
99
  Each key is a hyphenated source-medium. If you just want the source then omit the hyphen and medium.
69
100
 
70
- Each value is a slightly more readable version for display
101
+ Each value is a slightly more readable version for display.
102
+
103
+ ## Development
104
+ The recommended approach is to use Vagrant. `vagrant up` will create an isolated darjeelink instance.
105
+ Before you run `vagrant up`, make sure to create `.env.development` & `.env.test` files as detailed below.
106
+
107
+ ### Setup development environment
108
+ Run `cp .env.sample spec/dummy/.env.development`
109
+
110
+ Nothing else required
111
+
112
+ ### Setup test environment
113
+ Run `cp .env.sample spec/dummy/.env.test`
114
+
115
+ Change the database url to be different to the development one i.e. `postgres://darjeelink_dbuser:password@localhost/darjeelink-test`
116
+
117
+ ## Releasing
118
+ Darjeelink follows [Semantic Versioning](https://semver.org)
119
+
120
+ Once all necessary changes have made it in to master and you are ready to do a release you need to do these steps.
121
+
122
+ Note that if you are running in a vagrant VM, most of these steps can be done from within the VM.
123
+
124
+ - Update `lib/darjeelink/version.rb` to the new version
125
+ - Run `bundle install` to pick up the change in Gemfile.lock
126
+ - Commit the changes to `lib/darjeelink/version.rb` and `Gemfile.lock`, and push them to GitHub
127
+ - Go to `https://github.com/38degrees/darjeelink/releases` and create a release tag in GitHub
128
+ - Run `gem build darjeelink.gemspec` this will output a file `darjeelink-X.X.X.gem` the version should match what version.rb and github.
129
+ - Run `gem push darjeelink-X.X.X.gem`
71
130
 
72
131
  ## GDPR
73
132
  No personally identifiable data is stored about the public by this gem.
@@ -1,5 +1,10 @@
1
1
  function generateTrackingLink(){
2
- var url = $('#url').val();
2
+ var url = $('#base-url').val();
3
+ if (!url) {
4
+ document.getElementById("long_url").value = "";
5
+ return;
6
+ }
7
+
3
8
  var sourceMedium = $('#source-medium').val();
4
9
  var source = sourceMedium.split('-')[0];
5
10
  var medium = sourceMedium.split('-')[1];
@@ -28,7 +33,7 @@ $(document).ready(function(){
28
33
  generateTrackingLink();
29
34
  });
30
35
 
31
- $("#tracking").keypress(function(){
36
+ $("#tracking").keyup(function(){
32
37
  generateTrackingLink();
33
38
  });
34
39
 
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Darjeelink
4
+ class ApiController < Darjeelink::ApplicationController
5
+ skip_before_action :check_ip_whitelist
6
+ skip_before_action :authenticate
7
+
8
+ before_action :authenticate_token
9
+
10
+ def create
11
+ short_link = Darjeelink::ShortLink.create!(short_link_params)
12
+
13
+ render(
14
+ json: { short_link: "#{Darjeelink.domain}/#{short_link.shortened_path}" },
15
+ status: :created
16
+ )
17
+ rescue ActiveRecord::RecordNotUnique
18
+ render(
19
+ json: { error: "#{short_link_params[:shortened_path]} already used! Choose a different custom path" },
20
+ status: :bad_request
21
+ )
22
+ rescue ActiveRecord::RecordInvalid => e
23
+ render(
24
+ json: { error: e.message.to_s },
25
+ status: :bad_request
26
+ )
27
+ rescue ActionController::ParameterMissing
28
+ render(
29
+ json: { error: 'Missing required params' },
30
+ status: :bad_request
31
+ )
32
+ end
33
+
34
+ private
35
+
36
+ def short_link_params
37
+ params.require(:short_link).permit(:url, :shortened_path)
38
+ end
39
+
40
+ def authenticate_token
41
+ # The Authorization header must be supplied in the following format:
42
+ # "Authorization" => "Token token=#{username}:#{token}"
43
+ authenticate_or_request_with_http_token do |username_token, _options|
44
+ # Perform token comparison; avoid timing attacks and length leaks
45
+ # See: https://thisdata.com/blog/timing-attacks-against-string-comparison/
46
+ return head(:unauthorized) unless valid_authorization_token?(username_token)
47
+
48
+ return true
49
+ end
50
+ end
51
+
52
+ def valid_authorization_token?(username_token)
53
+ username, token = username_token.split ':'
54
+
55
+ stored_token = ApiToken.find_by(username: username, active: true)&.token
56
+ return false if stored_token.nil?
57
+
58
+ ActiveSupport::SecurityUtils.secure_compare(
59
+ token,
60
+ stored_token
61
+ )
62
+ end
63
+ end
64
+ end
@@ -5,8 +5,8 @@ module Darjeelink
5
5
  skip_before_action :check_ip_whitelist, only: :show
6
6
  skip_before_action :authenticate, only: :show
7
7
 
8
- before_action :check_url_present, only: :create
9
- before_action :check_url_valid, only: :create
8
+ before_action :check_url_present, only: %i[create update]
9
+ before_action :check_url_valid, only: %i[create update]
10
10
 
11
11
  class ShortLinkNotFoundError < StandardError
12
12
  end
@@ -18,17 +18,13 @@ module Darjeelink
18
18
  end
19
19
 
20
20
  def new
21
+ @short_link = Darjeelink::ShortLink.new
21
22
  end
22
23
 
23
24
  def create
24
- begin
25
- Darjeelink::ShortLink.create!(url: params[:url], shortened_path: params[:shortened_path])
26
- rescue ActiveRecord::RecordNotUnique
27
- flash[:error] = "#{params[:shortened_path]} already used! Choose a different custom path"
28
- return redirect_to(darjeelink.new_short_link_path)
25
+ handle_create_or_update(error_redirect_path: darjeelink.new_short_link_path) do
26
+ Darjeelink::ShortLink.create!(short_link_params)
29
27
  end
30
-
31
- redirect_to(darjeelink.short_links_path)
32
28
  end
33
29
 
34
30
  def edit
@@ -37,9 +33,10 @@ module Darjeelink
37
33
 
38
34
  def update
39
35
  @short_link = Darjeelink::ShortLink.find(params[:id])
40
- @short_link.update!(short_link_params)
41
36
 
42
- redirect_to(darjeelink.short_links_path)
37
+ handle_create_or_update(error_redirect_path: darjeelink.edit_short_link_path(@short_link)) do
38
+ @short_link.update!(short_link_params)
39
+ end
43
40
  end
44
41
 
45
42
  def show
@@ -57,6 +54,22 @@ module Darjeelink
57
54
 
58
55
  private
59
56
 
57
+ def handle_create_or_update(error_redirect_path:)
58
+ return unless block_given?
59
+
60
+ begin
61
+ yield
62
+ rescue ActiveRecord::RecordNotUnique
63
+ flash[:error] = "#{params[:shortened_path]} already used! Choose a different custom path"
64
+ return redirect_to(error_redirect_path)
65
+ rescue ActiveRecord::RecordInvalid => e
66
+ flash[:error] = e.message.to_s
67
+ return redirect_to(error_redirect_path)
68
+ end
69
+
70
+ redirect_to(darjeelink.short_links_path)
71
+ end
72
+
60
73
  def log_missing_shortlink(shortened_path)
61
74
  Rails.logger.warn("ShortLink not found: #{shortened_path}")
62
75
  end
@@ -95,14 +108,14 @@ module Darjeelink
95
108
  end
96
109
 
97
110
  def check_url_present
98
- return if params[:url].present?
111
+ return if params[:short_link].present? && params[:short_link][:url].present?
99
112
 
100
113
  flash[:error] = 'URL cannot be blank'
101
114
  redirect_to(darjeelink.new_short_link_path)
102
115
  end
103
116
 
104
117
  def check_url_valid
105
- return if params[:url] =~ URI::DEFAULT_PARSER.make_regexp
118
+ return if params[:short_link].present? && params[:short_link][:url] =~ URI::DEFAULT_PARSER.make_regexp
106
119
 
107
120
  flash[:error] = 'URL is not valid. Does it have https:// and are there any spaces?'
108
121
  redirect_to(darjeelink.new_short_link_path)
@@ -3,6 +3,7 @@
3
3
  module Darjeelink
4
4
  class TrackingLinksController < Darjeelink::ApplicationController
5
5
  def new
6
+ @short_link = Darjeelink::ShortLink.new
6
7
  end
7
8
  end
8
9
  end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Darjeelink
4
+ class ApiToken < ApplicationRecord
5
+ validates :username, uniqueness: true
6
+ validates :token, length: { minimum: 32 }, uniqueness: true
7
+
8
+ before_validation :generate_token
9
+
10
+ def generate_token
11
+ self.token = SecureRandom.uuid if token.blank?
12
+ end
13
+ end
14
+ end
@@ -3,9 +3,12 @@
3
3
  module Darjeelink
4
4
  class ShortLink < ApplicationRecord
5
5
  after_save :generate_short_link
6
- before_validation :strip_white_space
7
6
 
8
7
  validates_presence_of :url
8
+ validates :url, :shortened_path, format: {
9
+ without: /\s/,
10
+ message: 'must not contain any whitespace (spaces, tabs, etc)'
11
+ }
9
12
 
10
13
  class << self
11
14
  def search(query)
@@ -47,12 +50,7 @@ module Darjeelink
47
50
  i /= base
48
51
  end
49
52
 
50
- generated_path.join('').reverse
51
- end
52
-
53
- def strip_white_space
54
- url&.strip!
55
- shortened_path&.strip!
53
+ generated_path.join.reverse
56
54
  end
57
55
  end
58
56
  end
@@ -7,18 +7,21 @@
7
7
  </div>
8
8
  <% end %>
9
9
 
10
- <%= form_with url: darjeelink.short_links_path, local: true do |f| %>
11
- <div class="form-group">
12
- <label for="url">Url</label>
13
- <input type="url" class="form-control" id="long_url" name="url">
14
- </div>
15
- <div class="form-group">
16
- <label for="shortened_path">Custom Path</label>
17
- <input type="text" class="form-control" name="shortened_path">
18
- </div>
19
- <div>
20
- <button type="submit">Shorten</button>
21
- </div>
22
- <% end %>
10
+ <div class="form-group">
11
+ <%= f.label :url %>
12
+ <%= f.url_field :url,
13
+ class: "form-control", id: 'long_url', value: short_link.url, required: true,
14
+ pattern: 'https?://[^\s]+', placeholder: 'https://www.example.com',
15
+ title: 'URL, starting http:// or https:// - no whitespace (space, tab, etc) allowed'
16
+ %>
17
+ </div>
18
+
19
+ <div class="form-group">
20
+ <%= f.label :custom_path %>
21
+ <%= f.text_field :shortened_path,
22
+ class: "form-control", id: 'shortened_path', value: short_link.shortened_path,
23
+ pattern: '[^\s]*', title: 'Short path - no whitespace (space, tab, etc) allowed'
24
+ %>
25
+ </div>
23
26
  </div>
24
27
  </div>
@@ -13,16 +13,9 @@
13
13
  <div class="row">
14
14
  <div class="col-md-12">
15
15
  <%= form_for @short_link, url: darjeelink.short_link_path do |f| %>
16
- <div class="form-group">
17
- <%= f.label :url %>
18
- <%= f.url_field :url, class: "form-control", value: @short_link.url %>
19
- </div>
20
- <div class="form-group">
21
- <%= f.label :custom_path %>
22
- <%= f.text_field :shortened_path, class: "form-control", value: @short_link.shortened_path %>
23
- </div>
16
+ <%= render partial: 'short_link_form', locals: { f: f, short_link: @short_link } %>
24
17
  <div>
25
- <button type="submit">Update</button>
18
+ <%= f.submit "Update Shortlink", class: "btn btn-primary" %>
26
19
  </div>
27
20
  <% end %>
28
21
  </div>
@@ -9,4 +9,9 @@
9
9
  <h1>New Short Link</h1>
10
10
  </div>
11
11
  </div>
12
- <%= render partial: 'short_link_form' %>
12
+ <%= form_for @short_link, url: darjeelink.short_links_path, local: true do |f| %>
13
+ <%= render partial: 'short_link_form', locals: { f: f, short_link: @short_link } %>
14
+ <div>
15
+ <%= f.submit "Create Shortlink", class: "btn btn-primary" %>
16
+ </div>
17
+ <% end %>
@@ -14,35 +14,46 @@
14
14
  </div>
15
15
  </div>
16
16
 
17
- <div class="row">
18
- <div class="col-md-12">
19
- <form id="tracking">
17
+ <%= form_for @short_link, url: darjeelink.short_links_path, local: true do |f| %>
18
+ <div class="row" id="tracking">
19
+ <div class="col-md-12">
20
20
  <div class="form-group">
21
- <label for="url">URL</label>
22
- <input type="text" class="form-control" id="url">
23
- <label for="source">Source - Medium</label>
24
- <select class="form-control" id="source-medium">
25
- <% Darjeelink.source_mediums.each do |key, value| %>
26
- <option value="<%= key %>"><%= value %></option>
27
- <% end %>
21
+ <label for="base-url">URL</label>
22
+ <input
23
+ type="text" class="form-control" id="base-url" name="base-url" required=true
24
+ pattern="https?://[^\s]+" placeholder="https://www.example.com"
25
+ title="URL, starting http:// or https:// - no whitespace (space, tab, etc) allowed"
26
+ >
27
+
28
+ <label for="source-medium">Source - Medium</label>
29
+ <select class="form-control" id="source-medium" name="source-medium">
30
+ <%= options_for_select(Darjeelink.source_mediums.map { |k,v| [v,k] }) %>
28
31
  </select>
32
+
29
33
  <label for="campaign">ID / Identifier (lower-case, underscores only)</label>
30
- <input type="text" class="form-control" id="campaign">
34
+ <input
35
+ type="text" class="form-control" id="campaign" name="campaign" pattern="[^\s]*"
36
+ title="ID for the campaign - no whitespace (space, tab, etc) allowed"
37
+ >
31
38
  </div>
32
- </form>
39
+ </div>
33
40
  </div>
34
- </div>
35
41
 
36
- <div class="row">
37
- <div class="col-md-12">
38
- <h2>Your tracking link</h2>
39
- <button id="copy-btn" class="btn btn-info btn-sm" data-clipboard-target="#long_url">
40
- <span class="glyphicon glyphicon-copy"></span>
41
- </button>
42
+ <div class="row">
43
+ <div class="col-md-12">
44
+ <h2>Your tracking link</h2>
45
+ <button id="copy-btn" class="btn btn-info btn-sm" data-clipboard-target="#long_url">
46
+ <span class="glyphicon glyphicon-copy"></span>
47
+ </button>
48
+ </div>
42
49
  </div>
43
- </div>
44
50
 
45
- <%= render partial: 'darjeelink/short_links/short_link_form' %>
51
+ <%= render partial: 'darjeelink/short_links/short_link_form', locals: { f: f, short_link: @short_link } %>
52
+
53
+ <div>
54
+ <%= f.submit "Create Tracking Link", class: "btn btn-primary" %>
55
+ </div>
56
+ <% end %>
46
57
 
47
58
  <script>
48
59
  new ClipboardJS('#copy-btn');
@@ -0,0 +1,26 @@
1
+ {
2
+ "ignored_warnings": [
3
+ {
4
+ "warning_type": "Mass Assignment",
5
+ "warning_code": 70,
6
+ "fingerprint": "4c710243b0d9f3f174b1b0b465dcd19aca14b1f1a9658572b13a1172855b6ed7",
7
+ "check_name": "MassAssignment",
8
+ "message": "Parameters should be whitelisted for mass assignment",
9
+ "file": "app/controllers/darjeelink/short_links_controller.rb",
10
+ "line": 83,
11
+ "link": "https://brakemanscanner.org/docs/warning_types/mass_assignment/",
12
+ "code": "params.permit!",
13
+ "render_path": null,
14
+ "location": {
15
+ "type": "method",
16
+ "class": "Darjeelink::ShortLinksController",
17
+ "method": "build_url"
18
+ },
19
+ "user_input": null,
20
+ "confidence": "Medium",
21
+ "note": "The params aren't being use to create a record, we just use it to merge params that might be present on the shortened url and the source url"
22
+ }
23
+ ],
24
+ "updated": "2020-07-23 16:52:33 +0000",
25
+ "brakeman_version": "4.8.2"
26
+ }
@@ -14,14 +14,15 @@ Darjeelink.configure do |config|
14
14
  'sms-blast': 'SMS Blast',
15
15
  'google-advert': 'Google advert',
16
16
  'instagram-advert': 'Instagram Advert',
17
- 'chatbot': 'Chatbot',
18
- 'template': 'Template',
19
- 'other': 'Other',
20
- 'spotify': 'Spotify',
21
- 'youtube': 'Youtube',
17
+ chatbot: 'Chatbot',
18
+ template: 'Template',
19
+ other: 'Other',
20
+ spotify: 'Spotify',
21
+ youtube: 'Youtube',
22
22
  'google-search': 'Google search',
23
23
  'google-display': 'Google display',
24
- 'snapchat-advert': 'Snapchat Advert'
24
+ 'snapchat-advert': 'Snapchat Advert',
25
+ 'digitalorganiser-share': 'Digital Organiser'
25
26
  }
26
27
 
27
28
  config.auth_domain = ENV['AUTH_DOMAIN']
data/config/routes.rb CHANGED
@@ -5,6 +5,7 @@ Darjeelink::Engine.routes.draw do
5
5
 
6
6
  resources :short_links
7
7
  resources :tracking_links, only: :new
8
+ resources :api, only: :create
8
9
 
9
10
  # OmniAuth
10
11
  get '/auth/:provider/callback', to: 'sessions#create'
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ class CreateDarjeelinkApiTokens < ActiveRecord::Migration[6.1]
4
+ def change
5
+ create_table :darjeelink_api_tokens do |t|
6
+ t.string :token, null: false
7
+ t.string :username, null: false
8
+ t.boolean :active, null: false, default: false
9
+ t.timestamps
10
+ end
11
+
12
+ add_index(:darjeelink_api_tokens, :username, unique: true)
13
+ add_index(:darjeelink_api_tokens, :token, unique: true)
14
+ end
15
+ end
@@ -2,11 +2,7 @@
2
2
 
3
3
  module Darjeelink
4
4
  class Configuration
5
- attr_accessor :domain
6
- attr_accessor :source_mediums
7
- attr_accessor :auth_domain
8
- attr_accessor :rebrandly_api_key
9
- attr_accessor :fallback_url
5
+ attr_accessor :domain, :source_mediums, :auth_domain, :rebrandly_api_key, :fallback_url
10
6
 
11
7
  def initialize
12
8
  @domain = nil
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Darjeelink
4
- VERSION = '0.11.6'
4
+ VERSION = '0.12.0'
5
5
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: darjeelink
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.6
4
+ version: 0.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Hulme
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-05-19 00:00:00.000000000 Z
11
+ date: 2021-06-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: bitly
14
+ name: omniauth
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: '1.9'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: '1.9'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: omniauth-google-oauth2
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '5'
61
+ version: '6'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '5'
68
+ version: '6'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rebrandly
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -122,6 +122,20 @@ dependencies:
122
122
  - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: brakeman
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: bundler-audit
127
141
  requirement: !ruby/object:Gem::Requirement
@@ -178,7 +192,7 @@ dependencies:
178
192
  - - ">="
179
193
  - !ruby/object:Gem::Version
180
194
  version: '0'
181
- description:
195
+ description:
182
196
  email:
183
197
  - james@38degrees.org.uk
184
198
  executables: []
@@ -193,6 +207,7 @@ files:
193
207
  - app/assets/javascripts/darjeelink/sparkleh.js
194
208
  - app/assets/javascripts/darjeelink/tracking_link_generator.js
195
209
  - app/assets/stylesheets/darjeelink/application.css
210
+ - app/controllers/darjeelink/api_controller.rb
196
211
  - app/controllers/darjeelink/application_controller.rb
197
212
  - app/controllers/darjeelink/sessions_controller.rb
198
213
  - app/controllers/darjeelink/short_links_controller.rb
@@ -202,6 +217,7 @@ files:
202
217
  - app/importers/darjeelink/short_link_importer.rb
203
218
  - app/jobs/darjeelink/application_job.rb
204
219
  - app/mailers/darjeelink/application_mailer.rb
220
+ - app/models/darjeelink/api_token.rb
205
221
  - app/models/darjeelink/application_record.rb
206
222
  - app/models/darjeelink/short_link.rb
207
223
  - app/views/darjeelink/short_links/_short_link_form.erb
@@ -210,6 +226,7 @@ files:
210
226
  - app/views/darjeelink/short_links/new.html.erb
211
227
  - app/views/darjeelink/tracking_links/new.erb
212
228
  - app/views/layouts/darjeelink/application.html.erb
229
+ - config/brakeman.ignore
213
230
  - config/initializers/darjeelink.rb
214
231
  - config/initializers/omniauth.rb
215
232
  - config/initializers/rebrandly.rb
@@ -218,16 +235,17 @@ files:
218
235
  - db/migrate/20190304094710_case_insensitive_index_short_link_shortened_path.rb
219
236
  - db/migrate/20200505220716_rename_portkey_short_links_to_darjeelink_short_links.rb
220
237
  - db/migrate/20200505221026_rename_portkey_short_link_index.rb
238
+ - db/migrate/20210610083330_create_darjeelink_api_tokens.rb
221
239
  - lib/darjeelink.rb
222
240
  - lib/darjeelink/configuration.rb
223
241
  - lib/darjeelink/engine.rb
224
242
  - lib/darjeelink/version.rb
225
243
  - lib/tasks/darjeelink.rake
226
- homepage: https://github.com/38dgs/darjeelink
244
+ homepage: https://github.com/38degrees/darjeelink
227
245
  licenses:
228
246
  - MIT
229
247
  metadata: {}
230
- post_install_message:
248
+ post_install_message:
231
249
  rdoc_options: []
232
250
  require_paths:
233
251
  - lib
@@ -235,16 +253,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
235
253
  requirements:
236
254
  - - ">="
237
255
  - !ruby/object:Gem::Version
238
- version: '0'
256
+ version: '2.7'
239
257
  required_rubygems_version: !ruby/object:Gem::Requirement
240
258
  requirements:
241
259
  - - ">="
242
260
  - !ruby/object:Gem::Version
243
261
  version: '0'
244
262
  requirements: []
245
- rubyforge_project:
263
+ rubyforge_project:
246
264
  rubygems_version: 2.7.8
247
- signing_key:
265
+ signing_key:
248
266
  specification_version: 4
249
267
  summary: URL Shortener
250
268
  test_files: []