1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2025-02-08 05:57:26 +03:00

Merge pull request #2446 from keszybz/ask-password

Ask password unicode fix
This commit is contained in:
Lennart Poettering 2016-01-26 23:42:38 +01:00
commit 47889a8367
3 changed files with 58 additions and 5 deletions

View File

@ -1418,7 +1418,8 @@ manual_tests += \
test-ipcrm \
test-btrfs \
test-acd \
test-ipv4ll-manual
test-ipv4ll-manual \
test-ask-password-api
if HAVE_LIBIPTC
manual_tests += \
@ -1874,6 +1875,12 @@ test_rlimit_util_SOURCES = \
test_rlimit_util_LDADD = \
libshared.la
test_ask_password_api_SOURCES = \
src/test/test-ask-password-api.c
test_ask_password_api_LDADD = \
libshared.la
BUILT_SOURCES += \
src/test/test-hashmap-ordered.c

View File

@ -59,6 +59,7 @@
#include "terminal-util.h"
#include "time-util.h"
#include "umask-util.h"
#include "utf8.h"
#include "util.h"
#define KEYRING_TIMEOUT_USEC ((5 * USEC_PER_MINUTE) / 2)
@ -213,8 +214,8 @@ int ask_password_tty(
char **ret) {
struct termios old_termios, new_termios;
char passphrase[LINE_MAX], *x;
size_t p = 0;
char passphrase[LINE_MAX + 1] = {}, *x;
size_t p = 0, codepoint = 0;
int r;
_cleanup_close_ int ttyfd = -1, notify = -1;
struct pollfd pollfd[2];
@ -378,8 +379,13 @@ int ask_password_tty(
passphrase[p++] = c;
if (!(flags & ASK_PASSWORD_SILENT) && ttyfd >= 0)
loop_write(ttyfd, (flags & ASK_PASSWORD_ECHO) ? &c : "*", 1, false);
if (!(flags & ASK_PASSWORD_SILENT) && ttyfd >= 0) {
n = utf8_encoded_valid_unichar(passphrase + codepoint);
if (n >= 0) {
codepoint = p;
loop_write(ttyfd, (flags & ASK_PASSWORD_ECHO) ? &c : "*", 1, false);
}
}
dirty = true;
}

View File

@ -0,0 +1,40 @@
/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
/***
This file is part of systemd.
Copyright 2016 Zbigniew Jędrzejewski-Szmek
systemd 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.
systemd 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 systemd; If not, see <http://www.gnu.org/licenses/>.
***/
#include "alloc-util.h"
#include "ask-password-api.h"
#include "log.h"
static void ask_password(void) {
int r;
_cleanup_free_ char *ret;
r = ask_password_tty("hello?", "da key", 0, 0, NULL, &ret);
assert(r >= 0);
log_info("Got %s", ret);
}
int main(int argc, char **argv) {
log_parse_environment();
ask_password();
}