Rudolf's Radius Klassenbibliothek
Up Right Klassenbibliothek

Klasse Nachricht und Unterklassen

Zweck

Die Klasse Nachricht verwaltet den Puffer einer Radius-Nachricht. Sie enthält Zugriffsoperationen, die direkt auf den gesendeten Inhalt arbeiten. Man kommt daher ohne dynamisch allokierte Hilfsstrukturen aus.

Zur Bearbeitung gibt es zwei Unterklassen:

Komponentenklasse auth_attr

Deklaration in auth_attr.h:
struct auth_attr
{
  u_char id;
  u_char len;
  u_char data[1];

  void print(ostream &str);
};
Entscheidend ist der Trick, das Komponente data variabel lang ist.

Arbeitsfunktionen:

int addattributtolist(u_char *&ptr,u_char attribut,char *wert,size_t len)
bildet ein Attribut in der einer Liste, wo ptrder Allokationszeiger ist und weiterwndert. wert und len ist die Zeichenkette der Länge len, die in die Liste kopiert werden soll.
int addattrtolist(u_char *&ptr,Attreintrag *attr,char *value);
macht im prinzip das selbe wie die vorher beschreibene Funktion, untersucht aber den Typ des Attributs aus dem Attributeintrags des Verzeichnisses
void getstring(char *s,auth_attr *a)
liest Zeichenkette aus dem Attribut
void getuserandrealm(char *user,char *realm,auth_attr *a)
liest für mehr-Mandaten-radiusd user und realm aus dem Attribut. Im Attribut steht username@realm.
Ist kein @ vorhanden, so wird realm auf Länge 0 gesetzt.
user und realm sind Zeiger auf einen genügend großen Speicherplatz
UINT4 getintval(auth_attr *a)
liest Integerwert aus Attribut

Beschreibung der Klasse Nachricht

Headerfile nachricht.h

Initialisierung

Nachricht(char *buffer,int bl)
initialisiert eine nachricht mit einem Puffer buffer der Länge bl

Abfrage

int id()
u_char code()
bestimmt die Art der Nachricht
int totallen()
bestimmt die Gesamtlänge der Nachricht
const u_char *getdigest()
const u_char *getvector()
const u_char *getsecret()
auth_attr *first()
liefert das erste Attribut, NULL falls nachricht leer
auth_attr *next()
liefert das nächste Attribut bzw. NULL falls Ende der Nachricht
auth_attr *finde(u_char attribut);
liefert das Attribut mit der Kennzeichnung attribut bzw. NULL falls nicht vorhanden.
Es wurde keine Iteratorklasse als notwendig empfunden. Das Programm kann also die Nachricht mit first() und next() sequentiel durchlesen oder mit finde durchsuchen.

MD5-Security-Things

int Nachricht::calc_digest(const char *secret)
calculates the digest in the Nachricht. It is used for basic auhtorisation and password encription
int Zusenden::calc_responsedigest(const u_char *rsecret)
When a Server answers a client, he calulates a responsdigest with which function.
int Empfangen::check_reply(const u_char altvector[],char *secret)
The client keeps the Vector he send, this is the altvector. The client checks the Servers's answer with this method.
int ciffrepassword(u_char *clearpass,u_char *encryptpass,int len,const u_char *digest)
chiffers and dechiffers the password. The result is terminated with the '\0' Character. The digest can be the Membervariable of a Nachricht

Ausgabe

Zu Debugging-Zwecken:
void print(ostream &ostr);
schreibt die Klasse mit Hilfe des Dictionaries schön in ostr

Berechnung

int calc_digest(const char *secret);
berechnet das digest.

Rudolf Weber Informatik- und Netzwerkverein Ravensburg e.V