1*64811019SFrançois Revol #include <Screen.h> 2*64811019SFrançois Revol 3*64811019SFrançois Revol #include <stdio.h> 4*64811019SFrançois Revol #include <unistd.h> 5*64811019SFrançois Revol #include <pwd.h> 6*64811019SFrançois Revol 7*64811019SFrançois Revol #include "LoginApp.h" 8*64811019SFrançois Revol #include "LoginWindow.h" 9*64811019SFrançois Revol 10*64811019SFrançois Revol const char *kLoginAppSig = "application/x-vnd.Haiku-Login"; 11*64811019SFrançois Revol 12*64811019SFrançois Revol 13*64811019SFrançois Revol LoginApp::LoginApp() 14*64811019SFrançois Revol : BApplication(kLoginAppSig) 15*64811019SFrançois Revol { 16*64811019SFrançois Revol } 17*64811019SFrançois Revol 18*64811019SFrançois Revol 19*64811019SFrançois Revol LoginApp::~LoginApp() 20*64811019SFrançois Revol { 21*64811019SFrançois Revol } 22*64811019SFrançois Revol 23*64811019SFrançois Revol 24*64811019SFrançois Revol void 25*64811019SFrançois Revol LoginApp::ReadyToRun() 26*64811019SFrançois Revol { 27*64811019SFrançois Revol BScreen s; 28*64811019SFrançois Revol BRect frame(0, 0, 300, 100); 29*64811019SFrançois Revol frame.OffsetBySelf(s.Frame().Width()/2 - frame.Width()/2, 30*64811019SFrançois Revol s.Frame().Height()/2 - frame.Height()/2); 31*64811019SFrançois Revol LoginWindow *w = new LoginWindow(frame); 32*64811019SFrançois Revol w->Show(); 33*64811019SFrançois Revol } 34*64811019SFrançois Revol 35*64811019SFrançois Revol 36*64811019SFrançois Revol void 37*64811019SFrançois Revol LoginApp::MessageReceived(BMessage *message) 38*64811019SFrançois Revol { 39*64811019SFrançois Revol switch (message->what) { 40*64811019SFrançois Revol case kMsgOpenFilePanel: 41*64811019SFrançois Revol break; 42*64811019SFrançois Revol default: 43*64811019SFrançois Revol BApplication::MessageReceived(message); 44*64811019SFrançois Revol } 45*64811019SFrançois Revol } 46*64811019SFrançois Revol 47*64811019SFrançois Revol void TryLogin(BMessage *message); 48*64811019SFrançois Revol status_t ValidateLogin(const char *login, const char *password/*, bool force = false*/); 49*64811019SFrançois Revol 50*64811019SFrançois Revol void 51*64811019SFrançois Revol LoginApp::TryLogin(BMessage *message) 52*64811019SFrançois Revol { 53*64811019SFrançois Revol status_t err; 54*64811019SFrançois Revol const char *login; 55*64811019SFrançois Revol const char *password; 56*64811019SFrançois Revol BMessage reply(B_REPLY); 57*64811019SFrançois Revol if (message->FindString("login", &login) == B_OK) { 58*64811019SFrançois Revol if (message->FindString("password", &password) < B_OK) 59*64811019SFrançois Revol password = NULL; 60*64811019SFrançois Revol err = ValidateLogin(login, password); 61*64811019SFrançois Revol if (err == B_OK) { 62*64811019SFrançois Revol reply.AddInt32("error", B_OK); 63*64811019SFrançois Revol message->SendReply(reply, NULL); 64*64811019SFrançois Revol 65*64811019SFrançois Revol if (password == NULL) 66*64811019SFrançois Revol return; 67*64811019SFrançois Revol 68*64811019SFrançois Revol // start a session 69*64811019SFrançois Revol //kSetProgress 70*64811019SFrançois Revol StartUserSession(login); 71*64811019SFrançois Revol } else { 72*64811019SFrançois Revol reply.AddInt32("error", err); 73*64811019SFrançois Revol message->SendReply(reply, NULL); 74*64811019SFrançois Revol return; 75*64811019SFrançois Revol } 76*64811019SFrançois Revol 77*64811019SFrançois Revol } else { 78*64811019SFrançois Revol reply.AddInt32("error", EINVAL); 79*64811019SFrançois Revol message->SendReply(reply, NULL); 80*64811019SFrançois Revol return; 81*64811019SFrançois Revol } 82*64811019SFrançois Revol } 83*64811019SFrançois Revol 84*64811019SFrançois Revol 85*64811019SFrançois Revol status_t 86*64811019SFrançois Revol LoginApp::ValidateLogin(const char *login, const char *password/*, bool force = false*/) 87*64811019SFrançois Revol { 88*64811019SFrançois Revol struct passwd *pwd; 89*64811019SFrançois Revol 90*64811019SFrançois Revol pwd = getpwnam(login); 91*64811019SFrançois Revol if (!pwd) 92*64811019SFrançois Revol return ENOENT; 93*64811019SFrançois Revol if (strcmp(pwd->pw_name, login)) 94*64811019SFrançois Revol return ENOENT; 95*64811019SFrançois Revol 96*64811019SFrançois Revol if (password == NULL) { 97*64811019SFrançois Revol // we only want to check is login exists. 98*64811019SFrançois Revol return B_OK; 99*64811019SFrançois Revol } 100*64811019SFrançois Revol 101*64811019SFrançois Revol // XXX: check for shadow pass 102*64811019SFrançois Revol if (strcmp(crypt(password, pwd->pw_passwd), pwd->pw_passwd)) 103*64811019SFrançois Revol return B_NOT_ALLOWED; 104*64811019SFrançois Revol 105*64811019SFrançois Revol return B_OK; 106*64811019SFrançois Revol } 107*64811019SFrançois Revol 108*64811019SFrançois Revol 109*64811019SFrançois Revol status_t 110*64811019SFrançois Revol LoginApp::StartUserSession(const char *login) 111*64811019SFrançois Revol { 112*64811019SFrançois Revol return B_ERROR; 113*64811019SFrançois Revol } 114*64811019SFrançois Revol 115*64811019SFrançois Revol 116*64811019SFrançois Revol int 117*64811019SFrançois Revol LoginApp::getpty(char *pty, char *tty) 118*64811019SFrançois Revol { 119*64811019SFrançois Revol static const char major[] = "pqrs"; 120*64811019SFrançois Revol static const char minor[] = "0123456789abcdef"; 121*64811019SFrançois Revol uint32 i, j; 122*64811019SFrançois Revol int32 fd = -1; 123*64811019SFrançois Revol 124*64811019SFrançois Revol for (i = 0; i < sizeof(major); i++) 125*64811019SFrançois Revol { 126*64811019SFrançois Revol for (j = 0; j < sizeof(minor); j++) 127*64811019SFrançois Revol { 128*64811019SFrançois Revol sprintf(pty, "/dev/pt/%c%c", major[i], minor[j]); 129*64811019SFrançois Revol sprintf(tty, "/dev/tt/%c%c", major[i], minor[j]); 130*64811019SFrançois Revol fd = open(pty, O_RDWR|O_NOCTTY); 131*64811019SFrançois Revol if (fd >= 0) 132*64811019SFrançois Revol { 133*64811019SFrançois Revol return fd; 134*64811019SFrançois Revol } 135*64811019SFrançois Revol } 136*64811019SFrançois Revol } 137*64811019SFrançois Revol 138*64811019SFrançois Revol return fd; 139*64811019SFrançois Revol } 140*64811019SFrançois Revol 141*64811019SFrançois Revol 142*64811019SFrançois Revol 143