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