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:
commit
47889a8367
@ -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
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
40
src/test/test-ask-password-api.c
Normal file
40
src/test/test-ask-password-api.c
Normal 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();
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user