From f5da85049ce3ff99df842740a3d952ee2a08c223 Mon Sep 17 00:00:00 2001 From: AlexeySafronov Date: Tue, 9 Nov 2021 19:32:15 +0300 Subject: [PATCH] Fix Bug 53524 - Client.Profile|List: User's display name with diacritics invalid --- packages/asc-web-common/api/people/index.js | 14 + packages/asc-web-common/store/UserStore.js | 1 - packages/asc-web-common/utils/encoder.js | 1147 +++++++++++++++++++ 3 files changed, 1161 insertions(+), 1 deletion(-) create mode 100644 packages/asc-web-common/utils/encoder.js diff --git a/packages/asc-web-common/api/people/index.js b/packages/asc-web-common/api/people/index.js index ed914355e55..9fc205939fc 100644 --- a/packages/asc-web-common/api/people/index.js +++ b/packages/asc-web-common/api/people/index.js @@ -2,6 +2,7 @@ import { request } from "../client"; //import axios from "axios"; import Filter from "./filter"; import * as fakePeople from "./fake"; +import { Encoder } from "../../utils/encoder"; export function getUserList(filter = Filter.getDefault(), fake = false) { if (fake) { @@ -18,6 +19,14 @@ export function getUserList(filter = Filter.getDefault(), fake = false) { return request({ method: "get", url: `/people${params}`, + }).then((res) => { + res.items = res.items.map((user) => { + if (user && user.displayName) { + user.displayName = Encoder.htmlDecode(user.displayName); + } + return user; + }); + return res; }); } @@ -26,6 +35,11 @@ export function getUser(userName = null) { method: "get", url: `/people/${userName || "@self"}.json`, skipUnauthorized: true, + }).then((user) => { + if (user && user.displayName) { + user.displayName = Encoder.htmlDecode(user.displayName); + } + return user; }); } export function getUserPhoto(userId) { diff --git a/packages/asc-web-common/store/UserStore.js b/packages/asc-web-common/store/UserStore.js index d6ad2d5a679..3543df63ae4 100644 --- a/packages/asc-web-common/store/UserStore.js +++ b/packages/asc-web-common/store/UserStore.js @@ -23,7 +23,6 @@ class UserStore { getCurrentUser = async () => { const user = await api.people.getUser(); - this.setUser(user); }; diff --git a/packages/asc-web-common/utils/encoder.js b/packages/asc-web-common/utils/encoder.js new file mode 100644 index 00000000000..1f9b6f7ee62 --- /dev/null +++ b/packages/asc-web-common/utils/encoder.js @@ -0,0 +1,1147 @@ +/** + * Encoder + */ +export const Encoder = { + EncodeType: "entity", + isEmpty: function (val) { + if (val) { + return val === null || val.length == 0 || /^\s+$/.test(val); + } else { + return true; + } + }, + HTML2Numerical: function (s) { + var arr1 = new Array( + " ", + "¡", + "¢", + "£", + "¤", + "¥", + "¦", + "§", + "¨", + "©", + "ª", + "«", + "¬", + "­", + "®", + "¯", + "°", + "±", + "²", + "³", + "´", + "µ", + "¶", + "·", + "¸", + "¹", + "º", + "»", + "¼", + "½", + "¾", + "¿", + "à", + "á", + "â", + "ã", + "Ä", + "å", + "æ", + "ç", + "è", + "é", + "ê", + "ë", + "ì", + "í", + "î", + "ï", + "ð", + "ñ", + "ò", + "ó", + "ô", + "õ", + "Ö", + "×", + "ø", + "ù", + "ú", + "û", + "Ü", + "ý", + "þ", + "ß", + "à", + "á", + "â", + "ã", + "ä", + "å", + "æ", + "ç", + "è", + "é", + "ê", + "ë", + "ì", + "í", + "î", + "ï", + "ð", + "ñ", + "ò", + "ó", + "ô", + "õ", + "ö", + "÷", + "Ø", + "ù", + "ú", + "û", + "ü", + "ý", + "þ", + "ÿ", + """, + "&", + "<", + ">", + "œ", + "œ", + "š", + "š", + "ÿ", + "ˆ", + "˜", + " ", + " ", + " ", + "‌", + "‍", + "‎", + "‏", + "–", + "—", + "‘", + "’", + "‚", + "“", + "”", + "„", + "†", + "†", + "‰", + "‹", + "›", + "€", + "ƒ", + "α", + "β", + "γ", + "δ", + "ε", + "ζ", + "η", + "θ", + "ι", + "κ", + "λ", + "μ", + "ν", + "ξ", + "ο", + "π", + "ρ", + "σ", + "τ", + "υ", + "φ", + "χ", + "ψ", + "ω", + "α", + "β", + "γ", + "δ", + "ε", + "ζ", + "η", + "θ", + "ι", + "κ", + "λ", + "μ", + "ν", + "ξ", + "ο", + "π", + "ρ", + "ς", + "σ", + "τ", + "υ", + "φ", + "χ", + "ψ", + "ω", + "ϑ", + "ϒ", + "ϖ", + "•", + "…", + "′", + "′", + "‾", + "⁄", + "℘", + "ℑ", + "ℜ", + "™", + "ℵ", + "←", + "↑", + "→", + "↓", + "↔", + "↵", + "←", + "↑", + "→", + "↓", + "↔", + "∀", + "∂", + "∃", + "∅", + "∇", + "∈", + "∉", + "∋", + "∏", + "∑", + "−", + "∗", + "√", + "∝", + "∞", + "∠", + "∧", + "∨", + "∩", + "∪", + "∫", + "∴", + "∼", + "≅", + "≈", + "≠", + "≡", + "≤", + "≥", + "⊂", + "⊃", + "⊄", + "⊆", + "⊇", + "⊕", + "⊗", + "⊥", + "⋅", + "⌈", + "⌉", + "⌊", + "⌋", + "⟨", + "⟩", + "◊", + "♠", + "♣", + "♥", + "♦" + ); + var arr2 = new Array( + " ", + "¡", + "¢", + "£", + "¤", + "¥", + "¦", + "§", + "¨", + "©", + "ª", + "«", + "¬", + "­", + "®", + "¯", + "°", + "±", + "²", + "³", + "´", + "µ", + "¶", + "·", + "¸", + "¹", + "º", + "»", + "¼", + "½", + "¾", + "¿", + "À", + "Á", + "Â", + "Ã", + "Ä", + "Å", + "Æ", + "Ç", + "È", + "É", + "Ê", + "Ë", + "Ì", + "Í", + "Î", + "Ï", + "Ð", + "Ñ", + "Ò", + "Ó", + "Ô", + "Õ", + "Ö", + "×", + "Ø", + "Ù", + "Ú", + "Û", + "Ü", + "Ý", + "Þ", + "ß", + "à", + "á", + "â", + "ã", + "ä", + "å", + "æ", + "ç", + "è", + "é", + "ê", + "ë", + "ì", + "í", + "î", + "ï", + "ð", + "ñ", + "ò", + "ó", + "ô", + "õ", + "ö", + "÷", + "ø", + "ù", + "ú", + "û", + "ü", + "ý", + "þ", + "ÿ", + """, + "&", + "<", + ">", + "Œ", + "œ", + "Š", + "š", + "Ÿ", + "ˆ", + "˜", + " ", + " ", + " ", + "‌", + "‍", + "‎", + "‏", + "–", + "—", + "‘", + "’", + "‚", + "“", + "”", + "„", + "†", + "‡", + "‰", + "‹", + "›", + "€", + "ƒ", + "Α", + "Β", + "Γ", + "Δ", + "Ε", + "Ζ", + "Η", + "Θ", + "Ι", + "Κ", + "Λ", + "Μ", + "Ν", + "Ξ", + "Ο", + "Π", + "Ρ", + "Σ", + "Τ", + "Υ", + "Φ", + "Χ", + "Ψ", + "Ω", + "α", + "β", + "γ", + "δ", + "ε", + "ζ", + "η", + "θ", + "ι", + "κ", + "λ", + "μ", + "ν", + "ξ", + "ο", + "π", + "ρ", + "ς", + "σ", + "τ", + "υ", + "φ", + "χ", + "ψ", + "ω", + "ϑ", + "ϒ", + "ϖ", + "•", + "…", + "′", + "″", + "‾", + "⁄", + "℘", + "ℑ", + "ℜ", + "™", + "ℵ", + "←", + "↑", + "→", + "↓", + "↔", + "↵", + "⇐", + "⇑", + "⇒", + "⇓", + "⇔", + "∀", + "∂", + "∃", + "∅", + "∇", + "∈", + "∉", + "∋", + "∏", + "∑", + "−", + "∗", + "√", + "∝", + "∞", + "∠", + "∧", + "∨", + "∩", + "∪", + "∫", + "∴", + "∼", + "≅", + "≈", + "≠", + "≡", + "≤", + "≥", + "⊂", + "⊃", + "⊄", + "⊆", + "⊇", + "⊕", + "⊗", + "⊥", + "⋅", + "⌈", + "⌉", + "⌊", + "⌋", + "〈", + "〉", + "◊", + "♠", + "♣", + "♥", + "♦" + ); + return this.swapArrayVals(s, arr1, arr2); + }, + NumericalToHTML: function (s) { + var arr1 = new Array( + " ", + "¡", + "¢", + "£", + "¤", + "¥", + "¦", + "§", + "¨", + "©", + "ª", + "«", + "¬", + "­", + "®", + "¯", + "°", + "±", + "²", + "³", + "´", + "µ", + "¶", + "·", + "¸", + "¹", + "º", + "»", + "¼", + "½", + "¾", + "¿", + "À", + "Á", + "Â", + "Ã", + "Ä", + "Å", + "Æ", + "Ç", + "È", + "É", + "Ê", + "Ë", + "Ì", + "Í", + "Î", + "Ï", + "Ð", + "Ñ", + "Ò", + "Ó", + "Ô", + "Õ", + "Ö", + "×", + "Ø", + "Ù", + "Ú", + "Û", + "Ü", + "Ý", + "Þ", + "ß", + "à", + "á", + "â", + "ã", + "ä", + "å", + "æ", + "ç", + "è", + "é", + "ê", + "ë", + "ì", + "í", + "î", + "ï", + "ð", + "ñ", + "ò", + "ó", + "ô", + "õ", + "ö", + "÷", + "ø", + "ù", + "ú", + "û", + "ü", + "ý", + "þ", + "ÿ", + """, + "&", + "<", + ">", + "Œ", + "œ", + "Š", + "š", + "Ÿ", + "ˆ", + "˜", + " ", + " ", + " ", + "‌", + "‍", + "‎", + "‏", + "–", + "—", + "‘", + "’", + "‚", + "“", + "”", + "„", + "†", + "‡", + "‰", + "‹", + "›", + "€", + "ƒ", + "Α", + "Β", + "Γ", + "Δ", + "Ε", + "Ζ", + "Η", + "Θ", + "Ι", + "Κ", + "Λ", + "Μ", + "Ν", + "Ξ", + "Ο", + "Π", + "Ρ", + "Σ", + "Τ", + "Υ", + "Φ", + "Χ", + "Ψ", + "Ω", + "α", + "β", + "γ", + "δ", + "ε", + "ζ", + "η", + "θ", + "ι", + "κ", + "λ", + "μ", + "ν", + "ξ", + "ο", + "π", + "ρ", + "ς", + "σ", + "τ", + "υ", + "φ", + "χ", + "ψ", + "ω", + "ϑ", + "ϒ", + "ϖ", + "•", + "…", + "′", + "″", + "‾", + "⁄", + "℘", + "ℑ", + "ℜ", + "™", + "ℵ", + "←", + "↑", + "→", + "↓", + "↔", + "↵", + "⇐", + "⇑", + "⇒", + "⇓", + "⇔", + "∀", + "∂", + "∃", + "∅", + "∇", + "∈", + "∉", + "∋", + "∏", + "∑", + "−", + "∗", + "√", + "∝", + "∞", + "∠", + "∧", + "∨", + "∩", + "∪", + "∫", + "∴", + "∼", + "≅", + "≈", + "≠", + "≡", + "≤", + "≥", + "⊂", + "⊃", + "⊄", + "⊆", + "⊇", + "⊕", + "⊗", + "⊥", + "⋅", + "⌈", + "⌉", + "⌊", + "⌋", + "〈", + "〉", + "◊", + "♠", + "♣", + "♥", + "♦" + ); + var arr2 = new Array( + " ", + "¡", + "¢", + "£", + "¤", + "¥", + "¦", + "§", + "¨", + "©", + "ª", + "«", + "¬", + "­", + "®", + "¯", + "°", + "±", + "²", + "³", + "´", + "µ", + "¶", + "·", + "¸", + "¹", + "º", + "»", + "¼", + "½", + "¾", + "¿", + "à", + "á", + "â", + "ã", + "Ä", + "å", + "æ", + "ç", + "è", + "é", + "ê", + "ë", + "ì", + "í", + "î", + "ï", + "ð", + "ñ", + "ò", + "ó", + "ô", + "õ", + "Ö", + "×", + "ø", + "ù", + "ú", + "û", + "Ü", + "ý", + "þ", + "ß", + "à", + "á", + "â", + "ã", + "ä", + "å", + "æ", + "ç", + "è", + "é", + "ê", + "ë", + "ì", + "í", + "î", + "ï", + "ð", + "ñ", + "ò", + "ó", + "ô", + "õ", + "ö", + "÷", + "Ø", + "ù", + "ú", + "û", + "ü", + "ý", + "þ", + "ÿ", + """, + "&", + "<", + ">", + "œ", + "œ", + "š", + "š", + "ÿ", + "ˆ", + "˜", + " ", + " ", + " ", + "‌", + "‍", + "‎", + "‏", + "–", + "—", + "‘", + "’", + "‚", + "“", + "”", + "„", + "†", + "†", + "‰", + "‹", + "›", + "€", + "ƒ", + "α", + "β", + "γ", + "δ", + "ε", + "ζ", + "η", + "θ", + "ι", + "κ", + "λ", + "μ", + "ν", + "ξ", + "ο", + "π", + "ρ", + "σ", + "τ", + "υ", + "φ", + "χ", + "ψ", + "ω", + "α", + "β", + "γ", + "δ", + "ε", + "ζ", + "η", + "θ", + "ι", + "κ", + "λ", + "μ", + "ν", + "ξ", + "ο", + "π", + "ρ", + "ς", + "σ", + "τ", + "υ", + "φ", + "χ", + "ψ", + "ω", + "ϑ", + "ϒ", + "ϖ", + "•", + "…", + "′", + "′", + "‾", + "⁄", + "℘", + "ℑ", + "ℜ", + "™", + "ℵ", + "←", + "↑", + "→", + "↓", + "↔", + "↵", + "←", + "↑", + "→", + "↓", + "↔", + "∀", + "∂", + "∃", + "∅", + "∇", + "∈", + "∉", + "∋", + "∏", + "∑", + "−", + "∗", + "√", + "∝", + "∞", + "∠", + "∧", + "∨", + "∩", + "∪", + "∫", + "∴", + "∼", + "≅", + "≈", + "≠", + "≡", + "≤", + "≥", + "⊂", + "⊃", + "⊄", + "⊆", + "⊇", + "⊕", + "⊗", + "⊥", + "⋅", + "⌈", + "⌉", + "⌊", + "⌋", + "⟨", + "⟩", + "◊", + "♠", + "♣", + "♥", + "♦" + ); + return this.swapArrayVals(s, arr1, arr2); + }, + numEncode: function (s) { + if (this.isEmpty(s)) return ""; + var e = ""; + for (var i = 0; i < s.length; i++) { + var c = s.charAt(i); + if (c < " " || c > "~") { + c = "&#" + c.charCodeAt() + ";"; + } + e += c; + } + return e; + }, + htmlDecode: function (s) { + var c, + m, + d = s; + if (this.isEmpty(d)) return ""; + d = this.HTML2Numerical(d); + const arr = d.match(/&#[0-9]{1,5};/g); + if (arr != null) { + for (var x = 0; x < arr.length; x++) { + m = arr[x]; + c = m.substring(2, m.length - 1); + if (c >= -32768 && c <= 65535) { + d = d.replace(m, String.fromCharCode(c)); + } else { + d = d.replace(m, ""); + } + } + } + return d; + }, + htmlEncode: function (s, dbl) { + if (this.isEmpty(s)) return ""; + dbl = dbl | false; + if (dbl) { + if (this.EncodeType == "numerical") { + s = s.replace(/&/g, "&"); + } else { + s = s.replace(/&/g, "&"); + } + } + s = this.XSSEncode(s, false); + if (this.EncodeType == "numerical" || !dbl) { + s = this.HTML2Numerical(s); + } + s = this.numEncode(s); + if (!dbl) { + s = s.replace(/&#/g, "##AMPHASH##"); + if (this.EncodeType == "numerical") { + s = s.replace(/&/g, "&"); + } else { + s = s.replace(/&/g, "&"); + } + s = s.replace(/##AMPHASH##/g, "&#"); + } + s = s.replace(/&#\d*([^\d;]|$)/g, "$1"); + if (!dbl) { + s = this.correctEncoding(s); + } + if (this.EncodeType == "entity") { + s = this.NumericalToHTML(s); + } + return s; + }, + XSSEncode: function (s, en) { + if (!this.isEmpty(s)) { + en = en || true; + if (en) { + s = s.replace(/\'/g, "'"); + s = s.replace(/\"/g, """); + s = s.replace(//g, ">"); + } else { + s = s.replace(/\'/g, "'"); + s = s.replace(/\"/g, """); + s = s.replace(//g, ">"); + } + return s; + } else { + return ""; + } + }, + hasEncoded: function (s) { + if (/&#[0-9]{1,5};/g.test(s)) { + return true; + } else if (/&[A-Z]{2,6};/gi.test(s)) { + return true; + } else { + return false; + } + }, + stripUnicode: function (s) { + return s.replace(/[^\x20-\x7E]/g, ""); + }, + correctEncoding: function (s) { + return s.replace(/(&)(amp;)+/, "$1"); + }, + swapArrayVals: function (s, arr1, arr2) { + if (this.isEmpty(s)) return ""; + var re; + if (arr1 && arr2) { + if (arr1.length == arr2.length) { + for (var x = 0, i = arr1.length; x < i; x++) { + re = new RegExp(arr1[x], "g"); + s = s.replace(re, arr2[x]); + } + } + } + return s; + }, +};