Path: blob/main/components/common-go/namegen/workspaceid.go
2496 views
// Copyright (c) 2020 Gitpod GmbH. All rights reserved.1// Licensed under the GNU Affero General Public License (AGPL).2// See License.AGPL.txt in the project root for license information.34package namegen56import (7"crypto/rand"8"errors"9"fmt"10"math/big"11"regexp"12"strings"13)1415// PossibleWorkspaceIDPatterns16// gitpod-protocol/src/util/generate-workspace-id.ts is authoritative over the generation17// ws-proxy/pkg/proxy/workspacerouter.go is authoritative for this regexp18var PossibleWorkspaceIDPatterns = []string{19"[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}",20"[0-9a-z]{2,16}-[0-9a-z]{2,16}-[0-9a-z]{8,11}",21}2223var workspaceIDPattern = regexp.MustCompile(getWorkspaceIDPatternStr())2425// getWorkspaceIDPatternStr is the expected Workspace ID pattern str26// ^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$|^[0-9a-z]{2,16}-[0-9a-z]{2,16}-[0-9a-z]{8,11}$27func getWorkspaceIDPatternStr() string {28patterns := []string{}29for _, p := range PossibleWorkspaceIDPatterns {30patterns = append(patterns, fmt.Sprintf("^%s$", p))31}32return strings.Join(patterns, "|")33}3435func GenerateWorkspaceID() (string, error) {36s1, err := chooseRandomly(colors, 1)37if err != nil {38return "", err39}40s2, err := chooseRandomly(animals, 1)41if err != nil {42return "", err43}44s3, err := chooseRandomly(characters, 11)45if err != nil {46return "", err47}4849return strings.Join([]string{s1, s2, s3}, "-"), nil50}5152var (53InvalidWorkspaceID = errors.New("workspace id does not match required format")54)5556func ValidateWorkspaceID(id string) error {57if !workspaceIDPattern.MatchString(id) {58return fmt.Errorf("id '%s' does not match workspace ID regex '%s': %w", id, workspaceIDPattern.String(), InvalidWorkspaceID)59}6061return nil62}6364func chooseRandomly(options []string, length int) (res string, err error) {65l := big.NewInt(int64(len(options)))66for i := 0; i < length; i++ {67c, err := rand.Int(rand.Reader, l)68if err != nil {69return "", err70}71res += options[int(c.Int64())]72}73return res, nil74}7576var characters = strings.Split("abcdefghijklmnopqrstuvwxyz0123456789", "")7778var colors = []string{79"amaranth",80"amber",81"amethyst",82"apricot",83"aqua",84"aquamarine",85"azure",86"beige",87"black",88"blue",89"blush",90"bronze",91"brown",92"chocolate",93"coffee",94"copper",95"coral",96"crimson",97"cyan",98"emerald",99"fuchsia",100"gold",101"gray",102"green",103"harlequin",104"indigo",105"ivory",106"jade",107"kumquat",108"lavender",109"lime",110"magenta",111"maroon",112"moccasin",113"olive",114"orange",115"peach",116"pink",117"plum",118"purple",119"red",120"rose",121"salmon",122"sapphire",123"scarlet",124"silver",125"tan",126"teal",127"tomato",128"turquoise",129"violet",130"white",131"yellow",132}133134var animals = []string{135"canidae",136"felidae",137"cat",138"cattle",139"dog",140"donkey",141"goat",142"horse",143"pig",144"rabbit",145"aardvark",146"aardwolf",147"albatross",148"alligator",149"alpaca",150"amphibian",151"anaconda",152"angelfish",153"anglerfish",154"ant",155"anteater",156"antelope",157"antlion",158"ape",159"aphid",160"armadillo",161"asp",162"baboon",163"badger",164"bandicoot",165"barnacle",166"barracuda",167"basilisk",168"bass",169"bat",170"bear",171"beaver",172"bedbug",173"bee",174"beetle",175"bird",176"bison",177"blackbird",178"boa",179"boar",180"bobcat",181"bobolink",182"bonobo",183"booby",184"bovid",185"bug",186"butterfly",187"buzzard",188"camel",189"canid",190"capybara",191"cardinal",192"caribou",193"carp",194"cat",195"catshark",196"caterpillar",197"catfish",198"cattle",199"centipede",200"cephalopod",201"chameleon",202"cheetah",203"chickadee",204"chicken",205"chimpanzee",206"chinchilla",207"chipmunk",208"clam",209"clownfish",210"cobra",211"cockroach",212"cod",213"condor",214"constrictor",215"coral",216"cougar",217"cow",218"coyote",219"crab",220"crane",221"crawdad",222"crayfish",223"cricket",224"crocodile",225"crow",226"cuckoo",227"cicada",228"damselfly",229"deer",230"dingo",231"dinosaur",232"dodo",233"dog",234"dolphin",235"donkey",236"dormouse",237"dove",238"dragonfly",239"dragon",240"duck",241"eagle",242"earthworm",243"earwig",244"echidna",245"eel",246"egret",247"elephant",248"elk",249"emu",250"ermine",251"falcon",252"ferret",253"finch",254"firefly",255"fish",256"flamingo",257"flea",258"fly",259"flyingfish",260"fowl",261"fox",262"frog",263"gamefowl",264"galliform",265"gazelle",266"gecko",267"gerbil",268"gibbon",269"giraffe",270"goat",271"goldfish",272"goose",273"gopher",274"gorilla",275"grasshopper",276"grouse",277"guan",278"guanaco",279"guineafowl",280"gull",281"guppy",282"haddock",283"halibut",284"hamster",285"hare",286"harrier",287"hawk",288"hedgehog",289"heron",290"herring",291"hippopotamus",292"hookworm",293"hornet",294"horse",295"hoverfly",296"hummingbird",297"hyena",298"iguana",299"impala",300"jackal",301"jaguar",302"jay",303"jellyfish",304"junglefowl",305"kangaroo",306"kingfisher",307"kite",308"kiwi",309"koala",310"koi",311"krill",312"ladybug",313"lamprey",314"landfowl",315"lark",316"leech",317"lemming",318"lemur",319"leopard",320"leopon",321"limpet",322"lion",323"lizard",324"llama",325"lobster",326"locust",327"loon",328"louse",329"lungfish",330"lynx",331"macaw",332"mackerel",333"magpie",334"mammal",335"manatee",336"mandrill",337"marlin",338"marmoset",339"marmot",340"marsupial",341"marten",342"mastodon",343"meadowlark",344"meerkat",345"mink",346"minnow",347"mite",348"mockingbird",349"mole",350"mollusk",351"mongoose",352"monkey",353"moose",354"mosquito",355"moth",356"mouse",357"mule",358"muskox",359"narwhal",360"newt",361"nightingale",362"ocelot",363"octopus",364"opossum",365"orangutan",366"orca",367"ostrich",368"otter",369"owl",370"ox",371"panda",372"panther",373"parakeet",374"parrot",375"parrotfish",376"partridge",377"peacock",378"peafowl",379"pelican",380"penguin",381"perch",382"pheasant",383"pig",384"pigeon",385"pike",386"pinniped",387"piranha",388"planarian",389"platypus",390"pony",391"porcupine",392"porpoise",393"possum",394"prawn",395"primate",396"ptarmigan",397"puffin",398"puma",399"python",400"quail",401"quelea",402"quokka",403"rabbit",404"raccoon",405"rat",406"rattlesnake",407"raven",408"reindeer",409"reptile",410"rhinoceros",411"roadrunner",412"rodent",413"rook",414"rooster",415"roundworm",416"sailfish",417"salamander",418"salmon",419"sawfish",420"scallop",421"scorpion",422"seahorse",423"shark",424"sheep",425"shrew",426"shrimp",427"silkworm",428"silverfish",429"skink",430"skunk",431"sloth",432"slug",433"smelt",434"snail",435"snake",436"snipe",437"sole",438"sparrow",439"spider",440"spoonbill",441"squid",442"squirrel",443"starfish",444"stingray",445"stoat",446"stork",447"sturgeon",448"swallow",449"swan",450"swift",451"swordfish",452"swordtail",453"tahr",454"takin",455"tapir",456"tarantula",457"tarsier",458"termite",459"tern",460"thrush",461"tick",462"tiger",463"tiglon",464"toad",465"tortoise",466"toucan",467"trout",468"tuna",469"turkey",470"turtle",471"tyrannosaurus",472"urial",473"vicuna",474"viper",475"vole",476"vulture",477"wallaby",478"walrus",479"wasp",480"warbler",481"weasel",482"whale",483"whippet",484"whitefish",485"wildcat",486"wildebeest",487"wildfowl",488"wolf",489"wolverine",490"wombat",491"woodpecker",492"worm",493"wren",494"xerinae",495"yak",496"zebra",497"alpaca",498"cat",499"cattle",500"chicken",501"dog",502"donkey",503"ferret",504"gayal",505"goldfish",506"guppy",507"horse",508"koi",509"llama",510"sheep",511"yak",512"unicorn",513}514515516