From 79cbf76761b28812303ac6a5da57d755aa7d1a41 Mon Sep 17 00:00:00 2001 From: "Erik C. Thauvin" Date: Thu, 23 Mar 2023 20:37:01 -0700 Subject: [PATCH] Added validateCreditMethod standalone method --- README.md | 20 ++--- lib/build.gradle.kts | 2 +- .../main/java/rife/render/RenderUtils.java | 77 +++++++++++-------- .../java/rife/render/TestRenderUtils.java | 9 +++ 4 files changed, 65 insertions(+), 43 deletions(-) diff --git a/README.md b/README.md index c8d532f..f608f01 100644 --- a/README.md +++ b/README.md @@ -23,16 +23,16 @@ This project provides a collection of useful template renderers. ## Encoding Renderers -| Renderer | Description | -|:--------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------| -| [rife.render.EncodeBase64](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeBase64) | Encodes a template value to Base64 | -| [rife.render.EncodeHtml](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeHtml) | Encodes a template value to HTML | -| [rife.render.EncodeHtmlEntities](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeHtmlEntities) | Encodes a template value to HTML decimal entities | -| [rife.render.EncodeJs](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeJs) | Encodes a template value to JavaScript/ECMAScript | -| [rife.render.EncodeJson](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeJson) | Encodes a template value to JSON | -| [rife.render.EncodeUnicode](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeUnicode) | Encodes a template value to Unicode escape codes | -| [rife.render.EncodeUrl](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeUrl) | URL-encodes a template value | -| [rife.render.EncodeXml](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeXml) | Encodes a template value to XML | +| Renderer | Description | +|:------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------| +| [rife.render.EncodeBase64](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeBase64) | Encodes a template value to Base64 | +| [rife.render.EncodeHtml](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeHtml) | Encodes a template value to HTML | +| [rife.render.EncodeHtmlEntities](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeHtmlEntities) | Encodes a template value to HTML decimal entities | +| [rife.render.EncodeJs](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeJs) | Encodes a template value to JavaScript/ECMAScript | +| [rife.render.EncodeJson](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeJson) | Encodes a template value to JSON | +| [rife.render.EncodeUnicode](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeUnicode) | Encodes a template value to Unicode escape codes | +| [rife.render.EncodeUrl](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeUrl) | URL-encodes a template value | +| [rife.render.EncodeXml](https://github.com/rife2/rife2-template-renderers/wiki/rife.render.EncodeXml) | Encodes a template value to XML | ## Format Renderers diff --git a/lib/build.gradle.kts b/lib/build.gradle.kts index 52e192a..a4035eb 100644 --- a/lib/build.gradle.kts +++ b/lib/build.gradle.kts @@ -13,7 +13,7 @@ plugins { id("com.github.ben-manes.versions") version "0.46.0" } -val rifeVersion by rootProject.extra { "1.5.4" } +val rifeVersion by rootProject.extra { "1.5.5" } group = "com.uwyn.rife2" version = "1.0.1-SNAPSHOT" diff --git a/lib/src/main/java/rife/render/RenderUtils.java b/lib/src/main/java/rife/render/RenderUtils.java index 2fea4a7..e9fbe3c 100644 --- a/lib/src/main/java/rife/render/RenderUtils.java +++ b/lib/src/main/java/rife/render/RenderUtils.java @@ -192,38 +192,13 @@ public final class RenderUtils { return src; } - try { - var cc = src.replaceAll("[^0-9]", ""); + var cc = src.replaceAll("[^0-9]", ""); - var len = cc.length(); - if (len >= 4) { - // Luhn algorithm - var sum = 0; - boolean isSecond = false; - int digit; - char c; - for (int i = len - 1; i >= 0; i--) { - c = cc.charAt(i); - if (c >= '0' && c <= '9') { - digit = cc.charAt(i) - '0'; - if (isSecond) { - digit = digit * 2; - } - sum += digit / 10; - sum += digit % 10; - } - - isSecond = !isSecond; - } - if (sum % 10 == 0) { - return cc.substring(len - 4); - } - } - } catch (NumberFormatException ignore) { - // do nothing + if (validateCreditCard(cc)) { + return cc.substring(cc.length() - 4); + } else { + return ""; } - - return ""; } /** @@ -344,8 +319,8 @@ public final class RenderUtils { return src; } return fetchUrl(String.format("https://api.qrserver.com/v1/create-qr-code/?format=svg&size=%s&data=%s", - StringUtils.encodeUrl(size), - StringUtils.encodeUrl(src.trim())), + StringUtils.encodeUrl(size), + StringUtils.encodeUrl(src.trim())), src); } @@ -520,4 +495,42 @@ public final class RenderUtils { return sb.toString(); } + + /** + * Validates a credit card number using the Luhn algorithm. + * + * @param cc the credit card number + * @return {@code trude} if the credit card number is valid + */ + public static boolean validateCreditCard(String cc) { + try { + var len = cc.length(); + if (len >= 8 && len <= 19) { + // Luhn algorithm + var sum = 0; + boolean second = false; + int digit; + char c; + for (int i = len - 1; i >= 0; i--) { + c = cc.charAt(i); + if (c >= '0' && c <= '9') { + digit = cc.charAt(i) - '0'; + if (second) { + digit = digit * 2; + } + sum += digit / 10; + sum += digit % 10; + + second = !second; + } + } + if (sum % 10 == 0) { + return true; + } + } + } catch (NumberFormatException ignore) { + // do nothing + } + return false; + } } \ No newline at end of file diff --git a/lib/src/test/java/rife/render/TestRenderUtils.java b/lib/src/test/java/rife/render/TestRenderUtils.java index 1ef7762..f0f55c5 100644 --- a/lib/src/test/java/rife/render/TestRenderUtils.java +++ b/lib/src/test/java/rife/render/TestRenderUtils.java @@ -83,4 +83,13 @@ class TestRenderUtils { assertThat(RenderUtils.uncapitalize("A")).isEqualTo("a"); assertThat(RenderUtils.uncapitalize("")).as("empty").isEqualTo(""); } + + @Test + void testValidateCreditCard() { + assertThat(RenderUtils.validateCreditCard("4505 4672 3366 6430")).as("visa").isTrue(); + assertThat(RenderUtils.validateCreditCard("5189-5923-3915-0425")).as("mastercard").isTrue(); + assertThat(RenderUtils.validateCreditCard("3433634926643302")).as("amex").isTrue(); + assertThat(RenderUtils.validateCreditCard("6011 1076-8252 0629")).as("discover").isTrue(); + assertThat(RenderUtils.validateCreditCard("0123456789012345")).as("invalid").isFalse(); + } }