Programmering mot ITKACL
Grunnfunksjonaliteten i ITKACL er implementert som et enkelt C-bibliotek som gjør DNS-oppslag mot itkacl.samfundet.no-sonen. Det finnes en mengde andre grensesnitt til systemet (se under, samt ITKACLBruk), men alle er grensesnitt til det samme biblioteket – dette er gjort slik for å redusere mengden vedlikehold samt å være helt sikker på at ACLer ikke blir tolket forskjellig forskjellige steder. Alle grensesnittene til andre språk er laget med SWIG, et veldig søtt lite verktøy for å lage slike grensesnitt for et utall språk enkelt.
Alle grensesnittene ligger i git eller annet sted - hvor ting ligger ser ut til å variere litt for tiden.
C-bibliotek
C-biblioteket, som er grunnsteinen i systemet, har ett enkelt systemkall:
int itkacl_check(const char * const realm, const char * const user, char *errmsg, size_t errmsg_size);
realm er stien du ønsker å sjekke mot (f.eks. "/amsit/web/sg") og user er brukernavnet du ønsker å sjekke (f.eks. "sesse"; dette skal være en UNIX-bruker og ikke et Kerberos-principal som f.eks. "sesse@SAMFUNDET.NO").
errmsg er en peker til en streng som vil fylles med en feilmelding om det oppstår en feil, og errmsg_size er antall bytes det er allokert for denne strengen (inkludert den avsluttende nullbyten). errmsg kan være NULL; i så fall blir errmsg_size ignorert og ingen feilmelding vil bli returnert (men dette vil ikke affisere returverdien).
Returverdien kan være tre forskjellige verdier:
- 0, hvis brukeren har tilgang til objektet.
- 1, hvis brukeren ikke har tilgang til objektet.
- -1, hvis det oppsto en feil (kunne ikke koble til databasen, ACL-stien eksisterer ikke, osv.). Som nevnt over til her errmsg fylles med feilmeldingen.
Feilhåndteringen og resultatverdiene burde kanskje kommenteres litt ytterligere. For det første er ikke returverdiene det man ville forvente av en boolsk verdi (dvs. 1 eller "true" for at autentiseringen lyktes, og motsatt for 0). Dette har to grunner:
- 0 er standard suksess-returverdi i C for alt av system- og bibliotekskall.
- Dersom man returnerte 1 for suksess, ville man veldig fort begynne å gjøre if (itkacl_check(...)) og dermed ignorere feil.
I tillegg er feilhåndteringen noe som passer dårlig inn i de fleste høynivåspråks grensesnitt (dvs. forventningen av et feilmeldingsbuffer og en fast lengde på dette), og noe som krever litt ekstra kode når man lager SWIG-grensesnitt til koden. Dette har også sine grunner:
- Det fører automatisk til trådsikker kode; et statisk feilmeldingsbuffer vil ikke være trådsikkert.
- Det gjør minnelekkasjer mye vanskeligere; et feilmeldingsbuffer allokert av itkacl_check() ved feil og returnert vil ofte være vanskelig å huske på å få frigjort av den kallende funksjonen.
- Det kan returnere fritekst-feilmeldinger; et system basert på feilmeldingsnumre trenger ikke bare en konverteringstabell, men vil også vanskelig kunne kommunisere oppover feilmeldinger fra lavere lag.
Utover dette skulle C-biblioteket være rimelig lett å bruke.
Perl-modul
Vha. SWIG (som nevnt over) har man laget en Perl5-modul som snakker med C-biblioteket. Grensesnittet er veldig likt, men med to viktige forskjeller:
- Man slipper å allokere feilbufre selv; dersom det oppstår en feil oppstår et unntak.
- Ettersom man ikke trenger -1 for feilhåndtering returnerer funksjonen true/false etter vanlig Perl-stil.
Eksempel
cassarossa:~> perl -e 'use itkacl; itkacl::check("/web/amsit/sg", "sesse") and print "OK\n";' OK cassarossa:~> perl -e 'use itkacl; itkacl::check("/finnes/ikke", "sesse") and print "OK\n";' Couldn't find realm '/finnes/ikke' at -e line 1.
Python-modul
Som med Perl har man laget en Python-modul, som returnerer True/False (den krever derfor Python 2.3 eller nyere, da boolske verdier ikke eksisterte før dette). Operasjonen er identisk med Perl-modulen:
>>> import itkacl >>> if itkacl.check("/web/amsit/sg", "sesse"): ... print "OK\n" ... OK >>> if itkacl.check("/finnes/ikke", "sesse"): ... print "OK\n" ... Traceback (most recent call last): File "<stdin>", line 1, in ? RuntimeError: Couldn't find realm '/finnes/ikke'
PHP-modul
PHP-modulen ligner for det meste på Python-modulen. Magien som får itkacl til å fungere er i filen "itkacl.php", som må inkluderes på et eller annet hvis (include, requires, eller lignende). itkacl::check(realm, bruker) returnerer 1 dersom brukeren er autorisert, 0 dersom ikke autorisert, og den vil eventuelt gi en exception dersom en feil oppstår, som du kan catch'e på vanlig måte.
Eksempel
<?php include('itkacl.php'); try { print itkacl::check('/web/itk-intern', 'sandsmark'); } catch (Exception $e) { print $e; } ?>
Lenker: Start, itkacl, itkaclbruk, itkaclintro
Epost: itk@samfundet.no | Telefon: 992 15 925 | Sist endret: 2022-01-04 22:41 | Revisjon: 18 (historie, blame) | Totalt: 1905 kB | Rediger