IDEMPIERE-3304

Use apache commons-validator instead of own code to validate IBANs
This commit is contained in:
markus_bozem 2017-04-14 17:42:31 +02:00
parent 61dee84cb4
commit 1c166a17f0
10 changed files with 32 additions and 122 deletions

View File

@ -15,6 +15,7 @@
<classpathentry exported="true" kind="lib" path="jfreechart-1.0.19.jar"/>
<classpathentry exported="true" kind="lib" path="jnlp.jar"/>
<classpathentry exported="true" kind="lib" path="barcode4j-2.1.jar"/>
<classpathentry exported="true" kind="lib" path="commons-validator-1.6.jar"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
</classpath>

View File

@ -12,7 +12,8 @@ Bundle-ClassPath: base.jar,
jfreechart-1.0.19.jar,
jnlp.jar,
barcode4j-2.1.jar,
bsh-2.0b6.jar
bsh-2.0b6.jar,
commons-validator-1.6.jar
Export-Package: bsh,
bsh.classpath,
bsh.collection,

View File

@ -27,7 +27,8 @@ bin.includes = META-INF/,\
OSGI-INF/addressvalidationeventhandler.xml,\
schema/,\
barcode4j-2.1.jar,\
bsh-2.0b6.jar
bsh-2.0b6.jar,\
commons-validator-1.6.jar
output.base.jar = bin/
src.includes = schema/
source.base.jar = src/

View File

@ -11,6 +11,7 @@
<get src="${url.maven2.lib}/maven2/net/sourceforge/barbecue/barbecue/1.5-beta1/barbecue-1.5-beta1.jar" dest="barbecue-1.5-beta1.jar" usetimestamp="true" verbose="true" retries="5" />
<get src="${url.maven2.lib}/maven2/org/jfree/jcommon/1.0.23/jcommon-1.0.23.jar" dest="jcommon-1.0.23.jar" usetimestamp="true" verbose="true" retries="5" />
<get src="${url.maven2.lib}/maven2/org/jfree/jfreechart/1.0.19/jfreechart-1.0.19.jar" dest="jfreechart-1.0.19.jar" usetimestamp="true" verbose="true" retries="5" />
<get src="${url.maven2.lib}/maven2/commons-validator/commons-validator/1.6/commons-validator-1.6.jar" dest="commons-validator-1.6.jar" usetimestamp="true" verbose="true" retries="5" />
<!-- jnlp is not used in idempiere? -->
<get src="${url.maven2.lib}/maven2/net/sf/barcode4j/barcode4j/2.1/barcode4j-2.1.jar" dest="barcode4j-2.1.jar" usetimestamp="true" verbose="true" retries="5" />
<get src="${url.file.srv}/jarfile/4.1/jnlp.jar" dest="jnlp.jar" usetimestamp="true" verbose="true" retries="5" />

View File

@ -213,7 +213,7 @@ public class MBPBankAccount extends X_C_BP_BankAccount
if (MSysConfig.getBooleanValue(MSysConfig.IBAN_VALIDATION, true, Env.getAD_Client_ID(Env.getCtx()))) {
if (!Util.isEmpty(getIBAN())) {
setIBAN(IBAN.normalizeIBAN(getIBAN()));
if (!IBAN.isCheckDigitValid(getIBAN())) {
if (!IBAN.isValid(getIBAN())) {
log.saveError("Error", "IBAN is invalid");
return false;
}

View File

@ -135,7 +135,7 @@ public class MBankAccount extends X_C_BankAccount
if (MSysConfig.getBooleanValue(MSysConfig.IBAN_VALIDATION, true, Env.getAD_Client_ID(Env.getCtx()))) {
if (!Util.isEmpty(getIBAN())) {
setIBAN(IBAN.normalizeIBAN(getIBAN()));
if (!IBAN.isCheckDigitValid(getIBAN())) {
if (!IBAN.isValid(getIBAN())) {
log.saveError("Error", "IBAN is invalid");
return false;
}

View File

@ -801,7 +801,7 @@ public class MPayment extends X_C_Payment
if (MSysConfig.getBooleanValue(MSysConfig.IBAN_VALIDATION, true, Env.getAD_Client_ID(Env.getCtx()))) {
if (!Util.isEmpty(getIBAN())) {
setIBAN(IBAN.normalizeIBAN(getIBAN()));
if (!IBAN.isCheckDigitValid(getIBAN())) {
if (!IBAN.isValid(getIBAN())) {
log.saveError("Error", "IBAN is invalid");
return false;
}

View File

@ -86,7 +86,7 @@ public class MPaymentTransaction extends X_C_PaymentTransaction implements Proce
if (MSysConfig.getBooleanValue(MSysConfig.IBAN_VALIDATION, true, Env.getAD_Client_ID(Env.getCtx()))) {
if (!Util.isEmpty(getIBAN())) {
setIBAN(IBAN.normalizeIBAN(getIBAN()));
if (!IBAN.isCheckDigitValid(getIBAN())) {
if (!IBAN.isValid(getIBAN())) {
log.saveError("Error", "IBAN is invalid");
return false;
}

View File

@ -1,11 +1,19 @@
// adapted from http://how-blogz.blogspot.de/2007/08/java-iban-check-digit-validation.html
// soastation.banking.IBAN
/******************************************************************************
* Product: iDempiere Business Suite ERP/CRM/SCM *
* Copyright (C) 2017 Markus Bozem *
* This program is free software; you can redistribute it and/or modify it *
* under the terms version 2 of the GNU General Public License as published *
* by the Free Software Foundation. This program is distributed in the hope *
* that it will be useful, but WITHOUT ANY WARRANTY; without even the implied *
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *
* See the GNU General Public License for more details. *
* You should have received a copy of the GNU General Public License along *
* with this program; if not, write to the Free Software Foundation, Inc., *
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. * *
*****************************************************************************/
package org.compiere.util;
import java.math.BigInteger;
import java.util.ResourceBundle;
import org.apache.commons.validator.routines.IBANValidator;
public class IBAN {
@ -22,73 +30,16 @@ public class IBAN {
}
return null ;
}
/**
* Determines if the given IBAN is valid based on the check digit. To
* validate the checksum: 1. Check that the total IBAN length is correct as
* per the country. If not, the IBAN is invalid. 2. Move the four initial
* characters to the end of the string. 3. Replace the letters in the string
* with digits, expanding the string as necessary, such that A=10, B=11 and
* Z=35. 4. Convert the string to an integer and mod-97 the entire number.
* If the remainder is 1 you have a valid IBAN number.
*
* @param iban
* @return boolean indicating if specific IBAN has a valid check digit
* @return boolean indicating if specific IBAN is valid
*/
public static boolean isCheckDigitValid(String iban) {
try {
if (null == iban)
return false;
int validIBANLength = getValidIBANLength(iban);
if (validIBANLength < 4)
return false;
if (iban.length() != validIBANLength)
return false;
BigInteger numericIBAN = getNumericIBAN(iban, false);
public static boolean isValid(String iban) {
IBANValidator iBANValidator = IBANValidator.getInstance() ;
int checkDigit = numericIBAN.mod(new BigInteger("97")).intValue();
return checkDigit == 1;
} catch (Exception e) {
return false;
}
}
/**
* Using the IBAN.properties file gets the valid fixed length value for a
* country code. Only uses the first 2 characters of the given string.
*
* @param countryCode
* @return
*/
public static int getValidIBANLength(String countryCode) {
String code = countryCode.substring(0, 2).toUpperCase();
String length = ResourceBundle.getBundle(IBAN.class.getCanonicalName()).getString("length." + code);
if (length == null)
return -1;
return Integer.valueOf(length).intValue();
}
private static BigInteger getNumericIBAN(String iban, boolean isCheckDigitAtEnd) {
String endCheckDigitIBAN = iban;
if (!isCheckDigitAtEnd) {
// Move first four characters to end of string to put check digit at
// end
endCheckDigitIBAN = iban.substring(4) + iban.substring(0, 4);
}
StringBuffer numericIBAN = new StringBuffer();
for (int i = 0; i < endCheckDigitIBAN.length(); i++) {
if (Character.isDigit(endCheckDigitIBAN.charAt(i))) {
numericIBAN.append(endCheckDigitIBAN.charAt(i));
} else {
numericIBAN.append(10 + getAlphabetPosition(endCheckDigitIBAN.charAt(i)));
}
}
return new BigInteger(numericIBAN.toString());
}
private static int getAlphabetPosition(char letter) {
return Character.valueOf(Character.toUpperCase(letter)).compareTo(Character.valueOf('A'));
return iBANValidator.isValid(iban) ;
}
}

View File

@ -1,45 +0,0 @@
# IBAN related properties. Includes IBAN lengths for different countries
length.AD=24
length.AT=20
length.BE=16
length.BA=20
length.BG=22
length.CH=21
length.CY=28
length.CZ=24
length.DE=22
length.DK=18
length.EE=20
length.ES=24
length.FO=18
length.FI=18
length.FR=27
length.GB=22
length.GI=23
length.GL=18
length.GR=27
length.HU=28
length.HR=21
length.IE=22
length.IS=26
length.IT=27
length.LI=21
length.LT=20
length.LU=20
length.LV=21
length.MA=24
length.MC=27
length.MK=19
length.MT=31
length.NL=18
length.NO=15
length.PL=28
length.PT=25
length.RO=24
length.RS=22
length.SE=24
length.SI=19
length.SK=24
length.SM=27
length.TN=24
length.TR=26