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 bzr et 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:

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:

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:

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:

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

Mail: itk@samfundet.no | Telefon: 992 15 925 | Sist endret: 2010-02-21 20:02 | Revisjon: 17 (historie, blame) | Totalt: 1434 kB | Rediger