From a8aa84cdd9af04600f0e2c78200045d3a24fe0e7 Mon Sep 17 00:00:00 2001 From: Areek Zillur Date: Mon, 15 Dec 2014 15:20:09 -0500 Subject: [PATCH] [PLUGIN] Licenses should only be valid between issue and expiration date NOTE: Version bumped to beta2 closes elastic/elasticsearch#36 Original commit: elastic/x-pack-elasticsearch@c713a3c889fbc2821e5af30ee76f754cece515a9 --- core-shaded/pom.xml | 2 +- core/pom.xml | 4 ++-- .../elasticsearch/license/core/License.java | 9 +++++++- .../core/LicenseSerializationTests.java | 12 ++++++---- licensor/pom.xml | 4 ++-- plugin/pom.xml | 6 ++--- .../license/plugin/core/LicensesService.java | 15 +++++++++++-- .../plugin/LicensesClientServiceTests.java | 22 +++++++++++++++++-- pom.xml | 2 +- 9 files changed, 58 insertions(+), 18 deletions(-) diff --git a/core-shaded/pom.xml b/core-shaded/pom.xml index e8bad957691..3472a124539 100644 --- a/core-shaded/pom.xml +++ b/core-shaded/pom.xml @@ -5,7 +5,7 @@ elasticsearch-license org.elasticsearch - 1.0.0-beta1 + 1.0.0-beta2 4.0.0 diff --git a/core/pom.xml b/core/pom.xml index 1b260675745..443f61ef928 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -5,7 +5,7 @@ elasticsearch-license org.elasticsearch - 1.0.0-beta1 + 1.0.0-beta2 4.0.0 @@ -17,7 +17,7 @@ org.elasticsearch elasticsearch-license-core-shaded - 1.0.0-beta1 + 1.0.0-beta2 diff --git a/core/src/main/java/org/elasticsearch/license/core/License.java b/core/src/main/java/org/elasticsearch/license/core/License.java index 4e913377e95..a1495a67c17 100644 --- a/core/src/main/java/org/elasticsearch/license/core/License.java +++ b/core/src/main/java/org/elasticsearch/license/core/License.java @@ -191,7 +191,14 @@ public class License implements ToXContent { } builder.startObject(); if (restViewMode) { - builder.field(XFields.STATUS, ((expiryDate - System.currentTimeMillis()) > 0l) ? "active" : "expired"); + String status = "active"; + long now = System.currentTimeMillis(); + if (issueDate > now) { + status = "invalid"; + } else if (expiryDate < now) { + status = "expired"; + } + builder.field(XFields.STATUS, status); } builder.field(XFields.UID, uid); builder.field(XFields.TYPE, type); diff --git a/core/src/test/java/org/elasticsearch/license/core/LicenseSerializationTests.java b/core/src/test/java/org/elasticsearch/license/core/LicenseSerializationTests.java index ca0973ca16d..b5a65684117 100644 --- a/core/src/test/java/org/elasticsearch/license/core/LicenseSerializationTests.java +++ b/core/src/test/java/org/elasticsearch/license/core/LicenseSerializationTests.java @@ -77,12 +77,14 @@ public class LicenseSerializationTests extends ElasticsearchTestCase { long now = System.currentTimeMillis(); String expiredLicenseExpiryDate = TestUtils.dateMathString("now-1d/d", now); String validLicenseIssueDate = TestUtils.dateMathString("now-10d/d", now); - String validLicenseExpiryDate = TestUtils.dateMathString("now+1d/d", now); + String invalidLicenseIssueDate = TestUtils.dateMathString("now+1d/d", now); + String validLicenseExpiryDate = TestUtils.dateMathString("now+2d/d", now); Set licenses = TestUtils.generateLicenses(Arrays.asList(new TestUtils.LicenseSpec("expired_feature", validLicenseIssueDate, expiredLicenseExpiryDate) - , new TestUtils.LicenseSpec("valid_feature", validLicenseIssueDate, validLicenseExpiryDate))); + , new TestUtils.LicenseSpec("valid_feature", validLicenseIssueDate, validLicenseExpiryDate), + new TestUtils.LicenseSpec("invalid_feature", invalidLicenseIssueDate, validLicenseExpiryDate))); - assertThat(licenses.size(), equalTo(2)); + assertThat(licenses.size(), equalTo(3)); for (License license : licenses) { XContentBuilder builder = XContentFactory.contentBuilder(XContentType.JSON); license.toXContent(builder, new ToXContent.MapParams(ImmutableMap.of(Licenses.REST_VIEW_MODE, "true"))); @@ -95,8 +97,10 @@ public class LicenseSerializationTests extends ElasticsearchTestCase { assertThat(map.get("expiry_date"), notNullValue()); if (license.feature().equals("valid_feature")) { assertThat((String) map.get("status"), equalTo("active")); - } else { + } else if (license.feature().equals("expired_feature")) { assertThat((String) map.get("status"), equalTo("expired")); + } else if (license.feature().equals("invalid_feature")) { + assertThat((String) map.get("status"), equalTo("invalid")); } } diff --git a/licensor/pom.xml b/licensor/pom.xml index 52350f2ceab..5bfc414f8c4 100644 --- a/licensor/pom.xml +++ b/licensor/pom.xml @@ -5,7 +5,7 @@ elasticsearch-license org.elasticsearch - 1.0.0-beta1 + 1.0.0-beta2 4.0.0 @@ -19,7 +19,7 @@ org.elasticsearch elasticsearch-license-core - 1.0.0-beta1 + 1.0.0-beta2 diff --git a/plugin/pom.xml b/plugin/pom.xml index e17e325181a..63618de5054 100644 --- a/plugin/pom.xml +++ b/plugin/pom.xml @@ -5,7 +5,7 @@ elasticsearch-license org.elasticsearch - 1.0.0-beta1 + 1.0.0-beta2 4.0.0 @@ -21,13 +21,13 @@ org.elasticsearch elasticsearch-license-licensor - 1.0.0-beta1 + 1.0.0-beta2 test org.elasticsearch elasticsearch-license-core - 1.0.0-beta1 + 1.0.0-beta2 compile diff --git a/plugin/src/main/java/org/elasticsearch/license/plugin/core/LicensesService.java b/plugin/src/main/java/org/elasticsearch/license/plugin/core/LicensesService.java index a7cc75f3045..0776ce5f838 100644 --- a/plugin/src/main/java/org/elasticsearch/license/plugin/core/LicensesService.java +++ b/plugin/src/main/java/org/elasticsearch/license/plugin/core/LicensesService.java @@ -458,9 +458,11 @@ public class LicensesService extends AbstractLifecycleComponent long nextScheduleFrequency = -1l; for (ListenerHolder listenerHolder : registeredListeners) { long expiryDate = expiryDateForFeature(listenerHolder.feature, currentLicensesMetaData); - long expiryDuration = expiryDate - System.currentTimeMillis(); + long issueDate = issueDateForFeature(listenerHolder.feature, currentLicensesMetaData); + long now = System.currentTimeMillis(); + long expiryDuration = expiryDate - now; - if (expiryDuration > 0l) { + if (expiryDuration > 0l && (now - issueDate) >= 0l) { listenerHolder.enableFeatureIfNeeded(); if (nextScheduleFrequency == -1l) { nextScheduleFrequency = expiryDuration; @@ -597,6 +599,15 @@ public class LicensesService extends AbstractLifecycleComponent return true; } + private long issueDateForFeature(String feature, final LicensesMetaData currentLicensesMetaData) { + final Map effectiveLicenses = getEffectiveLicenses(currentLicensesMetaData); + License featureLicense; + if ((featureLicense = effectiveLicenses.get(feature)) != null) { + return featureLicense.issueDate(); + } + return -1l; + } + private long expiryDateForFeature(String feature, final LicensesMetaData currentLicensesMetaData) { final Map effectiveLicenses = getEffectiveLicenses(currentLicensesMetaData); License featureLicense; diff --git a/plugin/src/test/java/org/elasticsearch/license/plugin/LicensesClientServiceTests.java b/plugin/src/test/java/org/elasticsearch/license/plugin/LicensesClientServiceTests.java index f4ec906c7fd..cfc9c6b51c5 100644 --- a/plugin/src/test/java/org/elasticsearch/license/plugin/LicensesClientServiceTests.java +++ b/plugin/src/test/java/org/elasticsearch/license/plugin/LicensesClientServiceTests.java @@ -42,6 +42,21 @@ public class LicensesClientServiceTests extends AbstractLicensesServiceTests { assertClientListenerNotificationCount(clientListener, actions); } + @Test + public void testLicenseWithFutureIssueDate() throws Exception { + final LicensesClientService clientService = licensesClientService(); + final TestTrackingClientListener clientListener = new TestTrackingClientListener(); + String feature = "feature"; + List actions = new ArrayList<>(); + long now = System.currentTimeMillis(); + long issueDate = dateMath("now+10d/d", now); + + actions.add(registerWithTrialLicense(clientService, clientListener, feature, TimeValue.timeValueSeconds(2))); + actions.add(generateAndPutSignedLicenseAction(masterLicensesManagerService(), feature, issueDate, TimeValue.timeValueHours(24 * 20))); + actions.add(assertExpiryAction(feature, "trial", TimeValue.timeValueSeconds(2))); + assertClientListenerNotificationCount(clientListener, actions); + } + @Test public void testMultipleClientSignedLicenseEnforcement() throws Exception { // multiple client registration with null trial license and then different expiry signed license @@ -190,19 +205,22 @@ public class LicensesClientServiceTests extends AbstractLicensesServiceTests { } private Action generateAndPutSignedLicenseAction(final LicensesManagerService masterLicensesManagerService, final String feature, final TimeValue expiryDuration) throws Exception { + return generateAndPutSignedLicenseAction(masterLicensesManagerService, feature, -1, expiryDuration); + } + private Action generateAndPutSignedLicenseAction(final LicensesManagerService masterLicensesManagerService, final String feature, final long issueDate, final TimeValue expiryDuration) throws Exception { return new Action(new Runnable() { @Override public void run() { License license; try { - license = generateSignedLicense(feature, expiryDuration); + license = generateSignedLicense(feature, issueDate, expiryDuration); } catch (Exception e) { fail(e.getMessage()); return; } registerAndAckSignedLicenses(masterLicensesManagerService, Arrays.asList(license), LicensesStatus.VALID); } - }, 0, 1, "should trigger onEnable for " + feature + " once [signed license]"); + }, 0, (issueDate <= System.currentTimeMillis()) ? 1 : 0, "should trigger onEnable for " + feature + " once [signed license]"); } private Action registerWithoutTrialLicense(final LicensesClientService clientService, final LicensesClientService.Listener clientListener, final String feature) { diff --git a/pom.xml b/pom.xml index 707aeba044d..a2ce9f3f8e3 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ org.elasticsearch elasticsearch-license pom - 1.0.0-beta1 + 1.0.0-beta2 core-shaded core