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