Path: blob/master/src/packages/util/db-schema/name-rules.ts
1447 views
/* Checks that name satisfies the following constraints1Inspired by -- https://github.com/isiahmeadows/github-limits23Each function checks the basic rules, but NOT for uniqueness,4which requires a DB query.56If a rule fails, throws an Error.78The URL schema is910https://cocalc.com/[account name]/[project name]/[shared path name]1112We are only using these URL's for the share server.13We only use such a URL if all segments are specified.1415NOTE: at some point we considered using these url's for more than just16the share server, and maybe when some segments aren't specified. If we17did that, we have to have a lot more constraints on the segments, e.g.,18we can't allow "files" for the shared path name. But we are NOT doing19that.20*/2122import { is_valid_uuid_string } from "../misc";2324export function isReserved(name: string): boolean {25return RESERVED.has(name.toLowerCase());26}2728/*29Account name:30- between 1 and 39 characters31- doesn't start with a -32- only includes the characters 0-9,a-z,A-Z,-33- Don't allow uuid's.34- cannot include consecutive hyphens35*/36export function checkAccountName(name: string) {37if (name.length < 1) {38throw Error("name must have at least 1 character");39}40if (name.length > 39) {41throw Error("name must have at most 39 characters");42}43if (is_valid_uuid_string(name)) {44throw Error("name must not be a v4 UUID");45}46if (name.includes("--")) {47throw Error("name must not contain consecutive hyphens");48}49if (!/^[a-z\d](?:[a-z\d]|-(?=[a-z\d])){0,38}$/i.test(name)) {50throw Error(51"name must contain only a-z,A-Z,0-9, or -, and not start with hyphen.",52);53}54// Check for reserved names.55if (isReserved(name)) {56throw Error(`username "${name}" is reserved -- not available`);57}58}5960/*61Project name:6263- Max length: 100 characters64- All characters must be either a hyphen (-), a period (.), or alphanumeric65- Unique amongst projects with given owner (that's a separate db query)66*/67export function checkProjectName(name: string) {68if (name.length < 1) {69throw Error("name must have at least 1 character");70}71if (name.length > 100) {72throw Error("name must have at most 100 characters");73}74if (!/^[\.a-z\d](?:[\.a-z\d]|-(?=[\.a-z\d])){0,99}$/i.test(name)) {75throw Error(76"name must contain only a-z,A-Z,0-9, . or -, and not start with hyphen or have spaces.",77);78}79}8081/*82Public path name:8384- Max length: 100 characters85- All characters must be either a hyphen (-), a period (.), or alphanumeric86- Unique amongst public paths in a given project (a separate db query)87*/8889export function checkPublicPathName(name: string) {90if (name.length < 1) {91throw Error("name must have at least 1 character");92}93if (name.length > 100) {94throw Error("name must have at most 100 characters");95}96if (!/^[\.a-z\d](?:[\.a-z\d]|-(?=[\.a-z\d])){0,99}$/i.test(name)) {97throw Error(98"name must contain only a-z,A-Z,0-9, . or -, and not start with hyphen or have spaces.",99);100}101}102103// Combined words from what we use, https://www.quora.com/How-do-sites-prevent-vanity-URLs-from-colliding-with-future-features104// and https://github.com/Mottie/github-reserved-names/blob/master/reserved-names.json and105// https://github.com/Mottie/github-reserved-names and random other things.106// If you add more and want to clean this up in the console, this may be helpful:107// Array.from(RESERVED).sort().join(' ')108const RESERVED = new Set(109`\1100111400112401113402114403115404116405117406118407119408120409121410122411123412124413125414126415127416128417129418130419131420132421133422134423135424136425137426138427139428140429141430142431143500144501145502146503147504148505149506150507151508152509153510154511155about156access157account158accounts159action160actions161activate162activities163activity164ad165add166address167adm168admin169administration170administrator171ads172adult173advertising174advisories175affiliate176affiliates177ajax178alive179all180alpha181analysis182analytics183android184anon185anonymous186any187api188app189apps190archive191archives192article193articles194asct195ask196asset197assets198atom199attributes200auth201authentication202avatar203backup204balancer-manager205banner206banners207beta208better209billing210bin211blob212blobs213blog214blogs215board216book217bookmark218bot219bots220bounty221branches222bug223business224businesses225c226cache227cadastro228calendar229call230campaign231cancel232captcha233career234careers235cart236case-studies237categories238category239cdn240central241certification242cgi243cgi-bin244changelog245chat246check247checking248checkout249cla250client251cliente252clients253cloud254cocalc255cocksucker256code257codereview258collection259collections260comercial261comment262comments263commit264commits265communities266community267companies268company269compare270compras271compute272conat273config274configuration275connect276contact277contact_us278contact-us279contactus280contest281contribute282contributing283cookbook284cookies285corp286coupon287coupons288create289crm290css291cunt292customer293customer-stories294customers295customize296dashboard297dashboards298data299db300default301delete302demo303design304designer305destroy306dev307devel308develop309developer310developers311diagram312diary313dict314dictionary315die316diff317dir318direct_messages319directory320discover321discussions322dist323doc324docs325documentation326domain327download328downloads329downtime330ecommerce331edit332editor333editors334edu335education336337embed338employment339empty340end341enterprise342entries343entry344error345errors346eval347event348events349exit350explore351352faq353favorite354favorites355feature356featured357features358feed359feedback360feeds361file362files363first364fixtures365flash366fleet367fleets368flog369follow370followers371following372font373fonts374forgot375forked376form377forum378forums379founder380free381friend382friends383ftp384fuck385gadget386gadgets387game388games389garage390get391ghost392gift393gifts394gist395gists396github397github.com398gitlab399gitlab.com400grafana401graph402graphs403group404groups405guest406guests407guide408guides409help410help-wanted411home412homepage413hooks414host415hosting416hostmaster417hostname418hovercards419howto420hpg421html422http423httpd424https425hub426i427iamges428icon429icons430id431idea432ideas433identity434image435images436imap437img438inbox439include440includes441index442indice443individual444info445information446inquiry447448integration449interfaces450intern451internal452intranet453introduction454invalid-email-address455investors456invitations457invite458invoice459ipad460iphone461irc462is463issue464issues465it466item467items468java469javascript470job471jobs472join473journal474journals475js476json477jump478knowledgebase479lab480labs481language482languages483last484launch485layouts486ldap-status487learn488legal489library490license491licenses492link493links494linux495list496listings497lists498log499log_in500log_out501log-in502log-out503login504logos505logout506logs507m508mac509510mail1511mail2512mail3513mail4514mail5515mailer516mailing517maintenance518malware519man520manager521manual522map523maps524marketing525marketplace526master527me528media529member530members531mention532mentioned533mentioning534mentions535message536messages537messenger538metrics539microblog540microblogs541migrating542milestones543mine544mirrors545mis546misc547mob548mobile549module550modules551monitor552motherfucker553movie554movies555mp3556msg557msn558music559musicas560mx561my562mysql563name564named565nan566navi567navigation568nbextensions569net570network571new572news573newsletter574nick575nickname576nocodb577node578nodes579none580nonprofit581nonprofits582notes583notices584noticias585notification586notifications587notify588ns589ns1590ns10591ns2592ns3593ns4594ns5595ns6596ns7597ns8598ns9599null600oauth601oauth_clients602offer603offers604office605official606old607online608open-source609openid610operator611order612orders613organisations614organization615organizations616orgs617overview618owner619owners620page621pager622pages623panel624partners625password626password-reset627payment628payments629perl630personal631phone632photo633photoalbum634photos635php636phpmyadmin637phppgadmin638phpredisadmin639pic640pics641ping642piss643plan644plans645plugin646plugins647policies648policy649poll650polls651pop652pop3653popular654popularity655portal656post657postfix658postmaster659posts660pr661premium662press663price664pricing665primus666privacy667privacy_policy668privacy-policy669privacypolicy670private671processes672product673products674professional675profile676profiles677project678projects679prometheus680promo681pub682public683pulls684purchase685purchases686purpose687put688python689query690random691ranking692raw693rdf694rdfs695read696readme697recent698recommendations699recruit700recruitment701redeem702register703registration704release705releases706remove707render708replies709reply710report711reports712repositories713repository714req715request716requests717reset718resources719restore720revert721roc722root723rss724ruby725rule726sag727sagemath728sagemathinc729sale730sales731sample732samples733save734save-net-neutrality735saved736school737scraping738script739scripts740search741secure742security743self744send745server746server-info747server-status748service749services750session751sessions752setting753settings754setup755share756shareholders757shit758shop759show760showcases761sign_in762sign_up763sign-in764sign-up765signin766signout767signup768site769sitemap770sites771smartphone772smtp773snapshots774software775soporte776source777spam778spec779special780sponsors781sql782src783ssh784ssl785ssladmin786ssladministrator787sslwebmaster788sso789staff790stage791staging792star793starred794stars795start796stat797state798static799statistics800stats801status802statuses803storage804store805stores806stories807style808styleguide809stylesheet810stylesheets811subdomain812subscribe813subscriptions814suggest815suggestion816suggestions817suporte818support819survey820surveys821suspended822svn823swf824sys825sysadmin826sysadministrator827system828tablet829tablets830tag831talk832talks833task834tasks835teach836teacher837teachers838teaching839team840teams841tech842telnet843template844templates845ten846term847terms848terms_of_service849terms-of-service850termsofservice851test852test1853test2854test3855teste856testimonials857testing858tests859theme860themes861thread862threads863timeline864timetravel865tits866tmp867todo868token869tool870tools871top872topic873topics874tos875tour876train877training878translations879tree880trending881trends882try883tutorial884tutorials885tux886tv887888twittr889undef890unfollow891unsubscribe892update893updates894upload895uploads896url897usage898user899username900users901usuario902vendas903ver904version905video906videos907visitor908visualization909voucher910vouchers911w912watch913watching914weather915web916webapp917webhook918webhooks919webmail920webmaster921website922websites923welcome924widget925widgets926wiki927win928windows929word930work931works932works-with933workshop934ww935wws936www937www0938www1939www2940www3941www4942www5943www6944www7945www8946www9947wwws948wwww949xfn950xml951xmpp952xpg953xxx954yaml955year956yml957you958yourdomain959yourname960yoursite961yourusername`.split("\n"),962);963964// for testing only965if (process.env["NODE_DEV"] === "TEST") {966exports.RESERVED = RESERVED;967}968969970