diff --git a/iban.cpp b/iban.cpp index 9a82f52..4caee9a 100644 --- a/iban.cpp +++ b/iban.cpp @@ -28,12 +28,8 @@ extern "C" } -#include #include -#include "specification.h" -#include "validate.h" - extern "C" { PG_MODULE_MAGIC; @@ -41,9 +37,41 @@ extern "C" using Iban = char; } -void Validate::addSpecification(Specification* specPtr) { - this->specifications[specPtr->countryCode] = specPtr; -} +class Specification { + public: + Specification(std::string structure, size_t length) + : structure{ structure } + , m_length{ length } + { + }; + + inline size_t getLength() const noexcept + { + return m_length; + } + + std::string structure; + +private: + size_t m_length; +}; + +class Validate { + public: + Validate(); + + bool isValid(std::string arg); + + void addSpecification(std::string countryCode, size_t length, std::string structure) noexcept + { + specifications.emplace(countryCode, std::make_unique(structure, length)); + } + + std::map> specifications; +}; + +/* Validator global instance. */ +static Validate validator; /** * Calculates the MOD 97 10 of the passed IBAN as specified in ISO7064. @@ -51,7 +79,7 @@ void Validate::addSpecification(Specification* specPtr) { * @param string iban * @returns {bool} */ -bool iso7064Mod97_10(std::string iBan) { +static bool iso7064Mod97_10(std::string iBan) { std::rotate(iBan.begin(), iBan.begin() + 4, iBan.end()); std::string numberstring;//will contain the letter substitutions @@ -75,8 +103,9 @@ bool iso7064Mod97_10(std::string iBan) { number = std::stol(prepended + numberstring.substr(segstart, step)); int remainder = number % 97; prepended = std::to_string(remainder); - if (remainder < 10) + if (remainder < 10) { prepended = "0" + prepended; + } segstart = segstart + step; step = 7; } @@ -93,7 +122,7 @@ bool iso7064Mod97_10(std::string iBan) { * @param {string} structure the structure to parse * @returns {regexp} */ -std::regex parseStructure(std::string structure) { +static std::regex parseStructure(std::string structure) { std::smatch match; std::string::const_iterator text_iter = structure.cbegin(); @@ -124,301 +153,205 @@ std::regex parseStructure(std::string structure) { return std::regex(regex.c_str()); } -bool Validate::isValid(std::string arg) { - Specification* spec = new Specification(arg); - +bool Validate::isValid(std::string account) { /* Convert uppercase */ - std::transform(spec->example.begin(), spec->example.end(), - spec->example.begin(), toupper); + std::transform(account.begin(), account.end(), account.begin(), toupper); + + /* Reject anything too small */ + if (account.length() < 3) { + return false; + } /* Match on country */ - spec->countryCode = spec->example.substr(0, 2); - spec->length = spec->example.length(); - Specification* specFound = this->specifications[spec->countryCode]; + const std::string& countryCode = account.substr(0, 2); + const std::string& shortened = account.substr(4); + + const std::unique_ptr& specFound = this->specifications[countryCode]; if (!specFound) { return false; } /* Test accountnumber */ - std::string shortened = spec->example.substr(4, spec->example.length()); - bool result = specFound->length == spec->length - && specFound->countryCode.compare(spec->countryCode) == 0 + return specFound->getLength() == account.length() && std::regex_match(shortened, parseStructure(specFound->structure)) - && iso7064Mod97_10(spec->example); - - delete spec; - return result; -} - -Validate::~Validate() { - for (auto it = specifications.begin(); it != specifications.end(); it++) { - delete it->second; - } + && iso7064Mod97_10(account); } Validate::Validate() { - addSpecification(new Specification( - "AD", 24, "F04F04A12", - "AD1200012030200359100100")); - addSpecification(new Specification( - "AE", 23, "F03F16", - "AE070331234567890123456")); - addSpecification(new Specification( - "AL", 28, "F08A16", - "AL47212110090000000235698741")); - addSpecification(new Specification( - "AT", 20, "F05F11", - "AT611904300234573201")); - addSpecification(new Specification( - "AZ", 28, "U04A20", - "AZ21NABZ00000000137010001944")); - addSpecification(new Specification( - "BA", 20, "F03F03F08F02", - "BA391290079401028494")); - addSpecification(new Specification( - "BE", 16, "F03F07F02", - "BE68539007547034")); - addSpecification(new Specification( - "BG", 22, "U04F04F02A08", - "BG80BNBG96611020345678")); - addSpecification(new Specification( - "BH", 22, "U04A14", - "BH67BMAG00001299123456")); - addSpecification(new Specification( - "BR", 29, "F08F05F10U01A01", - "BR9700360305000010009795493P1")); - addSpecification(new Specification( - "CH", 21, "F05A12", - "CH9300762011623852957")); - addSpecification(new Specification( - "CR", 21, "F03F14", - "CR0515202001026284066")); - addSpecification(new Specification( - "CY", 28, "F03F05A16", - "CY17002001280000001200527600")); - addSpecification(new Specification( - "CZ", 24, "F04F06F10", - "CZ6508000000192000145399")); - addSpecification(new Specification( - "DE", 22, "F08F10", - "DE89370400440532013000")); - addSpecification(new Specification( - "DK", 18, "F04F09F01", - "DK5000400440116243")); - addSpecification(new Specification( - "DO", 28, "U04F20", - "DO28BAGR00000001212453611324")); - addSpecification(new Specification( - "EE", 20, "F02F02F11F01", - "EE382200221020145685")); - addSpecification(new Specification( - "ES", 24, "F04F04F01F01F10", - "ES9121000418450200051332")); - addSpecification(new Specification( - "FI", 18, "F06F07F01", - "FI2112345600000785")); - addSpecification(new Specification( - "FO", 18, "F04F09F01", - "FO6264600001631634")); - addSpecification(new Specification( - "FR", 27, "F05F05A11F02", - "FR1420041010050500013M02606")); - addSpecification(new Specification( - "GB", 22, "U04F06F08", - "GB29NWBK60161331926819")); - addSpecification(new Specification( - "GE", 22, "U02F16", - "GE29NB0000000101904917")); - addSpecification(new Specification( - "GI", 23, "U04A15", - "GI75NWBK000000007099453")); - addSpecification(new Specification( - "GL", 18, "F04F09F01", - "GL8964710001000206")); - addSpecification(new Specification( - "GR", 27, "F03F04A16", - "GR1601101250000000012300695")); - addSpecification(new Specification( - "GT", 28, "A04A20", - "GT82TRAJ01020000001210029690")); - addSpecification(new Specification( - "HR", 21, "F07F10", - "HR1210010051863000160")); - addSpecification(new Specification( - "HU", 28, "F03F04F01F15F01", - "HU42117730161111101800000000")); - addSpecification(new Specification( - "IE", 22, "U04F06F08", - "IE29AIBK93115212345678")); - addSpecification(new Specification( - "IL", 23, "F03F03F13", - "IL620108000000099999999")); - addSpecification(new Specification( - "IS", 26, "F04F02F06F10", - "IS140159260076545510730339")); - addSpecification(new Specification( - "IT", 27, "U01F05F05A12", - "IT60X0542811101000000123456")); - addSpecification(new Specification( - "KW", 30, "U04A22", - "KW81CBKU0000000000001234560101")); - addSpecification(new Specification( - "KZ", 20, "F03A13", - "KZ86125KZT5004100100")); - addSpecification(new Specification( - "LB", 28, "F04A20", - "LB62099900000001001901229114")); - addSpecification(new Specification( - "LC", 32, "U04F24", - "LC07HEMM000100010012001200013015")); - addSpecification(new Specification( - "LI", 21, "F05A12", - "LI21088100002324013AA")); - addSpecification(new Specification( - "LT", 20, "F05F11", - "LT121000011101001000")); - addSpecification(new Specification( - "LU", 20, "F03A13", - "LU280019400644750000")); - addSpecification(new Specification( - "LV", 21, "U04A13", - "LV80BANK0000435195001")); - addSpecification(new Specification( - "MC", 27, "F05F05A11F02", - "MC5811222000010123456789030")); - addSpecification(new Specification( - "MD", 24, "U02A18", - "MD24AG000225100013104168")); - addSpecification(new Specification( - "ME", 22, "F03F13F02", - "ME25505000012345678951")); - addSpecification(new Specification( - "MK", 19, "F03A10F02", - "MK07250120000058984")); - addSpecification(new Specification( - "MR", 27, "F05F05F11F02", - "MR1300020001010000123456753")); - addSpecification(new Specification( - "MT", 31, "U04F05A18", - "MT84MALT011000012345MTLCAST001S")); - addSpecification(new Specification( - "MU", 30, "U04F02F02F12F03U03", - "MU17BOMM0101101030300200000MUR")); - addSpecification(new Specification( - "NL", 18, "U04F10", - "NL91ABNA0417164300")); - addSpecification(new Specification( - "NO", 15, "F04F06F01", - "NO9386011117947")); - addSpecification(new Specification( - "PK", 24, "U04A16", - "PK36SCBL0000001123456702")); - addSpecification(new Specification( - "PL", 28, "F08F16", - "PL61109010140000071219812874")); - addSpecification(new Specification( - "PS", 29, "U04A21", - "PS92PALS000000000400123456702")); - addSpecification(new Specification( - "PT", 25, "F04F04F11F02", - "PT50000201231234567890154")); - addSpecification(new Specification( - "RO", 24, "U04A16", - "RO49AAAA1B31007593840000")); - addSpecification(new Specification( - "RS", 22, "F03F13F02", - "RS35260005601001611379")); - addSpecification(new Specification( - "SA", 24, "F02A18", - "SA0380000000608010167519")); - addSpecification(new Specification( - "SE", 24, "F03F16F01", - "SE4550000000058398257466")); - addSpecification(new Specification( - "SI", 19, "F05F08F02", - "SI56263300012039086")); - addSpecification(new Specification( - "SK", 24, "F04F06F10", - "SK3112000000198742637541")); - addSpecification(new Specification( - "SM", 27, "U01F05F05A12", - "SM86U0322509800000000270100")); - addSpecification(new Specification( - "ST", 25, "F08F11F02", - "ST68000100010051845310112")); - addSpecification(new Specification( - "TL", 23, "F03F14F02", - "TL380080012345678910157")); - addSpecification(new Specification( - "TN", 24, "F02F03F13F02", - "TN5910006035183598478831")); - addSpecification(new Specification( - "TR", 26, "F05F01A16", - "TR330006100519786457841326")); - addSpecification(new Specification( - "VG", 24, "U04F16", - "VG96VPVG0000012345678901")); - addSpecification(new Specification( - "XK", 20, "F04F10F02", - "XK051212012345678906")); - addSpecification(new Specification( - "AO", 25, "F21", - "AO69123456789012345678901")); - addSpecification(new Specification( - "BF", 27, "F23", - "BF2312345678901234567890123")); - addSpecification(new Specification( - "BI", 16, "F12", - "BI41123456789012")); - addSpecification(new Specification( - "BJ", 28, "F24", - "BJ39123456789012345678901234")); - addSpecification(new Specification( - "CI", 28, "U01F23", - "CI17A12345678901234567890123")); - addSpecification(new Specification( - "CM", 27, "F23", - "CM9012345678901234567890123")); - addSpecification(new Specification( - "CV", 25, "F21", - "CV30123456789012345678901")); - addSpecification(new Specification( - "DZ", 24, "F20", - "DZ8612345678901234567890")); - addSpecification(new Specification( - "IR", 26, "F22", - "IR861234568790123456789012")); - addSpecification(new Specification( - "JO", 30, "A04F22", - "JO15AAAA1234567890123456789012")); - addSpecification(new Specification( - "MG", 27, "F23", - "MG1812345678901234567890123")); - addSpecification(new Specification( - "ML", 28, "U01F23", - "ML15A12345678901234567890123")); - addSpecification(new Specification( - "MZ", 25, "F21", - "MZ25123456789012345678901")); - addSpecification(new Specification( - "QA", 29, "U04A21", - "QA30AAAA123456789012345678901")); - addSpecification(new Specification( - "SN", 28, "U01F23", - "SN52A12345678901234567890123")); - addSpecification(new Specification( - "UA", 29, "F25", - "UA511234567890123456789012345")); - addSpecification(new Specification( - "EG", 27, "F23", - "EG1100006001880800100014553")); - addSpecification(new Specification( - "CG", 27, "F23", - "CG5230011000202151234567890")); - addSpecification(new Specification( - "GA", 27, "F23", - "GA2140002000055602673300064")); - + addSpecification( + "AD", 24, "F04F04A12"); + addSpecification( + "AE", 23, "F03F16"); + addSpecification( + "AL", 28, "F08A16"); + addSpecification( + "AT", 20, "F05F11"); + addSpecification( + "AZ", 28, "U04A20"); + addSpecification( + "BA", 20, "F03F03F08F02"); + addSpecification( + "BE", 16, "F03F07F02"); + addSpecification( + "BG", 22, "U04F04F02A08"); + addSpecification( + "BH", 22, "U04A14"); + addSpecification( + "BR", 29, "F08F05F10U01A01"); + addSpecification( + "CH", 21, "F05A12"); + addSpecification( + "CR", 21, "F03F14"); + addSpecification( + "CY", 28, "F03F05A16"); + addSpecification( + "CZ", 24, "F04F06F10"); + addSpecification( + "DE", 22, "F08F10"); + addSpecification( + "DK", 18, "F04F09F01"); + addSpecification( + "DO", 28, "U04F20"); + addSpecification( + "EE", 20, "F02F02F11F01"); + addSpecification( + "ES", 24, "F04F04F01F01F10"); + addSpecification( + "FI", 18, "F06F07F01"); + addSpecification( + "FO", 18, "F04F09F01"); + addSpecification( + "FR", 27, "F05F05A11F02"); + addSpecification( + "GB", 22, "U04F06F08"); + addSpecification( + "GE", 22, "U02F16"); + addSpecification( + "GI", 23, "U04A15"); + addSpecification( + "GL", 18, "F04F09F01"); + addSpecification( + "GR", 27, "F03F04A16"); + addSpecification( + "GT", 28, "A04A20"); + addSpecification( + "HR", 21, "F07F10"); + addSpecification( + "HU", 28, "F03F04F01F15F01"); + addSpecification( + "IE", 22, "U04F06F08"); + addSpecification( + "IL", 23, "F03F03F13"); + addSpecification( + "IS", 26, "F04F02F06F10"); + addSpecification( + "IT", 27, "U01F05F05A12"); + addSpecification( + "KW", 30, "U04A22"); + addSpecification( + "KZ", 20, "F03A13"); + addSpecification( + "LB", 28, "F04A20"); + addSpecification( + "LC", 32, "U04F24"); + addSpecification( + "LI", 21, "F05A12"); + addSpecification( + "LT", 20, "F05F11"); + addSpecification( + "LU", 20, "F03A13"); + addSpecification( + "LV", 21, "U04A13"); + addSpecification( + "MC", 27, "F05F05A11F02"); + addSpecification( + "MD", 24, "U02A18"); + addSpecification( + "ME", 22, "F03F13F02"); + addSpecification( + "MK", 19, "F03A10F02"); + addSpecification( + "MR", 27, "F05F05F11F02"); + addSpecification( + "MT", 31, "U04F05A18"); + addSpecification( + "MU", 30, "U04F02F02F12F03U03"); + addSpecification( + "NL", 18, "U04F10"); + addSpecification( + "NO", 15, "F04F06F01"); + addSpecification( + "PK", 24, "U04A16"); + addSpecification( + "PL", 28, "F08F16"); + addSpecification( + "PS", 29, "U04A21"); + addSpecification( + "PT", 25, "F04F04F11F02"); + addSpecification( + "RO", 24, "U04A16"); + addSpecification( + "RS", 22, "F03F13F02"); + addSpecification( + "SA", 24, "F02A18"); + addSpecification( + "SE", 24, "F03F16F01"); + addSpecification( + "SI", 19, "F05F08F02"); + addSpecification( + "SK", 24, "F04F06F10"); + addSpecification( + "SM", 27, "U01F05F05A12"); + addSpecification( + "ST", 25, "F08F11F02"); + addSpecification( + "TL", 23, "F03F14F02"); + addSpecification( + "TN", 24, "F02F03F13F02"); + addSpecification( + "TR", 26, "F05F01A16"); + addSpecification( + "VG", 24, "U04F16"); + addSpecification( + "XK", 20, "F04F10F02"); + addSpecification( + "AO", 25, "F21"); + addSpecification( + "BF", 27, "F23"); + addSpecification( + "BI", 16, "F12"); + addSpecification( + "BJ", 28, "F24"); + addSpecification( + "CI", 28, "U01F23"); + addSpecification( + "CM", 27, "F23"); + addSpecification( + "CV", 25, "F21"); + addSpecification( + "DZ", 24, "F20"); + addSpecification( + "IR", 26, "F22"); + addSpecification( + "JO", 30, "A04F22"); + addSpecification( + "MG", 27, "F23"); + addSpecification( + "ML", 28, "U01F23"); + addSpecification( + "MZ", 25, "F21"); + addSpecification( + "QA", 29, "U04A21"); + addSpecification( + "SN", 28, "U01F23"); + addSpecification( + "UA", 29, "F25"); + addSpecification( + "EG", 27, "F23"); + addSpecification( + "CG", 27, "F23"); + addSpecification( + "GA", 27, "F23"); } /** @@ -430,15 +363,15 @@ Validate::Validate() { * @returns {bool} */ namespace { + bool account_validate_text(text *iban) { char *ciban; bool result; - Validate val; ciban = text_to_cstring(iban); try { - result = val.isValid(std::string(ciban)); + result = validator.isValid(ciban); } catch (std::exception& e) { elog(ERROR, "%s", e.what()); return false; @@ -449,10 +382,9 @@ bool account_validate_text(text *iban) { bool account_validate_str(char *iban) { bool result; - Validate val; try { - result = val.isValid(std::string(iban)); + result = validator.isValid(iban); } catch (std::exception& e) { elog(ERROR, "%s", e.what()); return false; @@ -460,7 +392,8 @@ bool account_validate_str(char *iban) { return result; } -} + +} // namespace extern "C" { diff --git a/specification.h b/specification.h deleted file mode 100644 index 4eb059a..0000000 --- a/specification.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once - -#include - -class Specification { - public: - Specification(std::string countryCode, int length, std::string structure, std::string example) : - countryCode(countryCode), - length(length), - structure(structure), - example(example) { - }; - Specification(std::string example) : example(example) {}; - std::string countryCode; - int length; - std::string structure; - std::string example; -}; diff --git a/validate.h b/validate.h deleted file mode 100644 index 90c5d66..0000000 --- a/validate.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once -#include -#include -#include "specification.h" - -class Validate { - public: - Validate(); - ~Validate(); - bool isValid(std::string arg); - void addSpecification(Specification* specPtr); - - std::map specifications; -};