blatherskite

a toy discord-like chat app backend written for a swe class
Log | Files | Refs | README

commit ed0f2fdef37f96349d47c874e811b108916b92c1
parent bbd955fd4e4ef8d19b9d917e55221f8332365b2f
Author: Papayapaya <91221817+Papayapaya@users.noreply.github.com>
Date:   Thu, 17 Nov 2022 16:51:01 -0800

use filter and implement

Diffstat:
Mscuttlebutt/src/main.rs | 49+++++++++++++++++++++++--------------------------
1 file changed, 23 insertions(+), 26 deletions(-)

diff --git a/scuttlebutt/src/main.rs b/scuttlebutt/src/main.rs @@ -1,4 +1,3 @@ -use anyhow::Ok; use chrono::{DateTime, Duration, Local, Utc}; use hmac::{Hmac, digest::typenum::array}; use jwt::{SignWithKey, VerifyWithKey}; @@ -90,23 +89,14 @@ pub fn gen_id() -> i64 { } pub fn check_name(name: String) -> String{ - let disallowed_chars: [u32; 53] = [0x202e,0x0009,0x00AD,0x034F,0x061C,0x115F,0x1160,0x17B4,0x17B5,0x180E,0x2000,0x2001,0x2002,0x2003,0x2004,0x2005,0x2006,0x2007,0x2008,0x2009,0x200A,0x200B,0x200C,0x200D,0x200E,0x200F,0x202F,0x205F,0x2060,0x2061,0x2062,0x2063,0x2064,0x206A,0x206B,0x206C,0x206D,0x206E,0x206F,0x3000,0x2800,0x3164,0xFEFF,0xFFA0,0x1D159,0x1D173,0x1D174,0x1D175,0x1D176,0x1D177,0x1D178,0x1D179,0x1D17A]; - let name_chars = name.chars(); - let mut fixed_name = String::from(""); - let mut index = 0; - let mut to_keep:[bool; 32] = [true; 32]; //assuming 32 is the max name size - TODO: figure out how to not hardcode this in rust - for i in name_chars{ - for j in 0..disallowed_chars.len(){ - if i == char::from_u32(disallowed_chars[j]).unwrap() { - to_keep[index] = false; - }; - }; - if to_keep[index]{ - fixed_name.push(i) - }; - index += 1; - }; - assert!(fixed_name != "", "name is empty or contains only illegal characters"); + let name_chars = name.chars(); + let fixed_name_chars = name_chars.filter(|i| !i.is_whitespace()); + let mut fixed_name: String = "".to_string(); + for i in fixed_name_chars{ + fixed_name.push(i); + }; + println!("{}", fixed_name); + assert!(fixed_name != "".to_string(), "name is empty or contains only illegal characters"); return fixed_name; } @@ -175,8 +165,9 @@ impl Api { if hash.0.len() != 64 { return BadRequest(PlainText("Invalid hash provided.".to_string())); } + let checked_name = check_name(name.0.clone()); let id = gen_id(); - self.db.create_user(id, name.0.clone(), email.0.clone(), hash.0).unwrap(); + self.db.create_user(id, checked_name.clone(), email.0.clone(), hash.0).unwrap(); self.db.create_user_groups(id).unwrap(); self.db.create_user_dms(id).unwrap(); Success(Json(User { @@ -190,7 +181,8 @@ impl Api { /// Update your name and email. async fn update_user(&self, auth: Authorization, name: Query<String>, email: Query<String>) -> GenericResponse { use GenericResponse::*; - self.db.update_user(auth.0.id, name.0, email.0).unwrap(); + let checked_name = check_name(name.0.clone()); + self.db.update_user(auth.0.id, checked_name, email.0).unwrap(); Success } @@ -271,7 +263,8 @@ impl Api { if name.0 == "" { return BadRequest(PlainText("Empty string not allowed for name".to_string())) } - self.db.create_group(gid, auth.0.id, name.0.clone(), false).unwrap(); + let fixed_name = check_name(name.0.clone()); + self.db.create_group(gid, auth.0.id, fixed_name.clone(), false).unwrap(); self.db.add_user_group(auth.0.id, gid).unwrap(); self.db.add_group_admin(gid, auth.0.id).unwrap(); let cid = gen_id(); @@ -332,8 +325,9 @@ impl Api { return NotFound(PlainText("Didn't find group or experienced database error.".to_string())); } else if self.db.get_group_owner(id.0).unwrap() != auth.0.id { return Unauthorized; - } - self.db.update_group(id.0, name.0).unwrap(); + } + let fixed_name = check_name(name.0.clone()); + self.db.update_group(id.0, fixed_name).unwrap(); Success } @@ -502,7 +496,8 @@ impl Api { return Unauthorized; } let cid = gen_id(); - self.db.create_channel(cid, gid.0, auth.0.id, name.0.clone()).unwrap(); + let fixed_name = check_name(name.0.clone()); + self.db.create_channel(cid, gid.0, auth.0.id, fixed_name.clone()).unwrap(); self.db.add_group_channel(gid.0, cid).unwrap(); Success(Json(Channel { id: cid, @@ -526,7 +521,8 @@ impl Api { if !self.db.get_group_admin(channel.group).unwrap().contains(&auth.0.id) { return Unauthorized; } - self.db.update_channel(id.0, name.0).unwrap(); + let fixed_name = check_name(name.0.clone()); + self.db.update_channel(id.0, fixed_name).unwrap(); Success } @@ -664,10 +660,11 @@ impl Api { } else if !self.db.valid_id(IdType::Message, id.0).unwrap() { return NotFound(PlainText("Message not found".to_string())) } + let fixed_name = check_name(name.0.clone()); let tid = gen_id(); let msg = self.db.get_message(id.0).unwrap(); let chan = self.db.get_channel(msg.channel).unwrap(); - self.db.create_channel(tid, chan.group, auth.0.id, name.0.clone()).unwrap(); + self.db.create_channel(tid, chan.group, auth.0.id, fixed_name.clone()).unwrap(); self.db.set_channel_private(tid, true).unwrap(); self.db.set_thread(id.0, tid).unwrap(); Success(Json(Channel {