[ 
https://issues.apache.org/jira/browse/FINERACT-2669?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Adam Saghy resolved FINERACT-2669.
----------------------------------
    Resolution: Fixed

> Bulk-import download templates throw HTTP 500 (IllegalArgumentException: 
> Invalid name) when a client or office name contains an apostrophe — the 
> named-range sanitiser uses a denylist that misses ' and other Excel-illegal 
> characters
> ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: FINERACT-2669
>                 URL: https://issues.apache.org/jira/browse/FINERACT-2669
>             Project: Apache Fineract
>          Issue Type: Bug
>          Components: DataImportTool
>            Reporter: Farooq Ayoade
>            Priority: Major
>             Fix For: 1.15.0
>
>
> h3. Observed behavior
> Downloading a bulk-import template that embeds client lookups (e.g. loan 
> repayment: {{{}GET /v1/loans/repayments/downloadtemplate{}}}) returns HTTP 
> 500 when any client in the requesting user's office hierarchy has an 
> apostrophe in its display name:
> {{java.lang.IllegalArgumentException: Invalid name: 
> 'Account_IRE'S_LIMITED_181_': name must be letter, digit, period, or 
> underscore
> at org.apache.poi.hssf.usermodel.HSSFName.validateName(HSSFName.java:206)
> at org.apache.poi.hssf.usermodel.HSSFName.setNameName(HSSFName.java:134)
> at 
> org.apache.fineract.infrastructure.bulkimport.populator.AbstractWorkbookPopulator.setSanitized(AbstractWorkbookPopulator.java)
> at 
> org.apache.fineract.infrastructure.bulkimport.populator.loanrepayment.LoanRepaymentWorkbookPopulator.setNames(...)}}
> {{}}
> h3. Expected behavior
> The template downloads successfully (HTTP 200). The client/office name is 
> sanitised into a valid Excel defined-name (only letter, digit, period, 
> underscore) for the dropdown named range, regardless of which characters the 
> display name contains.
> h3. Steps to reproduce
>  # Create a client whose display name contains an apostrophe, e.g. {{{}IRE'S 
> LIMITED{}}}, with an active loan.
>  # As a user whose office hierarchy includes that client, call {{{}GET 
> /fineract-provider/api/v1/loans/repayments/downloadtemplate?dateFormat=dd%20MMMM%20yyyy{}}}.
>  # Observe HTTP 500 with the {{Invalid name}} {{IllegalArgumentException}} 
> above. (Scope the request to an office that excludes the apostrophe client 
> and it succeeds — confirming the trigger is the name content.)
> h3. Root cause
> {{AbstractWorkbookPopulator.setSanitized()}} sanitises a display name before 
> passing it to {{Name.setNameName(...)}} for a dropdown named range. The 
> sanitiser uses a *denylist* regex that enumerates "bad" characters to replace 
> with {{{}_{}}}:
>  
>  
> {{private static final Pattern NAME_REGEX = Pattern.compile("[ 
> @#&()<>,;.:$£€§°\\\\/=!\\?\\-\\+\\*\"\\[}}
> {{]]");}}
> The apostrophe {{'}} is not in the list (nor are {{{}%{}}}, {{{}~{}}}, 
> {{{}^{}}}, {{{{}}{{}}}, {{{}}{}}}, {{{}|{}}}, backtick, etc.), so it survives 
> into the defined name and POI rejects it. A denylist inherently misses any 
> character it does not enumerate.
> h3. Proposed fix
> Invert the denylist into an {*}allowlist{*}: replace any character that is 
> not a valid Excel defined-name character with {{{}_{}}}. Excel/POI permit 
> letters, digits, period and underscore; keep Unicode letters/digits so 
> accented names (which the old denylist preserved) are unaffected:
>  
> {{private static final Pattern NAME_REGEX = 
> Pattern.compile("[^\\p\\{L}\\p\\{N}._]");}}
> This fixes the apostrophe and every other Excel-illegal character in one 
> place, for every template that builds named ranges via {{setSanitized}} (loan 
> repayment, savings/RD/FD transactions, guarantor, groups, …). Related: 
> FINERACT-1256 (the original sanitiser change).
> ----
> {{}}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to