return pbl author attribute to its original usage

and use the new primary_authors attribute instead

Fixes #9547
This commit is contained in:
pentarctagon 2024-12-12 15:06:37 -06:00 committed by Pentarctagon
parent e8af57e3ab
commit 893b31e769
9 changed files with 43 additions and 11 deletions

View file

@ -0,0 +1,2 @@
### WML Engine
* The author attribute is now again a display only attribute. Instead the primary_authors attribute should be used, which supports specifying multiple primary authors.

View file

@ -211,6 +211,7 @@
{ROW text_box _"Forum thread:" "forum_thread" _"The numeric topic ID of a thread on the Wesnoth forums where players can post feedback."}
{ROW label _"Forum URL" "forum_url" _"The full URL of your feedback thread on the forums."}
{ROW toggle_button _"Forum Authentication:" "forum_auth" _"Whether to use your forum username and password when uploading or to store your password and email address in the add-ons _server.pbl."}
{ROW text_box _"Primary Authors:" "primary_authors" _"Comma delimited list of forum usernames of other people who are allowed to upload updates for this add-on or delete this add-on."}
{ROW text_box _"Secondary Authors:" "secondary_authors" _"Comma delimited list of forum usernames of other people who are allowed to upload updates for this add-on."}
{ROW text_box _"Email:" "email" _"An email address you can be contacted at in case of issues with your add-on."}
{ROW text_box _"Password:" "password" _"The add-ons current password. Using forum authentication is recommended instead since this password is not stored securely."}

View file

@ -43,6 +43,7 @@
{SIMPLE_KEY email email}
[/then]
[else]
{SIMPLE_KEY primary_authors string_list}
{SIMPLE_KEY secondary_authors string_list}
[/else]
[/if]

View file

@ -45,12 +45,16 @@ void addon_auth::pre_show()
pwd->set_value(cfg_["passphrase"].str(""));
std::vector<config> content_list;
content_list.emplace_back("label", cfg_["author"].str(""));
for(const auto& author : utils::split(cfg_["primary_authors"].str(""), ',')) {
content_list.emplace_back("label", author);
}
for(const auto& author : utils::split(cfg_["secondary_authors"].str(""), ',')) {
content_list.emplace_back("label", author);
}
find_widget<menu_button>("choose_uploader").set_values(content_list);
if(content_list.size() > 0) {
find_widget<menu_button>("choose_uploader").set_values(content_list);
}
}
void addon_auth::post_show()

View file

@ -140,15 +140,21 @@ void editor_edit_pbl::pre_show()
if(pbl["forum_auth"].to_bool()) {
find_widget<toggle_button>("forum_auth").set_value(true);
find_widget<text_box>("primary_authors").set_value(pbl["primary_authors"]);
find_widget<text_box>("secondary_authors").set_value(pbl["secondary_authors"]);
find_widget<text_box>("email").set_visible(gui2::widget::visibility::invisible);
find_widget<label>("email_label").set_visible(gui2::widget::visibility::invisible);
find_widget<text_box>("password").set_visible(gui2::widget::visibility::invisible);
find_widget<label>("password_label").set_visible(gui2::widget::visibility::invisible);
find_widget<text_box>("primary_authors").set_visible(gui2::widget::visibility::visible);
find_widget<label>("primary_authors_label").set_visible(gui2::widget::visibility::visible);
find_widget<text_box>("secondary_authors").set_visible(gui2::widget::visibility::visible);
find_widget<label>("secondary_authors_label").set_visible(gui2::widget::visibility::visible);
} else {
find_widget<text_box>("email").set_value(pbl["email"]);
find_widget<text_box>("password").set_value(pbl["passphrase"]);
find_widget<text_box>("primary_authors").set_visible(gui2::widget::visibility::invisible);
find_widget<label>("primary_authors_label").set_visible(gui2::widget::visibility::invisible);
find_widget<text_box>("secondary_authors").set_visible(gui2::widget::visibility::invisible);
find_widget<label>("secondary_authors_label").set_visible(gui2::widget::visibility::invisible);
}
@ -265,6 +271,10 @@ config editor_edit_pbl::create_cfg()
if(find_widget<toggle_button>("forum_auth").get_value_bool()) {
cfg["forum_auth"] = true;
if(const std::string& primary_authors = find_widget<text_box>("primary_authors").get_value(); !primary_authors.empty()) {
cfg["primary_authors"] = primary_authors;
}
if(const std::string& secondary_authors = find_widget<text_box>("secondary_authors").get_value(); !secondary_authors.empty()) {
cfg["secondary_authors"] = secondary_authors;
}
@ -319,6 +329,8 @@ void editor_edit_pbl::toggle_auth()
find_widget<text_box>("password").set_visible(gui2::widget::visibility::invisible);
find_widget<label>("email_label").set_visible(gui2::widget::visibility::invisible);
find_widget<label>("password_label").set_visible(gui2::widget::visibility::invisible);
find_widget<text_box>("primary_authors").set_visible(gui2::widget::visibility::visible);
find_widget<label>("primary_authors_label").set_visible(gui2::widget::visibility::visible);
find_widget<text_box>("secondary_authors").set_visible(gui2::widget::visibility::visible);
find_widget<label>("secondary_authors_label").set_visible(gui2::widget::visibility::visible);
} else {
@ -326,6 +338,8 @@ void editor_edit_pbl::toggle_auth()
find_widget<text_box>("password").set_visible(gui2::widget::visibility::visible);
find_widget<label>("email_label").set_visible(gui2::widget::visibility::visible);
find_widget<label>("password_label").set_visible(gui2::widget::visibility::visible);
find_widget<text_box>("primary_authors").set_visible(gui2::widget::visibility::invisible);
find_widget<label>("primary_authors_label").set_visible(gui2::widget::visibility::invisible);
find_widget<text_box>("secondary_authors").set_visible(gui2::widget::visibility::invisible);
find_widget<label>("secondary_authors_label").set_visible(gui2::widget::visibility::invisible);
}

View file

@ -1339,6 +1339,13 @@ ADDON_CHECK_STATUS server::validate_addon(const server::request& req, config*& e
return ADDON_CHECK_STATUS::USER_DOES_NOT_EXIST;
}
for(const std::string& primary_author : utils::split(upload["primary_authors"].str(), ',')) {
if(!user_handler_->user_exists(primary_author)) {
LOG_CS << "Validation error: forum auth requested for a primary author who doesn't exist";
return ADDON_CHECK_STATUS::USER_DOES_NOT_EXIST;
}
}
for(const std::string& secondary_author : utils::split(upload["secondary_authors"].str(), ',')) {
if(!user_handler_->user_exists(secondary_author)) {
LOG_CS << "Validation error: forum auth requested for a secondary author who doesn't exist";
@ -1523,7 +1530,7 @@ void server::handle_upload(const server::request& req)
// Write general metadata attributes
addon.copy_or_remove_attributes(upload,
"title", "name", "uploader", "author", "secondary_authors", "description", "version", "icon",
"title", "name", "uploader", "author", "primary_authors", "secondary_authors", "description", "version", "icon",
"translate", "dependencies", "core", "type", "tags", "email", "forum_auth"
);
@ -1565,7 +1572,7 @@ void server::handle_upload(const server::request& req)
// if p1 is primary, p2 is secondary, and p2 uploads, then this is skipped because the uploader is not the primary author
// if next time p2 is primary, p1 is secondary, and p1 uploads, then p1 is both uploader and secondary author
// therefore p2's author information would not be reinserted if the uploader attribute were used instead
user_handler_->db_insert_addon_authors(server_id_, name, addon["author"].str(), utils::split(addon["secondary_authors"].str(), ','));
user_handler_->db_insert_addon_authors(server_id_, name, utils::split(addon["primary_authors"].str(), ','), utils::split(addon["secondary_authors"].str(), ','));
}
}
user_handler_->db_insert_addon_info(server_id_, name, addon["title"].str(), addon["type"].str(), addon["version"].str(), addon["forum_auth"].to_bool(), topic_id, upload["uploader"].str());

View file

@ -282,13 +282,16 @@ void fuh::db_delete_addon_authors(const std::string& instance_version, const std
conn_.delete_addon_authors(instance_version, id);
}
void fuh::db_insert_addon_authors(const std::string& instance_version, const std::string& id, const std::string& primary_author, const std::vector<std::string>& secondary_authors) {
conn_.insert_addon_author(instance_version, id, primary_author, 1);
void fuh::db_insert_addon_authors(const std::string& instance_version, const std::string& id, const std::vector<std::string>& primary_authors, const std::vector<std::string>& secondary_authors) {
// ignore any duplicate authors
std::set<std::string> inserted_authors;
inserted_authors.emplace(primary_author);
for(const std::string& primary_author : primary_authors) {
if(inserted_authors.count(primary_author) == 0) {
inserted_authors.emplace(primary_author);
conn_.insert_addon_author(instance_version, id, primary_author, 1);
}
}
for(const std::string& secondary_author : secondary_authors) {
if(inserted_authors.count(secondary_author) == 0) {
inserted_authors.emplace(secondary_author);

View file

@ -310,10 +310,10 @@ public:
*
* @param instance_version Which major version this is for (1.16, 1.17, etc).
* @param id The ID of the add-on.
* @param primary_author The primary author of the add-on.
* @param primary_authors The primary authors of the add-on.
* @param secondary_authors The secondary authors of the add-on.
*/
void db_insert_addon_authors(const std::string& instance_version, const std::string& id, const std::string& primary_author, const std::vector<std::string>& secondary_authors);
void db_insert_addon_authors(const std::string& instance_version, const std::string& id, const std::vector<std::string>& primary_authors, const std::vector<std::string>& secondary_authors);
/**
* Checks whether any author information exists for a particular addon and version, since if there's no author information then of course no primary or secondary authors will ever be found.

View file

@ -143,6 +143,6 @@ public:
virtual bool db_is_user_primary_author(const std::string& instance_version, const std::string& id, const std::string& username) = 0;
virtual bool db_is_user_secondary_author(const std::string& instance_version, const std::string& id, const std::string& username) = 0;
virtual void db_delete_addon_authors(const std::string& instance_version, const std::string& id) = 0;
virtual void db_insert_addon_authors(const std::string& instance_version, const std::string& id, const std::string& primary_author, const std::vector<std::string>& secondary_authors) = 0;
virtual void db_insert_addon_authors(const std::string& instance_version, const std::string& id, const std::vector<std::string>& primary_authors, const std::vector<std::string>& secondary_authors) = 0;
virtual bool db_do_any_authors_exist(const std::string& instance_version, const std::string& id) = 0;
};