xref: /haiku/src/apps/login/LoginApp.cpp (revision 220adf9a931a95562a405a99be5a9c1fa9602544)
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