Skip to content

Commit f3bc04a

Browse files
committed
Update bucket name validation (merge commit)
Merge branch 'feature/update-bucket-creation' into 'main' * Switch to stricter bucket name validation See merge request https://gitlab.ci.csc.fi/sds-dev/sd-connect/swift-browser-ui/-/merge_requests/450 Reviewed-by: Sampsa Penna <sapenna@csc.fi> Approved-by: Timo Nurminen <tnurmine@csc.fi> Merged by Monika Radaviciute <mradavic@csc.fi>
2 parents 9ce26ef + 8a9b415 commit f3bc04a

File tree

9 files changed

+264
-96
lines changed

9 files changed

+264
-96
lines changed

.github/config/.finnishwords.txt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1+
aakkosia
12
aika
23
aikana
34
aina
45
ajaksi
6+
aksenttimerkkejä
57
aktiiviset
68
alapuolisesta
79
alaviiva
10+
alkaa
811
alkanut
912
alla
1013
aloitettiin
@@ -109,6 +112,7 @@ ilmoittaa
109112
ilmoittaminen
110113
ilmoituksen
111114
informaatio
115+
isot
112116
ja
113117
jaa
114118
jaan
@@ -173,6 +177,7 @@ jäsenet
173177
jäsenille
174178
jäsenten
175179
kaikille
180+
kaikissa
176181
kaikki
177182
kaikkien
178183
kansio
@@ -199,6 +204,7 @@ kelvollisia
199204
kenttää
200205
kentällä
201206
kerran
207+
kesken
202208
keskeyttää
203209
keskus
204210
kestää
@@ -207,6 +213,8 @@ kielletty
207213
kiellettyä
208214
kielletyn
209215
kiinni
216+
kirjaimella
217+
kirjaimet
210218
kirjaudu
211219
kirjautua
212220
kirjautuaksesi
@@ -308,10 +316,12 @@ laskutuksesta
308316
laskutusyksiköiden
309317
laskutusysiköiden
310318
lataa
319+
lataamisen
311320
latauksen
312321
lataukset
313322
lataus
314323
latauslinkki
324+
latinalaisia
315325
leikepöydälle
316326
liiku
317327
liitä
@@ -332,9 +342,11 @@ luettelo
332342
luku
333343
lukuoikeus
334344
luo
345+
luodaan
335346
luomisen
336347
luonnin
337348
luonti
349+
luottamuksellisia
338350
luotu
339351
lupa
340352
lähetettiin
@@ -404,14 +416,18 @@ navigoitaessa
404416
ne
405417
niiden
406418
niin
419+
niissä
407420
nimellä
408421
nimen
409422
nimet
410423
nimetä
411424
nimeä
412425
nimi
426+
nimiä
413427
numeroinen
414428
numeroisen
429+
numeroita
430+
numerolla
415431
nykyinen
416432
nykyisen
417433
nykyisiä
@@ -520,12 +536,15 @@ pelkästä
520536
peruuta
521537
peruutettu
522538
pian
539+
pienellä
523540
pienemmissä
524541
pienennä
525542
pienillä
543+
pieniä
526544
piilota
527545
piste
528546
pitkiä
547+
pitkä
529548
poiketa
530549
pois
531550
poissa
@@ -593,6 +612,7 @@ päivätty
593612
päänäkymään
594613
pääsy
595614
pääsyä
615+
päätasolle
596616
päättyä
597617
rajan
598618
rajattu
@@ -761,6 +781,7 @@ tiedot
761781
tieteen
762782
tieto
763783
tietoa
784+
tietoja
764785
tietosivulta
765786
tietotekniikan
766787
tietotekniikkakeskus
@@ -837,6 +858,7 @@ ulkopuolinen
837858
ulos
838859
umpeutui
839860
uniikin
861+
uniikki
840862
useiden
841863
useille
842864
useisiin
@@ -912,6 +934,7 @@ vuoksi
912934
vähintään
913935
väliaikaiseen
914936
väliaikaisten
937+
väliviivaa
915938
vältä
916939
yhdelle
917940
yhden
@@ -939,6 +962,7 @@ ylläpitäjälle
939962
ymmärrettävyys
940963
yritit
941964
yritä
965+
ämpäreiden
942966
ämpäreille
943967
ämpäreitä
944968
ämpäri
@@ -949,3 +973,4 @@ yritä
949973
ämpäristä
950974
ämpärit
951975
ämpäriä
976+
åäöé

swift_browser_ui_frontend/src/common/api.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,22 @@ export async function swiftCreateContainer(
375375
}
376376
}
377377

378+
export async function swiftCheckContainerExists(
379+
project,
380+
container,
381+
) {
382+
const fetchURL = new URL(
383+
"/api/".concat(
384+
encodeURI(project), "/",
385+
encodeURI(container),
386+
),
387+
document.location.origin,
388+
);
389+
const ret = await GET(fetchURL);
390+
if (ret.status === 200 || ret.status === 403) return true;
391+
if (ret.status === 404) return false;
392+
}
393+
378394
export async function swiftDeleteContainer(
379395
project,
380396
container,

swift_browser_ui_frontend/src/common/globalFunctions.js

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import store from "@/common/store";
22
import { taginputConfirmKeys } from "@/common/conv";
33
import { getDB } from "@/common/db";
4+
import { swiftCheckContainerExists } from "@/common/api";
45

56
export function toggleCreateBucketModal() {
67
store.commit("toggleCreateBucketModal", true);
@@ -135,27 +136,29 @@ export function getPaginationOptions(t) {
135136
return paginationOptions;
136137
}
137138

138-
export function validateBucketName(str, t, containers) {
139-
//minimum length 3 chars
140-
let error = "";
141-
//forbid !"#$%&'()*+,/:;<=>?@[\]^`{|}~ allow .-_
142-
const re = new RegExp("[!-,/:-@\\[-\\^`\\{-~]");
143-
if (str.length <= 2) {
144-
error = t("message.error.tooShort");
145-
}
146-
else if (str.match(re)) {
147-
error= t("message.error.forbiddenChars");
148-
}
149-
else if (str.endsWith("_segments")) {
150-
error= t("message.error.segments");
151-
}
152-
else {
153-
if (containers) {
154-
const found = containers.find(cont => cont.name === str);
155-
if (found) error = t("message.error.inUse");
156-
}
139+
export async function validateBucketName(input) {
140+
let result = {
141+
lowerCaseOrNum: undefined,
142+
inputLength: undefined,
143+
alphaNumHyphen: undefined,
144+
ownable: undefined,
145+
};
146+
if (!input) return result;
147+
148+
result.lowerCaseOrNum = !!(
149+
input[0].match(/[\p{L}0-9]/u) && input[0] === input[0].toLowerCase()
150+
);
151+
result.inputLength = input.length >= 3 && input.length <= 63;
152+
result.alphaNumHyphen = !!input.match(/^[a-z0-9-]+$/g);
153+
if (result.lowerCaseOrNum && result.inputLength && result.alphaNumHyphen) {
154+
const containerExists = await swiftCheckContainerExists(
155+
store.state.active.id, input);
156+
// In undefined case allow user to attempt bucket creation
157+
result.ownable = !containerExists;
158+
} else {
159+
result.ownable = false;
157160
}
158-
return error;
161+
return result;
159162
}
160163

161164
export function getCurrentISOtime(time) {

swift_browser_ui_frontend/src/common/lang.js

Lines changed: 44 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -250,20 +250,30 @@ let default_translations = {
250250
tagName: "Tags (optional)",
251251
tagPlaceholder: "# Add a tag and press enter",
252252
container_ops: {
253-
addContainer: "Create new bucket",
254-
norename:
255-
"Please note that bucket names cannot be modified " +
256-
"after creating a bucket.",
253+
addContainer: "Create a new bucket",
257254
createdBucket:
258255
"Created bucket will be shared with all project members in ",
259256
viewProjectMembers: "View project members",
260257
deleteNote: "Bucket must be empty before " + "it can be deleted.",
261258
deleteSuccess: "Bucket was deleted.",
262259
bucketName: "Bucket name",
263260
},
261+
nameValidation: {
262+
lowerCaseOrNum:
263+
"Bucket name should start with a lowercase letter or a number.",
264+
inputLength:
265+
"Bucket name should be between 3 and 63 characters long.",
266+
alphaNumHyphen1:
267+
"Use only lowercase Latin letters (a-z), numbers (0-9), and " +
268+
"hyphens (-).",
269+
alphaNumHyphen2: "Uppercase letters, underscore (_) and accent " +
270+
"letters with diacritics or special marks (åäöé) are not allowed.",
271+
ownable: "Bucket names must be unique across all existing buckets " +
272+
"in all projects.",
273+
},
264274
folders: {
265275
deleteNote:
266-
"Folders are deleted by deleting all " + "items in them.",
276+
"Folders are deleted by deleting all items in them.",
267277
deleteOneSuccess: "Folder was deleted.",
268278
deleteManySuccess: "Folders were deleted.",
269279
},
@@ -320,8 +330,15 @@ let default_translations = {
320330
encrypt: {
321331
uploadFiles: "Upload files",
322332
uploadDestination: "Destination bucket: ",
323-
upload_step1: "Create a new bucket",
324-
upload_step2: "Files to be uploaded",
333+
uploadStep1: {
334+
title: "Create a new bucket",
335+
createAtRoot: "Bucket is created at the root level of your project.",
336+
nonModifiable:
337+
"Bucket names cannot be changed after " +
338+
"creation or upload. Remember, all bucket names are public; " +
339+
"please do not include any confidential information.",
340+
},
341+
uploadStep2: "Files to be uploaded",
325342
multipleReceivers: "Additional encryption keys (public keys only)",
326343
pubkey: "Paste public key",
327344
pubkeyLabel: "Public keys (SHA-256)",
@@ -802,9 +819,6 @@ let default_translations = {
802819
tagPlaceholder: "# Lisää asiasana ja paina rivinvaihtoa",
803820
container_ops: {
804821
addContainer: "Luo uusi ämpäri",
805-
norename:
806-
"Ämpäriä ei voi nimetä uudelleen, " +
807-
"mutta sen voi kopioida uudella nimellä.",
808822
createdBucket: "Luotu ämpäri jaetaan kaikille jäsenille projektissa ",
809823
viewProjectMembers: "Näytä projektin jäsenet",
810824
deleteNote:
@@ -813,6 +827,18 @@ let default_translations = {
813827
deleteSuccess: "Ämpäri poistettu",
814828
bucketName: "Ämpärin nimi",
815829
},
830+
nameValidation: {
831+
lowerCaseOrNum:
832+
"Ämpärin nimi alkaa pienellä kirjaimella tai numerolla.",
833+
inputLength: "Ämpärin nimi on 3-63 merkkiä pitkä.",
834+
alphaNumHyphen1: "Käytä vain latinalaisia pieniä aakkosia (a-z), " +
835+
"numeroita (0-9) ja väliviivaa (-).",
836+
alphaNumHyphen2: "Isot kirjaimet, alaviiva (_) ja kirjaimet, " +
837+
"joissa on aksenttimerkkejä tai erikoismerkkejä (åäöé) eivät " +
838+
"ole sallittuja.",
839+
ownable: "Ämpärin nimen tulee olla uniikki kaikkien ämpäreiden " +
840+
"kesken kaikissa projekteissa.",
841+
},
816842
folders: {
817843
deleteNote:
818844
"Kansion poistaminen edellyttää sen kaikkien " +
@@ -874,8 +900,14 @@ let default_translations = {
874900
encrypt: {
875901
uploadFiles: "Lataa tiedostoja",
876902
uploadDestination: "Kohdeämpäri: ",
877-
upload_step1: "Luo uusi ämpäri",
878-
upload_step2: "Ladattavat tiedostot",
903+
uploadStep1: {
904+
title: "Luo uusi ämpäri",
905+
createAtRoot: "Ämpäri luodaan projektin päätasolle.",
906+
nonModifiable: "Ämpärin nimiä ei voi " +
907+
"muokata luomisen tai lataamisen jälkeen. Ämpäreiden nimet ovat " +
908+
"julkisia ja niissä ei tulisi käyttää luottamuksellisia tietoja.",
909+
},
910+
uploadStep2: "Ladattavat tiedostot",
879911
multipleReceivers: "Lisää salausavaimia (vain julkiset avaimet)",
880912
addkey: "Lisää avain",
881913
pubkey: "Liitä julkinen avain",

0 commit comments

Comments
 (0)