Exemplo n.º 1
0
static gboolean
session_new_bus (const char *address)
{
    DBusError error;

    dbus_error_init (&error);

    if (session_bus != NULL) {
        N_DEBUG (LOG_CAT "received session bus address '%s'", address);
        dbus_connection_unref (session_bus);
        session_bus = NULL;
    }
    else
        N_DEBUG (LOG_CAT "received new session bus address '%s'", address);

    if ((session_bus = dbus_connection_open (address, &error)) == NULL ||
        !dbus_bus_register (session_bus, &error))
    {
        if (dbus_error_is_set(&error)) {
            N_WARNING (LOG_CAT "failed to connect to session bus %s (%s)",
                address, error.message);

            dbus_error_free (&error);
        }
        else
            N_WARNING (LOG_CAT "failed to connect to session bus %s", address);

        return FALSE;
    }

    session_reconnect ();

    return TRUE;
}
Exemplo n.º 2
0
static gboolean
inotify_watch (GIOChannel *source, GIOCondition condition, gpointer userdata)
{
    char buf[BUF_LEN];
    int len, i = 0, fd = 0;
    gchar *address = NULL;
    gboolean success = FALSE;

    struct inotify_event *event = NULL;

    (void) userdata;

    if (condition & G_IO_IN) {

        fd = g_io_channel_unix_get_fd (source);
        len = read (fd, buf, BUF_LEN);

        while (i < len) {
            event = (struct inotify_event *) &buf[i];

            if (event->mask & IN_DELETE_SELF) {

                N_DEBUG (LOG_CAT "session bus address file was removed.");
                close_file_watcher ();
                setup_file_polling ();

                return FALSE;
            }

            if ((event->mask & IN_MODIFY)) {

                success = FALSE;

                if ((address = load_session_bus_address (SESSION_BUS_ADDRESS_FILENAME)) != NULL) {
                    if (session_new_bus (address)) {
                        session_reconnect ();
                        success = TRUE;
                    }
                }

                if (!success) {
                    close_file_watcher ();
                    setup_file_polling ();
                    return FALSE;
                }
            }

            i += EVENT_SIZE + event->len;
        }

    }

    return TRUE;
}
Exemplo n.º 3
0
static gboolean
session_bus_connect ()
{
    DBusError error;
    dbus_error_init(&error);

    if (!session_bus) {
        session_bus = dbus_bus_get(DBUS_BUS_SESSION, &error);
        if (dbus_error_is_set(&error)) {
            N_DEBUG (LOG_CAT "Could not connect to DBus session bus.");
            return FALSE;
        }
    }

    N_DEBUG (LOG_CAT "Connected to DBus session bus.");
    session_reconnect ();

    return TRUE;
}
Exemplo n.º 4
0
void DEFAULT_CC
scp_v0_process(struct SCP_CONNECTION *c, struct SCP_SESSION *s)
{
    int display = 0;
    tbus data;
    struct session_item *s_item;
    int errorcode = 0 ;

    data = auth_userpass(s->username, s->password,&errorcode);

    if (s->type == SCP_GW_AUTHENTICATION)
    {
        /* this is just authentication in a gateway situation */
        /* g_writeln("SCP_GW_AUTHENTICATION message received"); */
        if (data)
        {
            if (1 == access_login_allowed(s->username))
            {
                /* the user is member of the correct groups. */
                scp_v0s_replyauthentication(c, errorcode);
                log_message(LOG_LEVEL_INFO, "Access permitted for user: %s",
                            s->username);
                /* g_writeln("Connection allowed"); */
            }
            else
            {
                scp_v0s_replyauthentication(c, 32+3); /* all first 32 are reserved for PAM errors */
                log_message(LOG_LEVEL_INFO, "Username okey but group problem for "
                            "user: %s", s->username);
                /* g_writeln("user password ok, but group problem"); */
            }
        }
        else
        {
            /* g_writeln("username or password error"); */
            log_message(LOG_LEVEL_INFO, "Username or password error for user: %s",
                        s->username);
            scp_v0s_replyauthentication(c, errorcode);
        }

        auth_end(data);
    }
    else if (data)
    {
        s_item = session_get_bydata(s->username, s->width, s->height,
                                    s->bpp, s->type);

        if (s_item != 0)
        {
            display = s_item->display;

            if (0 != s->client_ip)
            {
                log_message( LOG_LEVEL_INFO, "++ reconnected session: username %s, "
                             "display :%d.0, session_pid %d, ip %s",
                             s->username, display, s_item->pid, s->client_ip);
            }
            else
            {
                log_message(LOG_LEVEL_INFO, "++ reconnected session: username %s, "
                            "display :%d.0, session_pid %d", s->username, display,
                            s_item->pid);
            }

            session_reconnect(display, s->username);
            auth_end(data);
            /* don't set data to null here */
        }
        else
        {
            LOG_DBG("pre auth");

            if (1 == access_login_allowed(s->username))
            {
                if (0 != s->client_ip)
                {
                    log_message(LOG_LEVEL_INFO, "++ created session (access granted): "
                                "username %s, ip %s", s->username, s->client_ip);
                }
                else
                {
                    log_message(LOG_LEVEL_INFO, "++ created session (access granted): "
                                "username %s", s->username);
                }

                if (SCP_SESSION_TYPE_XVNC == s->type)
                {
                    log_message( LOG_LEVEL_INFO, "starting Xvnc session...");
                    display = session_start(s->width, s->height, s->bpp, s->username,
                                            s->password, data, SESMAN_SESSION_TYPE_XVNC,
                                            s->domain, s->program, s->directory,
                                            s->client_ip);
                }
                else
                {
                    log_message(LOG_LEVEL_INFO, "starting X11rdp session...");
                    display = session_start(s->width, s->height, s->bpp, s->username,
                                            s->password, data, SESMAN_SESSION_TYPE_XRDP,
                                            s->domain, s->program, s->directory,
                                            s->client_ip);
                }
            }
            else
            {
                display = 0;
            }
        }

        if (display == 0)
        {
            auth_end(data);
            scp_v0s_deny_connection(c);
        }
        else
        {
            scp_v0s_allow_connection(c, display);
        }
    }
    else
    {
        scp_v0s_deny_connection(c);
    }
}