static char * get_current_seat_id (DBusConnection *connection) { gboolean res; char *session_id; char *seat_id; session_id = NULL; seat_id = NULL; res = get_current_session_id (connection, &session_id); if (res) { res = get_seat_id_for_session (connection, session_id, &seat_id); } g_free (session_id); return seat_id; }
static void handle_upload (struct evhttp_request * req, struct tr_rpc_server * server) { if (req->type != EVHTTP_REQ_POST) { send_simple_response (req, 405, NULL); } else { int i; int n; bool hasSessionId = false; tr_ptrArray parts = TR_PTR_ARRAY_INIT; const char * query = strchr (req->uri, '?'); const bool paused = query && strstr (query + 1, "paused=true"); extract_parts_from_multipart (req->input_headers, req->input_buffer, &parts); n = tr_ptrArraySize (&parts); /* first look for the session id */ for (i=0; i<n; ++i) { struct tr_mimepart * p = tr_ptrArrayNth (&parts, i); if (tr_memmem (p->headers, p->headers_len, TR_RPC_SESSION_ID_HEADER, strlen (TR_RPC_SESSION_ID_HEADER))) break; } if (i<n) { const struct tr_mimepart * p = tr_ptrArrayNth (&parts, i); const char * ours = get_current_session_id (server); const size_t ourlen = strlen (ours); hasSessionId = ourlen <= p->body_len && memcmp (p->body, ours, ourlen) == 0; } if (!hasSessionId) { int code = 409; const char * codetext = tr_webGetResponseStr (code); struct evbuffer * body = evbuffer_new (); evbuffer_add_printf (body, "%s", "{ \"success\": false, \"msg\": \"Bad Session-Id\" }");; evhttp_send_reply (req, code, codetext, body); evbuffer_free (body); } else for (i=0; i<n; ++i) { struct tr_mimepart * p = tr_ptrArrayNth (&parts, i); size_t body_len = p->body_len; tr_variant top, *args; tr_variant test; bool have_source = false; char * body = p->body; if (body_len >= 2 && memcmp (&body[body_len - 2], "\r\n", 2) == 0) body_len -= 2; tr_variantInitDict (&top, 2); tr_variantDictAddStr (&top, TR_KEY_method, "torrent-add"); args = tr_variantDictAddDict (&top, TR_KEY_arguments, 2); tr_variantDictAddBool (args, TR_KEY_paused, paused); if (tr_urlIsValid (body, body_len)) { tr_variantDictAddRaw (args, TR_KEY_filename, body, body_len); have_source = true; } else if (!tr_variantFromBenc (&test, body, body_len)) { char * b64 = tr_base64_encode (body, body_len, NULL); tr_variantDictAddStr (args, TR_KEY_metainfo, b64); tr_free (b64); have_source = true; } if (have_source) tr_rpc_request_exec_json (server->session, &top, NULL, NULL); tr_variantFree (&top); } tr_ptrArrayDestruct (&parts, (PtrArrayForeachFunc)tr_mimepart_free); /* send "success" response */ { int code = HTTP_OK; const char * codetext = tr_webGetResponseStr (code); struct evbuffer * body = evbuffer_new (); evbuffer_add_printf (body, "%s", "{ \"success\": true, \"msg\": \"Torrent Added\" }");; evhttp_send_reply (req, code, codetext, body); evbuffer_free (body); } } }
gchar * gsm_consolekit_get_current_session_type (GsmConsolekit *manager) { GError *gerror; DBusConnection *connection; DBusError error; DBusMessage *message = NULL; DBusMessage *reply = NULL; gchar *session_id; gchar *ret; DBusMessageIter iter; const char *value; session_id = NULL; ret = NULL; gerror = NULL; if (!gsm_consolekit_ensure_ck_connection (manager, &gerror)) { g_warning ("Could not connect to ConsoleKit: %s", gerror->message); g_error_free (gerror); goto out; } connection = dbus_g_connection_get_connection (manager->priv->dbus_connection); if (!get_current_session_id (connection, &session_id)) { goto out; } dbus_error_init (&error); message = dbus_message_new_method_call (CK_NAME, session_id, CK_SESSION_INTERFACE, "GetSessionType"); if (message == NULL) { goto out; } reply = dbus_connection_send_with_reply_and_block (connection, message, -1, &error); if (reply == NULL) { if (dbus_error_is_set (&error)) { g_warning ("Unable to determine session type: %s", error.message); dbus_error_free (&error); } goto out; } dbus_message_iter_init (reply, &iter); dbus_message_iter_get_basic (&iter, &value); ret = g_strdup (value); out: if (message != NULL) { dbus_message_unref (message); } if (reply != NULL) { dbus_message_unref (reply); } g_free (session_id); return ret; }
void gsm_consolekit_set_session_idle (GsmConsolekit *manager, gboolean is_idle) { gboolean res; GError *error; char *session_id; DBusMessage *message; DBusMessage *reply; DBusError dbus_error; DBusMessageIter iter; error = NULL; if (!gsm_consolekit_ensure_ck_connection (manager, &error)) { g_warning ("Could not connect to ConsoleKit: %s", error->message); g_error_free (error); return; } session_id = NULL; res = get_current_session_id (dbus_g_connection_get_connection (manager->priv->dbus_connection), &session_id); if (!res) { goto out; } g_debug ("Updating ConsoleKit idle status: %d", is_idle); message = dbus_message_new_method_call (CK_NAME, session_id, CK_SESSION_INTERFACE, "SetIdleHint"); if (message == NULL) { g_debug ("Couldn't allocate the D-Bus message"); return; } dbus_message_iter_init_append (message, &iter); dbus_message_iter_append_basic (&iter, DBUS_TYPE_BOOLEAN, &is_idle); /* FIXME: use async? */ dbus_error_init (&dbus_error); reply = dbus_connection_send_with_reply_and_block (dbus_g_connection_get_connection (manager->priv->dbus_connection), message, -1, &dbus_error); dbus_message_unref (message); if (reply != NULL) { dbus_message_unref (reply); } if (dbus_error_is_set (&dbus_error)) { g_debug ("%s raised:\n %s\n\n", dbus_error.name, dbus_error.message); dbus_error_free (&dbus_error); } out: g_free (session_id); }