diff --git a/CHANGELOG-EE b/CHANGELOG-EE index 70872e900e..37f99c41a6 100644 --- a/CHANGELOG-EE +++ b/CHANGELOG-EE @@ -1,3 +1,6 @@ +v 7.11.2 + - Fixed license upload and verification mechanism + v 7.11.0 - Skip git hooks commit validation when pushing new tag. - Add Two-factor authentication (2FA) for LDAP logins diff --git a/Gemfile.lock b/Gemfile.lock index 52fa2e4b9f..760ee0a87d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -219,7 +219,7 @@ GEM diff-lcs (~> 1.1) mime-types (~> 1.15) posix-spawn (~> 0.3) - gitlab-license (0.0.2) + gitlab-license (0.0.3) gitlab-linguist (3.0.1) charlock_holmes (~> 0.6.6) escape_utils (~> 0.2.4) diff --git a/app/models/historical_data.rb b/app/models/historical_data.rb index f573282b25..a62ae8780b 100644 --- a/app/models/historical_data.rb +++ b/app/models/historical_data.rb @@ -3,6 +3,8 @@ class HistoricalData < ActiveRecord::Base # HistoricalData.during((Date.today - 1.year)..Date.today).average(:active_user_count) scope :during, ->(range) { where(date: range) } + # HistoricalData.up_until(Date.today - 1.month).average(:active_user_count) + scope :up_until, ->(date) { where("date <= :date", date: date) } class << self def track! diff --git a/app/models/license.rb b/app/models/license.rb index f272b965f5..81b02593d9 100644 --- a/app/models/license.rb +++ b/app/models/license.rb @@ -96,27 +96,23 @@ class License < ActiveRecord::Base return unless self.license? && self.restricted?(:active_user_count) restricted_user_count = self.restrictions[:active_user_count] - active_user_count = User.active.count - historical_active_user_count = HistoricalData.maximum(:active_user_count) || 0 - max_active_user_count = [active_user_count, historical_active_user_count].max + date_range = (self.starts_at - 1.year)..self.starts_at + active_user_count = HistoricalData.during(date_range).maximum(:active_user_count) || 0 + + return unless active_user_count - return if max_active_user_count < restricted_user_count + return if active_user_count < restricted_user_count - overage = max_active_user_count - restricted_user_count + overage = active_user_count - restricted_user_count message = "" - message << - if historical_active_user_count > active_user_count - "At one point, this GitLab installation had " - else - "This GitLab installation has " - end - message << "#{number_with_delimiter max_active_user_count} active #{"user".pluralize(max_active_user_count)}, " + message << "During the year before this license started, this GitLab installation had " + message << "#{number_with_delimiter active_user_count} active #{"user".pluralize(active_user_count)}, " message << "exceeding this license's limit of #{number_with_delimiter restricted_user_count} by " message << "#{number_with_delimiter overage} #{"user".pluralize(overage)}. " message << "Please upload a license for at least " - message << "#{number_with_delimiter max_active_user_count} #{"user".pluralize(max_active_user_count)}." + message << "#{number_with_delimiter active_user_count} #{"user".pluralize(active_user_count)}." self.errors.add(:base, message) end diff --git a/app/views/admin/licenses/show.html.haml b/app/views/admin/licenses/show.html.haml index fa07fc463d..6e28fbc22f 100644 --- a/app/views/admin/licenses/show.html.haml +++ b/app/views/admin/licenses/show.html.haml @@ -20,12 +20,12 @@ .panel-heading Details %ul.well-list - %li - %span.light Issued: - %strong= time_ago_with_tooltip @license.issued_at %li %span.light Uploaded: %strong= time_ago_with_tooltip @license.created_at + %li + %span.light Started: + %strong= time_ago_with_tooltip @license.starts_at %li %span.light - if @license.expired? @@ -65,7 +65,8 @@ %strong Exceeds license limit - - historical = HistoricalData.maximum(:active_user_count) + - date_range = (Date.today - 1.year)..Date.today + - historical = HistoricalData.during(date_range).maximum(:active_user_count) - if historical %li %span.light Maximum active users: @@ -106,8 +107,8 @@ %tr - @license.licensee.keys.each do |label| %th= label - %th Issued at %th Uploaded at + %th Started at %th Expired at %th Active users %tbody @@ -117,10 +118,10 @@ %td= license.licensee[label] %td %span - = license.issued_at + = license.created_at %td %span - = license.created_at + = license.starts_at %td %span = license.expires_at || "Never" diff --git a/doc/api/users.md b/doc/api/users.md index cd141daadc..f0293bab5e 100644 --- a/doc/api/users.md +++ b/doc/api/users.md @@ -2,6 +2,8 @@ ## List users +Active users = Total accounts - Blocked users + Get a list of users. This function takes pagination parameters `page` and `per_page` to restrict the list of users. @@ -393,4 +395,4 @@ Parameters: - `uid` (required) - id of specified user - `id` (required) - SSH key ID -Will return `200 OK` on success, or `404 Not found` if either user or key cannot be found. +Will return `200 OK` on success, or `404 Not found` if either user or key cannot be found. \ No newline at end of file diff --git a/spec/factories.rb b/spec/factories.rb index 4149e8d30e..35b199e66a 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -211,7 +211,7 @@ FactoryGirl.define do end factory :gitlab_license, class: "Gitlab::License" do - issued_at { Date.today - 1.month } + starts_at { Date.today - 1.month } licensee do { "Name" => Faker::Name.name } end diff --git a/spec/models/historical_data_spec.rb b/spec/models/historical_data_spec.rb index 20d8a5f61f..015838ec01 100644 --- a/spec/models/historical_data_spec.rb +++ b/spec/models/historical_data_spec.rb @@ -8,13 +8,19 @@ describe HistoricalData do end describe ".during" do - it "returns the historical data during the given period" do + it "returns the historical data during the specified period" do expect(HistoricalData.during(Date.new(2014, 1, 1)..Date.new(2014, 12, 31)).average(:active_user_count)).to eq(650) end end + describe ".up_until" do + it "returns the historical data up until the specified date" do + expect(HistoricalData.up_until(Date.new(2014, 6, 1)).average(:active_user_count)).to eq(350) + end + end + describe ".at" do - it "returns the historical data at the given date" do + it "returns the historical data at the specified date" do expect(HistoricalData.at(Date.new(2014, 8, 1)).active_user_count).to eq(800) end end diff --git a/spec/models/license_spec.rb b/spec/models/license_spec.rb index f8998b0dfd..d4465cfd30 100644 --- a/spec/models/license_spec.rb +++ b/spec/models/license_spec.rb @@ -23,39 +23,10 @@ describe License do end end - describe "Active user count" do - let(:active_user_count) { User.active.count } - - context "when there is no active user count restriction" do - it "is valid" do - expect(license).to be_valid - end - end - - context "when the active user count restriction is exceeded" do - before do - gl_license.restrictions = { active_user_count: active_user_count - 1 } - end - - it "is invalid" do - expect(license).to_not be_valid - end - end - - context "when the active user count restriction is not exceeded" do - before do - gl_license.restrictions = { active_user_count: active_user_count + 1 } - end - - it "is valid" do - expect(license).to be_valid - end - end - end - describe "Historical active user count" do let(:active_user_count) { User.active.count + 10 } - let!(:historical_data) { HistoricalData.create!(date: License.current.issued_at, active_user_count: active_user_count) } + let(:date) { License.current.starts_at } + let!(:historical_data) { HistoricalData.create!(date: date, active_user_count: active_user_count) } context "when there is no active user count restriction" do it "is valid" do @@ -68,8 +39,34 @@ describe License do gl_license.restrictions = { active_user_count: active_user_count - 1 } end - it "is invalid" do - expect(license).to_not be_valid + context "when the license started" do + it "is invalid" do + expect(license).to_not be_valid + end + end + + context "after the license started" do + let(:date) { Date.today } + + it "is valid" do + expect(license).to be_valid + end + end + + context "in the year before the license started" do + let(:date) { License.current.starts_at - 6.months } + + it "is invalid" do + expect(license).to_not be_valid + end + end + + context "earlier than a year before the license started" do + let(:date) { License.current.starts_at - 2.years } + + it "is valid" do + expect(license).to be_valid + end end end