2017-05-24 10:46:42 +00:00
|
|
|
/*
|
|
|
|
* strings.c: Implementation of default UI strings
|
|
|
|
*
|
|
|
|
* Copyright (C) 2017 Frank Morgner <frankmorgner@gmail.com>
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library 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
|
|
|
|
* Lesser General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
* License along with this library; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "libopensc/internal.h"
|
2017-10-30 19:02:37 +00:00
|
|
|
#include "ui/strings.h"
|
2017-05-24 10:46:42 +00:00
|
|
|
#include <locale.h>
|
2017-08-02 21:12:58 +00:00
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
2017-05-24 10:46:42 +00:00
|
|
|
|
|
|
|
enum ui_langs {
|
|
|
|
EN,
|
|
|
|
DE,
|
|
|
|
};
|
|
|
|
|
|
|
|
static const char *get_inserted_text(struct sc_pkcs15_card *p15card, struct sc_atr *atr)
|
|
|
|
{
|
|
|
|
static char text[3*SC_MAX_ATR_SIZE] = {0};
|
|
|
|
const char prefix[] = "ATR: ";
|
|
|
|
|
|
|
|
if (p15card && p15card->card && p15card->card->name) {
|
|
|
|
return p15card->card->name;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!atr)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
strcpy(text, prefix);
|
|
|
|
sc_bin_to_hex(atr->value, atr->len, text + (sizeof prefix) - 1,
|
|
|
|
sizeof(text) - (sizeof prefix) - 1, ':');
|
|
|
|
|
|
|
|
return text;
|
|
|
|
}
|
|
|
|
|
|
|
|
static const char *get_removed_text(struct sc_pkcs15_card *p15card)
|
|
|
|
{
|
|
|
|
if (p15card && p15card->card && p15card->card->reader
|
|
|
|
&& p15card->card->reader->name) {
|
|
|
|
return p15card->card->reader->name;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static const char *ui_get_config_str(struct sc_context *ctx,
|
|
|
|
struct sc_atr *atr, const char *flag_name, const char *ret_default)
|
|
|
|
{
|
|
|
|
const char *ret = ret_default;
|
|
|
|
|
|
|
|
scconf_block *atrblock = _sc_match_atr_block(ctx, NULL, atr);
|
|
|
|
|
|
|
|
if (atrblock)
|
|
|
|
ret = scconf_get_str(atrblock, flag_name, ret_default);
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int find_lang_str(const char *str, enum ui_langs *lang)
|
|
|
|
{
|
|
|
|
if (str) {
|
|
|
|
if (0 == strncmp(str, "de", 2)) {
|
|
|
|
if (lang) {
|
|
|
|
*lang = DE;
|
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
} else if (0 == strncmp(str, "en", 2)) {
|
|
|
|
if (lang) {
|
|
|
|
*lang = EN;
|
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
const char *ui_get_str(struct sc_context *ctx, struct sc_atr *atr,
|
|
|
|
struct sc_pkcs15_card *p15card, enum ui_str id)
|
|
|
|
{
|
|
|
|
enum ui_langs lang = EN;
|
|
|
|
const char *str, *option;
|
|
|
|
|
|
|
|
/* load option strings */
|
|
|
|
switch (id) {
|
|
|
|
case MD_PINPAD_DLG_TITLE:
|
|
|
|
option = "md_pinpad_dlg_title";
|
|
|
|
break;
|
|
|
|
case MD_PINPAD_DLG_MAIN:
|
|
|
|
option = "md_pinpad_dlg_main";
|
|
|
|
break;
|
|
|
|
case MD_PINPAD_DLG_CONTENT_USER:
|
|
|
|
option = "md_pinpad_dlg_content_user";
|
|
|
|
break;
|
2017-10-17 07:38:19 +00:00
|
|
|
case MD_PINPAD_DLG_CONTENT_USER_SIGN:
|
|
|
|
option = "md_pinpad_dlg_content_user_sign";
|
|
|
|
break;
|
2017-05-24 10:46:42 +00:00
|
|
|
case MD_PINPAD_DLG_CONTENT_ADMIN:
|
|
|
|
option = "md_pinpad_dlg_content_admin";
|
|
|
|
break;
|
|
|
|
case MD_PINPAD_DLG_EXPANDED:
|
|
|
|
option = "md_pinpad_dlg_expanded";
|
|
|
|
break;
|
|
|
|
case MD_PINPAD_DLG_ICON:
|
|
|
|
option = "md_pinpad_dlg_icon";
|
|
|
|
break;
|
|
|
|
case NOTIFY_CARD_INSERTED:
|
|
|
|
option = "notify_card_inserted";
|
|
|
|
break;
|
|
|
|
case NOTIFY_CARD_INSERTED_TEXT:
|
|
|
|
option = "notify_card_inserted_text";
|
|
|
|
break;
|
|
|
|
case NOTIFY_CARD_REMOVED:
|
|
|
|
option = "notify_card_removed";
|
|
|
|
break;
|
|
|
|
case NOTIFY_CARD_REMOVED_TEXT:
|
|
|
|
option = "notify_card_removed_text";
|
|
|
|
break;
|
|
|
|
case NOTIFY_PIN_GOOD:
|
|
|
|
option = "notify_pin_good";
|
|
|
|
break;
|
|
|
|
case NOTIFY_PIN_GOOD_TEXT:
|
|
|
|
option = "notify_pin_good_text";
|
|
|
|
break;
|
|
|
|
case NOTIFY_PIN_BAD:
|
|
|
|
option = "notify_pin_bad";
|
|
|
|
break;
|
|
|
|
case NOTIFY_PIN_BAD_TEXT:
|
|
|
|
option = "notify_pin_bad_text";
|
|
|
|
break;
|
2018-07-27 13:50:41 +00:00
|
|
|
case MD_PINPAD_DLG_VERIFICATION:
|
|
|
|
option = "md_pinpad_dlg_verification";
|
|
|
|
break;
|
2017-05-24 10:46:42 +00:00
|
|
|
default:
|
|
|
|
option = NULL;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* load language */
|
|
|
|
/* card's language supersedes system's language */
|
|
|
|
if (!p15card || !p15card->tokeninfo
|
|
|
|
|| !find_lang_str(p15card->tokeninfo->preferred_language, &lang)) {
|
|
|
|
#ifdef _WIN32
|
|
|
|
LANGID langid = GetUserDefaultUILanguage();
|
2019-07-04 01:58:29 +00:00
|
|
|
if (langid == LANG_GERMAN) {
|
2017-05-24 10:46:42 +00:00
|
|
|
lang = DE;
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
/* LANGUAGE supersedes locale */
|
|
|
|
if (!find_lang_str(getenv("LANGUAGE"), &lang)) {
|
|
|
|
/* XXX Should we use LC_MESSAGES instead? */
|
|
|
|
find_lang_str(setlocale(LC_ALL, ""), &lang);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
/* load default strings */
|
|
|
|
switch (lang) {
|
|
|
|
case DE:
|
|
|
|
switch (id) {
|
|
|
|
case MD_PINPAD_DLG_TITLE:
|
|
|
|
str = "Windows-Sicherheit";
|
|
|
|
break;
|
|
|
|
case MD_PINPAD_DLG_MAIN:
|
|
|
|
str = "OpenSC Smartcard-Anbieter";
|
|
|
|
break;
|
|
|
|
case MD_PINPAD_DLG_CONTENT_USER:
|
2017-10-17 07:38:19 +00:00
|
|
|
str = "Bitte geben Sie Ihre PIN auf dem PIN-Pad ein.";
|
|
|
|
break;
|
|
|
|
case MD_PINPAD_DLG_CONTENT_USER_SIGN:
|
2017-05-24 10:46:42 +00:00
|
|
|
str = "Bitte geben Sie Ihre PIN für die digitale Signatur auf dem PIN-Pad ein.";
|
|
|
|
break;
|
|
|
|
case MD_PINPAD_DLG_CONTENT_ADMIN:
|
|
|
|
str = "Bitte geben Sie Ihre PIN zum Entsperren der Nutzer-PIN auf dem PIN-Pad ein.";
|
|
|
|
break;
|
|
|
|
case MD_PINPAD_DLG_EXPANDED:
|
|
|
|
str = "Dieses Fenster wird automatisch geschlossen, wenn die PIN am PIN-Pad eingegeben wurde (Timeout typischerweise nach 30 Sekunden).";
|
|
|
|
break;
|
|
|
|
case NOTIFY_CARD_INSERTED:
|
|
|
|
if (p15card) {
|
|
|
|
str = "Smartcard kann jetzt verwendet werden";
|
|
|
|
} else {
|
|
|
|
str = "Smartcard erkannt";
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case NOTIFY_CARD_INSERTED_TEXT:
|
|
|
|
str = get_inserted_text(p15card, atr);
|
|
|
|
break;
|
|
|
|
case NOTIFY_CARD_REMOVED:
|
|
|
|
str = "Smartcard entfernt";
|
|
|
|
break;
|
|
|
|
case NOTIFY_CARD_REMOVED_TEXT:
|
|
|
|
str = get_removed_text(p15card);
|
|
|
|
break;
|
|
|
|
case NOTIFY_PIN_GOOD:
|
|
|
|
str = "PIN verifiziert";
|
|
|
|
break;
|
|
|
|
case NOTIFY_PIN_GOOD_TEXT:
|
|
|
|
str = "Smartcard ist entsperrt";
|
|
|
|
break;
|
|
|
|
case NOTIFY_PIN_BAD:
|
|
|
|
str = "PIN nicht verifiziert";
|
|
|
|
break;
|
|
|
|
case NOTIFY_PIN_BAD_TEXT:
|
|
|
|
str = "Smartcard ist gesperrt";
|
|
|
|
break;
|
2018-07-27 13:50:41 +00:00
|
|
|
case MD_PINPAD_DLG_VERIFICATION:
|
|
|
|
str = "Sofort PIN am PIN-Pad abfragen";
|
|
|
|
break;
|
2017-05-24 10:46:42 +00:00
|
|
|
|
|
|
|
case MD_PINPAD_DLG_CONTROL_COLLAPSED:
|
|
|
|
case MD_PINPAD_DLG_CONTROL_EXPANDED:
|
|
|
|
str = "Weitere Informationen";
|
|
|
|
break;
|
|
|
|
case MD_PINPAD_DLG_CANCEL:
|
|
|
|
str = "Abbrechen";
|
|
|
|
break;
|
2018-07-26 13:01:16 +00:00
|
|
|
case NOTIFY_EXIT:
|
|
|
|
str = "Beenden";
|
|
|
|
break;
|
2017-05-24 10:46:42 +00:00
|
|
|
default:
|
|
|
|
str = NULL;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case EN:
|
|
|
|
default:
|
|
|
|
switch (id) {
|
|
|
|
case MD_PINPAD_DLG_TITLE:
|
|
|
|
str = "Windows Security";
|
|
|
|
break;
|
|
|
|
case MD_PINPAD_DLG_MAIN:
|
|
|
|
str = "OpenSC Smart Card Provider";
|
|
|
|
break;
|
|
|
|
case MD_PINPAD_DLG_CONTENT_USER:
|
2017-10-17 07:38:19 +00:00
|
|
|
str = "Please enter your PIN on the PIN pad.";
|
|
|
|
break;
|
|
|
|
case MD_PINPAD_DLG_CONTENT_USER_SIGN:
|
2017-05-24 10:46:42 +00:00
|
|
|
str = "Please enter your digital signature PIN on the PIN pad.";
|
|
|
|
break;
|
|
|
|
case MD_PINPAD_DLG_CONTENT_ADMIN:
|
|
|
|
str = "Please enter your PIN to unblock the user PIN on the PIN pad.";
|
|
|
|
break;
|
|
|
|
case MD_PINPAD_DLG_EXPANDED:
|
|
|
|
str = "This window will be closed automatically after the PIN has been submitted on the PIN pad (timeout typically after 30 seconds).";
|
|
|
|
break;
|
|
|
|
case NOTIFY_CARD_INSERTED:
|
|
|
|
if (p15card) {
|
|
|
|
str = "Smart card is ready to use";
|
|
|
|
} else {
|
|
|
|
str = "Smart card detected";
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case NOTIFY_CARD_INSERTED_TEXT:
|
|
|
|
str = get_inserted_text(p15card, atr);
|
|
|
|
break;
|
|
|
|
case NOTIFY_CARD_REMOVED:
|
|
|
|
str = "Smart card removed";
|
|
|
|
break;
|
|
|
|
case NOTIFY_CARD_REMOVED_TEXT:
|
|
|
|
str = get_removed_text(p15card);
|
|
|
|
break;
|
|
|
|
case NOTIFY_PIN_GOOD:
|
|
|
|
str = "PIN verified";
|
|
|
|
break;
|
|
|
|
case NOTIFY_PIN_GOOD_TEXT:
|
|
|
|
str = "Smart card is unlocked";
|
|
|
|
break;
|
|
|
|
case NOTIFY_PIN_BAD:
|
|
|
|
str = "PIN not verified";
|
|
|
|
break;
|
|
|
|
case NOTIFY_PIN_BAD_TEXT:
|
|
|
|
str = "Smart card is locked";
|
|
|
|
break;
|
2018-07-27 13:50:41 +00:00
|
|
|
case MD_PINPAD_DLG_VERIFICATION:
|
|
|
|
str = "Immediately request PIN on PIN-Pad";
|
|
|
|
break;
|
|
|
|
|
2017-05-24 10:46:42 +00:00
|
|
|
case MD_PINPAD_DLG_CONTROL_COLLAPSED:
|
|
|
|
case MD_PINPAD_DLG_CONTROL_EXPANDED:
|
|
|
|
str = "Click here for more information";
|
|
|
|
break;
|
|
|
|
case MD_PINPAD_DLG_CANCEL:
|
|
|
|
str = "Cancel";
|
|
|
|
break;
|
2018-07-26 13:01:16 +00:00
|
|
|
case NOTIFY_EXIT:
|
|
|
|
str = "Exit";
|
|
|
|
break;
|
2017-05-24 10:46:42 +00:00
|
|
|
default:
|
|
|
|
str = NULL;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* user's strings supersede default strings */
|
|
|
|
if (option != NULL) {
|
|
|
|
/* overwrite str with the user's choice */
|
|
|
|
str = ui_get_config_str(ctx, atr, option, str);
|
|
|
|
}
|
|
|
|
|
|
|
|
return str;
|
|
|
|
}
|