2020-07-23 11:57:44 +03:00
|
|
|
import * as Strings from "~/common/strings";
|
|
|
|
|
2020-11-15 19:41:35 +03:00
|
|
|
import JSZip from "jszip";
|
|
|
|
|
2020-07-23 11:57:44 +03:00
|
|
|
const USERNAME_REGEX = new RegExp("^[a-zA-Z0-9_]{0,}[a-zA-Z]+[0-9]*$");
|
|
|
|
const MIN_PASSWORD_LENGTH = 8;
|
2020-09-17 02:26:15 +03:00
|
|
|
const EMAIL_REGEX = /^[\w-]+@[a-zA-Z0-9_]+?\.[a-zA-Z]{2,50}$/;
|
2020-08-07 02:28:54 +03:00
|
|
|
|
2020-08-07 02:36:03 +03:00
|
|
|
// TODO(jim): Regex should cover some of this.
|
|
|
|
const REJECT_LIST = [
|
2020-08-07 02:28:54 +03:00
|
|
|
"..",
|
2020-11-16 11:07:11 +03:00
|
|
|
"$",
|
|
|
|
"#",
|
2020-08-07 02:06:54 +03:00
|
|
|
"_",
|
2020-08-07 02:36:03 +03:00
|
|
|
"_next",
|
|
|
|
"next",
|
|
|
|
"webpack",
|
2020-08-19 09:15:14 +03:00
|
|
|
"system",
|
|
|
|
"experience",
|
2020-08-07 02:06:54 +03:00
|
|
|
"root",
|
|
|
|
"www",
|
|
|
|
"website",
|
|
|
|
"index",
|
|
|
|
"api",
|
|
|
|
"public",
|
|
|
|
"static",
|
|
|
|
"admin",
|
|
|
|
"administrator",
|
|
|
|
"webmaster",
|
2020-09-22 20:21:58 +03:00
|
|
|
"download",
|
|
|
|
"downloads",
|
2020-08-07 02:06:54 +03:00
|
|
|
"403",
|
|
|
|
"404",
|
|
|
|
"500",
|
2020-08-19 21:17:12 +03:00
|
|
|
"maintenance",
|
2020-09-21 22:39:36 +03:00
|
|
|
"guidelines",
|
2020-08-19 21:17:12 +03:00
|
|
|
"updates",
|
2020-08-07 02:06:54 +03:00
|
|
|
"login",
|
2020-08-07 02:28:54 +03:00
|
|
|
"authenticate",
|
2020-08-07 02:06:54 +03:00
|
|
|
"sign-in",
|
2020-08-07 02:28:54 +03:00
|
|
|
"sign_in",
|
2020-08-07 02:06:54 +03:00
|
|
|
"signin",
|
|
|
|
"log-in",
|
2020-08-07 02:28:54 +03:00
|
|
|
"log_in",
|
2020-08-07 02:06:54 +03:00
|
|
|
"logout",
|
2020-09-04 10:16:59 +03:00
|
|
|
"terms",
|
|
|
|
"terms-of-service",
|
|
|
|
"community",
|
|
|
|
"privacy",
|
|
|
|
"reset-password",
|
|
|
|
"reset",
|
|
|
|
"logout",
|
|
|
|
"dashboard",
|
|
|
|
"analytics",
|
|
|
|
"data",
|
2020-10-05 05:17:08 +03:00
|
|
|
"timeout",
|
|
|
|
"please-dont-use-timeout",
|
2020-08-07 02:06:54 +03:00
|
|
|
];
|
2020-07-23 11:57:44 +03:00
|
|
|
|
2020-08-07 02:36:03 +03:00
|
|
|
export const userRoute = (text) => {
|
|
|
|
if (!USERNAME_REGEX.test(text)) {
|
2020-07-23 11:57:44 +03:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2020-08-07 02:36:03 +03:00
|
|
|
if (REJECT_LIST.includes(text)) {
|
2020-07-23 11:57:44 +03:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2020-08-07 02:36:03 +03:00
|
|
|
return true;
|
|
|
|
};
|
|
|
|
|
2020-09-06 05:42:30 +03:00
|
|
|
export const slatename = (text) => {
|
|
|
|
if (Strings.isEmpty(text)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (text.length > 48) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
};
|
|
|
|
|
2020-08-07 02:36:03 +03:00
|
|
|
export const username = (text) => {
|
|
|
|
if (Strings.isEmpty(text)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2020-09-13 01:08:36 +03:00
|
|
|
if (text.length > 48 || text.length < 1) {
|
2020-09-06 05:42:30 +03:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2020-08-07 02:36:03 +03:00
|
|
|
if (!userRoute(text)) {
|
2020-08-07 02:06:54 +03:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2020-07-23 11:57:44 +03:00
|
|
|
return true;
|
|
|
|
};
|
|
|
|
|
|
|
|
export const password = (text) => {
|
|
|
|
if (Strings.isEmpty(text)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (text.length < MIN_PASSWORD_LENGTH) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
};
|
2020-08-02 09:00:04 +03:00
|
|
|
|
|
|
|
export const isFileTypeAllowed = (type = "") => {
|
2020-09-16 12:16:46 +03:00
|
|
|
console.log({ type });
|
|
|
|
|
2020-09-08 08:23:22 +03:00
|
|
|
if (type.startsWith("text/")) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2020-09-16 12:16:46 +03:00
|
|
|
if (type.startsWith("model/")) {
|
2020-09-08 08:23:22 +03:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2020-09-16 12:16:46 +03:00
|
|
|
if (type.startsWith("font/")) {
|
2020-08-02 09:00:04 +03:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2020-09-16 12:16:46 +03:00
|
|
|
if (type.startsWith("application/")) {
|
2020-08-10 13:10:44 +03:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2020-08-04 06:15:24 +03:00
|
|
|
if (type.startsWith("audio/")) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2020-08-02 09:00:04 +03:00
|
|
|
if (type.startsWith("image/")) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2020-08-02 10:29:24 +03:00
|
|
|
if (type.startsWith("video/")) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2020-08-02 09:00:04 +03:00
|
|
|
return false;
|
|
|
|
};
|
2020-11-11 04:44:21 +03:00
|
|
|
|
|
|
|
export const isPreviewableImage = (type = "") => {
|
|
|
|
if (type.startsWith("image/svg")) return false;
|
|
|
|
|
|
|
|
return type.startsWith("image/");
|
|
|
|
};
|
2020-11-15 19:41:35 +03:00
|
|
|
|
|
|
|
export const isUnityFile = async (file) => {
|
2020-11-16 05:31:18 +03:00
|
|
|
try {
|
|
|
|
const zip = new JSZip();
|
2020-11-15 19:41:35 +03:00
|
|
|
|
2020-11-16 05:31:18 +03:00
|
|
|
const contents = await zip.loadAsync(file);
|
|
|
|
const fileNames = Object.keys(contents.files);
|
2020-11-15 19:41:35 +03:00
|
|
|
|
2020-11-16 05:31:18 +03:00
|
|
|
// NOTE(daniel): every Unity game file will have this file
|
|
|
|
const unityRegex = new RegExp(/unityloader.js/i);
|
2020-11-15 20:14:36 +03:00
|
|
|
|
2020-11-16 05:31:18 +03:00
|
|
|
return fileNames.some((file) => unityRegex.test(file));
|
|
|
|
} catch (e) {
|
|
|
|
return false;
|
|
|
|
}
|
2020-11-15 19:41:35 +03:00
|
|
|
};
|