ref: c1c72f6cfd9f4360993888dc306eeb7bbf1f4256
parent: 0406ab471ab3c21903bd6c331cb75426b9e7fb1c
author: mkf <mkf@cloud9p.org>
date: Sun Dec 3 02:24:08 EST 2023
cmd/login: import
--- /dev/null
+++ b/cmd/login.c
@@ -1,0 +1,119 @@
+#include <u.h>
+#include <libc.h>
+#include <err.h>
+#include <user.h>
+#include <ps2.h>
+
+#include <mem.h>
+
+char answers[32][256] =
+{
+ "Authtication failure\n",
+
+ /* uhh... */
+ "Better luck next time!\n",
+ "Try harder.\n",
+ "lol.\n",
+ "Nice try.\n",
+ "Use hashcat.\n",
+ "Not even close.\n",
+ "Yawn...\n",
+ "Did you expected me to accept this?\n",
+ "Segmention fault\n",
+ "Segmention fault (core dumped)\n"
+ "Divison by zero\n",
+ "General protection fault\n",
+ "login 6817489: suicide: invalid address 0x0/0 in sys call pc=0x40cf\n",
+ "Click here to reset your password.\n",
+ "Consider this as a BSOD.\n",
+ "Cry about it.\n",
+ "This password is already used by <nil>.\n",
+ "my aunt could type better than you\n",
+
+ "login.exe has stopped working\n"
+ "A problem caused the program to stop working correctly."
+ "Teppich will close the program and notify you if a solution is available.\n",
+};
+
+static int
+usage()
+{
+ printf("usage: login username\n");
+ return USAGE;
+}
+
+static int
+checkpass(char *pass, user_t *u)
+{
+ if(u != nil && u->pass == adler32(pass))
+ return OK;
+ return INCORRECT_PASSWD;
+}
+
+int
+login_main(int argc, char **argv)
+{
+ int i;
+ char c, *p;
+ ll_t *t;
+ user_t *u;
+
+
+ if(argc != 2)
+ return usage();
+
+ u = nil;
+ t = users;
+ /* search for user */
+ while(t != nil)
+ {
+ u = (user_t*)t->val;
+ if(!strcmp(u->name, argv[1]))
+ break;
+ t = (ll_t*)t->next;
+ }
+ printf("Password: ");
+ i = 0;
+ p = malloc(PASSWD_MAX);
+
+ while(i < PASSWD_MAX - 1)
+ {
+ c = ps2_getc();
+
+ if(c == '\b')
+ {
+ if(i)
+ i--;
+ p[i] = '\0';
+ printf("\b");
+ continue;
+ }
+ else if(c == '\r')
+ {
+ p[i] = '\0';
+ break;
+ }
+ p[i] = c;
+ printf("*");
+ i++;
+ }
+ printf("\n");
+
+
+ if(i > PASSWD_MAX)
+ {
+ printf("\noverflow!\n");
+ return OVERFLOW;
+ }
+
+ if(checkpass(p, u) == OK)
+ {
+ cuser = *u;
+ return OK;
+ }
+ else
+ {
+ printf("%s", answers[(i) % (sizeof(answers) / sizeof(char*))]);
+ return AUTH_FAILED;
+ }
+}