From bf7558830f6bd711d259f6641c52e8395bbab437 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Thu, 1 Apr 2021 13:57:45 -0400 Subject: [PATCH 1/2] Changing preferred to display name. Fixes #1211 --- api_tests/package.json | 2 +- api_tests/src/user.spec.ts | 4 ++-- api_tests/yarn.lock | 8 ++++---- crates/api/src/local_user.rs | 10 +++++----- crates/api_common/src/person.rs | 2 +- crates/apub/src/objects/person.rs | 9 +++++---- crates/db_queries/src/source/person.rs | 16 ++++++++-------- crates/db_schema/src/schema.rs | 6 +++--- crates/db_schema/src/source/person.rs | 14 +++++++------- crates/db_views/src/comment_view.rs | 2 +- crates/db_views/src/post_view.rs | 2 +- crates/utils/src/test.rs | 8 ++++---- crates/utils/src/utils.rs | 6 ++---- .../down.sql | 6 ++++++ .../up.sql | 6 ++++++ 15 files changed, 56 insertions(+), 45 deletions(-) create mode 100644 migrations/2021-04-01-173552_rename_preferred_username_to_display_name/down.sql create mode 100644 migrations/2021-04-01-173552_rename_preferred_username_to_display_name/up.sql diff --git a/api_tests/package.json b/api_tests/package.json index 7cb949594..1b0583c4f 100644 --- a/api_tests/package.json +++ b/api_tests/package.json @@ -16,7 +16,7 @@ "eslint": "^7.18.0", "eslint-plugin-jane": "^9.0.3", "jest": "^26.6.3", - "lemmy-js-client": "0.10.0-rc.13", + "lemmy-js-client": "0.11.0-rc.1", "node-fetch": "^2.6.1", "prettier": "^2.1.2", "ts-jest": "^26.4.4", diff --git a/api_tests/src/user.spec.ts b/api_tests/src/user.spec.ts index a10876cf5..5d10fd043 100644 --- a/api_tests/src/user.spec.ts +++ b/api_tests/src/user.spec.ts @@ -19,7 +19,7 @@ let apShortname: string; function assertUserFederation(userOne: PersonViewSafe, userTwo: PersonViewSafe) { expect(userOne.person.name).toBe(userTwo.person.name); - expect(userOne.person.preferred_username).toBe(userTwo.person.preferred_username); + expect(userOne.person.display_name).toBe(userTwo.person.display_name); expect(userOne.person.bio).toBe(userTwo.person.bio); expect(userOne.person.actor_id).toBe(userTwo.person.actor_id); expect(userOne.person.avatar).toBe(userTwo.person.avatar); @@ -49,7 +49,7 @@ test('Set some user settings, check that they are federated', async () => { lang: '', avatar, banner, - preferred_username: 'user321', + display_name: 'user321', show_avatars: false, send_notifications_to_email: false, bio, diff --git a/api_tests/yarn.lock b/api_tests/yarn.lock index 8f8abf873..f3b8e603f 100644 --- a/api_tests/yarn.lock +++ b/api_tests/yarn.lock @@ -3233,10 +3233,10 @@ language-tags@^1.0.5: dependencies: language-subtag-registry "~0.3.2" -lemmy-js-client@0.10.0-rc.13: - version "0.10.0-rc.13" - resolved "https://registry.yarnpkg.com/lemmy-js-client/-/lemmy-js-client-0.10.0-rc.13.tgz#ea2e88857243374d7fbd49ee6b4bb94c34359d85" - integrity sha512-zodvYkwBYR7iP27ah6L/QPUphUUdq38kCH7QF2CUYBrsSAEkGmq2kdz+iusnQ1Ht7Ad80GtYycFprsZBveV5eQ== +lemmy-js-client@0.11.0-rc.1: + version "0.11.0-rc.1" + resolved "https://registry.yarnpkg.com/lemmy-js-client/-/lemmy-js-client-0.11.0-rc.1.tgz#0031676be9fc787157a21dd3f5095dd1ee9e6a57" + integrity sha512-dtpxe/hHTbYEv2WnfGkAieOB9jyKUVED+y4DosUp/FcaatjPcMTiKOvCdMNjlvvG/9GyclWEoyNitPEsvJwjmg== leven@^3.1.0: version "3.1.0" diff --git a/crates/api/src/local_user.rs b/crates/api/src/local_user.rs index 656ddf971..2fb4056f2 100644 --- a/crates/api/src/local_user.rs +++ b/crates/api/src/local_user.rs @@ -60,7 +60,7 @@ use lemmy_utils::{ email::send_email, location_info, settings::structs::Settings, - utils::{generate_random_string, is_valid_preferred_username, naive_from_unix}, + utils::{generate_random_string, is_valid_display_name, naive_from_unix}, ApiError, ConnectionId, LemmyError, @@ -174,7 +174,7 @@ impl Perform for SaveUserSettings { let banner = diesel_option_overwrite_to_url(&data.banner)?; let email = diesel_option_overwrite(&data.email); let bio = diesel_option_overwrite(&data.bio); - let preferred_username = diesel_option_overwrite(&data.preferred_username); + let display_name = diesel_option_overwrite(&data.display_name); let matrix_user_id = diesel_option_overwrite(&data.matrix_user_id); if let Some(Some(bio)) = &bio { @@ -183,8 +183,8 @@ impl Perform for SaveUserSettings { } } - if let Some(Some(preferred_username)) = &preferred_username { - if !is_valid_preferred_username(preferred_username.trim()) { + if let Some(Some(display_name)) = &display_name { + if !is_valid_display_name(display_name.trim()) { return Err(ApiError::err("invalid_username").into()); } } @@ -235,7 +235,7 @@ impl Perform for SaveUserSettings { avatar, banner, inbox_url: None, - preferred_username, + display_name, published: None, updated: Some(naive_now()), banned: None, diff --git a/crates/api_common/src/person.rs b/crates/api_common/src/person.rs index 7767da460..d95fed6b5 100644 --- a/crates/api_common/src/person.rs +++ b/crates/api_common/src/person.rs @@ -53,7 +53,7 @@ pub struct SaveUserSettings { pub lang: Option, pub avatar: Option, pub banner: Option, - pub preferred_username: Option, + pub display_name: Option, pub email: Option, pub bio: Option, pub matrix_user_id: Option, diff --git a/crates/apub/src/objects/person.rs b/crates/apub/src/objects/person.rs index 25c785d84..3e468d5c8 100644 --- a/crates/apub/src/objects/person.rs +++ b/crates/apub/src/objects/person.rs @@ -64,7 +64,8 @@ impl ToApub for DbPerson { set_content_and_source(&mut person, bio)?; } - if let Some(i) = self.preferred_username.to_owned() { + // In apub, the "name" is a display name + if let Some(i) = self.display_name.to_owned() { person.set_name(i); } @@ -161,7 +162,7 @@ impl FromApubToForm for PersonForm { .preferred_username() .context(location_info!())? .to_string(); - let preferred_username: Option = person + let display_name: Option = person .name() .map(|n| n.one()) .flatten() @@ -176,12 +177,12 @@ impl FromApubToForm for PersonForm { .map(|s| s.to_owned().into()); check_slurs(&name)?; - check_slurs_opt(&preferred_username)?; + check_slurs_opt(&display_name)?; check_slurs_opt(&bio)?; Ok(PersonForm { name, - preferred_username: Some(preferred_username), + display_name: Some(display_name), banned: None, deleted: None, avatar: avatar.map(|o| o.map(|i| i.into())), diff --git a/crates/db_queries/src/source/person.rs b/crates/db_queries/src/source/person.rs index 35ed540c0..2d332bd01 100644 --- a/crates/db_queries/src/source/person.rs +++ b/crates/db_queries/src/source/person.rs @@ -15,7 +15,7 @@ mod safe_type { type Columns = ( id, name, - preferred_username, + display_name, avatar, banned, published, @@ -37,7 +37,7 @@ mod safe_type { ( id, name, - preferred_username, + display_name, avatar, banned, published, @@ -63,7 +63,7 @@ mod safe_type_alias_1 { type Columns = ( id, name, - preferred_username, + display_name, avatar, banned, published, @@ -85,7 +85,7 @@ mod safe_type_alias_1 { ( id, name, - preferred_username, + display_name, avatar, banned, published, @@ -111,7 +111,7 @@ mod safe_type_alias_2 { type Columns = ( id, name, - preferred_username, + display_name, avatar, banned, published, @@ -133,7 +133,7 @@ mod safe_type_alias_2 { ( id, name, - preferred_username, + display_name, avatar, banned, published, @@ -236,7 +236,7 @@ impl Person_ for Person { diesel::update(person.find(person_id)) .set(( - preferred_username.eq::>(None), + display_name.eq::>(None), bio.eq::>(None), matrix_user_id.eq::>(None), deleted.eq(true), @@ -264,7 +264,7 @@ mod tests { let expected_person = Person { id: inserted_person.id, name: "holly".into(), - preferred_username: None, + display_name: None, avatar: None, banner: None, banned: false, diff --git a/crates/db_schema/src/schema.rs b/crates/db_schema/src/schema.rs index 5bc55f529..04b5322c4 100644 --- a/crates/db_schema/src/schema.rs +++ b/crates/db_schema/src/schema.rs @@ -270,7 +270,7 @@ table! { person (id) { id -> Int4, name -> Varchar, - preferred_username -> Nullable, + display_name -> Nullable, avatar -> Nullable, banned -> Bool, published -> Timestamp, @@ -470,7 +470,7 @@ table! { person_alias_1 (id) { id -> Int4, name -> Varchar, - preferred_username -> Nullable, + display_name -> Nullable, avatar -> Nullable, banned -> Bool, published -> Timestamp, @@ -494,7 +494,7 @@ table! { person_alias_2 (id) { id -> Int4, name -> Varchar, - preferred_username -> Nullable, + display_name -> Nullable, avatar -> Nullable, banned -> Bool, published -> Timestamp, diff --git a/crates/db_schema/src/source/person.rs b/crates/db_schema/src/source/person.rs index 2c0e7e8b7..be1ce268f 100644 --- a/crates/db_schema/src/source/person.rs +++ b/crates/db_schema/src/source/person.rs @@ -10,7 +10,7 @@ use serde::Serialize; pub struct Person { pub id: PersonId, pub name: String, - pub preferred_username: Option, + pub display_name: Option, pub avatar: Option, pub banned: bool, pub published: chrono::NaiveDateTime, @@ -35,7 +35,7 @@ pub struct Person { pub struct PersonSafe { pub id: PersonId, pub name: String, - pub preferred_username: Option, + pub display_name: Option, pub avatar: Option, pub banned: bool, pub published: chrono::NaiveDateTime, @@ -56,7 +56,7 @@ pub struct PersonSafe { pub struct PersonAlias1 { pub id: PersonId, pub name: String, - pub preferred_username: Option, + pub display_name: Option, pub avatar: Option, pub banned: bool, pub published: chrono::NaiveDateTime, @@ -80,7 +80,7 @@ pub struct PersonAlias1 { pub struct PersonSafeAlias1 { pub id: PersonId, pub name: String, - pub preferred_username: Option, + pub display_name: Option, pub avatar: Option, pub banned: bool, pub published: chrono::NaiveDateTime, @@ -101,7 +101,7 @@ pub struct PersonSafeAlias1 { pub struct PersonAlias2 { pub id: PersonId, pub name: String, - pub preferred_username: Option, + pub display_name: Option, pub avatar: Option, pub banned: bool, pub published: chrono::NaiveDateTime, @@ -125,7 +125,7 @@ pub struct PersonAlias2 { pub struct PersonSafeAlias2 { pub id: PersonId, pub name: String, - pub preferred_username: Option, + pub display_name: Option, pub avatar: Option, pub banned: bool, pub published: chrono::NaiveDateTime, @@ -145,7 +145,7 @@ pub struct PersonSafeAlias2 { #[table_name = "person"] pub struct PersonForm { pub name: String, - pub preferred_username: Option>, + pub display_name: Option>, pub avatar: Option>, pub banned: Option, pub published: Option, diff --git a/crates/db_views/src/comment_view.rs b/crates/db_views/src/comment_view.rs index 6b13103c0..ff5b6debf 100644 --- a/crates/db_views/src/comment_view.rs +++ b/crates/db_views/src/comment_view.rs @@ -519,7 +519,7 @@ mod tests { creator: PersonSafe { id: inserted_person.id, name: "timmy".into(), - preferred_username: None, + display_name: None, published: inserted_person.published, avatar: None, actor_id: inserted_person.actor_id.to_owned(), diff --git a/crates/db_views/src/post_view.rs b/crates/db_views/src/post_view.rs index df67d3693..64f261aad 100644 --- a/crates/db_views/src/post_view.rs +++ b/crates/db_views/src/post_view.rs @@ -541,7 +541,7 @@ mod tests { creator: PersonSafe { id: inserted_person.id, name: person_name, - preferred_username: None, + display_name: None, published: inserted_person.published, avatar: None, actor_id: inserted_person.actor_id.to_owned(), diff --git a/crates/utils/src/test.rs b/crates/utils/src/test.rs index aaa59bfa7..04abd4b7d 100644 --- a/crates/utils/src/test.rs +++ b/crates/utils/src/test.rs @@ -1,7 +1,7 @@ use crate::utils::{ is_valid_community_name, + is_valid_display_name, is_valid_post_title, - is_valid_preferred_username, is_valid_username, remove_slurs, scrape_text_for_mentions, @@ -29,9 +29,9 @@ fn test_valid_register_username() { } #[test] -fn test_valid_preferred_username() { - assert!(is_valid_preferred_username("hello @there")); - assert!(!is_valid_preferred_username("@hello there")); +fn test_valid_display_name() { + assert!(is_valid_display_name("hello @there")); + assert!(!is_valid_display_name("@hello there")); } #[test] diff --git a/crates/utils/src/utils.rs b/crates/utils/src/utils.rs index c53d6c7c2..931565b6d 100644 --- a/crates/utils/src/utils.rs +++ b/crates/utils/src/utils.rs @@ -108,10 +108,8 @@ pub fn is_valid_username(name: &str) -> bool { } // Can't do a regex here, reverse lookarounds not supported -pub fn is_valid_preferred_username(preferred_username: &str) -> bool { - !preferred_username.starts_with('@') - && preferred_username.chars().count() >= 3 - && preferred_username.chars().count() <= 20 +pub fn is_valid_display_name(name: &str) -> bool { + !name.starts_with('@') && name.chars().count() >= 3 && name.chars().count() <= 20 } pub fn is_valid_community_name(name: &str) -> bool { diff --git a/migrations/2021-04-01-173552_rename_preferred_username_to_display_name/down.sql b/migrations/2021-04-01-173552_rename_preferred_username_to_display_name/down.sql new file mode 100644 index 000000000..844c02d38 --- /dev/null +++ b/migrations/2021-04-01-173552_rename_preferred_username_to_display_name/down.sql @@ -0,0 +1,6 @@ +alter table person rename display_name to preferred_username; + +-- Regenerate the person_alias views +drop view person_alias_1, person_alias_2; +create view person_alias_1 as select * from person; +create view person_alias_2 as select * from person; diff --git a/migrations/2021-04-01-173552_rename_preferred_username_to_display_name/up.sql b/migrations/2021-04-01-173552_rename_preferred_username_to_display_name/up.sql new file mode 100644 index 000000000..f4b9729c1 --- /dev/null +++ b/migrations/2021-04-01-173552_rename_preferred_username_to_display_name/up.sql @@ -0,0 +1,6 @@ +alter table person rename preferred_username to display_name; + +-- Regenerate the person_alias views +drop view person_alias_1, person_alias_2; +create view person_alias_1 as select * from person; +create view person_alias_2 as select * from person; From 799ab94af313f635dbe4547ea2f9a85c3124fd11 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Thu, 1 Apr 2021 14:09:53 -0400 Subject: [PATCH 2/2] Don't allow zero-space char in display name. Fixes #1317 --- crates/utils/src/test.rs | 6 ++++++ crates/utils/src/utils.rs | 5 ++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/crates/utils/src/test.rs b/crates/utils/src/test.rs index 04abd4b7d..754aa8c3a 100644 --- a/crates/utils/src/test.rs +++ b/crates/utils/src/test.rs @@ -32,6 +32,12 @@ fn test_valid_register_username() { fn test_valid_display_name() { assert!(is_valid_display_name("hello @there")); assert!(!is_valid_display_name("@hello there")); + + // Make sure zero-space with an @ doesn't work + assert!(!is_valid_display_name(&format!( + "{}@my name is", + '\u{200b}' + ))); } #[test] diff --git a/crates/utils/src/utils.rs b/crates/utils/src/utils.rs index 931565b6d..732ac2c8d 100644 --- a/crates/utils/src/utils.rs +++ b/crates/utils/src/utils.rs @@ -109,7 +109,10 @@ pub fn is_valid_username(name: &str) -> bool { // Can't do a regex here, reverse lookarounds not supported pub fn is_valid_display_name(name: &str) -> bool { - !name.starts_with('@') && name.chars().count() >= 3 && name.chars().count() <= 20 + !name.starts_with('@') + && !name.starts_with('\u{200b}') + && name.chars().count() >= 3 + && name.chars().count() <= 20 } pub fn is_valid_community_name(name: &str) -> bool {