164811019SFrançois Revol #include <Screen.h> 264811019SFrançois Revol 364811019SFrançois Revol #include <stdio.h> 464811019SFrançois Revol #include <unistd.h> 564811019SFrançois Revol #include <pwd.h> 664811019SFrançois Revol 764811019SFrançois Revol #include "LoginApp.h" 864811019SFrançois Revol #include "LoginWindow.h" 964811019SFrançois Revol 1064811019SFrançois Revol const char *kLoginAppSig = "application/x-vnd.Haiku-Login"; 1164811019SFrançois Revol 1264811019SFrançois Revol 1364811019SFrançois Revol LoginApp::LoginApp() 1464811019SFrançois Revol : BApplication(kLoginAppSig) 1564811019SFrançois Revol { 1664811019SFrançois Revol } 1764811019SFrançois Revol 1864811019SFrançois Revol 1964811019SFrançois Revol LoginApp::~LoginApp() 2064811019SFrançois Revol { 2164811019SFrançois Revol } 2264811019SFrançois Revol 2364811019SFrançois Revol 2464811019SFrançois Revol void 2564811019SFrançois Revol LoginApp::ReadyToRun() 2664811019SFrançois Revol { 2764811019SFrançois Revol BScreen s; 2864811019SFrançois Revol BRect frame(0, 0, 300, 100); 2964811019SFrançois Revol frame.OffsetBySelf(s.Frame().Width()/2 - frame.Width()/2, 3064811019SFrançois Revol s.Frame().Height()/2 - frame.Height()/2); 3164811019SFrançois Revol LoginWindow *w = new LoginWindow(frame); 3264811019SFrançois Revol w->Show(); 3364811019SFrançois Revol } 3464811019SFrançois Revol 3564811019SFrançois Revol 3664811019SFrançois Revol void 3764811019SFrançois Revol LoginApp::MessageReceived(BMessage *message) 3864811019SFrançois Revol { 3964811019SFrançois Revol switch (message->what) { 4064811019SFrançois Revol case kMsgOpenFilePanel: 4164811019SFrançois Revol break; 4264811019SFrançois Revol default: 4364811019SFrançois Revol BApplication::MessageReceived(message); 4464811019SFrançois Revol } 4564811019SFrançois Revol } 4664811019SFrançois Revol 4764811019SFrançois Revol void TryLogin(BMessage *message); 4864811019SFrançois Revol status_t ValidateLogin(const char *login, const char *password/*, bool force = false*/); 4964811019SFrançois Revol 5064811019SFrançois Revol void 5164811019SFrançois Revol LoginApp::TryLogin(BMessage *message) 5264811019SFrançois Revol { 5364811019SFrançois Revol status_t err; 5464811019SFrançois Revol const char *login; 5564811019SFrançois Revol const char *password; 5664811019SFrançois Revol BMessage reply(B_REPLY); 5764811019SFrançois Revol if (message->FindString("login", &login) == B_OK) { 5864811019SFrançois Revol if (message->FindString("password", &password) < B_OK) 5964811019SFrançois Revol password = NULL; 6064811019SFrançois Revol err = ValidateLogin(login, password); 6164811019SFrançois Revol if (err == B_OK) { 6264811019SFrançois Revol reply.AddInt32("error", B_OK); 63*220adf9aSFrançois Revol message->SendReply(&reply); 6464811019SFrançois Revol 6564811019SFrançois Revol if (password == NULL) 6664811019SFrançois Revol return; 6764811019SFrançois Revol 6864811019SFrançois Revol // start a session 6964811019SFrançois Revol //kSetProgress 7064811019SFrançois Revol StartUserSession(login); 7164811019SFrançois Revol } else { 7264811019SFrançois Revol reply.AddInt32("error", err); 73*220adf9aSFrançois Revol message->SendReply(&reply); 7464811019SFrançois Revol return; 7564811019SFrançois Revol } 7664811019SFrançois Revol 7764811019SFrançois Revol } else { 7864811019SFrançois Revol reply.AddInt32("error", EINVAL); 79*220adf9aSFrançois Revol message->SendReply(&reply); 8064811019SFrançois Revol return; 8164811019SFrançois Revol } 8264811019SFrançois Revol } 8364811019SFrançois Revol 8464811019SFrançois Revol 8564811019SFrançois Revol status_t 8664811019SFrançois Revol LoginApp::ValidateLogin(const char *login, const char *password/*, bool force = false*/) 8764811019SFrançois Revol { 8864811019SFrançois Revol struct passwd *pwd; 8964811019SFrançois Revol 9064811019SFrançois Revol pwd = getpwnam(login); 9164811019SFrançois Revol if (!pwd) 9264811019SFrançois Revol return ENOENT; 9364811019SFrançois Revol if (strcmp(pwd->pw_name, login)) 9464811019SFrançois Revol return ENOENT; 9564811019SFrançois Revol 9664811019SFrançois Revol if (password == NULL) { 9764811019SFrançois Revol // we only want to check is login exists. 9864811019SFrançois Revol return B_OK; 9964811019SFrançois Revol } 10064811019SFrançois Revol 10164811019SFrançois Revol // XXX: check for shadow pass 10264811019SFrançois Revol if (strcmp(crypt(password, pwd->pw_passwd), pwd->pw_passwd)) 10364811019SFrançois Revol return B_NOT_ALLOWED; 10464811019SFrançois Revol 10564811019SFrançois Revol return B_OK; 10664811019SFrançois Revol } 10764811019SFrançois Revol 10864811019SFrançois Revol 10964811019SFrançois Revol status_t 11064811019SFrançois Revol LoginApp::StartUserSession(const char *login) 11164811019SFrançois Revol { 11264811019SFrançois Revol return B_ERROR; 11364811019SFrançois Revol } 11464811019SFrançois Revol 11564811019SFrançois Revol 11664811019SFrançois Revol int 11764811019SFrançois Revol LoginApp::getpty(char *pty, char *tty) 11864811019SFrançois Revol { 11964811019SFrançois Revol static const char major[] = "pqrs"; 12064811019SFrançois Revol static const char minor[] = "0123456789abcdef"; 12164811019SFrançois Revol uint32 i, j; 12264811019SFrançois Revol int32 fd = -1; 12364811019SFrançois Revol 12464811019SFrançois Revol for (i = 0; i < sizeof(major); i++) 12564811019SFrançois Revol { 12664811019SFrançois Revol for (j = 0; j < sizeof(minor); j++) 12764811019SFrançois Revol { 12864811019SFrançois Revol sprintf(pty, "/dev/pt/%c%c", major[i], minor[j]); 12964811019SFrançois Revol sprintf(tty, "/dev/tt/%c%c", major[i], minor[j]); 13064811019SFrançois Revol fd = open(pty, O_RDWR|O_NOCTTY); 13164811019SFrançois Revol if (fd >= 0) 13264811019SFrançois Revol { 13364811019SFrançois Revol return fd; 13464811019SFrançois Revol } 13564811019SFrançois Revol } 13664811019SFrançois Revol } 13764811019SFrançois Revol 13864811019SFrançois Revol return fd; 13964811019SFrançois Revol } 14064811019SFrançois Revol 14164811019SFrançois Revol 14264811019SFrançois Revol 143