slovensko-digital / autogram-extension

European Union Public License 1.2
10 stars 4 forks source link

Bratislava.sk support #78

Open MarekBodingerBA opened 7 months ago

MarekBodingerBA commented 7 months ago

S očakávaným vydaním formulára obsahujúcim KEP by sme radi podporovali aj tento extension.

Musel som upraviť injectovaciu logiku, keďže Ditec scripty načítavame asynchrónne až po načítaní stránky, pri pôvodnom injecte ešte neboli dostupné.

pomali commented 7 months ago

Paráda!

Toto rieši to problém, že ak sa načíta ditec ako druhý tak prepíše autogram? Lebo niečo podobné (ak si dobre pamätám) som začal riešiť na minv.sk v tomto PR https://github.com/slovensko-digital/autogram-extension/pull/70/files kde som to na hulváta zablokoval.

MarekBodingerBA commented 7 months ago

Toto rieši to problém, že ak sa načíta ditec ako druhý tak prepíše autogram?

Neviem, asi najľahšie bude vyskúšať, ale vyzerá to, že by mohlo. :)

MarekBodingerBA commented 7 months ago

Na druhú stranu, do nejakej miery to nedáva zmysel čakať na načítanie DSigneru aby sa nakoniec nepoužil, ale v konečnom dôsledku je to oveľa jednoduchšie. To blokovanie skriptov nie je úplne zlá myšlienka, ale napríklad my čakáme na načítanie tých skriptov, tým, že by boli zablokované by to u nás zlyhalo a k podpisovaniu by sa užívateľ nedostal.

pomali commented 7 months ago

Presne to som si myslel, že blokovanie môže rozbiť niektoré weby.

Ten detectSupportedPlatforms by sme mali implementovať aj my, asi to je niečo z novšej verzie?

Mal som ešte jedno riešenie cez Proxy object, ale to je riadne komplikované ( vedeli by sme ignorovať všetky zápisy do toho objektu)

A ešte je alternatívou použiť service worker ktorý by ditec skripty nahradil prázdnym súborom (ako adblock), ale tam je problém s hádaním url a ak by ich niekto bundloval tak to nebude fungovať.

MarekBodingerBA commented 7 months ago

Mal som ešte jedno riešenie cez Proxy object, ale to je riadne komplikované ( vedeli by sme ignorovať všetky zápisy do toho objektu)

Je možné zavolať Object.freeze na tom ditecu, ale to by hádzalo errory vždy keď sa to bude pokúšať prepísať nejakú property.

Išlo by to s vlastnou proxy čo pri pokuse o prepísanie nespraví nič:

function customFreeze(obj) {
    return new Proxy(obj, {
        set: function() {
            return true;
        },
        deleteProperty: function() {
            return false;
        },
        defineProperty: function() {
            return true;
        }
    });
}

window.ditec = customFreeze(window.ditec);

Možno to je aj lepšie riešenie, ale implikácie sa ťažko odhadujú, napríklad u nás by to nefungovalo lebo nemáte to detectSupportedPlatforms implementované.

Ten detectSupportedPlatforms by sme mali implementovať aj my, asi to je niečo z novšej verzie?

Asi, ale neviem čo by to malo vracať vo vašom prípade, asi neprázdny array.

A ešte je alternatívou použiť service worker ktorý by ditec skripty nahradil prázdnym súborom (ako adblock), ale tam je problém s hádaním url a ak by ich niekto bundloval tak to nebude fungovať.

To znie ako overkill.

filiplikavcan commented 7 months ago

Namiesto pollovania pri cakani na Ditec by som skusil pouzit Object.watch. Tu som to kedysi pouzil v odpovedi: https://stackoverflow.com/questions/8298430/handling-code-which-relies-on-jquery-before-jquery-is-loaded/29222203#29222203

pomali commented 3 months ago

@MarekBodingerBA ak by sme implementovali detectSupportedPlatforms a nejaku formu ochrany prepisu cez proxy object bude to pre vas dobre riesenie? ci este musime vyriesit to, ze cakate na nacitanie skriptov?

ad Object.watch() - ten je uz deprecated, a nahradenie toho su proxy objects

MarekBodingerBA commented 3 months ago

@pomali Áno, detectSupportedPlatforms používame takto.

Pod ochranou sa myslí, že by sa zapísalo do toho window.ditec.dSigXadesBpJs hneď po inicializácii extensionu bez ohľadu na to či sa Ditec SDKčko načíta plošne pre celú doménu? To je trocha opačný prístup ako v tomto PR. Tu čakám dokým sa načíta Ditec SDK (teraz keď sa nad tým zamyslím tak by to išlo určite lepším spôsobom ako setInterval) a potom to prepíšem Autogramom.

Ono by to malo teoreticky fungovať aj s tým iniciálnym zapísaním Autogramu priamo do toho objektu, ale príde mi to rizikovejšie. Minimálne mám pocit, že tie Ditec SDK skripty sa musia načítať v istom poradí čo by mohlo toto rozhodiť (nechýbal by Autogramu config, ktorý ešte nebude načítaný?). Tiež my načítavame to Ditec SDK iba pri stránkach s podpisovačom, takto by extension injectol Autogram aj na stránkach kde sa podpisovanie nepoužíva (neviem aké by to malo implikácie).

MarekBodingerBA commented 3 months ago

Pre úplnú jednoduchosť aby sme sa chápali, injectol som do stránky tento script (a simuloval Slow 3G):

const i = setInterval(() => {
  console.log(window.ditec?.dSigXadesBpJs);
  if (window.ditec?.dSigXadesBpJs) {
  clearInterval(i)  
  }
}, 10)

https://github.com/slovensko-digital/autogram-extension/assets/104828482/44b11f23-4d0d-4623-b0bf-760a5ee82419

To znamená, že ten window.ditec.dSigXadesBpJs je inicializovaný neskôr po načítaní stránky.

Otestovať sa to dá tu: https://konto.bratislava.sk/mestske-sluzby/priznanie-k-dani-z-nehnutelnosti/ → Vyplniť cez Bratislavské konto