diff --git a/lib/utils/reserved-users.js b/lib/utils/reserved-users.js --- a/lib/utils/reserved-users.js +++ b/lib/utils/reserved-users.js @@ -1,8 +1,7 @@ // @flow // All entries in this list must be lowercase and must also be included in -// `services/identity/reserved_usernames.json` and in -// `services/blob/reserved_usernames.json`!! +// `shared/comm-lib/shared/reserved_usernames.json`!! const reservedUsernamesSet: $ReadOnlySet = new Set([ // Additional Reserved Keywords 'comm', diff --git a/services/blob/Cargo.lock b/services/blob/Cargo.lock --- a/services/blob/Cargo.lock +++ b/services/blob/Cargo.lock @@ -1107,6 +1107,7 @@ "grpc_clients", "hex", "http", + "once_cell", "rand", "serde", "serde_json", diff --git a/services/blob/src/config.rs b/services/blob/src/config.rs --- a/services/blob/src/config.rs +++ b/services/blob/src/config.rs @@ -68,17 +68,6 @@ config_builder.load().await } -fn get_all_reserved_invite_links() -> HashSet { - // All entries in `reserved_usernames.json` must be lowercase and must also be - // included in `lib/utils/reserved-users.js`!! - let contents = include_str!("../reserved_usernames.json"); - let reserved_usernames: Vec = serde_json::from_str(contents).unwrap(); - - reserved_usernames.into_iter().collect() -} -pub static RESERVED_INVITE_LINKS: Lazy> = - Lazy::new(get_all_reserved_invite_links); - fn get_all_offensive_invite_links() -> HashSet { let contents = include_str!("../third-party/bad-words/words.json"); let reserved_usernames: Vec = serde_json::from_str(contents).unwrap(); diff --git a/services/blob/src/service.rs b/services/blob/src/service.rs --- a/services/blob/src/service.rs +++ b/services/blob/src/service.rs @@ -7,13 +7,14 @@ use async_stream::try_stream; use chrono::Duration; use comm_lib::http::ByteStream; +use comm_lib::shared::reserved_users::RESERVED_USERNAME_SET; use comm_lib::tools::BoxedError; use once_cell::sync::Lazy; use tokio_stream::StreamExt; use tonic::codegen::futures_core::Stream; use tracing::{debug, error, info, trace, warn}; -use crate::config::{CONFIG, OFFENSIVE_INVITE_LINKS, RESERVED_INVITE_LINKS}; +use crate::config::{CONFIG, OFFENSIVE_INVITE_LINKS}; use crate::constants::{ INVITE_LINK_BLOB_HASH_PREFIX, S3_MULTIPART_UPLOAD_MINIMUM_CHUNK_SIZE, }; @@ -138,7 +139,7 @@ invite_secret: &str, ) -> Result<(), BlobServiceError> { let lowercase_secret = invite_secret.to_lowercase(); - if (RESERVED_INVITE_LINKS.contains(&lowercase_secret)) { + if (RESERVED_USERNAME_SET.contains(&lowercase_secret)) { debug!("Reserved invite link"); return Err(BlobServiceError::InviteLinkError(InviteLinkError::Reserved)); } diff --git a/services/identity/Cargo.lock b/services/identity/Cargo.lock --- a/services/identity/Cargo.lock +++ b/services/identity/Cargo.lock @@ -851,6 +851,7 @@ "derive_more", "grpc_clients", "hex", + "once_cell", "rand 0.8.5", "serde", "serde_json", diff --git a/services/identity/reserved_usernames.json b/services/identity/reserved_usernames.json deleted file mode 100644 --- a/services/identity/reserved_usernames.json +++ /dev/null @@ -1,2223 +0,0 @@ -[ - "comm", - "dapp-tools", - "dapp_tools", - "ethers-js", - "ethers_js", - "ganache-cli", - "ganache_cli", - "hardhat", - "mod", - "moderator", - "solidity", - "truffle", - "web3", - "web3modal", - "0", - "12", - "49", - "478", - "1hive", - "aave", - "agoraspace", - "aladdindao", - "alchemistdao", - "allships", - "ampled", - "angeldao", - "aragon", - "badgerdao", - "bankless", - "bardao", - "bayc", - "beetsdao", - "braintrust", - "bright", - "brightid", - "brightmomentsgallery", - "brrdao", - "cabindao", - "canudao", - "cedge", - "clip", - "closerdao", - "coinvise", - "collab-land", - "collab_land", - "colony", - "comp", - "compound", - "coordinape", - "cre8club", - "crisisdao", - "cspdao", - "daohaus", - "daosquare", - "daostack", - "darkstardao", - "decred", - "developerdao", - "devs", - "dfdao", - "dinnerdao", - "dinogangz", - "discodao", - "distributed-town", - "distributed_town", - "divineroles", - "dopewarsdao", - "dorg", - "duckdao", - "dxdao", - "edendao", - "elektradao", - "ethernautdao", - "etherscan", - "evewealth", - "ff", - "fiatluxdao", - "fingerprints", - "fireeyes", - "flamingodao", - "forefront", - "freecompany", - "friendswithbenefits", - "fwb", - "gardens", - "gcr", - "genezisbiohacking", - "genre", - "geometrydao", - "gitcoin", - "gnosis", - "gnosissafe", - "gorn", - "gornhegemonydao", - "gremlins", - "guildhall", - "habitat", - "heatdao", - "herstorydao", - "honeydao", - "idlefinance", - "indexcoop", - "insuredao", - "jennydao", - "joystream", - "jumperdao", - "keeperdao", - "kleoverse", - "komorebicollective", - "krause", - "krausehouse", - "learndao", - "leavingrecords", - "lex", - "lexdao", - "llama", - "lovesocietydao", - "lurkerdao", - "magnetdao", - "makerdao", - "maodao", - "maskdao", - "meebitsdao", - "meritcircle", - "metacartel", - "metafam", - "metagammadelta", - "metamask", - "metaversedao", - "minty", - "mirror-xyz", - "mirror_xyz", - "mirrorclubdao", - "molochdao", - "moonshotcollective", - "moshdao", - "muse0", - "nebo", - "neptunedao", - "nfdao", - "nounsdao", - "olympusdao", - "opendao", - "opensea", - "opolis", - "orcaprotocol", - "pacdao", - "paperclip", - "parcel", - "party", - "partydao", - "peerion", - "phlotedao", - "physicalanddigitalartaficionados", - "pizzadao", - "pleasrdao", - "pokemontrainersclub", - "prints", - "proofofhumanity", - "prosperdao", - "proteindao", - "psydao", - "rabbithole", - "raidguild", - "rainbowwallet", - "raribledao", - "readyplayerdao", - "reddao", - "ref", - "retokendao", - "ribondao", - "rumblekong", - "sarcophagus", - "scribedao", - "seedclub", - "sharkdao", - "shinydao", - "snapshot", - "snx", - "sourcecred", - "spork", - "sporkdao", - "sputnik-fund", - "sputnik_fund", - "squaddao", - "squig", - "squiggle", - "stack", - "stackerventuresdao", - "syndicate", - "synthetix", - "tally", - "taodao", - "tarascadao", - "terrachess", - "thelao", - "thewipmeetup", - "thugdao", - "tinseldao", - "tokenwalkdao", - "tomomasterdao", - "triforcedao", - "trippy", - "trojandao", - "ultradao", - "universitydao", - "unlockdao", - "vectordao", - "viariodao", - "vita", - "vitadao", - "walletconnect", - "whalerdao", - "whiskeypioneers", - "yamdao", - "yearn", - "yfi", - "ygg", - "zouzoukwa", - "aaa", - "aarp", - "abarth", - "abb", - "abbott", - "abbvie", - "abc", - "able", - "abogado", - "abudhabi", - "ac", - "academy", - "accenture", - "accountant", - "accountants", - "aco", - "actor", - "ad", - "adac", - "ads", - "adult", - "ae", - "aeg", - "aero", - "aetna", - "af", - "afamilycompany", - "afl", - "africa", - "ag", - "agakhan", - "agency", - "ai", - "aig", - "airbus", - "airforce", - "airtel", - "akdn", - "al", - "alfaromeo", - "alibaba", - "alipay", - "allfinanz", - "allstate", - "ally", - "alsace", - "alstom", - "am", - "amazon", - "americanexpress", - "americanfamily", - "amex", - "amfam", - "amica", - "amsterdam", - "analytics", - "android", - "anquan", - "anz", - "ao", - "aol", - "apartments", - "app", - "apple", - "aq", - "aquarelle", - "ar", - "arab", - "aramco", - "archi", - "army", - "arpa", - "art", - "arte", - "as", - "asda", - "asia", - "associates", - "at", - "athleta", - "attorney", - "au", - "auction", - "audi", - "audible", - "audio", - "auspost", - "author", - "auto", - "autos", - "avianca", - "aw", - "aws", - "ax", - "axa", - "az", - "azure", - "ba", - "baby", - "baidu", - "banamex", - "bananarepublic", - "band", - "bank", - "bar", - "barcelona", - "barclaycard", - "barclays", - "barefoot", - "bargains", - "baseball", - "basketball", - "bauhaus", - "bayern", - "bb", - "bbc", - "bbt", - "bbva", - "bcg", - "bcn", - "bd", - "be", - "beats", - "beauty", - "beer", - "bentley", - "berlin", - "best", - "bestbuy", - "bet", - "bf", - "bg", - "bh", - "bharti", - "bi", - "bible", - "bid", - "bike", - "bing", - "bingo", - "bio", - "biz", - "bj", - "black", - "blackfriday", - "blockbuster", - "blog", - "bloomberg", - "blue", - "bm", - "bms", - "bmw", - "bn", - "bnpparibas", - "bo", - "boats", - "boehringer", - "bofa", - "bom", - "bond", - "boo", - "book", - "booking", - "bosch", - "bostik", - "boston", - "bot", - "boutique", - "box", - "br", - "bradesco", - "bridgestone", - "broadway", - "broker", - "brother", - "brussels", - "bs", - "bt", - "budapest", - "bugatti", - "build", - "builders", - "business", - "buy", - "buzz", - "bv", - "bw", - "by", - "bz", - "bzh", - "ca", - "cab", - "cafe", - "cal", - "call", - "calvinklein", - "cam", - "camera", - "camp", - "cancerresearch", - "canon", - "capetown", - "capital", - "capitalone", - "car", - "caravan", - "cards", - "care", - "career", - "careers", - "cars", - "casa", - "case", - "cash", - "casino", - "cat", - "catering", - "catholic", - "cba", - "cbn", - "cbre", - "cbs", - "cc", - "cd", - "center", - "ceo", - "cern", - "cf", - "cfa", - "cfd", - "cg", - "ch", - "chanel", - "channel", - "charity", - "chase", - "chat", - "cheap", - "chintai", - "christmas", - "chrome", - "church", - "ci", - "cipriani", - "circle", - "cisco", - "citadel", - "citi", - "citic", - "city", - "cityeats", - "ck", - "cl", - "claims", - "cleaning", - "click", - "clinic", - "clinique", - "clothing", - "cloud", - "club", - "clubmed", - "cm", - "cn", - "co", - "coach", - "codes", - "coffee", - "college", - "cologne", - "com", - "comcast", - "commbank", - "community", - "company", - "compare", - "computer", - "comsec", - "condos", - "construction", - "consulting", - "contact", - "contractors", - "cooking", - "cookingchannel", - "cool", - "coop", - "corsica", - "country", - "coupon", - "coupons", - "courses", - "cpa", - "cr", - "credit", - "creditcard", - "creditunion", - "cricket", - "crown", - "crs", - "cruise", - "cruises", - "csc", - "cu", - "cuisinella", - "cv", - "cw", - "cx", - "cy", - "cymru", - "cyou", - "cz", - "dabur", - "dad", - "dance", - "data", - "date", - "dating", - "datsun", - "day", - "dclk", - "dds", - "de", - "deal", - "dealer", - "deals", - "degree", - "delivery", - "dell", - "deloitte", - "delta", - "democrat", - "dental", - "dentist", - "desi", - "design", - "dev", - "dhl", - "diamonds", - "diet", - "digital", - "direct", - "directory", - "discount", - "discover", - "dish", - "diy", - "dj", - "dk", - "dm", - "dnp", - "do", - "docs", - "doctor", - "dog", - "domains", - "dot", - "download", - "drive", - "dtv", - "dubai", - "duck", - "dunlop", - "dupont", - "durban", - "dvag", - "dvr", - "dz", - "earth", - "eat", - "ec", - "eco", - "edeka", - "edu", - "education", - "ee", - "eg", - "email", - "emerck", - "energy", - "engineer", - "engineering", - "enterprises", - "epson", - "equipment", - "er", - "ericsson", - "erni", - "es", - "esq", - "estate", - "et", - "etisalat", - "eu", - "eurovision", - "eus", - "events", - "exchange", - "expert", - "exposed", - "express", - "extraspace", - "fage", - "fail", - "fairwinds", - "faith", - "family", - "fan", - "fans", - "farm", - "farmers", - "fashion", - "fast", - "fedex", - "feedback", - "ferrari", - "ferrero", - "fi", - "fiat", - "fidelity", - "fido", - "film", - "final", - "finance", - "financial", - "fire", - "firestone", - "firmdale", - "fish", - "fishing", - "fit", - "fitness", - "fj", - "fk", - "flickr", - "flights", - "flir", - "florist", - "flowers", - "fly", - "fm", - "fo", - "foo", - "food", - "foodnetwork", - "football", - "ford", - "forex", - "forsale", - "forum", - "foundation", - "fox", - "fr", - "free", - "fresenius", - "frl", - "frogans", - "frontdoor", - "frontier", - "ftr", - "fujitsu", - "fun", - "fund", - "furniture", - "futbol", - "fyi", - "ga", - "gal", - "gallery", - "gallo", - "gallup", - "game", - "games", - "gap", - "garden", - "gay", - "gb", - "gbiz", - "gd", - "gdn", - "ge", - "gea", - "gent", - "genting", - "george", - "gf", - "gg", - "ggee", - "gh", - "gi", - "gift", - "gifts", - "gives", - "giving", - "gl", - "glade", - "glass", - "gle", - "global", - "globo", - "gm", - "gmail", - "gmbh", - "gmo", - "gmx", - "gn", - "godaddy", - "gold", - "goldpoint", - "golf", - "goo", - "goodyear", - "goog", - "google", - "gop", - "got", - "gov", - "gp", - "gq", - "gr", - "grainger", - "graphics", - "gratis", - "green", - "gripe", - "grocery", - "group", - "gs", - "gt", - "gu", - "guardian", - "gucci", - "guge", - "guide", - "guitars", - "guru", - "gw", - "gy", - "hair", - "hamburg", - "hangout", - "haus", - "hbo", - "hdfc", - "hdfcbank", - "health", - "healthcare", - "help", - "helsinki", - "here", - "hermes", - "hgtv", - "hiphop", - "hisamitsu", - "hitachi", - "hiv", - "hk", - "hkt", - "hm", - "hn", - "hockey", - "holdings", - "holiday", - "homedepot", - "homegoods", - "homes", - "homesense", - "honda", - "horse", - "hospital", - "host", - "hosting", - "hot", - "hoteles", - "hotels", - "hotmail", - "house", - "how", - "hr", - "hsbc", - "ht", - "hu", - "hughes", - "hyatt", - "hyundai", - "ibm", - "icbc", - "ice", - "icu", - "id", - "ie", - "ieee", - "ifm", - "ikano", - "il", - "im", - "imamat", - "imdb", - "immo", - "immobilien", - "in", - "inc", - "industries", - "infiniti", - "info", - "ing", - "ink", - "institute", - "insurance", - "insure", - "int", - "international", - "intuit", - "investments", - "io", - "ipiranga", - "iq", - "ir", - "irish", - "is", - "ismaili", - "ist", - "istanbul", - "it", - "itau", - "itv", - "jaguar", - "java", - "jcb", - "je", - "jeep", - "jetzt", - "jewelry", - "jio", - "jll", - "jm", - "jmp", - "jnj", - "jo", - "jobs", - "joburg", - "jot", - "joy", - "jp", - "jpmorgan", - "jprs", - "juegos", - "juniper", - "kaufen", - "kddi", - "ke", - "kerryhotels", - "kerrylogistics", - "kerryproperties", - "kfh", - "kg", - "kh", - "ki", - "kia", - "kim", - "kinder", - "kindle", - "kitchen", - "kiwi", - "km", - "kn", - "koeln", - "komatsu", - "kosher", - "kp", - "kpmg", - "kpn", - "kr", - "krd", - "kred", - "kuokgroup", - "kw", - "ky", - "kyoto", - "kz", - "la", - "lacaixa", - "lamborghini", - "lamer", - "lancaster", - "lancia", - "land", - "landrover", - "lanxess", - "lasalle", - "lat", - "latino", - "latrobe", - "law", - "lawyer", - "lb", - "lc", - "lds", - "lease", - "leclerc", - "lefrak", - "legal", - "lego", - "lexus", - "lgbt", - "li", - "lidl", - "life", - "lifeinsurance", - "lifestyle", - "lighting", - "like", - "lilly", - "limited", - "limo", - "lincoln", - "linde", - "link", - "lipsy", - "live", - "living", - "lixil", - "lk", - "llc", - "llp", - "loan", - "loans", - "locker", - "locus", - "loft", - "lol", - "london", - "lotte", - "lotto", - "love", - "lpl", - "lplfinancial", - "lr", - "ls", - "lt", - "ltd", - "ltda", - "lu", - "lundbeck", - "luxe", - "luxury", - "lv", - "ly", - "ma", - "macys", - "madrid", - "maif", - "maison", - "makeup", - "man", - "management", - "mango", - "map", - "market", - "marketing", - "markets", - "marriott", - "marshalls", - "maserati", - "mattel", - "mba", - "mc", - "mckinsey", - "md", - "me", - "med", - "media", - "meet", - "melbourne", - "meme", - "memorial", - "men", - "menu", - "merckmsd", - "mg", - "mh", - "miami", - "microsoft", - "mil", - "mini", - "mint", - "mit", - "mitsubishi", - "mk", - "ml", - "mlb", - "mls", - "mm", - "mma", - "mn", - "mo", - "mobi", - "mobile", - "moda", - "moe", - "moi", - "mom", - "monash", - "money", - "monster", - "mormon", - "mortgage", - "moscow", - "moto", - "motorcycles", - "mov", - "movie", - "mp", - "mq", - "mr", - "ms", - "msd", - "mt", - "mtn", - "mtr", - "mu", - "museum", - "music", - "mutual", - "mv", - "mw", - "mx", - "my", - "mz", - "na", - "nab", - "nagoya", - "name", - "natura", - "navy", - "nba", - "nc", - "ne", - "nec", - "net", - "netbank", - "netflix", - "network", - "neustar", - "new", - "news", - "next", - "nextdirect", - "nexus", - "nf", - "nfl", - "ng", - "ngo", - "nhk", - "ni", - "nico", - "nike", - "nikon", - "ninja", - "nissan", - "nissay", - "nl", - "no", - "nokia", - "northwesternmutual", - "norton", - "now", - "nowruz", - "nowtv", - "np", - "nr", - "nra", - "nrw", - "ntt", - "nu", - "nyc", - "nz", - "obi", - "observer", - "off", - "office", - "okinawa", - "olayan", - "olayangroup", - "oldnavy", - "ollo", - "om", - "omega", - "one", - "ong", - "onl", - "online", - "ooo", - "open", - "oracle", - "orange", - "org", - "organic", - "origins", - "osaka", - "otsuka", - "ott", - "ovh", - "pa", - "page", - "panasonic", - "paris", - "pars", - "partners", - "parts", - "passagens", - "pay", - "pccw", - "pe", - "pet", - "pf", - "pfizer", - "pg", - "ph", - "pharmacy", - "phd", - "philips", - "phone", - "photo", - "photography", - "photos", - "physio", - "pics", - "pictet", - "pictures", - "pid", - "pin", - "ping", - "pink", - "pioneer", - "pizza", - "pk", - "pl", - "place", - "play", - "playstation", - "plumbing", - "plus", - "pm", - "pn", - "pnc", - "pohl", - "poker", - "politie", - "porn", - "post", - "pr", - "pramerica", - "praxi", - "press", - "prime", - "pro", - "prod", - "productions", - "prof", - "progressive", - "promo", - "properties", - "property", - "protection", - "pru", - "prudential", - "ps", - "pt", - "pub", - "pw", - "pwc", - "py", - "qa", - "qpon", - "quebec", - "quest", - "racing", - "radio", - "raid", - "re", - "read", - "realestate", - "realtor", - "realty", - "recipes", - "red", - "redstone", - "redumbrella", - "rehab", - "reise", - "reisen", - "reit", - "reliance", - "ren", - "rent", - "rentals", - "repair", - "report", - "republican", - "rest", - "restaurant", - "review", - "reviews", - "rexroth", - "rich", - "richardli", - "ricoh", - "ril", - "rio", - "rip", - "ro", - "rocher", - "rocks", - "rodeo", - "rogers", - "room", - "rs", - "rsvp", - "ru", - "rugby", - "ruhr", - "run", - "rw", - "rwe", - "ryukyu", - "sa", - "saarland", - "safe", - "safety", - "sakura", - "sale", - "salon", - "samsclub", - "samsung", - "sandvik", - "sandvikcoromant", - "sanofi", - "sap", - "sarl", - "sas", - "save", - "saxo", - "sb", - "sbi", - "sbs", - "sc", - "sca", - "scb", - "schaeffler", - "schmidt", - "scholarships", - "school", - "schule", - "schwarz", - "science", - "scjohnson", - "scot", - "sd", - "se", - "search", - "seat", - "secure", - "security", - "seek", - "select", - "sener", - "services", - "ses", - "seven", - "sew", - "sex", - "sexy", - "sfr", - "sg", - "sh", - "shangrila", - "sharp", - "shaw", - "shell", - "shia", - "shiksha", - "shoes", - "shop", - "shopping", - "shouji", - "show", - "showtime", - "si", - "silk", - "sina", - "singles", - "site", - "sj", - "sk", - "ski", - "skin", - "sky", - "skype", - "sl", - "sling", - "sm", - "smart", - "smile", - "sn", - "sncf", - "so", - "soccer", - "social", - "softbank", - "software", - "sohu", - "solar", - "solutions", - "song", - "sony", - "soy", - "spa", - "space", - "sport", - "spot", - "sr", - "srl", - "ss", - "st", - "stada", - "staples", - "star", - "statebank", - "statefarm", - "stc", - "stcgroup", - "stockholm", - "storage", - "store", - "stream", - "studio", - "study", - "style", - "su", - "sucks", - "supplies", - "supply", - "support", - "surf", - "surgery", - "suzuki", - "sv", - "swatch", - "swiss", - "sx", - "sy", - "sydney", - "systems", - "sz", - "tab", - "taipei", - "talk", - "taobao", - "target", - "tatamotors", - "tatar", - "tattoo", - "tax", - "taxi", - "tc", - "tci", - "td", - "tdk", - "team", - "tech", - "technology", - "tel", - "temasek", - "tennis", - "teva", - "tf", - "tg", - "th", - "thd", - "theater", - "theatre", - "tiaa", - "tickets", - "tienda", - "tiffany", - "tips", - "tires", - "tirol", - "tj", - "tjmaxx", - "tjx", - "tk", - "tkmaxx", - "tl", - "tm", - "tmall", - "tn", - "to", - "today", - "tokyo", - "tools", - "top", - "toray", - "toshiba", - "total", - "tours", - "town", - "toyota", - "toys", - "tr", - "trade", - "trading", - "training", - "travel", - "travelchannel", - "travelers", - "travelersinsurance", - "trust", - "trv", - "tt", - "tube", - "tui", - "tunes", - "tushu", - "tv", - "tvs", - "tw", - "tz", - "ua", - "ubank", - "ubs", - "ug", - "uk", - "unicom", - "university", - "uno", - "uol", - "ups", - "us", - "uy", - "uz", - "va", - "vacations", - "vana", - "vanguard", - "vc", - "ve", - "vegas", - "ventures", - "verisign", - "versicherung", - "vet", - "vg", - "vi", - "viajes", - "video", - "vig", - "viking", - "villas", - "vin", - "vip", - "virgin", - "visa", - "vision", - "viva", - "vivo", - "vlaanderen", - "vn", - "vodka", - "volkswagen", - "volvo", - "vote", - "voting", - "voto", - "voyage", - "vu", - "vuelos", - "wales", - "walmart", - "walter", - "wang", - "wanggou", - "watch", - "watches", - "weather", - "weatherchannel", - "webcam", - "weber", - "website", - "wed", - "wedding", - "weibo", - "weir", - "wf", - "whoswho", - "wien", - "wiki", - "williamhill", - "win", - "windows", - "wine", - "winners", - "wme", - "wolterskluwer", - "woodside", - "work", - "works", - "world", - "wow", - "ws", - "wtc", - "wtf", - "xbox", - "xerox", - "xfinity", - "xihuan", - "xin", - "xn--11b4c3d", - "xn--1ck2e1b", - "xn--1qqw23a", - "xn--2scrj9c", - "xn--30rr7y", - "xn--3bst00m", - "xn--3ds443g", - "xn--3e0b707e", - "xn--3hcrj9c", - "xn--3pxu8k", - "xn--42c2d9a", - "xn--45br5cyl", - "xn--45brj9c", - "xn--45q11c", - "xn--4dbrk0ce", - "xn--4gbrim", - "xn--54b7fta0cc", - "xn--55qw42g", - "xn--55qx5d", - "xn--5su34j936bgsg", - "xn--5tzm5g", - "xn--6frz82g", - "xn--6qq986b3xl", - "xn--80adxhks", - "xn--80ao21a", - "xn--80aqecdr1a", - "xn--80asehdb", - "xn--80aswg", - "xn--8y0a063a", - "xn--90a3ac", - "xn--90ae", - "xn--90ais", - "xn--9dbq2a", - "xn--9et52u", - "xn--9krt00a", - "xn--b4w605ferd", - "xn--bck1b9a5dre4c", - "xn--c1avg", - "xn--c2br7g", - "xn--cck2b3b", - "xn--cckwcxetd", - "xn--cg4bki", - "xn--clchc0ea0b2g2a9gcd", - "xn--czr694b", - "xn--czrs0t", - "xn--czru2d", - "xn--d1acj3b", - "xn--d1alf", - "xn--e1a4c", - "xn--eckvdtc9d", - "xn--efvy88h", - "xn--fct429k", - "xn--fhbei", - "xn--fiq228c5hs", - "xn--fiq64b", - "xn--fiqs8s", - "xn--fiqz9s", - "xn--fjq720a", - "xn--flw351e", - "xn--fpcrj9c3d", - "xn--fzc2c9e2c", - "xn--fzys8d69uvgm", - "xn--g2xx48c", - "xn--gckr3f0f", - "xn--gecrj9c", - "xn--gk3at1e", - "xn--h2breg3eve", - "xn--h2brj9c", - "xn--h2brj9c8c", - "xn--hxt814e", - "xn--i1b6b1a6a2e", - "xn--imr513n", - "xn--io0a7i", - "xn--j1aef", - "xn--j1amh", - "xn--j6w193g", - "xn--jlq480n2rg", - "xn--jlq61u9w7b", - "xn--jvr189m", - "xn--kcrx77d1x4a", - "xn--kprw13d", - "xn--kpry57d", - "xn--kput3i", - "xn--l1acc", - "xn--lgbbat1ad8j", - "xn--mgb9awbf", - "xn--mgba3a3ejt", - "xn--mgba3a4f16a", - "xn--mgba7c0bbn0a", - "xn--mgbaakc7dvf", - "xn--mgbaam7a8h", - "xn--mgbab2bd", - "xn--mgbah1a3hjkrd", - "xn--mgbai9azgqp6j", - "xn--mgbayh7gpa", - "xn--mgbbh1a", - "xn--mgbbh1a71e", - "xn--mgbc0a9azcg", - "xn--mgbca7dzdo", - "xn--mgbcpq6gpa1a", - "xn--mgberp4a5d4ar", - "xn--mgbgu82a", - "xn--mgbi4ecexp", - "xn--mgbpl2fh", - "xn--mgbt3dhd", - "xn--mgbtx2b", - "xn--mgbx4cd0ab", - "xn--mix891f", - "xn--mk1bu44c", - "xn--mxtq1m", - "xn--ngbc5azd", - "xn--ngbe9e0a", - "xn--ngbrx", - "xn--node", - "xn--nqv7f", - "xn--nqv7fs00ema", - "xn--nyqy26a", - "xn--o3cw4h", - "xn--ogbpf8fl", - "xn--otu796d", - "xn--p1acf", - "xn--p1ai", - "xn--pgbs0dh", - "xn--pssy2u", - "xn--q7ce6a", - "xn--q9jyb4c", - "xn--qcka1pmc", - "xn--qxa6a", - "xn--qxam", - "xn--rhqv96g", - "xn--rovu88b", - "xn--rvc1e0am3e", - "xn--s9brj9c", - "xn--ses554g", - "xn--t60b56a", - "xn--tckwe", - "xn--tiq49xqyj", - "xn--unup4y", - "xn--vermgensberater-ctb", - "xn--vermgensberatung-pwb", - "xn--vhquv", - "xn--vuq861b", - "xn--w4r85el8fhu5dnra", - "xn--w4rs40l", - "xn--wgbh1c", - "xn--wgbl6a", - "xn--xhq521b", - "xn--xkc2al3hye2a", - "xn--xkc2dl3a5ee0h", - "xn--y9a3aq", - "xn--yfro4i67o", - "xn--ygbi2ammx", - "xn--zfr164b", - "xxx", - "xyz", - "yachts", - "yahoo", - "yamaxun", - "yandex", - "ye", - "yodobashi", - "yoga", - "yokohama", - "you", - "youtube", - "yt", - "yun", - "za", - "zappos", - "zara", - "zero", - "zip", - "zm", - "zone", - "zuerich", - "zw", - "skiptocontent", - "pullrequests", - "issues", - "marketplace", - "explore", - "@andnasnd", - "shouldbee/", - "reserved-usernames", - "public", - "code", - "issues4", - "actions", - "projects", - "insights", - "about", - "access", - "account", - "accounts", - "activate", - "activities", - "activity", - "add", - "address", - "adm", - "admin", - "administration", - "administrator", - "advertising", - "affiliate", - "affiliates", - "ajax", - "all", - "alpha", - "analysis", - "anon", - "anonymous", - "api", - "apps", - "archive", - "archives", - "article", - "asct", - "asset", - "atom", - "auth", - "authentication", - "avatar", - "backup", - "balancer-manager", - "banner", - "banners", - "beta", - "billing", - "bin", - "blogs", - "board", - "bookmark", - "bots", - "bug", - "cache", - "cadastro", - "calendar", - "campaign", - "cancel", - "captcha", - "cart", - "categories", - "category", - "cgi", - "cgi-bin", - "changelog", - "check", - "checking", - "checkout", - "client", - "cliente", - "clients", - "codereview", - "comercial", - "comment", - "comments", - "communities", - "compras", - "config", - "configuration", - "connect", - "contact-us", - "contact_us", - "contactus", - "contest", - "contribute", - "corp", - "create", - "css", - "dashboard", - "db", - "default", - "delete", - "demo", - "designer", - "destroy", - "devel", - "developer", - "developers", - "diagram", - "diary", - "dict", - "dictionary", - "die", - "dir", - "direct_messages", - "dist", - "doc", - "documentation", - "domain", - "downloads", - "ecommerce", - "edit", - "editor", - "employment", - "empty", - "end", - "enterprise", - "entries", - "entry", - "error", - "errors", - "eval", - "event", - "everyone", - "exit", - "facebook", - "faq", - "favorite", - "favorites", - "feature", - "features", - "feed", - "feeds", - "file", - "files", - "first", - "flash", - "fleet", - "fleets", - "flog", - "follow", - "followers", - "following", - "forgot", - "form", - "forums", - "founder", - "friend", - "friends", - "ftp", - "gadget", - "gadgets", - "get", - "ghost", - "gist", - "github", - "graph", - "groups", - "guest", - "guests", - "home", - "homepage", - "hostmaster", - "hostname", - "howto", - "hpg", - "html", - "http", - "httpd", - "https", - "i", - "iamges", - "icon", - "icons", - "idea", - "ideas", - "image", - "images", - "imap", - "img", - "index", - "indice", - "information", - "inquiry", - "instagram", - "intranet", - "invitations", - "invite", - "ipad", - "iphone", - "irc", - "issue", - "item", - "items", - "javascript", - "job", - "join", - "js", - "json", - "jump", - "knowledgebase", - "language", - "languages", - "last", - "ldap-status", - "license", - "links", - "linux", - "list", - "lists", - "log", - "log-in", - "log-out", - "log_in", - "log_out", - "login", - "logout", - "logs", - "m", - "mac", - "mail", - "mail1", - "mail2", - "mail3", - "mail4", - "mail5", - "mailer", - "mailing", - "maintenance", - "manager", - "manual", - "maps", - "master", - "member", - "members", - "message", - "messages", - "messenger", - "microblog", - "microblogs", - "mine", - "mis", - "mob", - "movies", - "mp3", - "msg", - "msn", - "musicas", - "mysql", - "named", - "nan", - "navi", - "navigation", - "newsletter", - "nick", - "nickname", - "notes", - "noticias", - "notification", - "notifications", - "notify", - "ns", - "ns1", - "ns10", - "ns2", - "ns3", - "ns4", - "ns5", - "ns6", - "ns7", - "ns8", - "ns9", - "null", - "oauth", - "oauth_clients", - "offer", - "offers", - "official", - "old", - "openid", - "operator", - "order", - "orders", - "organization", - "organizations", - "overview", - "owner", - "owners", - "pager", - "pages", - "panel", - "password", - "payment", - "perl", - "photoalbum", - "php", - "phpmyadmin", - "phppgadmin", - "phpredisadmin", - "pic", - "plan", - "plans", - "plugin", - "plugins", - "policy", - "pop", - "pop3", - "popular", - "portal", - "postfix", - "postmaster", - "posts", - "premium", - "price", - "pricing", - "privacy", - "privacy-policy", - "privacy_policy", - "privacypolicy", - "private", - "product", - "products", - "profile", - "project", - "purpose", - "put", - "python", - "query", - "random", - "ranking", - "readme", - "recent", - "recruit", - "recruitment", - "register", - "registration", - "release", - "remove", - "replies", - "reports", - "repositories", - "repository", - "req", - "request", - "requests", - "reset", - "roc", - "root", - "rss", - "ruby", - "rule", - "sag", - "sales", - "sample", - "samples", - "script", - "scripts", - "self", - "send", - "server", - "server-info", - "server-status", - "service", - "session", - "sessions", - "setting", - "settings", - "setup", - "share", - "sign-in", - "sign-up", - "sign_in", - "sign_up", - "signin", - "signout", - "signup", - "sitemap", - "sites", - "smartphone", - "smtp", - "soporte", - "source", - "spec", - "special", - "sql", - "src", - "ssh", - "ssl", - "ssladmin", - "ssladministrator", - "sslwebmaster", - "staff", - "stage", - "staging", - "start", - "stat", - "state", - "static", - "stats", - "status", - "stores", - "stories", - "styleguide", - "stylesheet", - "stylesheets", - "subdomain", - "subscribe", - "subscriptions", - "suporte", - "svn", - "swf", - "sys", - "sysadmin", - "sysadministrator", - "system", - "tablet", - "tablets", - "tag", - "task", - "tasks", - "teams", - "telnet", - "term", - "terms", - "terms-of-service", - "terms_of_service", - "termsofservice", - "test", - "test1", - "test2", - "test3", - "teste", - "testing", - "tests", - "theme", - "themes", - "thread", - "threads", - "tmp", - "todo", - "tool", - "topic", - "topics", - "tos", - "tour", - "translations", - "trends", - "tutorial", - "tux", - "twitter", - "undef", - "unfollow", - "unsubscribe", - "update", - "upload", - "uploads", - "url", - "usage", - "user", - "username", - "users", - "usuario", - "vendas", - "ver", - "version", - "videos", - "visitor", - "web", - "webhook", - "webhooks", - "webmail", - "webmaster", - "websites", - "welcome", - "widget", - "widgets", - "word", - "workshop", - "ww", - "wws", - "www", - "www1", - "www2", - "www3", - "www4", - "www5", - "www6", - "www7", - "wwws", - "wwww", - "xfn", - "xml", - "xmpp", - "xpg", - "yaml", - "year", - "yml", - "yourdomain", - "yourname", - "yoursite", - "yourusername", - "genesis" -] diff --git a/services/identity/src/client_service.rs b/services/identity/src/client_service.rs --- a/services/identity/src/client_service.rs +++ b/services/identity/src/client_service.rs @@ -3,6 +3,7 @@ // External crate imports use comm_lib::aws::DynamoDBError; +use comm_lib::shared::reserved_users::RESERVED_USERNAME_SET; use comm_opaque2::grpc::protocol_error_to_grpc_status; use moka::future::Cache; use rand::rngs::OsRng; @@ -111,7 +112,7 @@ return Err(tonic::Status::already_exists("username already exists")); } - if CONFIG.reserved_usernames.contains(&message.username) + if RESERVED_USERNAME_SET.contains(&message.username) || is_valid_ethereum_address(&message.username) { return Err(tonic::Status::invalid_argument("username reserved")); @@ -151,7 +152,7 @@ let message = request.into_inner(); self.check_username_taken(&message.username).await?; - if CONFIG.reserved_usernames.contains(&message.username) { + if RESERVED_USERNAME_SET.contains(&message.username) { return Err(tonic::Status::invalid_argument("username reserved")); } diff --git a/services/identity/src/config.rs b/services/identity/src/config.rs --- a/services/identity/src/config.rs +++ b/services/identity/src/config.rs @@ -68,8 +68,6 @@ pub localstack_endpoint: Option, // Opaque 2.0 server secrets pub server_setup: comm_opaque2::ServerSetup, - // Reserved usernames - pub reserved_usernames: HashSet, pub keyserver_public_key: Option, pub tunnelbroker_endpoint: String, pub opensearch_endpoint: String, @@ -93,7 +91,6 @@ path_buf.push(SECRETS_SETUP_FILE); let server_setup = get_server_setup(path_buf.as_path())?; - let reserved_usernames = get_reserved_usernames_set()?; let keyserver_public_key = env::var(KEYSERVER_PUBLIC_KEY).ok(); Ok(Self { @@ -101,7 +98,6 @@ tunnelbroker_endpoint: cli.tunnelbroker_endpoint.clone(), opensearch_endpoint: cli.opensearch_endpoint.clone(), server_setup, - reserved_usernames, keyserver_public_key, }) } @@ -162,12 +158,3 @@ comm_opaque2::ServerSetup::deserialize(&decoded_server_setup) .map_err(Error::Opaque) } - -fn get_reserved_usernames_set() -> Result, Error> { - // All entries in `reserved_usernames.json` must be lowercase and must also be - // included in `lib/utils/reserved-users.js`!! - let contents = include_str!("../reserved_usernames.json"); - let reserved_usernames: Vec = serde_json::from_str(contents)?; - - Ok(reserved_usernames.into_iter().collect()) -} diff --git a/shared/comm-lib/Cargo.lock b/shared/comm-lib/Cargo.lock --- a/shared/comm-lib/Cargo.lock +++ b/shared/comm-lib/Cargo.lock @@ -981,6 +981,7 @@ "grpc_clients", "hex", "http", + "once_cell", "rand", "reqwest", "serde", diff --git a/shared/comm-lib/Cargo.toml b/shared/comm-lib/Cargo.toml --- a/shared/comm-lib/Cargo.toml +++ b/shared/comm-lib/Cargo.toml @@ -62,3 +62,4 @@ # crypto dependencies aes-gcm = { version = "0.10", optional = true } aead = { version = "0.5", features = ["bytes"], optional = true } +once_cell = "1.17" diff --git a/shared/comm-lib/src/lib.rs b/shared/comm-lib/src/lib.rs --- a/shared/comm-lib/src/lib.rs +++ b/shared/comm-lib/src/lib.rs @@ -8,6 +8,7 @@ pub mod database; #[cfg(feature = "http")] pub mod http; +pub mod shared; pub mod tools; mod reexports { diff --git a/shared/comm-lib/src/shared/mod.rs b/shared/comm-lib/src/shared/mod.rs new file mode 100644 --- /dev/null +++ b/shared/comm-lib/src/shared/mod.rs @@ -0,0 +1 @@ +pub mod reserved_users; diff --git a/services/blob/reserved_usernames.json b/shared/comm-lib/src/shared/reserved_usernames.json rename from services/blob/reserved_usernames.json rename to shared/comm-lib/src/shared/reserved_usernames.json diff --git a/shared/comm-lib/src/shared/reserved_users.rs b/shared/comm-lib/src/shared/reserved_users.rs new file mode 100644 --- /dev/null +++ b/shared/comm-lib/src/shared/reserved_users.rs @@ -0,0 +1,13 @@ +use once_cell::sync::Lazy; +use std::collections::HashSet; + +fn get_reserved_usernames_set() -> HashSet { + // All entries in `reserved_usernames.json` must be lowercase and must also be + // included in `lib/utils/reserved-users.js`!! + let contents = include_str!("reserved_usernames.json"); + let reserved_usernames: Vec = serde_json::from_str(contents).unwrap(); + + reserved_usernames.into_iter().collect() +} +pub static RESERVED_USERNAME_SET: Lazy> = + Lazy::new(get_reserved_usernames_set);