chiark / gitweb /
ask-password: support passwords without timeouts
authorLennart Poettering <lennart@poettering.net>
Wed, 13 Apr 2011 19:42:46 +0000 (21:42 +0200)
committerLennart Poettering <lennart@poettering.net>
Wed, 13 Apr 2011 19:42:46 +0000 (21:42 +0200)
src/ask-password-api.c
src/ask-password.c
src/cryptsetup.c
src/gnome-ask-password-agent.vala
src/tty-ask-password-agent.c

index 384cfc8..04d5623 100644 (file)
@@ -404,13 +404,13 @@ int ask_password_agent(
 
                 t = now(CLOCK_MONOTONIC);
 
-                if (until <= t) {
+                if (until > 0 && until <= t) {
                         log_notice("Timed out");
                         r = -ETIME;
                         goto finish;
                 }
 
-                if ((k = poll(pollfd, _FD_MAX, (until-t)/USEC_PER_MSEC)) < 0) {
+                if ((k = poll(pollfd, _FD_MAX, until > 0 ? (int) ((until-t)/USEC_PER_MSEC) : -1)) < 0) {
 
                         if (errno == EINTR)
                                 continue;
index c773764..6330369 100644 (file)
@@ -101,7 +101,7 @@ static int parse_argv(int argc, char *argv[]) {
                         break;
 
                 case ARG_TIMEOUT:
-                        if (parse_usec(optarg, &arg_timeout) < 0 || arg_timeout <= 0) {
+                        if (parse_usec(optarg, &arg_timeout) < 0) {
                                 log_error("Failed to parse --timeout parameter %s", optarg);
                                 return -EINVAL;
                         }
@@ -139,6 +139,7 @@ static int parse_argv(int argc, char *argv[]) {
 
 int main(int argc, char *argv[]) {
         int r;
+        usec_t timeout;
 
         log_parse_environment();
         log_open();
@@ -146,10 +147,15 @@ int main(int argc, char *argv[]) {
         if ((r = parse_argv(argc, argv)) <= 0)
                 goto finish;
 
+        if (arg_timeout > 0)
+                timeout = now(CLOCK_MONOTONIC) + arg_timeout;
+        else
+                timeout = 0;
+
         if (arg_use_tty && isatty(STDIN_FILENO)) {
                 char *password = NULL;
 
-                if ((r = ask_password_tty(arg_message, now(CLOCK_MONOTONIC) + arg_timeout, NULL, &password)) >= 0) {
+                if ((r = ask_password_tty(arg_message, timeout, NULL, &password)) >= 0) {
                         puts(password);
                         free(password);
                 }
@@ -157,7 +163,7 @@ int main(int argc, char *argv[]) {
         } else {
                 char **l;
 
-                if ((r = ask_password_agent(arg_message, arg_icon, now(CLOCK_MONOTONIC) + arg_timeout, arg_accept_cached, &l)) >= 0) {
+                if ((r = ask_password_agent(arg_message, arg_icon, timeout, arg_accept_cached, &l)) >= 0) {
                         char **p;
 
                         STRV_FOREACH(p, l) {
index 3aa822a..f52a41b 100644 (file)
@@ -309,7 +309,10 @@ int main(int argc, char *argv[]) {
                 if (opt_readonly)
                         flags |= CRYPT_ACTIVATE_READONLY;
 
-                until = now(CLOCK_MONOTONIC) + (opt_timeout > 0 ? opt_timeout : DEFAULT_TIMEOUT_USEC);
+                if (opt_timeout > 0)
+                        until = now(CLOCK_MONOTONIC) + opt_timeout;
+                else
+                        until = 0;
 
                 opt_tries = opt_tries > 0 ? opt_tries : 3;
                 opt_key_size = (opt_key_size > 0 ? opt_key_size : 256);
@@ -404,6 +407,8 @@ int main(int argc, char *argv[]) {
                                 }
                         }
 
+                        k = 0;
+
                         if (!opt_type || streq(opt_type, CRYPT_LUKS1))
                                 k = crypt_load(cd, CRYPT_LUKS1, NULL);
 
index 2bfc6a9..c31c07e 100644 (file)
@@ -165,7 +165,7 @@ public class MyStatusIcon : StatusIcon {
                         if (not_after_as_string.scanf("%llu", out not_after) != 1)
                                 return false;
 
-                        if (not_after < now)
+                        if (not_after > 0 && not_after < now)
                                 return false;
 
                         socket = key_file.get_string("Ask", "Socket");
index a414cba..4a29aba 100644 (file)
@@ -261,7 +261,6 @@ static int parse_password(const char *filename, char **wall) {
 
         FILE *f;
         int r;
-        usec_t n;
 
         assert(filename);
 
@@ -279,16 +278,17 @@ static int parse_password(const char *filename, char **wall) {
                 goto finish;
         }
 
-        if (!socket_name || not_after <= 0) {
+        if (!socket_name) {
                 log_error("Invalid password file %s", filename);
                 r = -EBADMSG;
                 goto finish;
         }
 
-        n = now(CLOCK_MONOTONIC);
-        if (n > not_after) {
-                r = 0;
-                goto finish;
+        if (not_after > 0) {
+                if (now(CLOCK_MONOTONIC) > not_after) {
+                        r = 0;
+                        goto finish;
+                }
         }
 
         if (arg_action == ACTION_LIST)