2006-12-28 21:42:04 -08:00
|
|
|
/*
|
|
|
|
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
|
|
|
|
*/
|
2006-02-19 15:53:35 -08:00
|
|
|
#include "e.h"
|
2006-03-31 09:26:38 -08:00
|
|
|
#ifdef HAVE_PAM
|
2006-04-17 20:08:43 -07:00
|
|
|
# include <security/pam_appl.h>
|
|
|
|
# include <pwd.h>
|
|
|
|
# include <limits.h>
|
2006-03-31 09:26:38 -08:00
|
|
|
#endif
|
|
|
|
|
2007-04-18 20:44:47 -07:00
|
|
|
#define E_DESKLOCK_STATE_DEFAULT 0
|
|
|
|
#define E_DESKLOCK_STATE_CHECKING 1
|
|
|
|
#define E_DESKLOCK_STATE_INVALID 2
|
|
|
|
|
2006-02-19 15:53:35 -08:00
|
|
|
#define ELOCK_POPUP_LAYER 10000
|
|
|
|
#define PASSWD_LEN 256
|
|
|
|
|
2006-02-22 06:35:04 -08:00
|
|
|
/**************************** private data ******************************/
|
2007-03-10 21:01:49 -08:00
|
|
|
typedef struct _E_Desklock_Data E_Desklock_Data;
|
|
|
|
typedef struct _E_Desklock_Popup_Data E_Desklock_Popup_Data;
|
2006-04-17 20:14:29 -07:00
|
|
|
#ifdef HAVE_PAM
|
2007-03-10 21:01:49 -08:00
|
|
|
typedef struct _E_Desklock_Auth E_Desklock_Auth;
|
2006-04-17 20:14:29 -07:00
|
|
|
#endif
|
2006-02-19 15:53:35 -08:00
|
|
|
|
2006-02-26 13:42:19 -08:00
|
|
|
struct _E_Desklock_Popup_Data
|
|
|
|
{
|
2007-03-10 21:01:49 -08:00
|
|
|
E_Popup *popup_wnd;
|
|
|
|
Evas_Object *bg_object;
|
|
|
|
Evas_Object *login_box;
|
2006-02-26 13:42:19 -08:00
|
|
|
};
|
2006-02-22 06:35:04 -08:00
|
|
|
|
|
|
|
struct _E_Desklock_Data
|
|
|
|
{
|
2008-10-22 04:49:33 -07:00
|
|
|
Eina_List *elock_wnd_list;
|
2006-02-26 22:35:56 -08:00
|
|
|
Ecore_X_Window elock_wnd;
|
2008-10-22 04:49:33 -07:00
|
|
|
Eina_List *handlers;
|
2006-03-03 20:11:51 -08:00
|
|
|
Ecore_X_Window elock_grab_break_wnd;
|
2007-03-10 21:01:49 -08:00
|
|
|
char passwd[PASSWD_LEN];
|
2007-04-18 20:44:47 -07:00
|
|
|
int state;
|
2006-02-22 06:35:04 -08:00
|
|
|
};
|
2006-04-17 20:14:29 -07:00
|
|
|
#ifdef HAVE_PAM
|
|
|
|
struct _E_Desklock_Auth
|
|
|
|
{
|
|
|
|
struct {
|
|
|
|
struct pam_conv conv;
|
|
|
|
pam_handle_t *handle;
|
|
|
|
} pam;
|
|
|
|
|
|
|
|
char user[PATH_MAX];
|
|
|
|
char passwd[PATH_MAX];
|
|
|
|
};
|
|
|
|
#endif
|
2006-02-19 15:53:35 -08:00
|
|
|
|
2007-03-10 21:01:49 -08:00
|
|
|
static E_Desklock_Data *edd = NULL;
|
|
|
|
static E_Zone *last_active_zone = NULL;
|
2006-04-17 20:14:29 -07:00
|
|
|
#ifdef HAVE_PAM
|
|
|
|
static Ecore_Event_Handler *_e_desklock_exit_handler = NULL;
|
2007-03-10 21:01:49 -08:00
|
|
|
static pid_t _e_desklock_child_pid = -1;
|
2006-04-17 20:14:29 -07:00
|
|
|
#endif
|
2007-02-13 08:33:35 -08:00
|
|
|
static Ecore_Exe *_e_custom_desklock_exe = NULL;
|
|
|
|
static Ecore_Event_Handler *_e_custom_desklock_exe_handler = NULL;
|
2008-01-10 23:33:57 -08:00
|
|
|
static Ecore_Poller *_e_desklock_idle_poller = NULL;
|
2007-04-04 04:43:36 -07:00
|
|
|
static int _e_desklock_user_idle = 0;
|
2009-04-26 19:54:43 -07:00
|
|
|
static double _e_desklock_autolock_time = 0.0;
|
|
|
|
static E_Dialog *_e_desklock_ask_presentation_dia = NULL;
|
|
|
|
static int _e_desklock_ask_presentation_count = 0;
|
2006-02-19 15:53:35 -08:00
|
|
|
|
2006-02-22 06:35:04 -08:00
|
|
|
/***********************************************************************/
|
|
|
|
|
2006-02-19 15:53:35 -08:00
|
|
|
static int _e_desklock_cb_key_down(void *data, int type, void *event);
|
|
|
|
static int _e_desklock_cb_mouse_down(void *data, int type, void *event);
|
|
|
|
static int _e_desklock_cb_mouse_up(void *data, int type, void *event);
|
|
|
|
static int _e_desklock_cb_mouse_wheel(void *data, int type, void *event);
|
2006-03-02 16:02:32 -08:00
|
|
|
static int _e_desklock_cb_mouse_move(void *data, int type, void *event);
|
2007-02-13 08:33:35 -08:00
|
|
|
static int _e_desklock_cb_custom_desklock_exit(void *data, int type, void *event);
|
2008-01-10 23:33:57 -08:00
|
|
|
static int _e_desklock_cb_idle_poller(void *data);
|
2006-02-19 15:53:35 -08:00
|
|
|
|
2008-07-07 14:28:22 -07:00
|
|
|
static void _e_desklock_null(void);
|
2007-09-13 14:09:12 -07:00
|
|
|
static void _e_desklock_passwd_update(void);
|
|
|
|
static void _e_desklock_backspace(void);
|
|
|
|
static void _e_desklock_delete(void);
|
|
|
|
static int _e_desklock_zone_num_get(void);
|
|
|
|
static int _e_desklock_check_auth(void);
|
2007-04-18 20:44:47 -07:00
|
|
|
static void _e_desklock_state_set(int state);
|
2006-03-31 09:26:38 -08:00
|
|
|
|
2006-04-17 20:14:29 -07:00
|
|
|
#ifdef HAVE_PAM
|
|
|
|
static int _e_desklock_cb_exit(void *data, int type, void *event);
|
2006-08-21 09:00:43 -07:00
|
|
|
static int _desklock_auth(char *passwd);
|
2006-04-17 20:14:29 -07:00
|
|
|
static int _desklock_pam_init(E_Desklock_Auth *da);
|
|
|
|
static int _desklock_auth_pam_conv(int num_msg, const struct pam_message **msg, struct pam_response **resp, void *appdata_ptr);
|
|
|
|
static char *_desklock_auth_get_current_user(void);
|
|
|
|
static char *_desklock_auth_get_current_host(void);
|
|
|
|
#endif
|
|
|
|
|
2009-04-26 19:54:43 -07:00
|
|
|
static void _e_desklock_ask_presentation_mode(void);
|
|
|
|
|
2007-05-28 04:15:04 -07:00
|
|
|
EAPI int E_EVENT_DESKLOCK = 0;
|
2007-05-28 04:08:36 -07:00
|
|
|
|
2006-04-17 20:14:29 -07:00
|
|
|
EAPI int
|
|
|
|
e_desklock_init(void)
|
|
|
|
{
|
2008-01-10 23:33:57 -08:00
|
|
|
/* A poller to tick every 256 ticks, watching for an idle user */
|
|
|
|
_e_desklock_idle_poller = ecore_poller_add(ECORE_POLLER_CORE, 256,
|
|
|
|
_e_desklock_cb_idle_poller, NULL);
|
2007-04-04 04:43:36 -07:00
|
|
|
|
2006-10-20 19:32:14 -07:00
|
|
|
if (e_config->desklock_background)
|
2006-12-28 21:42:04 -08:00
|
|
|
e_filereg_register(e_config->desklock_background);
|
2007-04-04 04:43:36 -07:00
|
|
|
|
2007-05-28 04:15:04 -07:00
|
|
|
E_EVENT_DESKLOCK = ecore_event_type_new();
|
2007-05-28 04:08:36 -07:00
|
|
|
|
2006-04-17 20:14:29 -07:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI int
|
|
|
|
e_desklock_shutdown(void)
|
|
|
|
{
|
|
|
|
e_desklock_hide();
|
2006-10-20 19:32:14 -07:00
|
|
|
if (e_config->desklock_background)
|
2006-12-28 21:42:04 -08:00
|
|
|
e_filereg_deregister(e_config->desklock_background);
|
2006-10-20 19:32:14 -07:00
|
|
|
|
2006-04-17 20:14:29 -07:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2009-04-25 11:32:34 -07:00
|
|
|
static const char *
|
|
|
|
_user_wallpaper_get(void)
|
|
|
|
{
|
|
|
|
const E_Config_Desktop_Background *cdbg;
|
|
|
|
const Eina_List *l;
|
|
|
|
|
|
|
|
if (e_config->desktop_default_background)
|
|
|
|
return e_config->desktop_default_background;
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH(e_config->desktop_backgrounds, l, cdbg)
|
|
|
|
if (cdbg->file)
|
|
|
|
return cdbg->file;
|
|
|
|
|
|
|
|
return e_theme_edje_file_get("base/theme/desklock",
|
|
|
|
"e/desklock/background");
|
|
|
|
}
|
|
|
|
|
2009-04-26 19:54:43 -07:00
|
|
|
EAPI int
|
|
|
|
e_desklock_show_autolocked(void)
|
|
|
|
{
|
2009-05-06 05:00:19 -07:00
|
|
|
if (_e_desklock_autolock_time < 1.0)
|
|
|
|
_e_desklock_autolock_time = ecore_loop_time_get();
|
2009-04-26 19:54:43 -07:00
|
|
|
return e_desklock_show();
|
|
|
|
}
|
|
|
|
|
2006-02-19 15:53:35 -08:00
|
|
|
EAPI int
|
|
|
|
e_desklock_show(void)
|
|
|
|
{
|
2008-10-22 04:49:33 -07:00
|
|
|
Eina_List *managers, *l, *l2, *l3;
|
2009-08-21 08:08:49 -07:00
|
|
|
E_Manager *man;
|
2006-03-02 16:02:32 -08:00
|
|
|
E_Desklock_Popup_Data *edp;
|
|
|
|
Evas_Coord mw, mh;
|
|
|
|
E_Zone *current_zone;
|
|
|
|
int zone_counter;
|
|
|
|
int total_zone_num;
|
2007-05-28 04:15:04 -07:00
|
|
|
E_Event_Desklock *ev;
|
2006-12-28 18:56:26 -08:00
|
|
|
|
2007-02-13 08:33:35 -08:00
|
|
|
if (_e_custom_desklock_exe) return 0;
|
2006-02-26 22:35:56 -08:00
|
|
|
|
2007-02-13 08:33:35 -08:00
|
|
|
if (e_config->desklock_use_custom_desklock)
|
2006-12-28 18:56:26 -08:00
|
|
|
{
|
2007-02-13 08:33:35 -08:00
|
|
|
_e_custom_desklock_exe_handler = ecore_event_handler_add(ECORE_EXE_EVENT_DEL,
|
|
|
|
_e_desklock_cb_custom_desklock_exit,
|
2006-12-28 18:56:26 -08:00
|
|
|
NULL);
|
|
|
|
e_util_library_path_strip();
|
2007-02-13 08:33:35 -08:00
|
|
|
_e_custom_desklock_exe = ecore_exe_run(e_config->desklock_custom_desklock_cmd, NULL);
|
2006-12-28 18:56:26 -08:00
|
|
|
e_util_library_path_restore();
|
|
|
|
return 1;
|
|
|
|
}
|
2007-02-13 08:33:35 -08:00
|
|
|
|
|
|
|
#ifndef HAVE_PAM
|
|
|
|
e_util_dialog_show(_("Error - no PAM support"),
|
|
|
|
_("No PAM support was built into Enlightenment, so<br>"
|
|
|
|
"desk locking is disabled."));
|
|
|
|
return 0;
|
|
|
|
#endif
|
|
|
|
|
2006-12-28 18:56:26 -08:00
|
|
|
if (edd) return 0;
|
|
|
|
|
2006-03-31 09:26:38 -08:00
|
|
|
#ifdef HAVE_PAM
|
2006-04-17 20:08:43 -07:00
|
|
|
if (e_config->desklock_auth_method == 1)
|
2006-02-26 22:35:56 -08:00
|
|
|
{
|
2006-03-31 09:26:38 -08:00
|
|
|
#endif
|
|
|
|
if (!e_config->desklock_personal_passwd)
|
|
|
|
{
|
|
|
|
E_Zone *zone;
|
|
|
|
|
|
|
|
zone = e_util_zone_current_get(e_manager_current_get());
|
|
|
|
if (zone)
|
2007-07-04 04:11:03 -07:00
|
|
|
e_configure_registry_call("screen/screen_lock", zone->container, NULL);
|
2006-03-31 09:26:38 -08:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
#ifdef HAVE_PAM
|
2006-02-26 22:35:56 -08:00
|
|
|
}
|
2006-03-31 09:26:38 -08:00
|
|
|
#endif
|
2006-02-26 22:35:56 -08:00
|
|
|
|
2006-03-03 20:11:51 -08:00
|
|
|
edd = E_NEW(E_Desklock_Data, 1);
|
|
|
|
if (!edd) return 0;
|
|
|
|
edd->elock_wnd = ecore_x_window_input_new(e_manager_current_get()->root,
|
|
|
|
0, 0, 1, 1);
|
|
|
|
ecore_x_window_show(edd->elock_wnd);
|
|
|
|
managers = e_manager_list();
|
|
|
|
if (!e_grabinput_get(edd->elock_wnd, 0, edd->elock_wnd))
|
2006-02-26 22:35:56 -08:00
|
|
|
{
|
2009-08-21 08:08:49 -07:00
|
|
|
EINA_LIST_FOREACH(managers, l, man)
|
2006-03-03 20:11:51 -08:00
|
|
|
{
|
|
|
|
Ecore_X_Window *windows;
|
|
|
|
int wnum;
|
|
|
|
|
|
|
|
windows = ecore_x_window_children_get(man->root, &wnum);
|
|
|
|
if (windows)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < wnum; i++)
|
|
|
|
{
|
|
|
|
Ecore_X_Window_Attributes att;
|
2007-03-10 21:01:49 -08:00
|
|
|
|
2006-03-04 04:38:18 -08:00
|
|
|
memset(&att, 0, sizeof(Ecore_X_Window_Attributes));
|
2006-03-03 20:11:51 -08:00
|
|
|
ecore_x_window_attributes_get(windows[i], &att);
|
|
|
|
if (att.visible)
|
|
|
|
{
|
|
|
|
ecore_x_window_hide(windows[i]);
|
|
|
|
if (e_grabinput_get(edd->elock_wnd, 0, edd->elock_wnd))
|
|
|
|
{
|
|
|
|
edd->elock_grab_break_wnd = windows[i];
|
|
|
|
free(windows);
|
|
|
|
goto works;
|
|
|
|
}
|
|
|
|
ecore_x_window_show(windows[i]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
free(windows);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/* everything failed - cant lock */
|
|
|
|
e_util_dialog_show(_("Lock Failed"),
|
|
|
|
_("Locking the desktop failed because some application<br>"
|
2006-04-29 21:31:42 -07:00
|
|
|
"has grabbed either the keyboard or the mouse or both<br>"
|
2006-03-03 20:11:51 -08:00
|
|
|
"and their grab is unable to be broken."));
|
2009-04-10 02:57:57 -07:00
|
|
|
ecore_x_window_free(edd->elock_wnd);
|
2006-03-03 20:11:51 -08:00
|
|
|
free(edd);
|
|
|
|
edd = NULL;
|
|
|
|
return 0;
|
2006-02-26 22:35:56 -08:00
|
|
|
}
|
2006-03-03 20:11:51 -08:00
|
|
|
works:
|
|
|
|
|
2006-03-02 16:02:32 -08:00
|
|
|
last_active_zone = current_zone =
|
|
|
|
e_zone_current_get(e_container_current_get(e_manager_current_get()));
|
2006-02-26 22:35:56 -08:00
|
|
|
|
2006-03-02 16:02:32 -08:00
|
|
|
zone_counter = 0;
|
|
|
|
total_zone_num = _e_desklock_zone_num_get();
|
2009-08-21 08:08:49 -07:00
|
|
|
EINA_LIST_FOREACH(managers, l, man)
|
2006-02-26 22:35:56 -08:00
|
|
|
{
|
2009-08-21 08:08:49 -07:00
|
|
|
E_Container *con;
|
|
|
|
EINA_LIST_FOREACH(man->containers, l2, con)
|
2006-02-26 22:35:56 -08:00
|
|
|
{
|
2009-08-21 08:08:49 -07:00
|
|
|
E_Zone *zone;
|
|
|
|
EINA_LIST_FOREACH(con->zones, l3, zone)
|
2006-02-26 22:35:56 -08:00
|
|
|
{
|
|
|
|
edp = E_NEW(E_Desklock_Popup_Data, 1);
|
|
|
|
if (edp)
|
|
|
|
{
|
|
|
|
edp->popup_wnd = e_popup_new(zone, 0, 0, zone->w, zone->h);
|
|
|
|
evas_event_feed_mouse_move(edp->popup_wnd->evas, -1000000, -1000000,
|
|
|
|
ecore_x_current_time_get(), NULL);
|
|
|
|
|
|
|
|
e_popup_layer_set(edp->popup_wnd, ELOCK_POPUP_LAYER);
|
2006-03-03 20:11:51 -08:00
|
|
|
ecore_evas_raise(edp->popup_wnd->ecore_evas);
|
2006-02-26 22:35:56 -08:00
|
|
|
|
|
|
|
evas_event_freeze(edp->popup_wnd->evas);
|
|
|
|
edp->bg_object = edje_object_add(edp->popup_wnd->evas);
|
2006-03-02 16:02:32 -08:00
|
|
|
|
2006-03-02 22:00:18 -08:00
|
|
|
if ((!e_config->desklock_background) ||
|
|
|
|
(!strcmp(e_config->desklock_background, "theme_desklock_background")))
|
2006-03-02 16:02:32 -08:00
|
|
|
{
|
|
|
|
e_theme_edje_object_set(edp->bg_object,
|
|
|
|
"base/theme/desklock",
|
2006-08-22 20:39:02 -07:00
|
|
|
"e/desklock/background");
|
2006-03-02 16:02:32 -08:00
|
|
|
}
|
|
|
|
else if (!strcmp(e_config->desklock_background, "theme_background"))
|
|
|
|
{
|
2006-03-02 22:00:18 -08:00
|
|
|
e_theme_edje_object_set(edp->bg_object,
|
|
|
|
"base/theme/backgrounds",
|
2006-08-22 20:39:02 -07:00
|
|
|
"e/desktop/background");
|
2006-03-02 16:02:32 -08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2009-04-25 11:32:34 -07:00
|
|
|
const char *f;
|
|
|
|
|
|
|
|
if (!strcmp(e_config->desklock_background, "user_background"))
|
|
|
|
f = _user_wallpaper_get();
|
|
|
|
else
|
|
|
|
f = e_config->desklock_background;
|
|
|
|
|
|
|
|
if (e_util_edje_collection_exists(f, "e/desklock/background"))
|
2006-03-02 16:02:32 -08:00
|
|
|
{
|
2009-04-25 11:32:34 -07:00
|
|
|
edje_object_file_set(edp->bg_object, f,
|
2006-08-22 20:39:02 -07:00
|
|
|
"e/desklock/background");
|
2006-03-02 16:02:32 -08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (!edje_object_file_set(edp->bg_object,
|
2009-04-25 11:32:34 -07:00
|
|
|
f, "e/desktop/background"))
|
2006-03-02 16:02:32 -08:00
|
|
|
{
|
|
|
|
edje_object_file_set(edp->bg_object,
|
2007-03-10 21:01:49 -08:00
|
|
|
e_theme_edje_file_get("base/theme/desklock",
|
|
|
|
"e/desklock/background"),
|
|
|
|
"e/desklock/background");
|
2006-03-02 16:02:32 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-02-26 22:35:56 -08:00
|
|
|
evas_object_move(edp->bg_object, 0, 0);
|
|
|
|
evas_object_resize(edp->bg_object, zone->w, zone->h);
|
|
|
|
evas_object_show(edp->bg_object);
|
2006-03-02 16:02:32 -08:00
|
|
|
edp->login_box = edje_object_add(edp->popup_wnd->evas);
|
|
|
|
e_theme_edje_object_set(edp->login_box,
|
2006-03-02 22:00:18 -08:00
|
|
|
"base/theme/desklock",
|
2006-08-22 20:39:02 -07:00
|
|
|
"e/desklock/login_box");
|
2006-08-22 00:39:11 -07:00
|
|
|
edje_object_part_text_set(edp->login_box, "e.text.title",
|
2006-03-02 22:00:18 -08:00
|
|
|
_("Please enter your unlock password"));
|
2006-03-02 16:02:32 -08:00
|
|
|
edje_object_size_min_calc(edp->login_box, &mw, &mh);
|
2008-10-26 15:44:57 -07:00
|
|
|
if (edje_object_part_exists(edp->bg_object, "e.swallow.login_box"))
|
2008-10-19 23:50:57 -07:00
|
|
|
{
|
|
|
|
edje_extern_object_min_size_set(edp->login_box, mw, mh);
|
|
|
|
edje_object_part_swallow(edp->bg_object, "e.swallow.login_box", edp->login_box);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
evas_object_resize(edp->login_box, mw, mh);
|
|
|
|
evas_object_move(edp->login_box,
|
|
|
|
((zone->w - mw) / 2),
|
|
|
|
((zone->h - mh) / 2));
|
|
|
|
}
|
2006-03-02 16:02:32 -08:00
|
|
|
if (total_zone_num > 1)
|
2006-04-17 20:08:43 -07:00
|
|
|
{
|
|
|
|
if (e_config->desklock_login_box_zone == -1)
|
|
|
|
evas_object_show(edp->login_box);
|
2008-10-19 23:50:57 -07:00
|
|
|
else if ((e_config->desklock_login_box_zone == -2) &&
|
|
|
|
(zone == current_zone))
|
2006-04-17 20:08:43 -07:00
|
|
|
evas_object_show(edp->login_box);
|
2008-10-19 23:50:57 -07:00
|
|
|
else if (e_config->desklock_login_box_zone == zone_counter)
|
2006-04-17 20:08:43 -07:00
|
|
|
evas_object_show(edp->login_box);
|
|
|
|
}
|
2006-03-02 16:02:32 -08:00
|
|
|
else
|
|
|
|
evas_object_show(edp->login_box);
|
|
|
|
/**/
|
2006-02-26 22:35:56 -08:00
|
|
|
|
|
|
|
e_popup_edje_bg_object_set(edp->popup_wnd, edp->bg_object);
|
|
|
|
evas_event_thaw(edp->popup_wnd->evas);
|
|
|
|
|
|
|
|
e_popup_show(edp->popup_wnd);
|
|
|
|
|
2008-10-22 04:49:33 -07:00
|
|
|
edd->elock_wnd_list = eina_list_append(edd->elock_wnd_list, edp);
|
2006-02-26 22:35:56 -08:00
|
|
|
}
|
2006-12-28 21:42:04 -08:00
|
|
|
zone_counter++;
|
2006-02-26 22:35:56 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* handlers */
|
2008-10-22 04:49:33 -07:00
|
|
|
edd->handlers = eina_list_append(edd->handlers,
|
2009-03-16 09:24:43 -07:00
|
|
|
ecore_event_handler_add(ECORE_EVENT_KEY_DOWN,
|
2006-02-26 22:35:56 -08:00
|
|
|
_e_desklock_cb_key_down, NULL));
|
2008-10-22 04:49:33 -07:00
|
|
|
edd->handlers = eina_list_append(edd->handlers,
|
2009-03-16 09:24:43 -07:00
|
|
|
ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN,
|
2006-02-26 22:35:56 -08:00
|
|
|
_e_desklock_cb_mouse_down, NULL));
|
2008-10-22 04:49:33 -07:00
|
|
|
edd->handlers = eina_list_append(edd->handlers,
|
2009-03-16 09:24:43 -07:00
|
|
|
ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_UP,
|
2006-02-26 22:35:56 -08:00
|
|
|
_e_desklock_cb_mouse_up, NULL));
|
2008-10-22 04:49:33 -07:00
|
|
|
edd->handlers = eina_list_append(edd->handlers,
|
2009-03-16 09:24:43 -07:00
|
|
|
ecore_event_handler_add(ECORE_EVENT_MOUSE_WHEEL,
|
2006-02-26 22:35:56 -08:00
|
|
|
_e_desklock_cb_mouse_wheel,
|
|
|
|
NULL));
|
2007-05-28 04:08:36 -07:00
|
|
|
if ((total_zone_num > 1) && (e_config->desklock_login_box_zone == -2))
|
2008-10-22 04:49:33 -07:00
|
|
|
edd->handlers = eina_list_append(edd->handlers,
|
2009-03-16 09:24:43 -07:00
|
|
|
ecore_event_handler_add(ECORE_EVENT_MOUSE_MOVE,
|
2006-03-02 16:02:32 -08:00
|
|
|
_e_desklock_cb_mouse_move,
|
|
|
|
NULL));
|
2006-02-26 22:35:56 -08:00
|
|
|
_e_desklock_passwd_update();
|
2007-05-28 04:15:04 -07:00
|
|
|
|
|
|
|
ev = E_NEW(E_Event_Desklock, 1);
|
|
|
|
ev->on = 1;
|
|
|
|
ecore_event_add(E_EVENT_DESKLOCK, ev, NULL, NULL);
|
2006-02-26 22:35:56 -08:00
|
|
|
return 1;
|
2006-02-19 15:53:35 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
|
|
|
e_desklock_hide(void)
|
|
|
|
{
|
2007-03-10 21:01:49 -08:00
|
|
|
E_Desklock_Popup_Data *edp;
|
2007-05-28 04:15:04 -07:00
|
|
|
E_Event_Desklock *ev;
|
2006-02-26 22:35:56 -08:00
|
|
|
|
2007-02-13 08:33:35 -08:00
|
|
|
if ((!edd) && (!_e_custom_desklock_exe)) return;
|
2006-03-03 20:11:51 -08:00
|
|
|
|
2007-02-13 08:33:35 -08:00
|
|
|
if (e_config->desklock_use_custom_desklock)
|
2006-12-28 21:42:04 -08:00
|
|
|
{
|
2007-02-13 08:33:35 -08:00
|
|
|
_e_custom_desklock_exe = NULL;
|
2006-12-28 21:42:04 -08:00
|
|
|
return;
|
|
|
|
}
|
2006-12-28 18:56:26 -08:00
|
|
|
|
2006-03-03 20:11:51 -08:00
|
|
|
if (edd->elock_grab_break_wnd)
|
|
|
|
ecore_x_window_show(edd->elock_grab_break_wnd);
|
2009-08-21 08:08:49 -07:00
|
|
|
|
|
|
|
EINA_LIST_FREE(edd->elock_wnd_list, edp)
|
2006-02-26 22:35:56 -08:00
|
|
|
{
|
|
|
|
if (edp)
|
|
|
|
{
|
|
|
|
e_popup_hide(edp->popup_wnd);
|
|
|
|
|
|
|
|
evas_event_freeze(edp->popup_wnd->evas);
|
|
|
|
evas_object_del(edp->bg_object);
|
2006-03-02 16:02:32 -08:00
|
|
|
evas_object_del(edp->login_box);
|
2006-02-26 22:35:56 -08:00
|
|
|
evas_event_thaw(edp->popup_wnd->evas);
|
|
|
|
|
2007-05-04 09:21:53 -07:00
|
|
|
e_util_defer_object_del(E_OBJECT(edp->popup_wnd));
|
2006-02-26 22:35:56 -08:00
|
|
|
E_FREE(edp);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-08-21 08:08:49 -07:00
|
|
|
E_FREE_LIST(edd->handlers, ecore_event_handler_del);
|
2006-02-26 22:35:56 -08:00
|
|
|
|
|
|
|
e_grabinput_release(edd->elock_wnd, edd->elock_wnd);
|
2009-04-10 02:57:57 -07:00
|
|
|
ecore_x_window_free(edd->elock_wnd);
|
2006-02-26 22:35:56 -08:00
|
|
|
|
|
|
|
E_FREE(edd);
|
|
|
|
edd = NULL;
|
2007-05-28 04:15:04 -07:00
|
|
|
|
|
|
|
ev = E_NEW(E_Event_Desklock, 1);
|
|
|
|
ev->on = 0;
|
|
|
|
ecore_event_add(E_EVENT_DESKLOCK, ev, NULL, NULL);
|
2009-04-26 19:54:43 -07:00
|
|
|
|
|
|
|
if (_e_desklock_autolock_time > 0.0)
|
|
|
|
{
|
|
|
|
if ((e_config->desklock_ask_presentation) &&
|
|
|
|
(e_config->desklock_ask_presentation_timeout > 0.0))
|
|
|
|
{
|
|
|
|
double max, now;
|
|
|
|
|
|
|
|
now = ecore_loop_time_get();
|
|
|
|
max = _e_desklock_autolock_time + e_config->desklock_ask_presentation_timeout;
|
|
|
|
if (now <= max)
|
|
|
|
_e_desklock_ask_presentation_mode();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
_e_desklock_ask_presentation_count = 0;
|
|
|
|
|
|
|
|
_e_desklock_autolock_time = 0.0;
|
|
|
|
}
|
2006-02-19 15:53:35 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_e_desklock_cb_key_down(void *data, int type, void *event)
|
|
|
|
{
|
2009-03-16 09:24:43 -07:00
|
|
|
Ecore_Event_Key *ev;
|
2006-02-26 22:35:56 -08:00
|
|
|
|
|
|
|
ev = event;
|
2009-03-16 09:24:43 -07:00
|
|
|
if (ev->window != edd->elock_wnd || edd->state == E_DESKLOCK_STATE_CHECKING) return 1;
|
2007-03-10 21:01:49 -08:00
|
|
|
|
2009-03-16 09:24:43 -07:00
|
|
|
if (!strcmp(ev->key, "Escape"))
|
2007-03-10 21:01:49 -08:00
|
|
|
;
|
2009-03-16 09:24:43 -07:00
|
|
|
else if (!strcmp(ev->key, "KP_Enter"))
|
2006-04-17 20:08:43 -07:00
|
|
|
_e_desklock_check_auth();
|
2009-03-16 09:24:43 -07:00
|
|
|
else if (!strcmp(ev->key, "Return"))
|
2006-04-17 20:08:43 -07:00
|
|
|
_e_desklock_check_auth();
|
2009-03-16 09:24:43 -07:00
|
|
|
else if (!strcmp(ev->key, "BackSpace"))
|
2006-02-26 22:35:56 -08:00
|
|
|
_e_desklock_backspace();
|
2009-03-16 09:24:43 -07:00
|
|
|
else if (!strcmp(ev->key, "Delete"))
|
2006-02-26 22:35:56 -08:00
|
|
|
_e_desklock_delete();
|
2009-03-17 14:55:33 -07:00
|
|
|
else if (!strcmp(ev->key, "u") && (ev->modifiers & ECORE_EVENT_MODIFIER_CTRL))
|
2008-07-07 14:28:22 -07:00
|
|
|
_e_desklock_null();
|
2006-02-26 22:35:56 -08:00
|
|
|
else
|
|
|
|
{
|
2007-03-25 15:45:00 -07:00
|
|
|
/* here we have to grab a password */
|
2009-03-16 09:24:43 -07:00
|
|
|
if (ev->compose)
|
2006-02-26 22:35:56 -08:00
|
|
|
{
|
2009-03-16 09:24:43 -07:00
|
|
|
if ((strlen(edd->passwd) < (PASSWD_LEN - strlen(ev->compose))))
|
2006-02-26 22:35:56 -08:00
|
|
|
{
|
2009-03-16 09:24:43 -07:00
|
|
|
strcat(edd->passwd, ev->compose);
|
2006-02-26 22:35:56 -08:00
|
|
|
_e_desklock_passwd_update();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return 1;
|
2006-02-19 15:53:35 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
|
|
|
_e_desklock_cb_mouse_down(void *data, int type, void *event)
|
|
|
|
{
|
2006-02-26 22:35:56 -08:00
|
|
|
return 1;
|
2006-02-19 15:53:35 -08:00
|
|
|
}
|
2006-04-17 20:08:43 -07:00
|
|
|
|
2006-02-19 15:53:35 -08:00
|
|
|
static int
|
|
|
|
_e_desklock_cb_mouse_up(void *data, int type, void *event)
|
|
|
|
{
|
2006-02-26 22:35:56 -08:00
|
|
|
return 1;
|
2006-02-19 15:53:35 -08:00
|
|
|
}
|
2006-04-17 20:08:43 -07:00
|
|
|
|
2006-02-19 15:53:35 -08:00
|
|
|
static int
|
|
|
|
_e_desklock_cb_mouse_wheel(void *data, int type, void *event)
|
|
|
|
{
|
2006-02-26 22:35:56 -08:00
|
|
|
return 1;
|
2006-02-19 15:53:35 -08:00
|
|
|
}
|
2006-03-02 16:02:32 -08:00
|
|
|
|
|
|
|
static int
|
2006-04-17 20:08:43 -07:00
|
|
|
_e_desklock_cb_mouse_move(void *data, int type, void *event)
|
2006-02-19 15:53:35 -08:00
|
|
|
{
|
2007-03-10 21:01:49 -08:00
|
|
|
E_Desklock_Popup_Data *edp;
|
2006-04-17 20:08:43 -07:00
|
|
|
E_Zone *current_zone;
|
2008-10-22 04:49:33 -07:00
|
|
|
Eina_List *l;
|
2006-04-17 20:08:43 -07:00
|
|
|
|
|
|
|
current_zone = e_zone_current_get(e_container_current_get(e_manager_current_get()));
|
|
|
|
|
|
|
|
if (current_zone == last_active_zone)
|
|
|
|
return 1;
|
|
|
|
|
2009-08-21 08:08:49 -07:00
|
|
|
EINA_LIST_FOREACH(edd->elock_wnd_list, l, edp)
|
2006-04-17 20:08:43 -07:00
|
|
|
{
|
|
|
|
if (!edp) continue;
|
|
|
|
|
|
|
|
if (edp->popup_wnd->zone == last_active_zone)
|
|
|
|
evas_object_hide(edp->login_box);
|
|
|
|
else if (edp->popup_wnd->zone == current_zone)
|
|
|
|
evas_object_show(edp->login_box);
|
|
|
|
}
|
|
|
|
last_active_zone = current_zone;
|
2006-02-26 22:35:56 -08:00
|
|
|
return 1;
|
2006-02-19 15:53:35 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2007-09-13 14:09:12 -07:00
|
|
|
_e_desklock_passwd_update(void)
|
2006-02-19 15:53:35 -08:00
|
|
|
{
|
2006-07-31 21:14:34 -07:00
|
|
|
char passwd_hidden[PASSWD_LEN] = "", *p, *pp;
|
2007-03-10 21:01:49 -08:00
|
|
|
E_Desklock_Popup_Data *edp;
|
2008-10-22 04:49:33 -07:00
|
|
|
Eina_List *l;
|
2006-02-26 22:35:56 -08:00
|
|
|
|
|
|
|
if (!edd) return;
|
|
|
|
|
2007-03-10 21:01:49 -08:00
|
|
|
for (p = edd->passwd, pp = passwd_hidden; *p; p++, pp++)
|
|
|
|
*pp = '*';
|
2006-07-31 21:14:34 -07:00
|
|
|
*pp = 0;
|
2006-02-26 22:35:56 -08:00
|
|
|
|
2009-08-21 08:08:49 -07:00
|
|
|
EINA_LIST_FOREACH(edd->elock_wnd_list, l, edp)
|
2006-02-26 22:35:56 -08:00
|
|
|
{
|
2007-03-10 21:01:49 -08:00
|
|
|
edje_object_part_text_set(edp->login_box, "e.text.password",
|
|
|
|
passwd_hidden);
|
2006-02-26 22:35:56 -08:00
|
|
|
}
|
2006-02-19 15:53:35 -08:00
|
|
|
}
|
|
|
|
|
2008-07-07 14:28:22 -07:00
|
|
|
static void
|
|
|
|
_e_desklock_null(void)
|
|
|
|
{
|
|
|
|
memset(edd->passwd, 0, sizeof(char) * PASSWD_LEN);
|
|
|
|
_e_desklock_passwd_update();
|
|
|
|
}
|
|
|
|
|
2006-02-19 15:53:35 -08:00
|
|
|
static void
|
2007-09-13 14:09:12 -07:00
|
|
|
_e_desklock_backspace(void)
|
2006-02-19 15:53:35 -08:00
|
|
|
{
|
2006-07-31 21:14:34 -07:00
|
|
|
int len, val, pos;
|
|
|
|
|
|
|
|
if (!edd) return;
|
2006-02-26 22:35:56 -08:00
|
|
|
|
|
|
|
len = strlen(edd->passwd);
|
|
|
|
if (len > 0)
|
|
|
|
{
|
|
|
|
pos = evas_string_char_prev_get(edd->passwd, len, &val);
|
|
|
|
if ((pos < len) && (pos >= 0))
|
|
|
|
{
|
|
|
|
edd->passwd[pos] = 0;
|
|
|
|
_e_desklock_passwd_update();
|
|
|
|
}
|
|
|
|
}
|
2006-02-19 15:53:35 -08:00
|
|
|
}
|
2006-02-26 22:35:56 -08:00
|
|
|
|
2006-02-19 15:53:35 -08:00
|
|
|
static void
|
2007-09-13 14:09:12 -07:00
|
|
|
_e_desklock_delete(void)
|
2006-02-19 15:53:35 -08:00
|
|
|
{
|
2006-04-17 20:08:43 -07:00
|
|
|
_e_desklock_backspace();
|
2006-02-19 15:53:35 -08:00
|
|
|
}
|
2006-02-26 13:42:19 -08:00
|
|
|
|
2006-03-02 16:02:32 -08:00
|
|
|
static int
|
2007-09-13 14:09:12 -07:00
|
|
|
_e_desklock_zone_num_get(void)
|
2006-03-02 16:02:32 -08:00
|
|
|
{
|
2006-04-17 20:08:43 -07:00
|
|
|
int num;
|
2008-10-22 04:49:33 -07:00
|
|
|
Eina_List *l, *l2;
|
2009-08-21 08:08:49 -07:00
|
|
|
E_Manager *man;
|
2006-04-17 20:08:43 -07:00
|
|
|
|
|
|
|
num = 0;
|
2009-08-21 08:08:49 -07:00
|
|
|
EINA_LIST_FOREACH(e_manager_list(), l, man)
|
2006-04-17 20:08:43 -07:00
|
|
|
{
|
2009-08-21 08:08:49 -07:00
|
|
|
E_Container *con;
|
|
|
|
EINA_LIST_FOREACH(man->containers, l2, con)
|
2006-04-17 20:08:43 -07:00
|
|
|
{
|
2008-10-22 04:49:33 -07:00
|
|
|
num += eina_list_count(con->zones);
|
2006-04-17 20:08:43 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return num;
|
2006-03-02 16:02:32 -08:00
|
|
|
}
|
2006-02-26 13:42:19 -08:00
|
|
|
|
2006-04-17 20:08:43 -07:00
|
|
|
static int
|
2007-09-13 14:09:12 -07:00
|
|
|
_e_desklock_check_auth(void)
|
2006-03-31 09:26:38 -08:00
|
|
|
{
|
2006-04-17 20:08:43 -07:00
|
|
|
if (!edd) return 0;
|
2006-03-31 09:26:38 -08:00
|
|
|
#ifdef HAVE_PAM
|
2006-04-17 20:08:43 -07:00
|
|
|
if (e_config->desklock_auth_method == 0)
|
|
|
|
return _desklock_auth(edd->passwd);
|
|
|
|
else if (e_config->desklock_auth_method == 1)
|
|
|
|
{
|
2006-04-17 20:14:29 -07:00
|
|
|
#endif
|
2006-04-17 20:08:43 -07:00
|
|
|
if ((e_config->desklock_personal_passwd) &&
|
|
|
|
(!strcmp(edd->passwd == NULL ? "" : edd->passwd,
|
|
|
|
e_config->desklock_personal_passwd == NULL ? "" :
|
|
|
|
e_config->desklock_personal_passwd)))
|
|
|
|
{
|
2006-04-17 20:14:29 -07:00
|
|
|
/* password ok */
|
2006-07-31 21:14:34 -07:00
|
|
|
/* security - null out passwd string once we are done with it */
|
2006-04-17 20:08:43 -07:00
|
|
|
memset(edd->passwd, 0, sizeof(char) * PASSWD_LEN);
|
|
|
|
e_desklock_hide();
|
|
|
|
return 1;
|
|
|
|
}
|
2006-03-31 09:26:38 -08:00
|
|
|
#ifdef HAVE_PAM
|
2006-04-17 20:08:43 -07:00
|
|
|
}
|
2006-03-31 09:26:38 -08:00
|
|
|
#endif
|
2007-04-18 20:44:47 -07:00
|
|
|
/* password is definitely wrong */
|
|
|
|
_e_desklock_state_set(E_DESKLOCK_STATE_INVALID);
|
2008-07-07 14:28:22 -07:00
|
|
|
_e_desklock_null();
|
2006-04-17 20:08:43 -07:00
|
|
|
return 0;
|
2006-03-31 09:26:38 -08:00
|
|
|
}
|
|
|
|
|
2007-04-18 20:44:47 -07:00
|
|
|
static void
|
|
|
|
_e_desklock_state_set(int state)
|
|
|
|
{
|
2008-10-22 04:49:33 -07:00
|
|
|
Eina_List *l;
|
2009-08-21 08:08:49 -07:00
|
|
|
E_Desklock_Popup_Data *edp;
|
2007-04-18 20:44:47 -07:00
|
|
|
const char *signal, *text;
|
|
|
|
if (!edd) return;
|
|
|
|
|
|
|
|
edd->state = state;
|
|
|
|
if (state == E_DESKLOCK_STATE_CHECKING)
|
|
|
|
{
|
|
|
|
signal = "e,state,checking";
|
|
|
|
text = "Authenticating...";
|
|
|
|
}
|
|
|
|
else if (state == E_DESKLOCK_STATE_INVALID)
|
|
|
|
{
|
|
|
|
signal = "e,state,invalid";
|
|
|
|
text = "The password you entered is invalid. Try again.";
|
|
|
|
}
|
|
|
|
|
2009-08-21 08:08:49 -07:00
|
|
|
EINA_LIST_FOREACH(edd->elock_wnd_list, l, edp)
|
2007-04-18 20:44:47 -07:00
|
|
|
{
|
|
|
|
edje_object_signal_emit(edp->login_box, signal, "e.desklock");
|
|
|
|
edje_object_signal_emit(edp->bg_object, signal, "e.desklock");
|
|
|
|
edje_object_part_text_set(edp->login_box, "e.text.title", text);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-03-31 09:26:38 -08:00
|
|
|
#ifdef HAVE_PAM
|
2006-04-17 20:08:43 -07:00
|
|
|
static int
|
|
|
|
_e_desklock_cb_exit(void *data, int type, void *event)
|
2006-03-31 09:26:38 -08:00
|
|
|
{
|
2006-04-17 20:08:43 -07:00
|
|
|
Ecore_Exe_Event_Del *ev;
|
|
|
|
|
|
|
|
ev = event;
|
|
|
|
if (ev->pid == _e_desklock_child_pid)
|
|
|
|
{
|
|
|
|
_e_desklock_child_pid = -1;
|
|
|
|
/* ok */
|
|
|
|
if (ev->exit_code == 0)
|
|
|
|
{
|
2006-07-31 21:14:34 -07:00
|
|
|
/* security - null out passwd string once we are done with it */
|
2006-04-17 20:08:43 -07:00
|
|
|
memset(edd->passwd, 0, sizeof(char) * PASSWD_LEN);
|
|
|
|
e_desklock_hide();
|
|
|
|
}
|
|
|
|
/* error */
|
|
|
|
else if (ev->exit_code < 128)
|
|
|
|
{
|
2006-07-31 21:14:34 -07:00
|
|
|
/* security - null out passwd string once we are done with it */
|
2006-04-17 20:08:43 -07:00
|
|
|
memset(edd->passwd, 0, sizeof(char) * PASSWD_LEN);
|
|
|
|
e_desklock_hide();
|
|
|
|
e_util_dialog_show(_("Authentication System Error"),
|
|
|
|
_("Authentication via PAM had errors setting up the<br>"
|
|
|
|
"authentication session. The error code was <hilight>%i</hilight>.<br>"
|
|
|
|
"This is bad and should not be happening. Please report this bug.")
|
|
|
|
, ev->exit_code);
|
|
|
|
}
|
|
|
|
/* failed auth */
|
|
|
|
else
|
|
|
|
{
|
2007-04-18 20:44:47 -07:00
|
|
|
_e_desklock_state_set(E_DESKLOCK_STATE_INVALID);
|
2006-07-31 21:14:34 -07:00
|
|
|
/* security - null out passwd string once we are done with it */
|
2008-07-07 14:28:22 -07:00
|
|
|
_e_desklock_null();
|
2006-04-17 20:08:43 -07:00
|
|
|
}
|
|
|
|
ecore_event_handler_del(_e_desklock_exit_handler);
|
|
|
|
_e_desklock_exit_handler = NULL;
|
|
|
|
}
|
|
|
|
return 1;
|
2006-03-31 09:26:38 -08:00
|
|
|
}
|
2006-04-17 20:08:43 -07:00
|
|
|
|
|
|
|
static int
|
2006-08-21 09:00:43 -07:00
|
|
|
_desklock_auth(char *passwd)
|
2006-03-31 09:26:38 -08:00
|
|
|
{
|
2007-04-18 20:44:47 -07:00
|
|
|
_e_desklock_state_set(E_DESKLOCK_STATE_CHECKING);
|
2006-04-17 20:08:43 -07:00
|
|
|
if ((_e_desklock_child_pid = fork()))
|
|
|
|
{
|
|
|
|
/* parent */
|
|
|
|
_e_desklock_exit_handler =
|
|
|
|
ecore_event_handler_add(ECORE_EXE_EVENT_DEL, _e_desklock_cb_exit,
|
|
|
|
NULL);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* child */
|
|
|
|
int pamerr;
|
2006-04-17 20:14:29 -07:00
|
|
|
E_Desklock_Auth da;
|
2006-07-31 21:14:34 -07:00
|
|
|
char *current_user, *p;
|
2006-08-12 06:25:29 -07:00
|
|
|
struct sigaction action;
|
|
|
|
|
2006-08-15 13:20:33 -07:00
|
|
|
action.sa_handler = SIG_DFL;
|
2006-08-12 06:25:29 -07:00
|
|
|
action.sa_flags = SA_ONSTACK | SA_NODEFER | SA_RESETHAND | SA_SIGINFO;
|
|
|
|
sigemptyset(&action.sa_mask);
|
|
|
|
sigaction(SIGSEGV, &action, NULL);
|
|
|
|
sigaction(SIGILL, &action, NULL);
|
|
|
|
sigaction(SIGFPE, &action, NULL);
|
|
|
|
sigaction(SIGBUS, &action, NULL);
|
|
|
|
sigaction(SIGABRT, &action, NULL);
|
|
|
|
|
2006-07-10 12:33:00 -07:00
|
|
|
current_user = _desklock_auth_get_current_user();
|
2008-10-27 05:34:35 -07:00
|
|
|
ecore_strlcpy(da.user, current_user, PATH_MAX);
|
|
|
|
ecore_strlcpy(da.passwd, passwd, PATH_MAX);
|
2006-07-31 21:14:34 -07:00
|
|
|
/* security - null out passwd string once we are done with it */
|
2006-08-21 09:00:43 -07:00
|
|
|
for (p = passwd; *p; p++) *p = 0;
|
2006-04-17 20:08:43 -07:00
|
|
|
da.pam.handle = NULL;
|
|
|
|
da.pam.conv.conv = NULL;
|
|
|
|
da.pam.conv.appdata_ptr = NULL;
|
|
|
|
|
|
|
|
pamerr = _desklock_pam_init(&da);
|
2006-06-20 04:35:15 -07:00
|
|
|
if (pamerr != PAM_SUCCESS)
|
|
|
|
{
|
2006-07-27 23:45:00 -07:00
|
|
|
free(current_user);
|
|
|
|
exit(pamerr);
|
2006-06-20 04:35:15 -07:00
|
|
|
}
|
2006-04-17 20:08:43 -07:00
|
|
|
pamerr = pam_authenticate(da.pam.handle, 0);
|
|
|
|
pam_end(da.pam.handle, pamerr);
|
2006-07-31 21:14:34 -07:00
|
|
|
/* security - null out passwd string once we are done with it */
|
2006-04-17 20:08:43 -07:00
|
|
|
memset(da.passwd, 0, sizeof(da.passwd));
|
2006-06-20 04:35:15 -07:00
|
|
|
if (pamerr == PAM_SUCCESS)
|
|
|
|
{
|
2006-07-27 23:45:00 -07:00
|
|
|
free(current_user);
|
|
|
|
exit(0);
|
2006-06-20 04:35:15 -07:00
|
|
|
}
|
|
|
|
free(current_user);
|
2006-04-17 20:08:43 -07:00
|
|
|
exit(-1);
|
|
|
|
}
|
2006-06-08 12:11:54 -07:00
|
|
|
return 1;
|
2006-03-31 09:26:38 -08:00
|
|
|
}
|
|
|
|
|
2006-04-17 20:08:43 -07:00
|
|
|
static char *
|
|
|
|
_desklock_auth_get_current_user(void)
|
2006-03-31 09:26:38 -08:00
|
|
|
{
|
2006-04-17 20:08:43 -07:00
|
|
|
char *user;
|
|
|
|
struct passwd *pwent = NULL;
|
2006-03-31 09:26:38 -08:00
|
|
|
|
2006-04-17 20:08:43 -07:00
|
|
|
pwent = getpwuid(getuid());
|
|
|
|
user = strdup(pwent->pw_name);
|
|
|
|
return user;
|
|
|
|
}
|
2006-03-31 09:26:38 -08:00
|
|
|
|
2006-04-17 20:08:43 -07:00
|
|
|
static int
|
2006-04-17 20:14:29 -07:00
|
|
|
_desklock_pam_init(E_Desklock_Auth *da)
|
2006-04-17 20:08:43 -07:00
|
|
|
{
|
|
|
|
int pamerr;
|
2006-08-12 06:25:29 -07:00
|
|
|
const char *pam_prof;
|
2006-06-20 04:35:15 -07:00
|
|
|
char *current_host;
|
|
|
|
char *current_user;
|
2006-04-17 20:08:43 -07:00
|
|
|
|
|
|
|
if (!da) return -1;
|
|
|
|
|
|
|
|
da->pam.conv.conv = _desklock_auth_pam_conv;
|
|
|
|
da->pam.conv.appdata_ptr = da;
|
|
|
|
da->pam.handle = NULL;
|
2006-08-12 06:25:29 -07:00
|
|
|
|
2006-09-19 02:59:03 -07:00
|
|
|
/* try other pam profiles - and system-auth (login for fbsd users) is a fallback */
|
2006-09-19 05:26:31 -07:00
|
|
|
pam_prof = "login";
|
2007-03-10 21:01:49 -08:00
|
|
|
if (ecore_file_exists("/etc/pam.d/enlightenment"))
|
|
|
|
pam_prof = "enlightenment";
|
|
|
|
else if (ecore_file_exists("/etc/pam.d/xscreensaver"))
|
|
|
|
pam_prof = "xscreensaver";
|
|
|
|
else if (ecore_file_exists("/etc/pam.d/kscreensaver"))
|
|
|
|
pam_prof = "kscreensaver";
|
|
|
|
else if (ecore_file_exists("/etc/pam.d/system-auth"))
|
|
|
|
pam_prof = "system-auth";
|
|
|
|
else if (ecore_file_exists("/etc/pam.d/system"))
|
|
|
|
pam_prof = "system";
|
2008-08-07 05:04:44 -07:00
|
|
|
else if (ecore_file_exists("/etc/pam.d/xdm"))
|
|
|
|
pam_prof = "xdm";
|
|
|
|
else if (ecore_file_exists("/etc/pam.d/gdm"))
|
|
|
|
pam_prof = "gdm";
|
|
|
|
else if (ecore_file_exists("/etc/pam.d/kdm"))
|
|
|
|
pam_prof = "kdm";
|
2006-04-17 20:08:43 -07:00
|
|
|
|
2006-08-12 06:25:29 -07:00
|
|
|
if ((pamerr = pam_start(pam_prof, da->user, &(da->pam.conv),
|
2006-04-17 20:08:43 -07:00
|
|
|
&(da->pam.handle))) != PAM_SUCCESS)
|
|
|
|
return pamerr;
|
2006-06-20 04:35:15 -07:00
|
|
|
|
|
|
|
current_user = _desklock_auth_get_current_user();
|
|
|
|
|
2007-03-10 21:01:49 -08:00
|
|
|
if ((pamerr = pam_set_item(da->pam.handle, PAM_USER, current_user)) != PAM_SUCCESS)
|
2006-06-20 04:35:15 -07:00
|
|
|
{
|
|
|
|
free(current_user);
|
|
|
|
return pamerr;
|
|
|
|
}
|
2006-04-17 20:08:43 -07:00
|
|
|
|
2006-06-20 04:35:15 -07:00
|
|
|
current_host = _desklock_auth_get_current_host();
|
2007-03-10 21:01:49 -08:00
|
|
|
if ((pamerr = pam_set_item(da->pam.handle, PAM_RHOST, current_host)) != PAM_SUCCESS)
|
2006-06-20 04:35:15 -07:00
|
|
|
{
|
|
|
|
free(current_user);
|
|
|
|
free(current_host);
|
|
|
|
return pamerr;
|
|
|
|
}
|
2006-04-17 20:08:43 -07:00
|
|
|
|
2006-06-20 04:35:15 -07:00
|
|
|
free(current_user);
|
|
|
|
free(current_host);
|
2006-04-17 20:08:43 -07:00
|
|
|
return 0;
|
2006-03-31 09:26:38 -08:00
|
|
|
}
|
|
|
|
|
2006-04-17 20:08:43 -07:00
|
|
|
static int
|
|
|
|
_desklock_auth_pam_conv(int num_msg, const struct pam_message **msg, struct pam_response **resp, void *appdata_ptr)
|
2006-03-31 09:26:38 -08:00
|
|
|
{
|
2006-04-17 20:08:43 -07:00
|
|
|
int replies = 0;
|
2006-04-17 20:14:29 -07:00
|
|
|
E_Desklock_Auth *da = (E_Desklock_Auth *)appdata_ptr;
|
2006-04-17 20:08:43 -07:00
|
|
|
struct pam_response *reply = NULL;
|
|
|
|
|
|
|
|
reply = (struct pam_response *)malloc(sizeof(struct pam_response) *num_msg);
|
|
|
|
|
|
|
|
if (!reply)
|
|
|
|
return PAM_CONV_ERR;
|
|
|
|
|
|
|
|
for (replies = 0; replies < num_msg; replies++)
|
|
|
|
{
|
|
|
|
switch (msg[replies]->msg_style)
|
|
|
|
{
|
|
|
|
case PAM_PROMPT_ECHO_ON:
|
|
|
|
reply[replies].resp_retcode = PAM_SUCCESS;
|
2006-08-21 08:35:17 -07:00
|
|
|
reply[replies].resp = strdup(da->user);
|
2006-04-17 20:08:43 -07:00
|
|
|
break;
|
|
|
|
case PAM_PROMPT_ECHO_OFF:
|
|
|
|
reply[replies].resp_retcode = PAM_SUCCESS;
|
2006-08-21 08:35:17 -07:00
|
|
|
reply[replies].resp = strdup(da->passwd);
|
2006-04-17 20:08:43 -07:00
|
|
|
break;
|
|
|
|
case PAM_ERROR_MSG:
|
|
|
|
case PAM_TEXT_INFO:
|
|
|
|
reply[replies].resp_retcode = PAM_SUCCESS;
|
|
|
|
reply[replies].resp = NULL;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
free(reply);
|
|
|
|
return PAM_CONV_ERR;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
*resp = reply;
|
|
|
|
return PAM_SUCCESS;
|
2006-03-31 09:26:38 -08:00
|
|
|
}
|
|
|
|
|
2006-04-17 20:08:43 -07:00
|
|
|
static char *
|
|
|
|
_desklock_auth_get_current_host(void)
|
2006-03-31 09:26:38 -08:00
|
|
|
{
|
2006-04-17 20:08:43 -07:00
|
|
|
return strdup("localhost");
|
2006-03-31 09:26:38 -08:00
|
|
|
}
|
|
|
|
#endif
|
2006-12-28 18:56:26 -08:00
|
|
|
|
|
|
|
static int
|
2007-02-13 08:33:35 -08:00
|
|
|
_e_desklock_cb_custom_desklock_exit(void *data, int type, void *event)
|
2006-12-28 18:56:26 -08:00
|
|
|
{
|
|
|
|
Ecore_Exe_Event_Del *ev;
|
|
|
|
|
|
|
|
ev = event;
|
2007-02-13 08:33:35 -08:00
|
|
|
if (ev->exe != _e_custom_desklock_exe) return 1;
|
2006-12-28 18:56:26 -08:00
|
|
|
|
|
|
|
if (ev->exit_code != 0)
|
2006-12-28 21:42:04 -08:00
|
|
|
{
|
|
|
|
/* do something profound here... like notify someone */
|
|
|
|
}
|
2006-12-28 18:56:26 -08:00
|
|
|
|
|
|
|
e_desklock_hide();
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
2007-04-04 04:43:36 -07:00
|
|
|
|
|
|
|
static int
|
2008-01-10 23:33:57 -08:00
|
|
|
_e_desklock_cb_idle_poller(void *data)
|
2007-04-04 04:43:36 -07:00
|
|
|
{
|
2009-04-25 09:49:53 -07:00
|
|
|
if ((e_config->desklock_autolock_idle) && (!e_config->mode.presentation))
|
2007-04-04 04:43:36 -07:00
|
|
|
{
|
2009-04-26 19:54:43 -07:00
|
|
|
double idle, max;
|
|
|
|
|
2007-04-04 04:43:36 -07:00
|
|
|
/* If a desklock is already up, bail */
|
|
|
|
if ((_e_custom_desklock_exe) || (edd)) return 1;
|
|
|
|
|
2009-04-26 19:54:43 -07:00
|
|
|
idle = ecore_x_screensaver_idle_time_get();
|
|
|
|
max = e_config->desklock_autolock_idle_timeout;
|
|
|
|
if (_e_desklock_ask_presentation_count > 0)
|
2009-05-06 05:00:19 -07:00
|
|
|
max *= (1 + _e_desklock_ask_presentation_count);
|
2009-04-26 19:54:43 -07:00
|
|
|
|
2007-04-04 04:43:36 -07:00
|
|
|
/* If we have exceeded our idle time... */
|
2009-04-26 19:54:43 -07:00
|
|
|
if (idle >= max)
|
2007-04-04 04:43:36 -07:00
|
|
|
{
|
|
|
|
/*
|
|
|
|
* Unfortunately, not all "desklocks" stay up for as long as
|
|
|
|
* the user is idle or until it is unlocked.
|
|
|
|
*
|
|
|
|
* 'xscreensaver-command -lock' for example sends a command
|
|
|
|
* to xscreensaver and then terminates. So, we have another
|
|
|
|
* check (_e_desklock_user_idle) which lets us know that we
|
|
|
|
* have locked the screen due to idleness.
|
|
|
|
*/
|
|
|
|
if (!_e_desklock_user_idle)
|
|
|
|
{
|
|
|
|
_e_desklock_user_idle = 1;
|
2009-04-26 19:54:43 -07:00
|
|
|
e_desklock_show_autolocked();
|
2007-04-04 04:43:36 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
_e_desklock_user_idle = 0;
|
|
|
|
}
|
|
|
|
|
2008-01-10 23:33:57 -08:00
|
|
|
/* Make sure our poller persists. */
|
2007-04-04 04:43:36 -07:00
|
|
|
return 1;
|
|
|
|
}
|
2009-04-26 19:54:43 -07:00
|
|
|
|
|
|
|
static void
|
|
|
|
_e_desklock_ask_presentation_del(void *data)
|
|
|
|
{
|
|
|
|
if (_e_desklock_ask_presentation_dia == data)
|
|
|
|
_e_desklock_ask_presentation_dia = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_desklock_ask_presentation_yes(void *data __UNUSED__, E_Dialog *dia)
|
|
|
|
{
|
|
|
|
e_config->mode.presentation = 1;
|
|
|
|
e_config_mode_changed();
|
|
|
|
e_config_save_queue();
|
|
|
|
e_object_del(E_OBJECT(dia));
|
|
|
|
_e_desklock_ask_presentation_count = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_desklock_ask_presentation_no(void *data __UNUSED__, E_Dialog *dia)
|
|
|
|
{
|
|
|
|
e_object_del(E_OBJECT(dia));
|
|
|
|
_e_desklock_ask_presentation_count = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_desklock_ask_presentation_no_increase(void *data __UNUSED__, E_Dialog *dia)
|
|
|
|
{
|
|
|
|
int timeout, interval, blanking, expose;
|
|
|
|
|
|
|
|
_e_desklock_ask_presentation_count++;
|
|
|
|
timeout = e_config->screensaver_timeout * _e_desklock_ask_presentation_count;
|
|
|
|
interval = e_config->screensaver_interval;
|
|
|
|
blanking = e_config->screensaver_blanking;
|
|
|
|
expose = e_config->screensaver_expose;
|
|
|
|
|
|
|
|
ecore_x_screensaver_set(timeout, interval, blanking, expose);
|
|
|
|
e_object_del(E_OBJECT(dia));
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_desklock_ask_presentation_no_forever(void *data __UNUSED__, E_Dialog *dia)
|
|
|
|
{
|
|
|
|
e_config->desklock_ask_presentation = 0;
|
|
|
|
e_config_save_queue();
|
|
|
|
e_object_del(E_OBJECT(dia));
|
|
|
|
_e_desklock_ask_presentation_count = 0;
|
|
|
|
}
|
|
|
|
|
2009-05-06 05:00:19 -07:00
|
|
|
static void
|
|
|
|
_e_desklock_ask_presentation_key_down(void *data, Evas *e __UNUSED__, Evas_Object *o __UNUSED__, void *event)
|
|
|
|
{
|
|
|
|
Evas_Event_Key_Down *ev = event;
|
|
|
|
E_Dialog *dia = data;
|
|
|
|
|
|
|
|
if (strcmp(ev->keyname, "Return") == 0)
|
|
|
|
_e_desklock_ask_presentation_yes(NULL, dia);
|
|
|
|
else if (strcmp(ev->keyname, "Escape") == 0)
|
|
|
|
_e_desklock_ask_presentation_no(NULL, dia);
|
|
|
|
}
|
|
|
|
|
2009-04-26 19:54:43 -07:00
|
|
|
static void
|
|
|
|
_e_desklock_ask_presentation_mode(void)
|
|
|
|
{
|
|
|
|
E_Manager *man;
|
|
|
|
E_Container *con;
|
|
|
|
E_Dialog *dia;
|
|
|
|
|
|
|
|
if (_e_desklock_ask_presentation_dia)
|
|
|
|
return;
|
|
|
|
|
|
|
|
man = e_manager_current_get();
|
|
|
|
if (!man) return;
|
|
|
|
con = e_container_current_get(man);
|
|
|
|
if (!con) return;
|
|
|
|
dia = e_dialog_new(con, "E", "_desklock_ask_presentation");
|
|
|
|
if (!dia) return;
|
|
|
|
|
|
|
|
e_dialog_title_set(dia, _("Activate Presentation Mode?"));
|
|
|
|
e_dialog_icon_set(dia, "dialog-ask", 64);
|
|
|
|
e_dialog_text_set
|
|
|
|
(dia,
|
|
|
|
_("You unlocked desktop too fast.<br><br>"
|
2009-04-29 08:36:12 -07:00
|
|
|
"Would you like to enable <b>presentation</b> mode and "
|
2009-04-26 19:54:43 -07:00
|
|
|
"temporarily disable screen saver, lock and power saving?"));
|
|
|
|
|
|
|
|
e_object_del_attach_func_set
|
|
|
|
(E_OBJECT(dia), _e_desklock_ask_presentation_del);
|
|
|
|
e_dialog_button_add
|
|
|
|
(dia, _("Yes"), NULL, _e_desklock_ask_presentation_yes, NULL);
|
|
|
|
e_dialog_button_add
|
|
|
|
(dia, _("No"), NULL, _e_desklock_ask_presentation_no, NULL);
|
|
|
|
e_dialog_button_add
|
|
|
|
(dia, _("No, but increase timeout"), NULL,
|
|
|
|
_e_desklock_ask_presentation_no_increase, NULL);
|
|
|
|
e_dialog_button_add
|
|
|
|
(dia, _("No, and stop asking"), NULL,
|
|
|
|
_e_desklock_ask_presentation_no_forever, NULL);
|
|
|
|
|
|
|
|
e_dialog_button_focus_num(dia, 0);
|
|
|
|
e_dialog_resizable_set(dia, 1);
|
|
|
|
e_widget_list_homogeneous_set(dia->box_object, 0);
|
|
|
|
e_util_win_auto_resize_fill(dia->win);
|
|
|
|
e_win_centered_set(dia->win, 1);
|
|
|
|
e_dialog_show(dia);
|
|
|
|
|
2009-05-06 05:00:19 -07:00
|
|
|
evas_object_event_callback_add
|
|
|
|
(dia->bg_object, EVAS_CALLBACK_KEY_DOWN,
|
|
|
|
_e_desklock_ask_presentation_key_down, dia);
|
|
|
|
|
2009-04-26 19:54:43 -07:00
|
|
|
_e_desklock_ask_presentation_dia = dia;
|
|
|
|
}
|