Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members  

shadow.cpp File Reference

#include "shadow.h"
#include <string.h>
#include <pwd.h>
#include <crypt.h>
#include <malloc.h>
#include <stdio.h>

Go to the source code of this file.

Functions

bool AuthenticateShadow (packet* pak, Buffer *in)
 Authenticate using shadow password. More...

bool CheckShadowed ( char *name, char *password )
 Looks up the username and password in the /etc/shadow file. More...


Function Documentation

bool AuthenticateShadow ( packet * pak,
Buffer * in)

Authenticate using shadow password.

Parameters:
pak   the authentication packet
in   the buffer where the answer has to be sent
Returns:
true on success, false on failure

Definition at line 22 of file shadow.cpp.

00022 {
00023     char name[100], password[100];
00024     struct passwd *passwrd;
00025 
00026     if ((pak->h.header[0] != PROT_AUTHENTICATE) || (pak->h.header[1] != AUTH_PASSWORD)) {
00027     return false;
00028     }
00029 
00030     if (((int) strlen(pak->data.c_str ())) != (pak->h.header[2] + pak->h.header[3])) {
00031         return false;
00032     }
00033 
00034     /*this splits the clientPacket-data, which includes the name and the password
00035     into two variables. */
00036     memcpy ( &name, pak->data.c_str (), pak->h.header[2] );
00037     memcpy ( &password, pak->data.c_str () + pak->h.header[2], pak->h.header[3] );
00038 
00039     name[pak->h.header[2]] = '\0';
00040     password[pak->h.header[3]] = '\0';
00041 
00042     passwrd = getpwnam ( name ); /* returns NULL when the name does not exist. */
00043 
00044     if (!passwrd) /* name does not exist */
00045         {
00046         return false;
00047         }
00048 
00049     if (strcmp (passwrd->pw_name, "x") == 0)  // non-shadowed systems not supported
00050         {
00051         return false;
00052         }
00053 
00054     if (CheckShadowed (name, password))
00055         {
00056         packet* temp = new ( packet );
00057 
00058         temp->h.header[0] = PROT_REGISTER_ENTITY;
00059         temp->data = name;
00060 
00061         in->write(temp);
00062 
00063         return true;
00064         }
00065 
00066     return false;
00067     }

bool CheckShadowed ( char * name,
char * password)

Looks up the username and password in the /etc/shadow file.

Parameters:
name   the username
password   the password (plain-text)
Returns:
true on success, false on failure

Definition at line 69 of file shadow.cpp.

00070 {
00071     struct spwd *shadow;
00072     char *salt;
00073 
00074     salt = (char *) malloc ( 2 );
00075 
00076     setspent ();    /*this is necessary to be read in a clean way */
00077 
00078     shadow = getspnam ( name );
00079 
00080     if(shadow==NULL) { /* we have a failure then */
00081     return false;
00082     };
00083 
00084     endspent ();
00085 
00086     salt[0] = shadow->sp_pwdp[0];
00087     salt[1] = shadow->sp_pwdp[1];
00088 
00089     if ( strcmp ( shadow->sp_pwdp, crypt ( password, salt ) ) == 0 )
00090         {
00091         return true;
00092         }
00093 
00094     return false;
00095     }

Generated at Sat May 13 13:50:22 2000 for 3Dsia by doxygen 1.1.2 written by Dimitri van Heesch, © 1997-2000