ceskaexpedice / kramerius

System Kramerius
GNU General Public License v3.0
45 stars 26 forks source link

Podmienka PDFDNNTLabels nefunguje #973

Closed rrandiak closed 9 months ago

rrandiak commented 1 year ago

Skúšané pomocou curl -H "Content-Type: application/json" -H "Authorization: Bearer $K7_TOKEN" 'https://api.kramerius.mzk.cz/search/api/client/v7.0/pdf/selection?pids=uuid:0e5a18b6-db8b-453e-9e72-7e5d1d2b6af0' na stránke s public licenciou. Skúšal som to s tokenom, ktorý priradí keycloak môjmu admin účtu. Keď nastavím podmienku pre Pdf a tisk pre rolu kramerius_admin, tak týmto spôsobom som schopný stiahnuť PDF stránky. Keď naopak podmienku pre rolu kramerius_admin vymažem a skúsim podmienku PDFDNNTLabels s licenciou public tak dostanem {"message":"action A_PDF_READ is not allowed, object is uuid:0e5a18b6-db8b-453e-9e72-7e5d1d2b6af0","status":403}.

Nazrel som do kódu Kraméria a z tejto triedy shared/common/src/main/java/cz/incad/kramerius/security/impl/criteria/PDFDNNTLabels.java som vyčítal, že vracia buď EvaluatingResultState.NOT_APPLICABLE alebo EvaluatingResultState.FALSE. Úplne sa do kódu Kraméria nerozumiem, ale myslím, že to bude ten dôvod.

Druhá vec je, že by sme potrebovali nastaviť Pdf a tisk dokumentov pre konkrétnu licenciu a parameter = ipčky. Dôvodom je, že niektoré dokumenty je možné na základe licencie tlačiť v študovňách, ale nikde inde.

A za tretie ešte spomeniem, že pred pár mesiacmi sa menilo názvoslovie filtrov z DNNT na Licence, a tu sa na to asi zabudlo.

Celkovo mi z toho teda vychádza opraviť podmienku PDFDNNTLabels a premenovať na PDFLicenses. A pridať podmienku PDFLicensesIPFiltered. Poprípade, ja osobne nevidím dôvod prečo by sa podmienky Licenses a LicensesIPFiltered nedali rovnako použiť pri akcií Čtení aj akcií Pdf a tisk. Ale je dosť možné, že na to nejaký dôvod je, len o ňom neviem.

Ďakujem,

Róbert Randiak, MZK - OSDD

Edit: otestoval som zmenenie podmienky PDFDNNTLabels na Licences priamo v databáze. A takto vytvorená podmienka s rolou common_users, podmienkou Licenses a licenciou public funguje. Samozrejme, že tam môžu byť iné zádrhle, netestoval som to nejak výrazne. Ale po tejto zmene sa mi podarilo získať dané PDF... Keď tak nad tým romzýšľam, možno tam nejak hrá rolu obmedzenie počtu stránok, preto sa nemôžu použiť rovnaké podmienky..

pavel-stastny commented 1 year ago

Zdravím,

no, ona ta logika je trošku jiná. Standardně Kramerius umožňuje tisknout cokoliv, na co má uživatel práva. Pokud vyhodnotí, že nemá, pak se ve výsledním PDF objeví hláška o nedostupnosti. Vše je řízeno akcí READ, která slouži k přístupu k dokumentům. S příchodem dnnt licencí (tehdy ještě labelů) se objevil usecase, kdy je nutno povolit akci READ ale zároveň zakázat tisk nebo generovani PDF. A to bylo úkolem tohoto pravidla.

  1. Podívat se, zda je dokument poskytunut pod licencí, kterou má v konfiguraci
  2. A pokud ano, tak generování zaříznout. Vrátit FALSE
  3. Pokud ne, pak řízení předat výš a nechat některé z ostatních pravidel ať rozhodne. Vrátí NOT_APPLICABLE

Ale máte pravdu, že by asi bylo dobré se zbavit jména DNNT v názvu pravidla.

rrandiak commented 1 year ago

Zdravím,

mohli by ste mi, prosím, poskytnúť odpoveď, prečo mi pomocou toho API callu nejde dané PDF stiahnuť, aj keď máme v Kramériu nastavené

Role Podmínka Parametr Licence  
common_users PDFDNNTLabels - public

a ten dokument (stránka) má licenciu public.

Chcel by som dodať, že toto nesúvisí s issue https://github.com/ceskaexpedice/kramerius-web-client/issues/649, keďže používam priamo API call, a zároveň podmienka s rolou kramerius_admin funguje

Role Podmínka Parametr Licence  
kramerius_admin - - -
Zároveň toto sú konkrétne use cases, ktoré by sme chceli týmto vyriešiť: Licencia  Akce Čtení Akce Pdf a tisk
public všade = Role: common_users všade = Role: common_users
public-muo všade = Role: common_users nikde
dnnto online = Role: uma_authorization terminály = Role: common_users, Parametr: "IPs Terminálov"
dnntt terminály = Role: common_users, Parametr: "IPs Terminálov" + terminály iných knižníc terminály = Role: common_users, Parametr: "IPs Terminálov"
onsite terminály = Role: common_users, Parametr: "IPs Terminálov" terminály = Role: common_users, Parametr: "IPs Terminálov"
onsite-sheetmusic terminály = Role: common_users, Parametr: "IPs Terminálov" nikde

Čtení máme nastavené, tak ako je napísané v tejto tabuľke. Chcel by som ešte nastaviť Pdf a tisk podľa tejto tabuľky, a momentálne to neviem nijak docieliť.

Vedeli by ste mi teda nejak poradiť? Alebo sa to celé vyrieší presunutím rozhodovania o tlačení do klienta? Tam ale existuje bezpečnostný problém, že klient sa dá obísť a dajú sa tlačiť a generovať PDF zo stránok, pri ktorých je to v klientovi zakázané.

Ďakujem,

Róbert

pavel-stastny commented 1 year ago

@r2it-git Dobrý den.

Problém bude v povolení tisku pro licence dnnto a dnntt, kdy jsou rozdilne IP filtry pro zobrazení a pro generovani PDF. Zde se počítalo s tím, že IP filtr bude nastaven pouze na čtení a podmínka PDFDNNTLabels bude sledovat, zda dílo bylo poskytunto dle licence. Pokud ano, tak PDF zařízne.

Standardně by to nastavení by mělo vypadat nějak tatko:

Zákaz pro konkrétní licence:

rrandiak commented 1 year ago

Dobrý deň,

môžem potvrdiť, že common_users bez podmínky funguje tak ako ste opísali. Lenže zákaz pre konkrétne licencie pomocou PDFDNNTLabels, nemá žiaden efekt. Momentálne nastavenia vyzerajú takto: Role Podmínka Parametr Licence
common_users PDFDNNTLabels - public-muo
common_users PDFDNNTLabels - onsite-sheetmusic
common_users - - -

Týmto som dosiahol, že keď nemá užívateľ právo čítať, tak PDF stránky budú nahradené informáciou o nedostupnosti. Avšak aj s podmienkou PDFDNNTLabels na licencií public-muo, je stále možné generovať PDF a tisk pre stránky s public-muo licenciou (nie sú nahradené informáciou o nedostupnosti). V Čtení je pre public-muo len jedna podmienka:

Role Podmínka Parametr Licence
common_users Licenses - public-muo

Podobne je to aj s licenciou onsite-sheetmusic.

pavel-stastny commented 1 year ago

@r2it-git Zdravím, podmínka PDFDNNTLabels byla nahrazena novou PDFProtectedByLicense. Chování by mělo být stejné jak je výše popsáno.