GREETER_MESSAGE_LOGIN = 4,
GREETER_MESSAGE_CANCEL_AUTHENTICATION = 5,
GREETER_MESSAGE_GET_USER_DEFAULTS = 6,
+ GREETER_MESSAGE_LOGIN_AS_GUEST = 7,
/* Messages from the server to the greeter */
GREETER_MESSAGE_CONNECTED = 101,
gchar *timed_user;
gint login_delay;
guint login_timeout;
+ gboolean guest_account_supported;
};
G_DEFINE_TYPE (LdmGreeter, ldm_greeter, G_TYPE_OBJECT);
greeter->priv->default_session = read_string (greeter, &offset);
greeter->priv->timed_user = read_string (greeter, &offset);
greeter->priv->login_delay = read_int (greeter, &offset);
+ greeter->priv->guest_account_supported = read_int (greeter, &offset) != 0;
- g_debug ("Connected theme=%s default-layout=%s default-session=%s timed-user=%s login-delay=%d",
+ g_debug ("Connected theme=%s default-layout=%s default-session=%s timed-user=%s login-delay=%d guest-account-supported=%s",
greeter->priv->theme,
greeter->priv->default_layout, greeter->priv->default_session,
- greeter->priv->timed_user, greeter->priv->login_delay);
+ greeter->priv->timed_user, greeter->priv->login_delay,
+ greeter->priv->guest_account_supported ? "true" : "false");
/* Set timeout for default login */
if (greeter->priv->timed_user[0] != '\0' && greeter->priv->login_delay > 0)
return greeter->priv->default_session;
}
+/**
+ * ldm_greeter_get_has_guest_session:
+ * @greeter: A #LdmGreeter
+ *
+ * Check if guest sessions are supported.
+ *
+ * Return value: TRUE if guest sessions are supported.
+ */
+gboolean
+ldm_greeter_get_has_guest_session (LdmGreeter *greeter)
+{
+ g_return_val_if_fail (LDM_IS_GREETER (greeter), FALSE);
+ return greeter->priv->guest_account_supported;
+}
+
/**
* ldm_greeter_get_timed_login_user:
* @greeter: A #LdmGreeter
if (!language)
language = "";
- g_debug ("Logging in");
+ g_debug ("Logging in as %s", username);
write_header (greeter, GREETER_MESSAGE_LOGIN, string_length (username) + string_length (session) + string_length (language));
write_string (greeter, username);
write_string (greeter, session);
void
ldm_greeter_login_with_defaults (LdmGreeter *greeter, const gchar *username)
{
- g_return_if_fail (LDM_IS_GREETER (greeter));
- g_return_if_fail (username != NULL);
ldm_greeter_login (greeter, username, NULL, NULL);
}
+/**
+ * ldm_greeter_login_as_guest:
+ * @greeter: A #LdmGreeter
+ * @session: (allow-none): The session to log into or NULL to use the default
+ * @language: (allow-none): The language to use or NULL to use the default
+ *
+ * Login a user into a guest session.
+ **/
+void
+ldm_greeter_login_as_guest (LdmGreeter *greeter, const gchar *session, const gchar *language)
+{
+ g_return_if_fail (LDM_IS_GREETER (greeter));
+
+ if (!session)
+ session = "";
+ if (!language)
+ language = "";
+
+ g_debug ("Logging into guest account");
+ write_header (greeter, GREETER_MESSAGE_LOGIN_AS_GUEST, string_length (session) + string_length (language));
+ write_string (greeter, session);
+ write_string (greeter, language);
+ flush (greeter);
+}
+
+/**
+ * ldm_greeter_login_as_guest_with_defaults:
+ * @greeter: A #LdmGreeter
+ *
+ * Login a user into a guest session using default settings for that user.
+ **/
+void
+ldm_greeter_login_as_guest_with_defaults (LdmGreeter *greeter)
+{
+ ldm_greeter_login_as_guest (greeter, NULL, NULL);
+}
+
static gboolean
upower_call_function (LdmGreeter *greeter, const gchar *function, gboolean has_result)
{
const gchar *ldm_greeter_get_default_session (LdmGreeter *greeter);
+gboolean ldm_greeter_get_has_guest_session (LdmGreeter *greeter);
+
const gchar *ldm_greeter_get_timed_login_user (LdmGreeter *greeter);
gint ldm_greeter_get_timed_login_delay (LdmGreeter *greeter);
void ldm_greeter_login_with_defaults (LdmGreeter *greeter, const gchar *username);
+void ldm_greeter_login_as_guest (LdmGreeter *greeter, const gchar *session, const gchar *language);
+
+void ldm_greeter_login_as_guest_with_defaults (LdmGreeter *greeter);
+
gboolean ldm_greeter_get_can_suspend (LdmGreeter *greeter);
void ldm_greeter_suspend (LdmGreeter *greeter);
GREETER_MESSAGE_CONTINUE_AUTHENTICATION = 3,
GREETER_MESSAGE_LOGIN = 4,
GREETER_MESSAGE_CANCEL_AUTHENTICATION = 5,
+ GREETER_MESSAGE_GET_USER_DEFAULTS = 6,
+ GREETER_MESSAGE_LOGIN_AS_GUEST = 7,
/* Messages from the server to the greeter */
GREETER_MESSAGE_CONNECTED = 101,
GREETER_MESSAGE_QUIT = 102,
GREETER_MESSAGE_PROMPT_AUTHENTICATION = 103,
- GREETER_MESSAGE_END_AUTHENTICATION = 104
+ GREETER_MESSAGE_END_AUTHENTICATION = 104,
+ GREETER_MESSAGE_USER_DEFAULTS = 106
} GreeterMessage;
#define HEADER_SIZE 8
QString defaultSession;
QString timedUser;
int loginDelay;
-
+ bool guestAccountSupported;
+
SessionsModel *sessionsModel;
Config *config;
QDBusInterface* lightdmInterface;
QDBusInterface* powerManagementInterface;
QDBusInterface* consoleKitInterface;
-
+
int toServerFd;
int fromServerFd;
QSocketNotifier *n;
qDebug() << "Connecting to display manager...";
writeHeader(GREETER_MESSAGE_CONNECT, 0);
flush();
-
-
-
}
void Greeter::startAuthentication(const QString &username)
login(username, NULL, NULL);
}
+void Greeter::loginAsGuest(const QString &session, const QString &language)
+{
+ qDebug() << "Logging into guest account for session " << session << " with language " << language;
+ writeHeader(GREETER_MESSAGE_LOGIN_AS_GUEST, stringLength(session) + stringLength(language));
+ writeString(session);
+ writeString(language);
+ flush();
+}
+
+void Greeter::loginAsGuestWithDefaults()
+{
+ loginAsGuest(NULL, NULL);
+}
+
void Greeter::onRead(int fd)
{
//qDebug() << "Reading from server";
d->defaultSession = readString(&offset);
d->timedUser = readString(&offset);
d->loginDelay = readInt(&offset);
- qDebug() << "Connected theme=" << d->theme << " default-layout=" << d->defaultLayout << " default-session=" << d->defaultSession << " timed-user=" << d->timedUser << " login-delay" << d->loginDelay;
+ d->guestAccountSupported = readInt(&offset) != 0;
+ qDebug() << "Connected theme=" << d->theme << " default-layout=" << d->defaultLayout << " default-session=" << d->defaultSession << " timed-user=" << d->timedUser << " login-delay" << d->loginDelay << " guestAccountSupported" << d->guestAccountSupported;
/* Set timeout for default login */
if(d->timedUser != "" && d->loginDelay > 0)
return d->defaultSession;
}
+bool Greeter::guestAccountSupported() const
+{
+ return d->guestAccountSupported;
+}
+
QString Greeter::timedLoginUser() const
{
return d->timedUser;
explicit Greeter(QObject* parent=0);
virtual ~Greeter();
- Q_PROPERTY(bool canSuspend READ canSuspend);
- Q_PROPERTY(bool canHibernate READ canHibernate);
+ Q_PROPERTY(bool canSuspend READ canSuspend);
+ Q_PROPERTY(bool canHibernate READ canHibernate);
Q_PROPERTY(bool canShutdown READ canShutdown);
Q_PROPERTY(bool canRestart READ canRestart);
QString defaultLayout() const;
QString layout() const;
- QLightDM::Config *config() const;
+ QLightDM::Config *config() const;
QString defaultSession() const;
+ bool guestAccountSupported() const;
bool inAuthentication() const;
bool isAuthenticated() const;
void cancelAuthentication();
void login(const QString &username, const QString &session, const QString &language);
void loginWithDefaults(const QString &username);
+ void loginAsGuest(const QString &session, const QString &language);
+ void loginAsGuestWithDefaults();
bool canSuspend() const;
bool canHibernate() const;
greeter_quit (display->priv->greeter_session);
}
+static void
+greeter_login_as_guest_cb (Greeter *greeter, const gchar *session, const gchar *language, Display *display)
+{
+ //gchar *username;
+
+ // FIXME: Create a guest session
+
+ //greeter_login_cb (greeter, username, session, language, display);
+}
+
static void
greeter_quit_cb (Greeter *greeter, Display *display)
{
greeter_set_layout (display->priv->greeter_session, display->priv->default_layout);
greeter_set_session (display->priv->greeter_session, display->priv->default_session);
g_signal_connect (G_OBJECT (display->priv->greeter_session), "login", G_CALLBACK (greeter_login_cb), display);
+ g_signal_connect (G_OBJECT (display->priv->greeter_session), "login-as-guest", G_CALLBACK (greeter_login_as_guest_cb), display);
g_signal_connect (G_OBJECT (display->priv->greeter_session), "quit", G_CALLBACK (greeter_quit_cb), display);
session_set_username (SESSION (display->priv->greeter_session), username);
session_set_command (SESSION (display->priv->greeter_session), command);
GREETER_MESSAGE_LOGIN = 4,
GREETER_MESSAGE_CANCEL_AUTHENTICATION = 5,
GREETER_MESSAGE_GET_USER_DEFAULTS = 6,
+ GREETER_MESSAGE_LOGIN_AS_GUEST = 7,
/* Messages from the server to the greeter */
GREETER_MESSAGE_CONNECTED = 101,
enum {
LOGIN,
+ LOGIN_AS_GUEST,
QUIT,
LAST_SIGNAL
};
theme = g_build_filename (THEME_DIR, greeter->priv->theme, "index.theme", NULL);
- write_header (greeter, GREETER_MESSAGE_CONNECTED, string_length (theme) + string_length (greeter->priv->layout) + string_length (greeter->priv->session) + string_length (greeter->priv->default_user ? greeter->priv->default_user : "") + int_length ());
+ write_header (greeter, GREETER_MESSAGE_CONNECTED, string_length (theme) + string_length (greeter->priv->layout) + string_length (greeter->priv->session) + string_length (greeter->priv->default_user ? greeter->priv->default_user : "") + int_length () + int_length ());
write_string (greeter, theme);
write_string (greeter, greeter->priv->layout);
write_string (greeter, greeter->priv->session);
write_string (greeter, greeter->priv->default_user ? greeter->priv->default_user : "");
write_int (greeter, greeter->priv->autologin_timeout);
+ write_int (greeter, FALSE);
flush (greeter);
g_free (theme);
g_signal_emit (greeter, signals[LOGIN], 0, username, session, language);
}
+static void
+handle_guest_login (Greeter *greeter, gchar *session, gchar *language)
+{
+ /*if (greeter->priv->user_session != NULL)
+ {
+ g_warning ("Ignoring request to log in when already logged in");
+ return;
+ }*/
+
+ g_debug ("Greeter login to guest account on session %s", session);
+
+ g_signal_emit (greeter, signals[LOGIN_AS_GUEST], 0, session, language);
+}
+
static void
handle_get_user_defaults (Greeter *greeter, gchar *username)
{
g_free (session_name);
g_free (language);
break;
+ case GREETER_MESSAGE_LOGIN_AS_GUEST:
+ session_name = read_string (greeter, &offset);
+ language = read_string (greeter, &offset);
+ handle_guest_login (greeter, session_name, language);
+ g_free (session_name);
+ g_free (language);
case GREETER_MESSAGE_GET_USER_DEFAULTS:
username = read_string (greeter, &offset);
handle_get_user_defaults (greeter, username);
NULL, NULL,
ldm_marshal_VOID__STRING_STRING_STRING,
G_TYPE_NONE, 3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
+ signals[LOGIN_AS_GUEST] =
+ g_signal_new ("login-as-guest",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GreeterClass, login_as_guest),
+ NULL, NULL,
+ ldm_marshal_VOID__STRING_STRING,
+ G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_STRING);
signals[QUIT] =
g_signal_new ("quit",
G_TYPE_FROM_CLASS (klass),
{
SessionClass parent_class;
void (*login)(Greeter *greeter, const gchar *username, const gchar *session, const gchar *language);
+ void (*login_as_guest)(Greeter *greeter, const gchar *session, const gchar *language);
void (*quit)(Greeter *greeter);
} GreeterClass;
BOOLEAN:OBJECT
VOID:INT,POINTER
VOID:OBJECT,BOOLEAN
+VOID:STRING,STRING
VOID:STRING,STRING,STRING