From f6f820c43d5303be2cdbeec10345badd46054255 Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Tue, 29 Nov 2022 15:56:21 +0100 Subject: [PATCH] Cleanup Avatars plugin --- plugins/avatars/avatars.js | 12 +++++------- plugins/avatars/avatars.min.js | 2 +- plugins/avatars/index.php | 17 +++-------------- plugins/avatars/jdenticon.js | 2 +- plugins/avatars/jdenticon.min.js | 2 +- 5 files changed, 11 insertions(+), 24 deletions(-) diff --git a/plugins/avatars/avatars.js b/plugins/avatars/avatars.js index cb4048361..a6a0c85c8 100644 --- a/plugins/avatars/avatars.js +++ b/plugins/avatars/avatars.js @@ -26,8 +26,8 @@ avatars.set(getAvatarUid(item[0]), url); item[1](url); } else if (window.identiconSvg) { - window.identiconSvg(from.email).then(svg => { - url = 'data:image/svg+xml;base64,'+btoa(svg); + // rl.pluginSettingsGet('avatars', 'identicon'); + window.identiconSvg(from.email).then(url => { avatars.set(getAvatarUid(item[0]), url); item[1](url); }); @@ -46,6 +46,7 @@ * Loads images from Nextcloud contacts */ addEventListener('DOMContentLoaded', () => { +// rl.pluginSettingsGet('avatars', 'nextcloud'); if (parent.OC) { const OC = () => parent.OC, nsDAV = 'DAV:', @@ -103,11 +104,8 @@ } else if (msg.avatar) { let bimi = 'pass' == msg.from[0].dkimStatus ? 1 : 0; if (window.identiconSvg) { - element.onerror = () => { - window.identiconSvg(msg.from[0].email).then(svg => - fn('data:image/svg+xml;base64,'+btoa(svg)) - ); - } + // rl.pluginSettingsGet('avatars', 'identicon'); + element.onerror = () => window.identiconSvg(msg.from[0].email).then(fn); } fn(`?Avatar/${bimi}/${msg.avatar}`); } else { diff --git a/plugins/avatars/avatars.min.js b/plugins/avatars/avatars.min.js index e8a0ecab4..235d38cc0 100644 --- a/plugins/avatars/avatars.min.js +++ b/plugins/avatars/avatars.min.js @@ -1 +1 @@ -(e=>{const t=[],a=new Map,s=new Map,r="MailMessageView",i=e=>{let t=e.from[0];return`${"pass"==t.dkimStatus?1:0}/${t.email.toLowerCase()}`},o=e=>s.get(e.from[0].email.toLowerCase())||a.get(i(e)),n=(()=>{let s=t.shift();for(;s;){let r=o(s[0]);if(!r){let t=s[0].from[0];e.pluginRemoteRequest(((e,o)=>{!e&&o?.Result.type?(r=`data:${o.Result.type};base64,${o.Result.data}`,a.set(i(s[0]),r),s[1](r)):window.identiconSvg&&window.identiconSvg(t.email).then((e=>{r="data:image/svg+xml;base64,"+btoa(e),a.set(i(s[0]),r),s[1](r)})),n()}),"Avatar",{bimi:"pass"==t.dkimStatus?1:0,email:t.email});break}s[1](r),s=t.shift()}}).debounce(1e3);addEventListener("DOMContentLoaded",(()=>{if(parent.OC){const e=()=>parent.OC,t="DAV:",a="http://nextcloud.com/ns",r="urn:ietf:params:xml:ns:carddav",i=(e,t,a)=>e.getElementsByTagNameNS(t,a),o=(e,t,a)=>i(e,t,a)?.item(0)?.textContent,n=t=>e().webroot+"/remote.php"+t;e().requestToken&&fetch(n(`/dav/addressbooks/users/${e().currentUser}/contacts/`),{mode:"same-origin",cache:"no-cache",redirect:"error",credentials:"same-origin",method:"REPORT",headers:{requesttoken:e().requestToken,"Content-Type":"application/xml; charset=utf-8",Depth:1},body:''}).then((e=>e.status<400?e.text():Promise.reject(new Error({response:e})))).then((e=>{const n=new DOMParser,d=i(n.parseFromString(e,"application/xml").documentElement,t,"response");for(let e=0;e{s.set(e[1].toLowerCase(),o(i,t,"href")+"?photo")}))}}))}})),ko.bindingHandlers.fromPic={init:(e,a,s,r)=>{if(r){let a=o(r),s=t=>{e.src=t};if(a)s(a);else if(r.avatar){let t="pass"==r.from[0].dkimStatus?1:0;window.identiconSvg&&(e.onerror=()=>{window.identiconSvg(r.from[0].email).then((e=>s("data:image/svg+xml;base64,"+btoa(e))))}),s(`?Avatar/${t}/${r.avatar}`)}else t.push([r,s]),n()}}},addEventListener("rl-view-model.create",(e=>{if(r===e.detail.viewModelTemplateID){const a=document.getElementById(r).content.querySelector(".messageItemHeader");a&&a.prepend(Element.fromHTML(''));let s=e.detail;s.viewUserPic=ko.observable(""),s.viewUserPicVisible=ko.observable(!1),s.message.subscribe((e=>{if(s.viewUserPicVisible(!1),e){let a=o(e),r=e=>{s.viewUserPic(e),s.viewUserPicVisible(!0)};if(a)r(a);else if(e.avatar){r(`?Avatar/${"pass"==e.from[0].dkimStatus?1:0}/${e.avatar}`)}else t.push([e,r]),n()}}))}"MailMessageList"===e.detail.viewModelTemplateID&&document.getElementById("MailMessageList").content.querySelector(".messageCheckbox").append(Element.fromHTML(''))}))})(window.rl); \ No newline at end of file +(e=>{const t=[],a=new Map,s=new Map,r="MailMessageView",i=e=>{let t=e.from[0];return`${"pass"==t.dkimStatus?1:0}/${t.email.toLowerCase()}`},o=e=>s.get(e.from[0].email.toLowerCase())||a.get(i(e)),n=(()=>{let s=t.shift();for(;s;){let r=o(s[0]);if(!r){let t=s[0].from[0];e.pluginRemoteRequest(((e,o)=>{!e&&o?.Result.type?(r=`data:${o.Result.type};base64,${o.Result.data}`,a.set(i(s[0]),r),s[1](r)):window.identiconSvg&&window.identiconSvg(t.email).then((e=>{a.set(i(s[0]),e),s[1](e)})),n()}),"Avatar",{bimi:"pass"==t.dkimStatus?1:0,email:t.email});break}s[1](r),s=t.shift()}}).debounce(1e3);addEventListener("DOMContentLoaded",(()=>{if(parent.OC){const e=()=>parent.OC,t="DAV:",a="http://nextcloud.com/ns",r="urn:ietf:params:xml:ns:carddav",i=(e,t,a)=>e.getElementsByTagNameNS(t,a),o=(e,t,a)=>i(e,t,a)?.item(0)?.textContent,n=t=>e().webroot+"/remote.php"+t;e().requestToken&&fetch(n(`/dav/addressbooks/users/${e().currentUser}/contacts/`),{mode:"same-origin",cache:"no-cache",redirect:"error",credentials:"same-origin",method:"REPORT",headers:{requesttoken:e().requestToken,"Content-Type":"application/xml; charset=utf-8",Depth:1},body:''}).then((e=>e.status<400?e.text():Promise.reject(new Error({response:e})))).then((e=>{const n=new DOMParser,d=i(n.parseFromString(e,"application/xml").documentElement,t,"response");for(let e=0;e{s.set(e[1].toLowerCase(),o(i,t,"href")+"?photo")}))}}))}})),ko.bindingHandlers.fromPic={init:(e,a,s,r)=>{if(r){let a=o(r),s=t=>{e.src=t};if(a)s(a);else if(r.avatar){let t="pass"==r.from[0].dkimStatus?1:0;window.identiconSvg&&(e.onerror=()=>window.identiconSvg(r.from[0].email).then(s)),s(`?Avatar/${t}/${r.avatar}`)}else t.push([r,s]),n()}}},addEventListener("rl-view-model.create",(e=>{if(r===e.detail.viewModelTemplateID){const a=document.getElementById(r).content.querySelector(".messageItemHeader");a&&a.prepend(Element.fromHTML(''));let s=e.detail;s.viewUserPic=ko.observable(""),s.viewUserPicVisible=ko.observable(!1),s.message.subscribe((e=>{if(s.viewUserPicVisible(!1),e){let a=o(e),r=e=>{s.viewUserPic(e),s.viewUserPicVisible(!0)};if(a)r(a);else if(e.avatar){r(`?Avatar/${"pass"==e.from[0].dkimStatus?1:0}/${e.avatar}`)}else t.push([e,r]),n()}}))}"MailMessageList"===e.detail.viewModelTemplateID&&document.getElementById("MailMessageList").content.querySelector(".messageCheckbox").append(Element.fromHTML(''))}))})(window.rl); diff --git a/plugins/avatars/index.php b/plugins/avatars/index.php index 5a6f2d340..7e521440b 100644 --- a/plugins/avatars/index.php +++ b/plugins/avatars/index.php @@ -19,11 +19,9 @@ class AvatarsPlugin extends \RainLoop\Plugins\AbstractPlugin $this->addJs('avatars.js'); $this->addJsonHook('Avatar', 'DoAvatar'); $this->addPartHook('Avatar', 'ServiceAvatar'); -// $this->addHook('filter.app-data', 'FilterAppData'); + $this->Config()->Get('plugin', 'identicon', false) && $this->addJs('jdenticon.js'); // https://github.com/the-djmaze/snappymail/issues/714 $this->Config()->Get('plugin', 'delay', true) || $this->addHook('filter.json-response', 'FilterJsonResponse'); - - $this->Config()->Get('plugin', 'identicon', false) && $this->addJs('jdenticon.js'); } public function FilterJsonResponse(string $sAction, array &$aResponseItem) @@ -81,17 +79,6 @@ class AvatarsPlugin extends \RainLoop\Plugins\AbstractPlugin exit; } - public function FilterAppData($bAdmin, &$aResult) : void - { - if (!$bAdmin && \is_array($aResult)) { - $aResult['Avatars'] = [ - 'bimi' => $this->Config()->Get('plugin', 'bimi', false), - 'gravatar' => $this->Config()->Get('plugin', 'gravatar', false), - 'nextcloud' => $this->Config()->Get('plugin', 'nextcloud', false) - ]; - } - } - protected function configMapping() : array { $aResult = array( @@ -111,11 +98,13 @@ class AvatarsPlugin extends \RainLoop\Plugins\AbstractPlugin if (\class_exists('OC') && isset(\OC::$server)) { $aResult[] = \RainLoop\Plugins\Property::NewInstance('nextcloud')->SetLabel('Lookup Nextcloud Contacts') ->SetType(\RainLoop\Enumerations\PluginPropertyType::BOOL) +// ->SetAllowedInJs(true) ->SetDefaultValue(false); } */ $aResult[] = \RainLoop\Plugins\Property::NewInstance('identicon')->SetLabel('Else create Identicon') ->SetType(\RainLoop\Enumerations\PluginPropertyType::BOOL) +// ->SetAllowedInJs(true) ->SetDefaultValue(false) ->SetDescription('https://wikipedia.org/wiki/Identicon'); return $aResult; diff --git a/plugins/avatars/jdenticon.js b/plugins/avatars/jdenticon.js index 536a75e07..35847e938 100644 --- a/plugins/avatars/jdenticon.js +++ b/plugins/avatars/jdenticon.js @@ -688,7 +688,7 @@ window.identiconSvg = async (hashOrValue) => { renderer.finish(); - return writer.toString(); + return 'data:image/svg+xml;base64,' + btoa(writer); }; })(); diff --git a/plugins/avatars/jdenticon.min.js b/plugins/avatars/jdenticon.min.js index 3a3d1cb02..c96982873 100644 --- a/plugins/avatars/jdenticon.min.js +++ b/plugins/avatars/jdenticon.min.js @@ -1 +1 @@ -(()=>{class t{constructor(t,i,s){this.h=t,this.s=i,this.l=s}toString(){const t=this.h,s=this.s,h=this.l,r=t=>(t=i(0,255,255*t).toString(16)).slice(0,2).padStart(2,"0");let n=h,e=h,a=h;if(0!=s){let i=h<.5?h*(s+1):h+s-h*s,r=2*h-i,o=t=>6*(t+=t<0?1:t>1?-1:0)<1?r+(i-r)*t*6:2*t<1?i:3*t<2?r+(i-r)*(2/3-t)*6:r;n=o(t+1/3),e=o(t),a=o(t-1/3)}return"#"+r(n)+r(e)+r(a)}}const i=(t,i,s)=>Math.max(t,Math.min(i,s)),s=(t,i,s)=>parseInt(t.substr(i,s),16),h=(i,s,h)=>{var r=[.55,.5,.5,.46,.6,.55,.55][6*i+.5|0];return new t(i,s,h=h<.5?h*r*2:r+(h-.5)*(1-r)*2).toString()};class r{constructor(t,i){this.x=t,this.y=i}}class n{constructor(t,i,s,h){this.u=t,this.v=i,this.K=s,this.Z=h}L(t,i,s,h){var n=this.u+this.K,e=this.v+this.K,a=this.Z;return 1===a?new r(n-i-(h||0),this.v+t):2===a?new r(n-t-(s||0),e-i-(h||0)):3===a?new r(this.u+i,e-t-(s||0)):new r(this.u+t,this.v+i)}}var e=new n(0,0,0,0);class a{constructor(t){this.M=t,this.A=e}g(t,i){for(var s=i?-2:2,h=[],r=i?t.length-2:0;r=0;r+=s)h.push(this.A.L(t[r],t[r+1]));this.M.g(h)}h(t,i,s,h){var r=this.A.L(t,i,s,s);this.M.h(r,s,h)}i(t,i,s,h,r){this.g([t,i,t+s,i,t+s,i+h,t,i+h],r)}j(t,i,s,h,r,n){var e=[t+s,i,t+s,i+h,t,i+h,t,i];e.splice((r||0)%4*2,2),this.g(e,n)}N(t,i,s,h,r){this.g([t+s/2,i,t+s,i+h/2,t+s/2,i+h,t,i+h/2],r)}}function o(t,i,s,h){var r,n,e,a,o,c;(t%=14)?1==t?(e=0|.5*s,a=0|.8*s,i.j(s-e,0,e,a,2)):2==t?(e=0|s/3,i.i(e,e,s-e,s-e)):3==t?(c=s<6?1:s<8?2:0|.25*s,o=(o=.1*s)>1?0|o:o>.5?1:o,i.i(c,c,s-o-c,s-o-c)):4==t?(n=0|.15*s,e=0|.5*s,i.h(s-e-n,s-e-n,e)):5==t?((c=4*(o=.1*s))>3&&(c|=0),i.i(0,0,s,s),i.g([c,c,s-o,c,c+(s-c-o)/2,s-o],!0)):6==t?i.g([0,0,s,0,s,.7*s,.4*s,.4*s,.7*s,s,0,s]):7==t?i.j(s/2,s/2,s/2,s/2,3):8==t?(i.i(0,0,s,s/2),i.i(0,s/2,s/2,s/2),i.j(s/2,s/2,s/2,s/2,1)):9==t?(o=.14*s,c=s<4?1:s<6?2:0|.35*s,o=s<8?o:0|o,i.i(0,0,s,s),i.i(c,c,s-c-o,s-c-o,!0)):10==t?(c=3*(o=.12*s),i.i(0,0,s,s),i.h(c,c,s-o-c,!0)):11==t?i.j(s/2,s/2,s/2,s/2,3):12==t?(n=.25*s,i.i(0,0,s,s),i.N(n,n,s-n,s-n,!0)):!h&&(n=.4*s,e=1.2*s,i.h(n,n,e)):(r=.42*s,i.g([0,0,s,0,s,s-2*r,s-r,s,0,s]))}function c(t,i,s){var h;(t%=4)?1==t?i.j(0,s/2,s,s/2,0):2==t?i.N(0,0,s,s):(h=s/6,i.h(h,h,s-2*h)):i.j(0,0,s,s,0)}function g(t){return(10*t+.5|0)/10}class l{constructor(){this.B=""}g(t){for(var i="",s=0;s'}m(t,i){i&&(this.F+='')}S(t,i){this.F+=''}toString(){return this.F+""}}window.identiconSvg=async t=>{const r=new v(50),e=new u(r),g=/^[0-9a-f]{11,}$/i.test(t)&&t||await async function(t){return Array.from(new Uint8Array(await crypto.subtle.digest("SHA-1",(new TextEncoder).encode(t)))).map((t=>t.toString(16).padStart(2,"0"))).join("")}(null==t?"":""+t),l=.5,w=0,f=t=>i(0,1,.4+.4*t),d=t=>i(0,1,.3+t*(.9-.3));var p,S=e.k,x=.5+.08*S|0;S-=2*x;const y=new a(e),j=0|S/4,m=0|x+S/2-2*j,A=s(g,-7)/268435455,M=[h(A,w,d(0)),h(A,l,f(.5)),h(A,w,d(1)),h(A,l,f(1)),h(A,l,f(0))],B=[],F=t=>{if(t.indexOf(p)>=0)for(var i=0;i=0)return!0},O=(t,i,h,r,a)=>{var o=s(g,h,1),c=r?s(g,r,1):0;e.O(M[B[t]]);for(var l=0;l{class t{constructor(t,i,s){this.h=t,this.s=i,this.l=s}toString(){const t=this.h,s=this.s,h=this.l,r=t=>(t=i(0,255,255*t).toString(16)).slice(0,2).padStart(2,"0");let n=h,a=h,e=h;if(0!=s){let i=h<.5?h*(s+1):h+s-h*s,r=2*h-i,o=t=>6*(t+=t<0?1:t>1?-1:0)<1?r+(i-r)*t*6:2*t<1?i:3*t<2?r+(i-r)*(2/3-t)*6:r;n=o(t+1/3),a=o(t),e=o(t-1/3)}return"#"+r(n)+r(a)+r(e)}}const i=(t,i,s)=>Math.max(t,Math.min(i,s)),s=(t,i,s)=>parseInt(t.substr(i,s),16),h=(i,s,h)=>{var r=[.55,.5,.5,.46,.6,.55,.55][6*i+.5|0];return new t(i,s,h=h<.5?h*r*2:r+(h-.5)*(1-r)*2).toString()};class r{constructor(t,i){this.x=t,this.y=i}}class n{constructor(t,i,s,h){this.u=t,this.v=i,this.K=s,this.Z=h}L(t,i,s,h){var n=this.u+this.K,a=this.v+this.K,e=this.Z;return 1===e?new r(n-i-(h||0),this.v+t):2===e?new r(n-t-(s||0),a-i-(h||0)):3===e?new r(this.u+i,a-t-(s||0)):new r(this.u+t,this.v+i)}}var a=new n(0,0,0,0);class e{constructor(t){this.M=t,this.A=a}g(t,i){for(var s=i?-2:2,h=[],r=i?t.length-2:0;r=0;r+=s)h.push(this.A.L(t[r],t[r+1]));this.M.g(h)}h(t,i,s,h){var r=this.A.L(t,i,s,s);this.M.h(r,s,h)}i(t,i,s,h,r){this.g([t,i,t+s,i,t+s,i+h,t,i+h],r)}j(t,i,s,h,r,n){var a=[t+s,i,t+s,i+h,t,i+h,t,i];a.splice((r||0)%4*2,2),this.g(a,n)}N(t,i,s,h,r){this.g([t+s/2,i,t+s,i+h/2,t+s/2,i+h,t,i+h/2],r)}}function o(t,i,s,h){var r,n,a,e,o,c;(t%=14)?1==t?(a=0|.5*s,e=0|.8*s,i.j(s-a,0,a,e,2)):2==t?(a=0|s/3,i.i(a,a,s-a,s-a)):3==t?(c=s<6?1:s<8?2:0|.25*s,o=(o=.1*s)>1?0|o:o>.5?1:o,i.i(c,c,s-o-c,s-o-c)):4==t?(n=0|.15*s,a=0|.5*s,i.h(s-a-n,s-a-n,a)):5==t?((c=4*(o=.1*s))>3&&(c|=0),i.i(0,0,s,s),i.g([c,c,s-o,c,c+(s-c-o)/2,s-o],!0)):6==t?i.g([0,0,s,0,s,.7*s,.4*s,.4*s,.7*s,s,0,s]):7==t?i.j(s/2,s/2,s/2,s/2,3):8==t?(i.i(0,0,s,s/2),i.i(0,s/2,s/2,s/2),i.j(s/2,s/2,s/2,s/2,1)):9==t?(o=.14*s,c=s<4?1:s<6?2:0|.35*s,o=s<8?o:0|o,i.i(0,0,s,s),i.i(c,c,s-c-o,s-c-o,!0)):10==t?(c=3*(o=.12*s),i.i(0,0,s,s),i.h(c,c,s-o-c,!0)):11==t?i.j(s/2,s/2,s/2,s/2,3):12==t?(n=.25*s,i.i(0,0,s,s),i.N(n,n,s-n,s-n,!0)):!h&&(n=.4*s,a=1.2*s,i.h(n,n,a)):(r=.42*s,i.g([0,0,s,0,s,s-2*r,s-r,s,0,s]))}function c(t,i,s){var h;(t%=4)?1==t?i.j(0,s/2,s,s/2,0):2==t?i.N(0,0,s,s):(h=s/6,i.h(h,h,s-2*h)):i.j(0,0,s,s,0)}function g(t){return(10*t+.5|0)/10}class l{constructor(){this.B=""}g(t){for(var i="",s=0;s'}m(t,i){i&&(this.F+='')}S(t,i){this.F+=''}toString(){return this.F+""}}window.identiconSvg=async t=>{const r=new v(50),a=new u(r),g=/^[0-9a-f]{11,}$/i.test(t)&&t||await async function(t){return Array.from(new Uint8Array(await crypto.subtle.digest("SHA-1",(new TextEncoder).encode(t)))).map((t=>t.toString(16).padStart(2,"0"))).join("")}(null==t?"":""+t),l=.5,w=0,f=t=>i(0,1,.4+.4*t),d=t=>i(0,1,.3+t*(.9-.3));var p,x=a.k,S=.5+.08*x|0;x-=2*S;const m=new e(a),y=0|x/4,j=0|S+x/2-2*y,A=s(g,-7)/268435455,M=[h(A,w,d(0)),h(A,l,f(.5)),h(A,w,d(1)),h(A,l,f(1)),h(A,l,f(0))],B=[],F=t=>{if(t.indexOf(p)>=0)for(var i=0;i=0)return!0},O=(t,i,h,r,e)=>{var o=s(g,h,1),c=r?s(g,r,1):0;a.O(M[B[t]]);for(var l=0;l