killbill-memoizeit
Changes
bin/gen_updater.rb 4(+2 -2)
NEWS 5(+1 -4)
profiles/killbill/src/main/java/org/killbill/billing/server/log/obfuscators/ObfuscatorConverter.java 22(+15 -7)
profiles/killbill/src/main/java/org/killbill/billing/server/log/obfuscators/PatternObfuscator.java 23(+16 -7)
profiles/killbill/src/main/resources/update-checker/killbill-server-update-list.properties 143(+140 -3)
profiles/killbill/src/test/java/org/killbill/billing/server/log/obfuscators/TestObfuscatorConverter.java 44(+44 -0)
Details
bin/gen_updater.rb 4(+2 -2)
diff --git a/bin/gen_updater.rb b/bin/gen_updater.rb
index 14f75c9..9ad2429 100644
--- a/bin/gen_updater.rb
+++ b/bin/gen_updater.rb
@@ -21,10 +21,10 @@ metadata.each do |entry|
train = parsed.last.to_i
if train % 2 == 1
current_dev_train = train if current_dev_train.to_i < train
- current_dev_version = version if current_dev_version.nil? || (current_dev_version < version)
+ current_dev_version = version if current_dev_version.nil? || (Gem::Version.new(current_dev_version) < Gem::Version.new(version))
else
current_stable_train = train if current_stable_train.to_i < train
- current_stable_version = version if current_stable_version.nil? || (current_stable_version < version)
+ current_stable_version = version if current_stable_version.nil? || (Gem::Version.new(current_stable_version) < Gem::Version.new(version))
end
releases << {
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java
index 2de2814..0c79bed 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java
@@ -700,7 +700,7 @@ public class AccountResource extends JaxRsResourceBase {
@GET
@Path("/{accountId:" + UUID_PATTERN + "}/" + INVOICES)
@Produces(APPLICATION_JSON)
- @ApiOperation(value = "Retrieve account invoices", response = InvoiceJson.class)
+ @ApiOperation(value = "Retrieve account invoices", response = InvoiceJson.class, responseContainer = "List")
@ApiResponses(value = {@ApiResponse(code = 400, message = "Invalid account id supplied"),
@ApiResponse(code = 404, message = "Account not found")})
public Response getInvoices(@PathParam("accountId") final UUID accountId,
NEWS 5(+1 -4)
diff --git a/NEWS b/NEWS
index b69e7fa..eb29201 100644
--- a/NEWS
+++ b/NEWS
@@ -24,10 +24,7 @@
See https://github.com/killbill/killbill/releases/tag/killbill-0.18.18
0.18.17
- Relax sanity checks for STANDALONE subscriptions #840
- Fix JDBC connection leak in pagination API #853
- Fix limitation where catalog plan name cannot end with an number #842
- Reduce log level of InvoiceItemGeneratorLogger #851
+ See https://github.com/killbill/killbill/releases/tag/killbill-0.18.17
0.18.16
See https://github.com/killbill/killbill/releases/tag/killbill-0.18.16
diff --git a/profiles/killbill/src/main/java/org/killbill/billing/server/log/obfuscators/ObfuscatorConverter.java b/profiles/killbill/src/main/java/org/killbill/billing/server/log/obfuscators/ObfuscatorConverter.java
index 6e522d6..a45d67e 100644
--- a/profiles/killbill/src/main/java/org/killbill/billing/server/log/obfuscators/ObfuscatorConverter.java
+++ b/profiles/killbill/src/main/java/org/killbill/billing/server/log/obfuscators/ObfuscatorConverter.java
@@ -17,14 +17,16 @@
package org.killbill.billing.server.log.obfuscators;
+import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import ch.qos.logback.classic.pattern.ClassicConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;
-import com.google.common.collect.ImmutableList;
/**
- * ObfuscatorConverter attempts to mask sensitive data in the log files.
+ * ObfuscatorConverter attempts to mask sensitive data in the log files. Extra parameters can be passed to the
+ * converter and the underlying obsfucators by adding arguments behind maskedMsg like the example shown below.
* <p/>
* To use, define a new conversion word in your Logback configuration, e.g.:
* <pre>
@@ -33,7 +35,7 @@ import com.google.common.collect.ImmutableList;
* converterClass="org.killbill.billing.server.log.obfuscators.ObfuscatorConverter" />
* <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
* <encoder>
- * <pattern>%date [%thread] - %maskedMsg%n</pattern>
+ * <pattern>%date [%thread] - %maskedMsg{param1, param2, ...}%n</pattern>
* </encoder>
* </appender>
* <root level="DEBUG">
@@ -44,10 +46,16 @@ import com.google.common.collect.ImmutableList;
*/
public class ObfuscatorConverter extends ClassicConverter {
- private final Collection<Obfuscator> obfuscators = ImmutableList.<Obfuscator>of(new ConfigMagicObfuscator(),
- new LoggingFilterObfuscator(),
- new PatternObfuscator(),
- new LuhnMaskingObfuscator());
+ private final Collection<Obfuscator> obfuscators = new ArrayList<Obfuscator>();
+
+ @Override
+ public void start() {
+ obfuscators.addAll(Arrays.asList(new ConfigMagicObfuscator(),
+ new LoggingFilterObfuscator(),
+ new PatternObfuscator(getOptionList()),
+ new LuhnMaskingObfuscator()));
+ super.start();
+ }
@Override
public String convert(final ILoggingEvent event) {
diff --git a/profiles/killbill/src/main/java/org/killbill/billing/server/log/obfuscators/PatternObfuscator.java b/profiles/killbill/src/main/java/org/killbill/billing/server/log/obfuscators/PatternObfuscator.java
index a850c5b..df4887a 100644
--- a/profiles/killbill/src/main/java/org/killbill/billing/server/log/obfuscators/PatternObfuscator.java
+++ b/profiles/killbill/src/main/java/org/killbill/billing/server/log/obfuscators/PatternObfuscator.java
@@ -17,6 +17,7 @@
package org.killbill.billing.server.log.obfuscators;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.regex.Pattern;
@@ -27,7 +28,7 @@ import com.google.common.collect.ImmutableList;
public class PatternObfuscator extends Obfuscator {
// Hide by default sensitive bank, PCI and PII data. For PANs, see LuhnMaskingObfuscator
- private static final String[] DEFAULT_SENSITIVE_KEYS = {
+ private static final Collection<String> DEFAULT_SENSITIVE_KEYS = ImmutableList.of(
"accountnumber",
"authenticationdata",
"bankaccountnumber",
@@ -49,19 +50,27 @@ public class PatternObfuscator extends Obfuscator {
"name",
"number",
"password",
- "xid"
- };
+ "xid");
private final Collection<Pattern> patterns = new LinkedList<Pattern>();
public PatternObfuscator() {
- this(ImmutableList.<Pattern>of());
+ this(ImmutableList.<Pattern>of(), ImmutableList.<String>of());
}
- public PatternObfuscator(final Collection<Pattern> extraPatterns) {
+ public PatternObfuscator(final Collection<String> extraKeywords) {
+ this(ImmutableList.<Pattern>of(), extraKeywords);
+ }
+
+ public PatternObfuscator(final Collection<Pattern> extraPatterns, final Collection<String> extraKeywords) {
super();
+ Collection<String> keywords = new ArrayList<String>();
+ keywords.addAll(DEFAULT_SENSITIVE_KEYS);
+ if (extraKeywords != null) {
+ keywords.addAll(extraKeywords);
+ }
- for (final String sensitiveKey : DEFAULT_SENSITIVE_KEYS) {
+ for (final String sensitiveKey : keywords) {
this.patterns.add(buildJSONPattern(sensitiveKey));
this.patterns.add(buildXMLPattern(sensitiveKey));
this.patterns.add(buildMultiValuesXMLPattern(sensitiveKey));
@@ -81,7 +90,7 @@ public class PatternObfuscator extends Obfuscator {
}
private Pattern buildXMLPattern(final String key) {
- return Pattern.compile(key + ">([^<\\n]+)</[^<>]*" + key + ">", DEFAULT_PATTERN_FLAGS);
+ return Pattern.compile(key + "(?:\\s+.*?)?>([^<\\n]+)</[^<>]*" + key + ">", DEFAULT_PATTERN_FLAGS);
}
private Pattern buildMultiValuesXMLPattern(final String key) {
diff --git a/profiles/killbill/src/main/resources/update-checker/killbill-server-update-list.properties b/profiles/killbill/src/main/resources/update-checker/killbill-server-update-list.properties
index c8dde49..e03035f 100644
--- a/profiles/killbill/src/main/resources/update-checker/killbill-server-update-list.properties
+++ b/profiles/killbill/src/main/resources/update-checker/killbill-server-update-list.properties
@@ -1,18 +1,155 @@
## Top level keys
# general.notice = This notice should rarely, if ever, be used as everyone will see it
+### 0.19.x series ###
+
+# 0.19.7
+0.19.7.updates =
+0.19.7.notices = This is the latest dev release.
+0.19.7.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.19.7
+
+# 0.19.6
+0.19.6.updates = 0.19.7
+0.19.6.notices = We recommend upgrading to 0.19.7, our latest dev release.
+0.19.6.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.19.6
+
+# 0.19.5
+0.19.5.updates = 0.19.7
+0.19.5.notices = We recommend upgrading to 0.19.7, our latest dev release.
+0.19.5.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.19.5
+
+# 0.19.4
+0.19.4.updates = 0.19.7
+0.19.4.notices = We recommend upgrading to 0.19.7, our latest dev release.
+0.19.4.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.19.4
+
+# 0.19.3
+0.19.3.updates = 0.19.7
+0.19.3.notices = We recommend upgrading to 0.19.7, our latest dev release.
+0.19.3.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.19.3
+
+# 0.19.2
+0.19.2.updates = 0.19.7
+0.19.2.notices = We recommend upgrading to 0.19.7, our latest dev release.
+0.19.2.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.19.2
+
+# 0.19.1
+0.19.1.updates = 0.19.7
+0.19.1.notices = We recommend upgrading to 0.19.7, our latest dev release.
+0.19.1.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.19.1
+
+# 0.19.0
+0.19.0.updates = 0.19.7
+0.19.0.notices = We recommend upgrading to 0.19.7, our latest dev release.
+0.19.0.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.19.0
+
### 0.18.x series ###
+# 0.18.19
+0.18.19.updates =
+0.18.19.notices = This is the latest GA release.
+0.18.19.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.19
+
+# 0.18.18
+0.18.18.updates = 0.18.19
+0.18.18.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.18.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.18
+
+# 0.18.17
+0.18.17.updates = 0.18.19
+0.18.17.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.17.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.17
+
+# 0.18.16
+0.18.16.updates = 0.18.19
+0.18.16.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.16.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.16
+
+# 0.18.15
+0.18.15.updates = 0.18.19
+0.18.15.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.15.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.15
+
+# 0.18.14
+0.18.14.updates = 0.18.19
+0.18.14.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.14.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.14
+
+# 0.18.13
+0.18.13.updates = 0.18.19
+0.18.13.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.13.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.13
+
+# 0.18.12
+0.18.12.updates = 0.18.19
+0.18.12.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.12.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.12
+
+# 0.18.11
+0.18.11.updates = 0.18.19
+0.18.11.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.11.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.11
+
+# 0.18.10
+0.18.10.updates = 0.18.19
+0.18.10.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.10.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.10
+
+# 0.18.9
+0.18.9.updates = 0.18.19
+0.18.9.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.9.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.9
+
+# 0.18.8
+0.18.8.updates = 0.18.19
+0.18.8.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.8.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.8
+
+# 0.18.7
+0.18.7.updates = 0.18.19
+0.18.7.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.7.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.7
+
+# 0.18.6
+0.18.6.updates = 0.18.19
+0.18.6.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.6.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.6
+
+# 0.18.5
+0.18.5.updates = 0.18.19
+0.18.5.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.5.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.5
+
+# 0.18.4
+0.18.4.updates = 0.18.19
+0.18.4.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.4.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.4
+
+# 0.18.3
+0.18.3.updates = 0.18.19
+0.18.3.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.3.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.3
+
+# 0.18.2
+0.18.2.updates = 0.18.19
+0.18.2.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.2.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.2
+
+# 0.18.1
+0.18.1.updates = 0.18.19
+0.18.1.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.1.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.1
+
# 0.18.0
-0.18.0.updates =
-0.18.0.notices = This is the latest GA release.
+0.18.0.updates = 0.18.19
+0.18.0.notices = We recommend upgrading to 0.18.19, our latest GA release.
0.18.0.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.0
### 0.17.x series ###
# 0.17.8
0.17.8.updates =
-0.17.8.notices = This is the latest dev release.
+0.17.8.notices = We recommend upgrading to 0.18.19, our latest GA release.
0.17.8.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.17.8
# 0.17.7
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/server/log/obfuscators/TestObfuscatorConverter.java b/profiles/killbill/src/test/java/org/killbill/billing/server/log/obfuscators/TestObfuscatorConverter.java
index 4d54512..ba4aa74 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/server/log/obfuscators/TestObfuscatorConverter.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/server/log/obfuscators/TestObfuscatorConverter.java
@@ -17,12 +17,15 @@
package org.killbill.billing.server.log.obfuscators;
+import java.util.List;
+
import org.killbill.billing.server.log.ServerTestSuiteNoDB;
import org.mockito.Mockito;
import org.testng.Assert;
import org.testng.annotations.Test;
import ch.qos.logback.classic.spi.ILoggingEvent;
+import com.google.common.collect.ImmutableList;
public class TestObfuscatorConverter extends ServerTestSuiteNoDB {
@@ -60,11 +63,52 @@ public class TestObfuscatorConverter extends ServerTestSuiteNoDB {
"</gateway>");
}
+ @Test(groups = "fast")
+ public void testLogSensitiveDataWithExtraKeywords() throws Exception {
+ verifyWithExtendedPatternObfuscator("Starting purchase call: \n" +
+ "<gateway>\n" +
+ "<card>4111111111111111</card>\n" +
+ "<address1>790 test blvd</address1>\n" +
+ "<bankAccountNumber>482391823</bankAccountNumber>\n" +
+ "<password>supersecret</password>\n" +
+ "</gateway>",
+ "Starting purchase call: \n" +
+ "<gateway>\n" +
+ "<card>411111******1111</card>\n" +
+ "<address1>*************</address1>\n" +
+ "<bankAccountNumber>*********</bankAccountNumber>\n" +
+ "<password>***********</password>\n" +
+ "</gateway>");
+ }
+
private void verify(final String input, final String output) {
final ILoggingEvent event = Mockito.mock(ILoggingEvent.class);
Mockito.when(event.getFormattedMessage()).thenReturn(input);
+ converter.start();
final String obfuscated = converter.convert(event);
Assert.assertEquals(obfuscated, output, obfuscated);
}
+
+ private void verifyWithExtendedPatternObfuscator(final String input, final String output) {
+ final ExtendedObfuscatorConverter extendedConverter = new ExtendedObfuscatorConverter();
+ final ILoggingEvent event = Mockito.mock(ILoggingEvent.class);
+ Mockito.when(event.getFormattedMessage()).thenReturn(input);
+
+ extendedConverter.start();
+ final String obfuscated = extendedConverter.convert(event);
+ Assert.assertEquals(obfuscated, output, obfuscated);
+ }
+
+ class ExtendedObfuscatorConverter extends ObfuscatorConverter {
+ @Override
+ public void start() {
+ super.start();
+ }
+
+ @Override
+ public List<String> getOptionList() {
+ return ImmutableList.of("address1");
+ }
+ }
}
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/server/log/obfuscators/TestPatternObfuscator.java b/profiles/killbill/src/test/java/org/killbill/billing/server/log/obfuscators/TestPatternObfuscator.java
index 934b81e..ecc3cf3 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/server/log/obfuscators/TestPatternObfuscator.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/server/log/obfuscators/TestPatternObfuscator.java
@@ -59,6 +59,29 @@ public class TestPatternObfuscator extends ServerTestSuiteNoDB {
}
@Test(groups = "fast")
+ public void testXmlWithAttributesOnTheKey() throws Exception {
+ verify("<PayerInfo xsi:type=\"ebl:PayerInfoType\">\n" +
+ "<accountnumber xsi:type=\"ebl:EmailAddressType\">michaelhk@gmail.com</accountnumber>\n" +
+ "<PayerID xsi:type=\"ebl:UserIDType\">ZZS5TS7FD7MRA</PayerID>\n" +
+ "<PayerStatus xsi:type=\"ebl:PayPalUserStatusCodeType\">verified</PayerStatus>\n" +
+ "<PayerName xsi:type=\"ebl:PersonNameType\">\n" +
+ "<Salutation xmlns=\"urn:ebay:apis:eBLBaseComponents\"></Salutation>\n" +
+ "<ccFirstName xmlns=\"urn:ebay:apis:eBLBaseComponents\">Michael</ccFirstName>\n" +
+ "<MiddleName xmlns=\"urn:ebay:apis:eBLBaseComponents\"></MiddleName>\n" +
+ "<ccLastName xmlns=\"urn:ebay:apis:eBLBaseComponents\">Henrick</ccLastName>",
+
+ "<PayerInfo xsi:type=\"ebl:PayerInfoType\">\n" +
+ "<accountnumber xsi:type=\"ebl:EmailAddressType\">*******************</accountnumber>\n" +
+ "<PayerID xsi:type=\"ebl:UserIDType\">ZZS5TS7FD7MRA</PayerID>\n" +
+ "<PayerStatus xsi:type=\"ebl:PayPalUserStatusCodeType\">verified</PayerStatus>\n" +
+ "<PayerName xsi:type=\"ebl:PersonNameType\">\n" +
+ "<Salutation xmlns=\"urn:ebay:apis:eBLBaseComponents\"></Salutation>\n" +
+ "<ccFirstName xmlns=\"urn:ebay:apis:eBLBaseComponents\">*******</ccFirstName>\n" +
+ "<MiddleName xmlns=\"urn:ebay:apis:eBLBaseComponents\"></MiddleName>\n" +
+ "<ccLastName xmlns=\"urn:ebay:apis:eBLBaseComponents\">*******</ccLastName>");
+ }
+
+ @Test(groups = "fast")
public void testCyberSource() throws Exception {
verify("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">\n" +
diff --git a/profiles/killpay/src/main/resources/update-checker/killbill-server-update-list.properties b/profiles/killpay/src/main/resources/update-checker/killbill-server-update-list.properties
index c8dde49..e03035f 100644
--- a/profiles/killpay/src/main/resources/update-checker/killbill-server-update-list.properties
+++ b/profiles/killpay/src/main/resources/update-checker/killbill-server-update-list.properties
@@ -1,18 +1,155 @@
## Top level keys
# general.notice = This notice should rarely, if ever, be used as everyone will see it
+### 0.19.x series ###
+
+# 0.19.7
+0.19.7.updates =
+0.19.7.notices = This is the latest dev release.
+0.19.7.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.19.7
+
+# 0.19.6
+0.19.6.updates = 0.19.7
+0.19.6.notices = We recommend upgrading to 0.19.7, our latest dev release.
+0.19.6.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.19.6
+
+# 0.19.5
+0.19.5.updates = 0.19.7
+0.19.5.notices = We recommend upgrading to 0.19.7, our latest dev release.
+0.19.5.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.19.5
+
+# 0.19.4
+0.19.4.updates = 0.19.7
+0.19.4.notices = We recommend upgrading to 0.19.7, our latest dev release.
+0.19.4.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.19.4
+
+# 0.19.3
+0.19.3.updates = 0.19.7
+0.19.3.notices = We recommend upgrading to 0.19.7, our latest dev release.
+0.19.3.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.19.3
+
+# 0.19.2
+0.19.2.updates = 0.19.7
+0.19.2.notices = We recommend upgrading to 0.19.7, our latest dev release.
+0.19.2.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.19.2
+
+# 0.19.1
+0.19.1.updates = 0.19.7
+0.19.1.notices = We recommend upgrading to 0.19.7, our latest dev release.
+0.19.1.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.19.1
+
+# 0.19.0
+0.19.0.updates = 0.19.7
+0.19.0.notices = We recommend upgrading to 0.19.7, our latest dev release.
+0.19.0.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.19.0
+
### 0.18.x series ###
+# 0.18.19
+0.18.19.updates =
+0.18.19.notices = This is the latest GA release.
+0.18.19.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.19
+
+# 0.18.18
+0.18.18.updates = 0.18.19
+0.18.18.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.18.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.18
+
+# 0.18.17
+0.18.17.updates = 0.18.19
+0.18.17.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.17.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.17
+
+# 0.18.16
+0.18.16.updates = 0.18.19
+0.18.16.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.16.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.16
+
+# 0.18.15
+0.18.15.updates = 0.18.19
+0.18.15.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.15.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.15
+
+# 0.18.14
+0.18.14.updates = 0.18.19
+0.18.14.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.14.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.14
+
+# 0.18.13
+0.18.13.updates = 0.18.19
+0.18.13.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.13.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.13
+
+# 0.18.12
+0.18.12.updates = 0.18.19
+0.18.12.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.12.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.12
+
+# 0.18.11
+0.18.11.updates = 0.18.19
+0.18.11.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.11.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.11
+
+# 0.18.10
+0.18.10.updates = 0.18.19
+0.18.10.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.10.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.10
+
+# 0.18.9
+0.18.9.updates = 0.18.19
+0.18.9.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.9.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.9
+
+# 0.18.8
+0.18.8.updates = 0.18.19
+0.18.8.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.8.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.8
+
+# 0.18.7
+0.18.7.updates = 0.18.19
+0.18.7.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.7.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.7
+
+# 0.18.6
+0.18.6.updates = 0.18.19
+0.18.6.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.6.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.6
+
+# 0.18.5
+0.18.5.updates = 0.18.19
+0.18.5.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.5.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.5
+
+# 0.18.4
+0.18.4.updates = 0.18.19
+0.18.4.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.4.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.4
+
+# 0.18.3
+0.18.3.updates = 0.18.19
+0.18.3.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.3.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.3
+
+# 0.18.2
+0.18.2.updates = 0.18.19
+0.18.2.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.2.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.2
+
+# 0.18.1
+0.18.1.updates = 0.18.19
+0.18.1.notices = We recommend upgrading to 0.18.19, our latest GA release.
+0.18.1.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.1
+
# 0.18.0
-0.18.0.updates =
-0.18.0.notices = This is the latest GA release.
+0.18.0.updates = 0.18.19
+0.18.0.notices = We recommend upgrading to 0.18.19, our latest GA release.
0.18.0.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.18.0
### 0.17.x series ###
# 0.17.8
0.17.8.updates =
-0.17.8.notices = This is the latest dev release.
+0.17.8.notices = We recommend upgrading to 0.18.19, our latest GA release.
0.17.8.release-notes = https://github.com/killbill/killbill/releases/tag/killbill-0.17.8
# 0.17.7