From e802fab87f94a13f397f04cfe6068f2f7ddf7888 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?=
 <barisusakli@gmail.com>
Date: Thu, 26 May 2022 12:12:19 -0400
Subject: [PATCH] fix: get rid of math.random in utils.generateUUID

---
 public/src/utils.common.js |  9 ---------
 public/src/utils.js        |  8 ++++++++
 src/utils.js               | 15 +++++++++++++++
 3 files changed, 23 insertions(+), 9 deletions(-)

diff --git a/public/src/utils.common.js b/public/src/utils.common.js
index 3860861ee0..da1c24c010 100644
--- a/public/src/utils.common.js
+++ b/public/src/utils.common.js
@@ -274,15 +274,6 @@ const HTMLEntities = Object.freeze({
 
 /* eslint-disable no-redeclare */
 const utils = {
-	generateUUID: function () {
-		/* eslint-disable no-bitwise */
-		return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
-			const r = Math.random() * 16 | 0;
-			const v = c === 'x' ? r : ((r & 0x3) | 0x8);
-			return v.toString(16);
-		});
-		/* eslint-enable no-bitwise */
-	},
 	// https://github.com/substack/node-ent/blob/master/index.js
 	decodeHTMLEntities: function (html) {
 		return String(html)
diff --git a/public/src/utils.js b/public/src/utils.js
index f57d68c354..50ed3960c2 100644
--- a/public/src/utils.js
+++ b/public/src/utils.js
@@ -73,4 +73,12 @@ utils.assertPasswordValidity = (password) => {
 	}
 };
 
+utils.generateUUID = function () {
+	// from https://github.com/tracker1/node-uuid4/blob/master/browser.js
+	const temp_url = URL.createObjectURL(new Blob());
+	const uuid = temp_url.toString();
+	URL.revokeObjectURL(temp_url);
+	return uuid.split(/[:\/]/g).pop().toLowerCase(); // remove prefixes
+};
+
 module.exports = utils;
diff --git a/src/utils.js b/src/utils.js
index 524730f221..3607f9b2d3 100644
--- a/src/utils.js
+++ b/src/utils.js
@@ -1,5 +1,7 @@
 'use strict';
 
+const crypto = require('crypto');
+
 process.profile = function (operation, start) {
 	console.log('%s took %d milliseconds', operation, process.elapsedTimeSince(start));
 };
@@ -14,4 +16,17 @@ utils.getLanguage = function () {
 	const meta = require('./meta');
 	return meta.config && meta.config.defaultLang ? meta.config.defaultLang : 'en-GB';
 };
+
+utils.generateUUID = function () {
+	// from https://github.com/tracker1/node-uuid4/blob/master/index.js
+	let rnd = crypto.randomBytes(16);
+	/* eslint-disable no-bitwise */
+	rnd[6] = (rnd[6] & 0x0f) | 0x40;
+	rnd[8] = (rnd[8] & 0x3f) | 0x80;
+	/* eslint-enable no-bitwise */
+	rnd = rnd.toString('hex').match(/(.{8})(.{4})(.{4})(.{4})(.{12})/);
+	rnd.shift();
+	return rnd.join('-');
+};
+
 module.exports = utils;