/*
* Acess 2 Login
+ * - By John Hodge (thePowersGang)
*/
#include "header.h"
+#include <acess/devices/pty.h> // Enable/disable echo
// === CONSTANTS ===
#define BUFLEN 1024
for(;;)
{
sUsername = GetUsername();
+ if(!sUsername || !sUsername[0]) continue;
sPassword = GetPassword();
+ if(!sPassword) {
+ free(sUsername);
+ continue;
+ }
if( (uid = ValidateUser(sUsername, sPassword)) == -1 )
{
printf("\nInvalid username or password\n");
+ _SysDebug("Auth failure: '%s':'%s'", sUsername, sPassword);
free(sUsername);
free(sPassword);
}
// Wait for child to terminate
_SysWaitTID(pid, &status);
+
+ // Clear graphics mode
+ struct ptymode mode = {.InputMode = PTYIMODE_ECHO|PTYIMODE_CANON,.OutputMode=0};
+ _SysIOCtl(0, PTY_IOCTL_SETMODE, &mode);
+ fprintf(stderr, "\x1b[R");
}
return 0;
}
-/**
- * \fn char *GetUsername()
- */
-char *GetUsername()
+char *_GetString(int bEcho)
{
- char ret[BUFLEN] = {0};
+ char ret[BUFLEN];
int pos = 0;
char ch;
- // Prompt the user
- printf("Username: ");
+ struct ptymode mode;
+ const int is_pty = (_SysIOCtl(0, DRV_IOCTL_TYPE, NULL) == DRV_TYPE_TERMINAL);
+
+ // Clear PTY echo
+ if( !bEcho && is_pty ) {
+ _SysIOCtl(0, PTY_IOCTL_GETMODE, &mode);
+ mode.InputMode &= ~PTYIMODE_ECHO;
+ _SysIOCtl(0, PTY_IOCTL_SETMODE, &mode);
+ }
// Read in text
while( (ch = fgetc(stdin)) != -1 && ch != '\n' )
{
+ // Handle backspace
if(ch == '\b') {
if( pos <= 0 ) continue;
pos --;
ret[pos] = '\0';
}
+ // Ctrl-C : Cancel
+ else if( ch == 'c'-'a'+1)
+ pos = 0;
+ // Ctrl-U : Clear
+ else if( ch == 'u'-'a'+1)
+ pos = 0;
+ // Ignore \r
+ else if( ch == '\r' )
+ continue;
else
ret[pos++] = ch;
- // Echo out to the screen
- fputc(ch, stdout);
-
if(pos == BUFLEN-1) break;
}
- // Finish String
ret[pos] = '\0';
-
- printf("\n");
+
+ // Re-set echo
+ if( !bEcho && is_pty ) {
+ mode.InputMode |= PTYIMODE_ECHO;
+ _SysIOCtl(0, PTY_IOCTL_SETMODE, &mode);
+ }
+
return strdup(ret);
}
/**
- * \fn char *GetPassword()
+ * \fn char *GetUsername()
*/
-char *GetPassword()
+char *GetUsername()
{
- char ret[BUFLEN];
+ char ret[BUFLEN] = {0};
int pos = 0;
char ch;
// Prompt the user
- printf("Password: ");
-
- // Read in text
- while( (ch = fgetc(stdin)) != -1 && ch != '\n' )
- {
- if(ch == '\b') {
- if( pos <= 0 ) continue;
- pos --;
- ret[pos] = '\0';
- }
- else
- ret[pos++] = ch;
-
- // Don't echo out to the screen
- //fputc(stdout, ch);
-
- if(pos == BUFLEN-1) break;
- }
+ printf("Username: ");
+ fflush(stdout);
- ret[pos] = '\0';
+ return _GetString(1);
+}
+
+/**
+ * \fn char *GetPassword()
+ */
+char *GetPassword()
+{
+ // Prompt the user
+ printf("Password: ");
+ fflush(stdout);
- printf("\n");
- return strdup(ret);
+ return _GetString(0);
}