string checks_suppress (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; Database_Check database_check; string page; page = Assets_Page::header (translate ("Suppressed check results"), webserver_request); Assets_View view; if (request->query.count ("release")) { int release = convert_to_int (request->query["release"]); database_check.release (release); view.set_variable ("success", translate("The check result is no longer suppressed.")); } // Get the Bibles the user has write-access to. vector <string> bibles; { vector <string> all_bibles = request->database_bibles()->getBibles (); for (auto bible : all_bibles) { if (access_bible_write (webserver_request, bible)) { bibles.push_back (bible); } } } string block; vector <Database_Check_Hit> suppressions = database_check.getSuppressions (); for (auto suppression : suppressions) { string bible = suppression.bible; // Only display entries for Bibles the user has write access to. if (in_array (bible, bibles)) { int id = suppression.rowid; bible = filter_string_sanitize_html (bible); string passage = filter_passage_display_inline ({Passage ("", suppression.book, suppression.chapter, convert_to_string (suppression.verse))}); string result = filter_string_sanitize_html (suppression.data); result.insert (0, bible + " " + passage + " "); block.append ("<p style=\"color:grey;\">\n"); block.append ("<a href=\"suppress?release=" + convert_to_string (id) + "\">\n"); block.append (emoji_wastebasket () + "\n"); block.append ("</a>\n"); block.append (result + "\n"); block.append ("</p>\n"); } } view.set_variable ("block", block); page += view.render ("checks", "suppress"); page += Assets_Page::footer (); return page; }
string resource_manage (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; string page; Assets_Header header = Assets_Header (translate("USFM Resources"), request); header.addBreadCrumb (menu_logic_settings_menu (), menu_logic_settings_text ()); page = header.run (); Assets_View view; Database_UsfmResources database_usfmresources = Database_UsfmResources (); // Delete resource. string remove = request->query ["delete"]; if (remove != "") { string confirm = request->query ["confirm"]; if (confirm == "") { Dialog_Yes dialog_yes = Dialog_Yes ("manage", translate("Would you like to delete this resource?")); dialog_yes.add_query ("delete", remove); page += dialog_yes.run (); return page; } if (confirm == "yes") { if (access_bible_write (request, remove)) { database_usfmresources.deleteResource (remove); // The Cloud updates the list of available USFM resources for the clients. tasks_logic_queue (LISTUSFMRESOURCES); } else { view.set_variable ("error", translate("You do not have write access to this resource")); } } } // Convert resource. string convert = request->query ["convert"]; if (convert != "") { string confirm = request->query ["confirm"]; if (confirm == "") { Dialog_Yes dialog_yes = Dialog_Yes ("manage", translate("Would you like to convert this resource to a Bible?")); dialog_yes.add_query ("convert", convert); page += dialog_yes.run (); return page; } if (confirm == "yes") { if (access_bible_write (request, convert)) { tasks_logic_queue (CONVERTRESOURCE2BIBLE, {convert}); redirect_browser (request, journal_index_url ()); return ""; } else { view.set_variable ("error", translate("Insufficient privileges")); } } } vector <string> resources = database_usfmresources.getResources (); vector <string> resourceblock; for (auto & resource : resources) { resourceblock.push_back ("<p>"); resourceblock.push_back ("<a href=\"?delete=" + resource + "\" class=\"deleteresource\" title=\"" + translate("Remove") + "\">"); resourceblock.push_back (emoji_wastebasket ()); resourceblock.push_back ("</a>"); resourceblock.push_back ("<a href=\"?convert=" + resource + "\" class=\"convertresource\" title=\"" + translate("Convert") + "\">"); resourceblock.push_back ("♻"); resourceblock.push_back ("</a>"); resourceblock.push_back (resource); resourceblock.push_back ("</p>"); } view.set_variable ("resourceblock", filter_string_implode (resourceblock, "\n")); page += view.render ("resource", "manage"); page += Assets_Page::footer (); return page; }
string checks_index (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; Database_Check database_check; string page; Assets_Header header = Assets_Header (translate("Checks"), webserver_request); header.addBreadCrumb (menu_logic_tools_menu (), menu_logic_tools_text ()); page = header.run (); Assets_View view; if (request->query.count ("approve")) { int approve = convert_to_int (request->query["approve"]); database_check.approve (approve); view.set_variable ("success", translate("The entry was suppressed.")); } if (request->query.count ("delete")) { int erase = convert_to_int (request->query["delete"]); database_check.erase (erase); view.set_variable ("success", translate("The entry was deleted for just now.")); } // Get the Bibles the user has write-access to. vector <int> bibleIDs; vector <string> bibles = request->database_bibles()->getBibles (); for (auto bible : bibles) { if (access_bible_write (webserver_request, bible)) { int id = request->database_bibles()->getID (bible); bibleIDs.push_back (id); } } string resultblock; vector <Database_Check_Hit> hits = database_check.getHits (); for (auto hit : hits) { int bibleID = hit.bible; if (find (bibleIDs.begin(), bibleIDs.end (), bibleID) != bibleIDs.end ()) { int id = hit.rowid; string bible = filter_string_sanitize_html (request->database_bibles()->getName (bibleID)); int book = hit.book; int chapter = hit.chapter; int verse = hit.verse; string link = filter_passage_link_for_opening_editor_at (book, chapter, convert_to_string (verse)); string information = filter_string_sanitize_html (hit.data); resultblock.append ("<p>\n"); resultblock.append ("<a href=\"index?approve=" + convert_to_string (id) + "\"> ✔ </a>\n"); resultblock.append ("<a href=\"index?delete=" + convert_to_string (id) + "\"> ✗ </a>\n"); resultblock.append (bible); resultblock.append (" "); resultblock.append (link); resultblock.append (" "); resultblock.append (information); resultblock.append ("</p>\n"); } } view.set_variable ("resultblock", resultblock); page += view.render ("checks", "index"); page += Assets_Page::footer (); return page; }
string bible_manage (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; string page; Assets_Header header = Assets_Header (translate("Bibles"), webserver_request); header.addBreadCrumb (menu_logic_settings_menu (), menu_logic_settings_text ()); page = header.run (); Assets_View view; string success_message; string error_message; // New Bible handler. if (request->query.count ("new")) { Dialog_Entry dialog_entry = Dialog_Entry ("manage", translate("Please enter a name for the new empty Bible"), "", "new", ""); page += dialog_entry.run (); return page; } if (request->post.count ("new")) { string bible = request->post ["entry"]; vector <string> bibles = request->database_bibles ()->getBibles (); if (find (bibles.begin(), bibles.end(), bible) != bibles.end()) { error_message = translate("This Bible already exists"); } else { request->database_bibles ()->createBible (bible); // Check / grant access. if (!access_bible_write (request, bible)) { string me = request->session_logic ()->currentUser (); Database_Privileges::setBible (me, bible, true); } success_message = translate("The Bible was created"); // Creating a Bible removes any Sample Bible that might have been there. if (!config_logic_demo_enabled ()) { request->database_bibles ()->deleteBible (demo_sample_bible_name ()); search_logic_delete_bible (demo_sample_bible_name ()); } } } // Copy Bible handler. if (request->query.count ("copy")) { string copy = request->query["copy"]; Dialog_Entry dialog_entry = Dialog_Entry ("manage", translate("Please enter a name for where to copy the Bible to"), "", "", "A new Bible will be created with the given name, and the current Bible copied to it"); dialog_entry.add_query ("origin", copy); page += dialog_entry.run (); return page; } if (request->query.count ("origin")) { string origin = request->query["origin"]; if (request->post.count ("entry")) { string destination = request->post["entry"]; vector <string> bibles = request->database_bibles ()->getBibles (); if (find (bibles.begin(), bibles.end(), destination) != bibles.end()) { error_message = translate("Cannot copy the Bible because the destination Bible already exists."); } else { // User needs read access to the original. if (access_bible_read (request, origin)) { request->database_bibles ()->createBible (destination); vector <int> books = request->database_bibles ()->getBooks (origin); for (auto & book : books) { vector <int> chapters = request->database_bibles ()->getChapters (origin, book); for (auto & chapter : chapters) { string data = request->database_bibles ()->getChapter (origin, book, chapter); Bible_Logic::storeChapter (destination, book, chapter, data); } } success_message = translate("The Bible was copied."); // Check / grant access to destination Bible. if (!access_bible_write (request, destination)) { string me = request->session_logic ()->currentUser (); Database_Privileges::setBible (me, destination, true); } // Creating a Bible removes any Sample Bible that might have been there. if (!config_logic_demo_enabled ()) { request->database_bibles ()->deleteBible (demo_sample_bible_name ()); search_logic_delete_bible (demo_sample_bible_name ()); } } } } } // Delete Bible handler. if (request->query.count ("delete")) { string bible = request->query ["delete"]; string confirm = request->query ["confirm"]; if (confirm == "yes") { // User needs write access for delete operation. if (access_bible_write (request, bible)) { Bible_Logic::deleteBible (bible); string gitdirectory = filter_git_directory (bible); if (file_exists (gitdirectory)) { filter_url_rmdir (gitdirectory); } // Remove associated settings and privileges. Database_Privileges::removeBible (bible); Database_Config_Bible::remove (bible); } else { page += Assets_Page::error ("Insufficient privileges to complete action"); } } if (confirm == "") { Dialog_Yes dialog_yes = Dialog_Yes ("manage", translate("Would you like to delete this Bible?") + " (" + bible + ")"); dialog_yes.add_query ("delete", bible); page += dialog_yes.run (); return page; } } view.set_variable ("success_message", success_message); view.set_variable ("error_message", error_message); vector <string> bibles = access_bible_bibles (request); string bibleblock; for (auto & bible : bibles) { bibleblock.append ("<li><a href=\"settings?bible=" + bible + "\">" + bible + "</a></li>\n"); } view.set_variable ("bibleblock", bibleblock); if (!client_logic_client_enabled ()) view.enable_zone ("server"); page += view.render ("bible", "manage"); page += Assets_Page::footer (); return page; }
string bible_import_usfm (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; string page; page = Assets_Page::header (translate ("Import USFM"), webserver_request, ""); Assets_View view = Assets_View (); string success_message; string error_message; // The name of the Bible. string bible = access_bible_clamp (request, request->query["bible"]); view.set_variable ("bible", filter_string_sanitize_html (bible)); // Whether the user has write access to this Bible. bool write_access = access_bible_write (request, bible); if (write_access) view.enable_zone ("write_access"); // USFM data submission. if (request->post.count ("submit")) { // Submission may take long if there's a lot of data or the network is slow. string data = request->post ["data"]; data = filter_url_tag_to_plus (data); data = filter_string_trim (data); if (data != "") { if (unicode_string_is_valid (data)) { string datafile = filter_url_tempfile (); filter_url_file_put_contents (datafile, data); success_message = translate("Import has started. See Journal for progress."); tasks_logic_queue (IMPORTUSFM, { datafile, bible }); } else { error_message = translate("Please supply valid Unicode UTF-8 text."); } } else { success_message = translate("Nothing was imported."); } } // File upload. if (request->post.count ("upload")) { string datafile = filter_url_tempfile () + request->post ["filename"]; string data = request->post ["data"]; if (!data.empty ()) { filter_url_file_put_contents (datafile, data); success_message = translate("Import has started. See Journal for progress."); tasks_logic_queue (IMPORTUSFM, { datafile, bible }); } else { error_message = translate ("Nothing was uploaded"); } } view.set_variable ("success_message", success_message); view.set_variable ("error_message", error_message); page += view.render ("bible", "import_usfm"); page += Assets_Page::footer (); return page; }
string bible_import (void * webserver_request) { Webserver_Request * request = (Webserver_Request *) webserver_request; string page; Assets_Header header = Assets_Header (translate("Import"), webserver_request); header.setNavigator (); header.addBreadCrumb (menu_logic_settings_menu (), menu_logic_settings_text ()); header.addBreadCrumb (bible_manage_url (), menu_logic_bible_manage_text ()); page = header.run (); Assets_View view; string success_message; string error_message; // The name of the Bible. string bible = access_bible_clamp (request, request->query["bible"]); view.set_variable ("bible", filter_string_sanitize_html (bible)); int book = Ipc_Focus::getBook (webserver_request); int chapter = Ipc_Focus::getChapter (webserver_request); // Whether the user has write access to this Bible. bool write_access = access_bible_write (request, bible); if (write_access) view.enable_zone ("write_access"); // USFM data submission. if (request->post.count ("submit")) { // Submission may take long if there's a lot of data or the network is slow. string data = request->post ["data"]; data = filter_url_tag_to_plus (data); data = filter_string_trim (data); if (data != "") { if (unicode_string_is_valid (data)) { string datafile = filter_url_tempfile (); filter_url_file_put_contents (datafile, data); success_message = translate("Import has started. See Journal for progress."); tasks_logic_queue (IMPORTBIBLE, { datafile, bible, convert_to_string (book), convert_to_string (chapter) }); } else { error_message = translate("Please supply valid Unicode UTF-8 text."); } } else { success_message = translate("Nothing was imported."); } // User imported something into this Bible: Set it as the default Bible. request->database_config_user()->setBible (bible); } // File upload. if (request->post.count ("upload")) { string datafile = filter_url_tempfile () + request->post ["filename"]; string data = request->post ["data"]; if (!data.empty ()) { filter_url_file_put_contents (datafile, data); success_message = translate("Import has started. See Journal for progress."); tasks_logic_queue (IMPORTBIBLE, { datafile, bible, convert_to_string (book), convert_to_string (chapter) }); } else { error_message = translate ("Nothing was uploaded"); } // User imported something into this Bible: Set it as the default Bible. request->database_config_user()->setBible (bible); } #ifdef HAVE_UPLOAD view.enable_zone ("enable_upload"); #else view.enable_zone ("disable_upload"); #endif view.set_variable ("success_message", success_message); view.set_variable ("error_message", error_message); page += view.render ("bible", "import"); page += Assets_Page::footer (); return page; }