This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
laforge gerrit-no-reply at lists.osmocom.orglaforge has submitted this change. ( https://gerrit.osmocom.org/c/osmo-remsim/+/20811 ) Change subject: bankd: regex matching of reader names ...................................................................... bankd: regex matching of reader names So far, bankd did a 1:1 string match of the CSV file line against the reader name. As pcsc-lite reader names unfortunately tend to change at times, we introduce matching by regular expressions in this patch. Change-Id: I58b71f9562e152e7ed21b55d7b876bba481b01f8 --- M doc/manuals/chapters/remsim-bankd.adoc M src/bankd/bankd_pcsc.c 2 files changed, 115 insertions(+), 13 deletions(-) Approvals: Jenkins Builder: Verified laforge: Looks good to me, approved diff --git a/doc/manuals/chapters/remsim-bankd.adoc b/doc/manuals/chapters/remsim-bankd.adoc index e76afd5..87dafa1 100644 --- a/doc/manuals/chapters/remsim-bankd.adoc +++ b/doc/manuals/chapters/remsim-bankd.adoc @@ -108,6 +108,9 @@ This CSV file specifies the mapping between the string names of the PCSC readers and the RSPRO bandk/slot numbers. The format is as follows: +* first column: bankd number +* second column: slot number within bankd +* third column: extended POSIX regular expression matching the slot .Example: CSV file mapping bankd slots 0..4 to an ACS ACR33U-A1 reader slots ---- @@ -128,4 +131,24 @@ ---- In this example, there's only a single PC/SC reader available, and it has a string of -"Alcor Micro AU9560 00 00" which needs to be copy-pasted into the CSV file. +"Alcor Micro AU9560 00 00" which needs to be used in the CSV file. + +NOTE:: If the reader name contains any special characters, they might need to be escaped according +to the extended POSIX regular expression syntax. See `man 7 regex` for a reference. + +.Example: CSV file mapping bankd slots 0..7 to a sysmoOCTSIM: +---- +"1","0","sysmocom sysmoOCTSIM \[CCID\] \(ab19180f3335355320202034463a15ff\) [0-9]{2} 00" +"1","1","sysmocom sysmoOCTSIM \[CCID\] \(ab19180f3335355320202034463a15ff\) [0-9]{2} 01" +"1","2","sysmocom sysmoOCTSIM \[CCID\] \(ab19180f3335355320202034463a15ff\) [0-9]{2} 02" +"1","3","sysmocom sysmoOCTSIM \[CCID\] \(ab19180f3335355320202034463a15ff\) [0-9]{2} 03" +"1","4","sysmocom sysmoOCTSIM \[CCID\] \(ab19180f3335355320202034463a15ff\) [0-9]{2} 04" +"1","5","sysmocom sysmoOCTSIM \[CCID\] \(ab19180f3335355320202034463a15ff\) [0-9]{2} 05" +"1","6","sysmocom sysmoOCTSIM \[CCID\] \(ab19180f3335355320202034463a15ff\) [0-9]{2} 06" +"1","7","sysmocom sysmoOCTSIM \[CCID\] \(ab19180f3335355320202034463a15ff\) [0-9]{2} 07" +---- + +In the above example, the +\[CCID\]+ and the +\(serialnumber\)+ both had to be escaped. + +The +[0-9]\{2\}+ construct exists to perform wildcard matching, no matter which particular two-digit number +pcscd decides to use. diff --git a/src/bankd/bankd_pcsc.c b/src/bankd/bankd_pcsc.c index f6e3683..e0b349c 100644 --- a/src/bankd/bankd_pcsc.c +++ b/src/bankd/bankd_pcsc.c @@ -1,4 +1,4 @@ -/* (C) 2018-2019 by Harald Welte <laforge at gnumonks.org> +/* (C) 2018-2020 by Harald Welte <laforge at gnumonks.org> * * All Rights Reserved * @@ -26,6 +26,8 @@ #include <osmocom/core/utils.h> #include <csv.h> +#include <regex.h> +#include <errno.h> #include "bankd.h" @@ -34,9 +36,19 @@ /* RSPRO bank slot number */ struct bank_slot slot; /* String name of the reader in PC/SC world */ - const char *name; + const char *name_regex; }; +/* return a talloc-allocated string containing human-readable POSIX regex error */ +static char *get_regerror(void *ctx, int errcode, regex_t *compiled) +{ + size_t len = regerror(errcode, compiled, NULL, 0); + char *buffer = talloc_size(ctx, len); + OSMO_ASSERT(buffer); + regerror(errcode, compiled, buffer, len); + return buffer; +} + enum parser_state_name { ST_NONE, ST_BANK_NR, @@ -76,7 +88,7 @@ break; case ST_PCSC_NAME: OSMO_ASSERT(ps->cur); - ps->cur->name = talloc_strdup(ps->cur, field); + ps->cur->name_regex = talloc_strdup(ps->cur, field); break; default: OSMO_ASSERT(0); @@ -87,9 +99,23 @@ { struct parser_state *ps = data; struct pcsc_slot_name *sn = ps->cur; + regex_t compiled_name; + int rc; - printf("PC/SC slot name: %u/%u -> '%s'\n", sn->slot.bank_id, sn->slot.slot_nr, sn->name); - llist_add_tail(&sn->list, &ps->bankd->pcsc_slot_names); + printf("PC/SC slot name: %u/%u -> regex '%s'\n", sn->slot.bank_id, sn->slot.slot_nr, sn->name_regex); + + memset(&compiled_name, 0, sizeof(compiled_name)); + + rc = regcomp(&compiled_name, sn->name_regex, REG_EXTENDED); + if (rc != 0) { + char *errmsg = get_regerror(sn, rc, &compiled_name); + fprintf(stderr, "Error compiling regex '%s': %s - Ignoring\n", sn->name_regex, errmsg); + talloc_free(errmsg); + talloc_free(sn); + } else { + llist_add_tail(&sn->list, &ps->bankd->pcsc_slot_names); + } + regfree(&compiled_name); ps->state = ST_BANK_NR; ps->cur = NULL; @@ -134,7 +160,7 @@ llist_for_each_entry(cur, &bankd->pcsc_slot_names, list) { if (bank_slot_equals(&cur->slot, slot)) - return cur->name; + return cur->name_regex; } return NULL; } @@ -144,9 +170,12 @@ #include <winscard.h> #include <pcsclite.h> +#define LOGW_PCSC_ERROR(w, rv, text) \ + LOGW((w), text ": %s (0x%lX)\n", pcsc_stringify_error(rv), rv) + #define PCSC_ERROR(w, rv, text) \ if (rv != SCARD_S_SUCCESS) { \ - LOGW((w), text ": %s (0x%lX)\n", pcsc_stringify_error(rv), rv); \ + LOGW_PCSC_ERROR(w, rv, text); \ goto end; \ } else { \ LOGW((w), ": OK\n"); \ @@ -170,6 +199,57 @@ return rc; } + +static int pcsc_connect_slot_regex(struct bankd_worker *worker) +{ + DWORD dwReaders = SCARD_AUTOALLOCATE; + LPSTR mszReaders = NULL; + regex_t compiled_name; + int result = -1; + LONG rc; + char *p; + + LOGW(worker, "Attempting to find card/slot using regex '%s'\n", worker->reader.name); + + rc = regcomp(&compiled_name, worker->reader.name, REG_EXTENDED); + if (rc != 0) { + LOGW(worker, "Error compiling RegEx over name '%s'\n", worker->reader.name); + return -EINVAL; + } + + rc = SCardListReaders(worker->reader.pcsc.hContext, NULL, (LPSTR)&mszReaders, &dwReaders); + if (rc != SCARD_S_SUCCESS) { + LOGW_PCSC_ERROR(worker, rc, "SCardListReaders"); + goto out_regfree; + } + + p = mszReaders; + while (*p) { + DWORD dwActiveProtocol; + int r = regexec(&compiled_name, p, 0, NULL, 0); + if (r == 0) { + LOGW(worker, "Attempting to open card/slot '%s'\n", p); + rc = SCardConnect(worker->reader.pcsc.hContext, p, SCARD_SHARE_SHARED, + SCARD_PROTOCOL_T0, &worker->reader.pcsc.hCard, + &dwActiveProtocol); + if (rc == SCARD_S_SUCCESS) + result = 0; + else + LOGW_PCSC_ERROR(worker, rc, "SCardConnect"); + break; + } + p += strlen(p) + 1; + } + + SCardFreeMemory(worker->reader.pcsc.hContext, mszReaders); + +out_regfree: + regfree(&compiled_name); + + return result; +} + + static int pcsc_open_card(struct bankd_worker *worker) { long rc; @@ -182,14 +262,13 @@ } if (!worker->reader.pcsc.hCard) { - LOGW(worker, "Attempting to open card/slot '%s'\n", worker->reader.name); - DWORD dwActiveProtocol; - rc = SCardConnect(worker->reader.pcsc.hContext, worker->reader.name, SCARD_SHARE_SHARED, - SCARD_PROTOCOL_T0, &worker->reader.pcsc.hCard, &dwActiveProtocol); - PCSC_ERROR(worker, rc, "SCardConnect") + rc = pcsc_connect_slot_regex(worker); + if (rc != 0) + goto end; } rc = pcsc_get_atr(worker); + end: return rc; } -- To view, visit https://gerrit.osmocom.org/c/osmo-remsim/+/20811 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-remsim Gerrit-Branch: master Gerrit-Change-Id: I58b71f9562e152e7ed21b55d7b876bba481b01f8 Gerrit-Change-Number: 20811 Gerrit-PatchSet: 2 Gerrit-Owner: laforge <laforge at osmocom.org> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: laforge <laforge at osmocom.org> Gerrit-MessageType: merged -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20210203/a7ca59d9/attachment.htm>