static void infinoted_plugin_dbus_check_acl(InfinotedPluginDbus* plugin, InfinotedPluginDbusInvocation* invocation, InfBrowser* browser, const InfBrowserIter* iter) { const gchar* account; GVariant* mask_variant; InfAclMask mask; InfAclMask out; GError* error; g_variant_get_child(invocation->parameters, 1, "&s", &account); g_variant_get_child(invocation->parameters, 2, "@as", &mask_variant); error = NULL; infinoted_plugin_dbus_mask_from_variant(&mask, mask_variant, &error); g_variant_unref(mask_variant); if(error != NULL) { g_dbus_method_invocation_return_gerror(invocation->invocation, error); g_error_free(error); } else { inf_browser_check_acl( browser, iter, inf_acl_account_id_from_string(account), &mask, &out ); g_dbus_method_invocation_return_value( invocation->invocation, g_variant_new( "(@a{sb})", infinoted_plugin_dbus_perms_to_variant(&mask, &out) ) ); } infinoted_plugin_dbus_invocation_free(plugin, invocation); }
void Gobby::UserJoin::attempt_user_join() { // Check if there is already a local user, for example for a // synced-in document. InfSession* session; g_object_get(G_OBJECT(m_proxy), "session", &session, NULL); InfUserTable* user_table = inf_session_get_user_table(session); InfUser* user = NULL; inf_user_table_foreach_local_user(user_table, retr_local_user_func, &user); g_object_unref(session); if(user != NULL) { user_join_complete(user, NULL); return; } // Next, check whether we are allowed to join a user if(m_node.get_browser() && m_node.get_browser_iter()) { InfBrowser* browser = m_node.get_browser(); const InfBrowserIter* iter = m_node.get_browser_iter(); const InfAclAccount* account = inf_browser_get_acl_local_account(browser); const InfAclAccountId acc_id = (account != NULL) ? account->id : 0; InfAclMask msk; inf_acl_mask_set1(&msk, INF_ACL_CAN_JOIN_USER); if(!inf_browser_check_acl(browser, iter, acc_id, &msk, NULL)) { GError* error = NULL; g_set_error( &error, inf_request_error_quark(), INF_REQUEST_ERROR_NOT_AUTHORIZED, "%s", inf_request_strerror( INF_REQUEST_ERROR_NOT_AUTHORIZED)); user_join_complete(NULL, error); g_error_free(error); return; } } // We are allowed, so attempt to join the user now. std::vector<GParameter> params = m_param_provider->get_user_join_parameters(); std::vector<GParameter>::iterator name_index = find_name_param(params); const gchar* name = g_value_get_string(&name_index->value); if(m_retry_index > 1) { gchar* new_name = g_strdup_printf( "%s %u", name, m_retry_index); g_value_take_string(&name_index->value, new_name); } GError* error = NULL; InfRequest* request = inf_session_proxy_join_user( m_proxy, params.size(), ¶ms[0], on_user_join_finished_static, this); for(unsigned int i = 0; i < params.size(); ++i) g_value_unset(¶ms[i].value); if(request != NULL) { m_request = request; g_object_ref(m_request); } }
void Gobby::UserJoinCommands::UserJoinInfo::attempt_user_join() { const Preferences& preferences = m_commands.m_preferences; // Check if there is already a local user, for example for a // synced-in document. InfSession* session; g_object_get(G_OBJECT(m_proxy), "session", &session, NULL); InfUserTable* user_table = inf_session_get_user_table(session); InfUser* user = NULL; inf_user_table_foreach_local_user(user_table, retr_local_user_func, &user); g_object_unref(session); if(user != NULL) { user_join_complete(user); return; } // Next, check whether we are allowed to join a user if(m_node.get_browser() && m_node.get_browser_iter()) { InfBrowser* browser = m_node.get_browser(); const InfBrowserIter* iter = m_node.get_browser_iter(); const InfAclAccount* account = inf_browser_get_acl_local_account(browser); InfAclMask msk; inf_acl_mask_set1(&msk, INF_ACL_CAN_JOIN_USER); if(!inf_browser_check_acl(browser, iter, account, &msk, NULL)) { set_permission_denied_text(m_view); finish(); return; } } // We are allowed, so attempt to join the user now. std::vector<GParameter> params; const GParameter name_param = { "name", { 0 } }; params.push_back(name_param); const GParameter status_param = { "status", { 0 } }; params.push_back(status_param); g_value_init(¶ms[0].value, G_TYPE_STRING); g_value_init(¶ms[1].value, INF_TYPE_USER_STATUS); const Glib::ustring& pref_name = preferences.user.name; if(m_retry_index > 1) { gchar* name = g_strdup_printf( "%s %u", pref_name.c_str(), m_retry_index); g_value_take_string(¶ms[0].value, name); } else { g_value_set_static_string( ¶ms[0].value, pref_name.c_str()); } if(m_folder.get_current_document() == &m_view) g_value_set_enum(¶ms[1].value, INF_USER_ACTIVE); else g_value_set_enum(¶ms[1].value, INF_USER_INACTIVE); // Extra properties for text session: TextSessionView* text_view = dynamic_cast<TextSessionView*>(&m_view); if(text_view) add_text_user_properties(params, *text_view); GError* error = NULL; InfRequest* request = inf_session_proxy_join_user( m_proxy, params.size(), ¶ms[0], on_user_join_finished_static, this); for(unsigned int i = 0; i < params.size(); ++i) g_value_unset(¶ms[i].value); if(request != NULL) { m_request = request; g_object_ref(m_request); m_view.set_info(_("User Join in progress..."), false); } }
void Gobby::BrowserContextCommands::on_populate_popup(Gtk::Menu* menu) { // TODO: Can this happen? Should we close the old popup here? g_assert(m_popup_menu == NULL); // Cancel previous attempts m_watch.reset(NULL); m_dialog.reset(NULL); InfBrowser* browser; InfBrowserIter iter; if(!m_browser.get_selected_browser(&browser)) return; if(!m_browser.get_selected_iter(browser, &iter)) { InfBrowserStatus browser_status; g_object_get(G_OBJECT(browser), "status", &browser_status, NULL); if(browser_status == INF_BROWSER_CLOSED) { Gtk::ImageMenuItem *remove_item = Gtk::manage( new Gtk::ImageMenuItem(_("_Remove"), true)); remove_item->set_image(*Gtk::manage(new Gtk::Image( Gtk::Stock::CLOSE, Gtk::ICON_SIZE_MENU))); remove_item->signal_activate().connect(sigc::bind( sigc::mem_fun(*this, &BrowserContextCommands::on_remove), browser)); remove_item->show(); menu->append(*remove_item); } return; } InfBrowserIter dummy_iter = iter; bool is_subdirectory = inf_browser_is_subdirectory(browser, &iter); bool is_toplevel = !inf_browser_get_parent(browser, &dummy_iter); // Watch the node, and close the popup menu when the node // it refers to is removed. m_watch.reset(new NodeWatch(browser, &iter)); m_watch->signal_node_removed().connect(sigc::mem_fun( *this, &BrowserContextCommands::on_menu_node_removed)); menu->signal_deactivate().connect(sigc::mem_fun( *this, &BrowserContextCommands::on_menu_deactivate)); bool have_toplevel_entries = false; // Add "Disconnect" menu option if the connection // item has been clicked at if(is_toplevel && INFC_IS_BROWSER(browser)) { Gtk::ImageMenuItem* disconnect_item = Gtk::manage( new Gtk::ImageMenuItem( _("_Disconnect from Server"), true)); disconnect_item->set_image(*Gtk::manage(new Gtk::Image( Gtk::Stock::DISCONNECT, Gtk::ICON_SIZE_MENU))); disconnect_item->signal_activate().connect(sigc::bind( sigc::mem_fun(*this, &BrowserContextCommands::on_disconnect), INFC_BROWSER(browser))); disconnect_item->show(); menu->append(*disconnect_item); have_toplevel_entries = true; } // Add create account option if the connection item has been clicked at if(is_toplevel) { const InfAclAccount* account = inf_browser_get_acl_local_account(browser); const InfAclAccountId acc_id = (account != NULL) ? account->id : 0; InfAclMask mask; inf_acl_mask_set1(&mask, INF_ACL_CAN_CREATE_ACCOUNT); inf_browser_check_acl(browser, &iter, acc_id, &mask, &mask); if(inf_acl_mask_has(&mask, INF_ACL_CAN_CREATE_ACCOUNT)) { Gtk::Image* image = Gtk::manage(new Gtk::Image); image->set_from_icon_name("application-certificate", Gtk::ICON_SIZE_MENU); Gtk::ImageMenuItem* item = Gtk::manage(new Gtk::ImageMenuItem( _("Create _Account..."), true)); item->set_image(*image); item->signal_activate().connect(sigc::bind( sigc::mem_fun( *this, &BrowserContextCommands:: on_create_account), browser)); item->show(); menu->append(*item); have_toplevel_entries = true; } } // Separator, if we have entries dedicated to the browser itself if(have_toplevel_entries) { Gtk::SeparatorMenuItem* sep_item = Gtk::manage(new Gtk::SeparatorMenuItem); sep_item->show(); menu->append(*sep_item); } // Create Document Gtk::ImageMenuItem* new_document_item = Gtk::manage( new Gtk::ImageMenuItem(_("Create Do_cument..."), true)); new_document_item->set_image(*Gtk::manage(new Gtk::Image( Gtk::Stock::NEW, Gtk::ICON_SIZE_MENU))); new_document_item->signal_activate().connect(sigc::bind( sigc::mem_fun(*this, &BrowserContextCommands::on_new), browser, iter, false)); new_document_item->set_sensitive(is_subdirectory); new_document_item->show(); menu->append(*new_document_item); // Create Directory // Check whether we have the folder-new icon, fall back to // Stock::DIRECTORY otherwise Glib::RefPtr<Gdk::Screen> screen = menu->get_screen(); Glib::RefPtr<Gtk::IconTheme> icon_theme( Gtk::IconTheme::get_for_screen(screen)); Gtk::Image* new_directory_image = Gtk::manage(new Gtk::Image); if(icon_theme->lookup_icon("folder-new", Gtk::ICON_SIZE_MENU, Gtk::ICON_LOOKUP_USE_BUILTIN)) { new_directory_image->set_from_icon_name( "folder-new", Gtk::ICON_SIZE_MENU); } else { new_directory_image->set( Gtk::Stock::DIRECTORY, Gtk::ICON_SIZE_MENU); } Gtk::ImageMenuItem* new_directory_item = Gtk::manage( new Gtk::ImageMenuItem(_("Create Di_rectory..."), true)); new_directory_item->set_image(*new_directory_image); new_directory_item->signal_activate().connect(sigc::bind( sigc::mem_fun(*this, &BrowserContextCommands::on_new), browser, iter, true)); new_directory_item->set_sensitive(is_subdirectory); new_directory_item->show(); menu->append(*new_directory_item); // Open Document Gtk::ImageMenuItem* open_document_item = Gtk::manage( new Gtk::ImageMenuItem(_("_Open Document..."), true)); open_document_item->set_image(*Gtk::manage(new Gtk::Image( Gtk::Stock::OPEN, Gtk::ICON_SIZE_MENU))); open_document_item->signal_activate().connect(sigc::bind( sigc::mem_fun(*this, &BrowserContextCommands::on_open), browser, iter)); open_document_item->set_sensitive(is_subdirectory); open_document_item->show(); menu->append(*open_document_item); // Separator Gtk::SeparatorMenuItem* sep_item = Gtk::manage(new Gtk::SeparatorMenuItem); sep_item->show(); menu->append(*sep_item); // Permissions Gtk::ImageMenuItem* permissions_item = Gtk::manage( new Gtk::ImageMenuItem(_("_Permissions..."), true)); permissions_item->set_image(*Gtk::manage(new Gtk::Image( Gtk::Stock::PROPERTIES, Gtk::ICON_SIZE_MENU))); permissions_item->signal_activate().connect(sigc::bind( sigc::mem_fun(*this, &BrowserContextCommands::on_permissions), browser, iter)); permissions_item->show(); menu->append(*permissions_item); // Delete Gtk::ImageMenuItem* delete_item = Gtk::manage( new Gtk::ImageMenuItem(_("D_elete"), true)); delete_item->set_image(*Gtk::manage(new Gtk::Image( Gtk::Stock::DELETE, Gtk::ICON_SIZE_MENU))); delete_item->signal_activate().connect(sigc::bind( sigc::mem_fun(*this, &BrowserContextCommands::on_delete), browser, iter)); delete_item->set_sensitive(!is_toplevel); delete_item->show(); menu->append(*delete_item); m_popup_menu = menu; menu->signal_selection_done().connect( sigc::mem_fun( *this, &BrowserContextCommands::on_popdown)); }