aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMattias Andrée <maandree@operamail.com>2013-11-22 10:16:02 +0100
committerMattias Andrée <maandree@operamail.com>2013-11-22 10:16:02 +0100
commit5e7d3624fa967adb90504752d6ff59678a75020f (patch)
treea84d3d21c482de9f705c60e3798c66e2d04a6283 /src
parentadd crypt auth module (diff)
downloadcerberus-5e7d3624fa967adb90504752d6ff59678a75020f.tar.gz
cerberus-5e7d3624fa967adb90504752d6ff59678a75020f.tar.bz2
cerberus-5e7d3624fa967adb90504752d6ff59678a75020f.tar.xz
use libpassphrase
Signed-off-by: Mattias Andrée <maandree@operamail.com>
Diffstat (limited to 'src')
-rw-r--r--src/cerberus.c8
-rw-r--r--src/cerberus.h2
-rw-r--r--src/passphrase.c111
-rw-r--r--src/passphrase.h42
-rw-r--r--src/quit.c7
5 files changed, 10 insertions, 160 deletions
diff --git a/src/cerberus.c b/src/cerberus.c
index c555a2b..8b103f2 100644
--- a/src/cerberus.c
+++ b/src/cerberus.c
@@ -104,7 +104,7 @@ void do_login(int argc, char** argv)
/* Disable echoing */
- disable_echo();
+ passphrase_disable_echo();
/* This should be done as early and quickly as possible so as little
as possible of the passphrase gets leaked to the output if the user
begins entering the passphrase directly after the username. */
@@ -201,7 +201,7 @@ void do_login(int argc, char** argv)
secure_tty(tty_group);
/* Redisable echoing */
- disable_echo();
+ passphrase_disable_echo();
/* Set up clean quiting and time out */
@@ -246,7 +246,7 @@ void do_login(int argc, char** argv)
}
/* Reset terminal settings */
- reenable_echo();
+ passphrase_reenable_echo();
/* Verify account, such as that it is enabled */
@@ -311,7 +311,7 @@ void do_login(int argc, char** argv)
*/
char* read_passphrase(void)
{
- passphrase = get_passphrase();
+ passphrase = passphrase_read();
return passphrase;
}
diff --git a/src/cerberus.h b/src/cerberus.h
index 69df492..b82a98d 100644
--- a/src/cerberus.h
+++ b/src/cerberus.h
@@ -34,6 +34,8 @@
#include <sys/types.h>
#include <grp.h>
+#include <passphrase.h>
+
#include "config.h"
#include "passphrase.h"
diff --git a/src/passphrase.c b/src/passphrase.c
deleted file mode 100644
index 599d5ff..0000000
--- a/src/passphrase.c
+++ /dev/null
@@ -1,111 +0,0 @@
-/**
- * cerberus – Minimal login program
- *
- * Copyright © 2013 Mattias Andrée (maandree@member.fsf.org)
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-#include <stdlib.h>
-#include <stdio.h>
-#include <termios.h>
-#include <unistd.h>
-
-#include "config.h"
-
-#include "passphrase.h"
-
-
-#define START_PASSPHRASE_LIMIT 32
-
-
-/**
- * The original TTY settings
- */
-static struct termios saved_stty;
-
-
-/**
- * Reads the passphrase from stdin
- *
- * @return The passphrase, should be `free`:ed
- */
-char* get_passphrase(void)
-{
- /* malloc and realloc returns NULL if we run out of memory,
- we will not do that under normal usecases, if we do, it
- okay to segfault on null derefencing and quit on that. */
-
- char* rc = malloc(START_PASSPHRASE_LIMIT * sizeof(char));
- long size = START_PASSPHRASE_LIMIT;
- long len = 0;
- int c;
-
- if (rc == NULL)
- {
- perror("malloc");
- sleep(ERROR_SLEEP);
- _exit(1);
- }
-
- /* Read password until EOF or Enter, skip all \0 as that
- is probably not a part of the passphrase (good luck typing
- that in X.org) and can be echoed into stdin by the kernel. */
- for (;;)
- {
- c = getchar();
- if ((c < 0) || (c == '\n'))
- break;
- if (c != 0)
- {
- *(rc + len++) = c;
- if (len == size)
- if ((rc = realloc(rc, (size <<= 1L) * sizeof(char))) == NULL)
- {
- perror("realloc");
- sleep(ERROR_SLEEP);
- _exit(1);
- }
- }
- }
-
- /* NUL-terminate passphrase */
- *(rc + len) = 0;
-
- printf("\n");
- return rc;
-}
-
-
-/**
- * Disable echoing and do anything else to the terminal settnings `get_passphrase` requires
- */
-void disable_echo(void)
-{
- struct termios stty;
-
- tcgetattr(STDIN_FILENO, &stty);
- saved_stty = stty;
- stty.c_lflag &= ~ECHO;
- tcsetattr(STDIN_FILENO, TCSAFLUSH, &stty);
-}
-
-
-/**
- * Undo the actions of `disable_echo`
- */
-void reenable_echo(void)
-{
- tcsetattr(STDIN_FILENO, TCSAFLUSH, &saved_stty);
-}
-
diff --git a/src/passphrase.h b/src/passphrase.h
deleted file mode 100644
index 18b84ae..0000000
--- a/src/passphrase.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * cerberus – Minimal login program
- *
- * Copyright © 2013 Mattias Andrée (maandree@member.fsf.org)
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-#ifndef __PASSPHRASE_H__
-#define __PASSPHRASE_H__
-
-
-/**
- * Reads the passphrase from stdin
- *
- * @return The passphrase, should be `free`:ed
- */
-char* get_passphrase(void);
-
-/**
- * Disable echoing and do anything else to the terminal settnings `get_passphrase` requires
- */
-void disable_echo(void);
-
-/**
- * Undo the actions of `disable_echo`
- */
-void reenable_echo(void);
-
-
-#endif
-
diff --git a/src/quit.c b/src/quit.c
index f609197..9a882ca 100644
--- a/src/quit.c
+++ b/src/quit.c
@@ -19,8 +19,9 @@
#include <stdio.h>
#include <unistd.h>
+#include <passphrase.h>
+
#include "config.h"
-#include "passphrase.h"
#include "quit.h"
@@ -33,7 +34,7 @@ void timeout_quit(int signal)
{
(void) signal;
printf("\nTimed out.\n");
- reenable_echo();
+ passphrase_reenable_echo();
_exit(10);
}
@@ -47,7 +48,7 @@ void user_quit(int signal)
{
(void) signal;
printf("\n");
- reenable_echo();
+ passphrase_reenable_echo();
_exit(130);
}