update to v1.31
This commit is contained in:
		
							
								
								
									
										10
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								Makefile
									
									
									
									
									
								
							@@ -4,6 +4,12 @@ LDLIBS =	-lcrypt
 | 
				
			|||||||
PREFIX =
 | 
					PREFIX =
 | 
				
			||||||
BINDIR =	$(PREFIX)/usr/sbin
 | 
					BINDIR =	$(PREFIX)/usr/sbin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ifeq ($(USE_SHADOW), 1)
 | 
				
			||||||
 | 
						DEFS:=-DUSE_SHADOW
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
						DEFS:=
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
all: sessmgr
 | 
					all: sessmgr
 | 
				
			||||||
	@echo "All done!"
 | 
						@echo "All done!"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -11,10 +17,10 @@ sessmgr: sessmgr.o sha256.o
 | 
				
			|||||||
	$(CC) $(CFLAGS) $(LDLIBS) sessmgr.o sha256.o -o sessmgr
 | 
						$(CC) $(CFLAGS) $(LDLIBS) sessmgr.o sha256.o -o sessmgr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sessmgr.o: sessmgr.c
 | 
					sessmgr.o: sessmgr.c
 | 
				
			||||||
	$(CC) $(CFLAGS) -c sessmgr.c
 | 
						$(CC) $(CFLAGS) $(DEFS) -c sessmgr.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
sha256.o: sha256.c
 | 
					sha256.o: sha256.c
 | 
				
			||||||
	$(CC) $(CFLAGS) -c sha256.c
 | 
						$(CC) $(CFLAGS) $(DEFS) -c sha256.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
install:
 | 
					install:
 | 
				
			||||||
	mkdir -p $(BINDIR)
 | 
						mkdir -p $(BINDIR)
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										95
									
								
								sessmgr.c
									
									
									
									
									
								
							
							
						
						
									
										95
									
								
								sessmgr.c
									
									
									
									
									
								
							@@ -11,13 +11,36 @@
 | 
				
			|||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
#include <unistd.h>
 | 
					#include <unistd.h>
 | 
				
			||||||
#include <pwd.h>
 | 
					 | 
				
			||||||
#include <stdarg.h>
 | 
					#include <stdarg.h>
 | 
				
			||||||
#include <time.h>
 | 
					#include <time.h>
 | 
				
			||||||
 | 
					#include <pwd.h>
 | 
				
			||||||
 | 
					#ifdef USE_SHADOW
 | 
				
			||||||
 | 
						#include <shadow.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "sessmgr.h"
 | 
					#include "sessmgr.h"
 | 
				
			||||||
#include "sha256.h"
 | 
					#include "sha256.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					char* get_admin_hash(const char* username) {
 | 
				
			||||||
 | 
						char* admin_hash = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if(username) {
 | 
				
			||||||
 | 
					#ifdef USE_SHADOW
 | 
				
			||||||
 | 
							struct spwd* pw;
 | 
				
			||||||
 | 
							if((pw = getspnam(username)) != NULL) {
 | 
				
			||||||
 | 
								admin_hash = strdup(pw->sp_pwdp);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
							struct passwd* pw;
 | 
				
			||||||
 | 
							if((pw = getpwnam(username)) != NULL) {
 | 
				
			||||||
 | 
								admin_hash = strdup(pw->pw_passwd);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return admin_hash;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
char* get_cookie_time(time_t t) {
 | 
					char* get_cookie_time(time_t t) {
 | 
				
			||||||
	struct tm* utc = gmtime(&t);
 | 
						struct tm* utc = gmtime(&t);
 | 
				
			||||||
	char wday[4];
 | 
						char wday[4];
 | 
				
			||||||
@@ -88,42 +111,9 @@ char* get_cookie_time(time_t t) {
 | 
				
			|||||||
	return safe_strdup(utc_str);
 | 
						return safe_strdup(utc_str);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
char* get_root_hash(void) {
 | 
					 | 
				
			||||||
	char* root_hash = get_root_hash_from_file("/etc/shadow");
 | 
					 | 
				
			||||||
	if(root_hash == NULL) {
 | 
					 | 
				
			||||||
		root_hash = get_root_hash_from_file("/etc/passwd");
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return root_hash;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
char* get_root_hash_from_file(const char* passwd_file) {
 | 
					 | 
				
			||||||
	int found = 0;
 | 
					 | 
				
			||||||
	FILE *pw = fopen(passwd_file, "r");
 | 
					 | 
				
			||||||
	char* root_hash = NULL;
 | 
					 | 
				
			||||||
	if(pw != NULL) {
 | 
					 | 
				
			||||||
		char line[512];
 | 
					 | 
				
			||||||
		char* test = fgets(line, 511, pw);
 | 
					 | 
				
			||||||
		while(test != NULL && !found) {
 | 
					 | 
				
			||||||
			if(strlen(test) > 5) {
 | 
					 | 
				
			||||||
				test[4] = '\0';
 | 
					 | 
				
			||||||
				if(strcmp(test, "root") == 0) {
 | 
					 | 
				
			||||||
					char* hash_end;
 | 
					 | 
				
			||||||
					found = 1;
 | 
					 | 
				
			||||||
					test = test + 5;
 | 
					 | 
				
			||||||
					hash_end = strchr(test, ':');
 | 
					 | 
				
			||||||
					*hash_end = '\0';
 | 
					 | 
				
			||||||
					root_hash = safe_strdup(test);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			test = fgets(line, 511, pw);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		fclose(pw);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return root_hash;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int main(int argc, char **argv) {
 | 
					int main(int argc, char **argv) {
 | 
				
			||||||
	char *password = NULL;
 | 
						char *password = NULL;
 | 
				
			||||||
 | 
						char *username = NULL;
 | 
				
			||||||
	char *cookie_hash = NULL;
 | 
						char *cookie_hash = NULL;
 | 
				
			||||||
	char *cookie_exp = NULL;
 | 
						char *cookie_exp = NULL;
 | 
				
			||||||
	char *user_agent = NULL;
 | 
						char *user_agent = NULL;
 | 
				
			||||||
@@ -132,16 +122,19 @@ int main(int argc, char **argv) {
 | 
				
			|||||||
	int timeout_minutes = DEFAULT_SESSION_TIMEOUT;
 | 
						int timeout_minutes = DEFAULT_SESSION_TIMEOUT;
 | 
				
			||||||
	unsigned long browser_time = 0;
 | 
						unsigned long browser_time = 0;
 | 
				
			||||||
	int loggedout = 0;
 | 
						int loggedout = 0;
 | 
				
			||||||
	int unconditionally_generate = 0;
 | 
					 | 
				
			||||||
	int next_opt;
 | 
						int next_opt;
 | 
				
			||||||
	int read;
 | 
						int read;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while((next_opt = getopt(argc, argv, "p:P:c:C:e:E:a:A:i:I:r:R:t:T:b:B:lL:gG")) != -1) {	
 | 
						while((next_opt = getopt(argc, argv, "p:P:u:U:c:C:e:E:a:A:i:I:r:R:t:T:b:B:lL")) != -1) {	
 | 
				
			||||||
		switch(next_opt) {
 | 
							switch(next_opt) {
 | 
				
			||||||
			case 'p':
 | 
								case 'p':
 | 
				
			||||||
			case 'P':
 | 
								case 'P':
 | 
				
			||||||
				password = safe_strdup(optarg);
 | 
									password = safe_strdup(optarg);
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
 | 
								case 'u':
 | 
				
			||||||
 | 
								case 'U':
 | 
				
			||||||
 | 
									username = safe_strdup(optarg);
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
			case 'c':
 | 
								case 'c':
 | 
				
			||||||
			case 'C':
 | 
								case 'C':
 | 
				
			||||||
				cookie_hash = safe_strdup(optarg);
 | 
									cookie_hash = safe_strdup(optarg);
 | 
				
			||||||
@@ -181,23 +174,19 @@ int main(int argc, char **argv) {
 | 
				
			|||||||
			case 'L':
 | 
								case 'L':
 | 
				
			||||||
				loggedout = 1;
 | 
									loggedout = 1;
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
			case 'g':
 | 
					 | 
				
			||||||
			case 'G':
 | 
					 | 
				
			||||||
				unconditionally_generate = 1;
 | 
					 | 
				
			||||||
				break;
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int expired = 0;
 | 
						int expired = 0;
 | 
				
			||||||
	int valid = 0;
 | 
						int valid = 0;
 | 
				
			||||||
	char* root_hash = get_root_hash();
 | 
						char* admin_hash = get_admin_hash(username);
 | 
				
			||||||
	if(loggedout == 1) {
 | 
						if(loggedout == 1) {
 | 
				
			||||||
		printf("echo \"Set-Cookie:kagera_sid=loggedout;\"; ");
 | 
							printf("echo \"Set-Cookie:kagera_sid=loggedout;\"; echo \"Set-Cookie:kagera_usr=loggedout;\"; ");
 | 
				
			||||||
	} else if(root_hash != NULL) {
 | 
						} else if(admin_hash != NULL) {
 | 
				
			||||||
		time_t now;
 | 
							time_t now;
 | 
				
			||||||
		time(&now);
 | 
							time(&now);
 | 
				
			||||||
		if(password != NULL) {
 | 
							if(password != NULL) {
 | 
				
			||||||
			valid = strcmp(crypt(password, root_hash), root_hash) == 0 ? 1 : 0;
 | 
								valid = strcmp(crypt(password, admin_hash), admin_hash) == 0 ? 1 : 0;
 | 
				
			||||||
			if(valid) {
 | 
								if(valid) {
 | 
				
			||||||
				printf("logger -t webui \"Kagera Administration Interface authorization succeeded from ${REMOTE_ADDR}\"; ");
 | 
									printf("logger -t webui \"Kagera Administration Interface authorization succeeded from ${REMOTE_ADDR}\"; ");
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@@ -210,7 +199,7 @@ int main(int argc, char **argv) {
 | 
				
			|||||||
					expired = 0;
 | 
										expired = 0;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			char *combined = safe_strcat(4, root_hash, cookie_exp, user_agent, src_ip);
 | 
								char *combined = safe_strcat(4, admin_hash, cookie_exp, user_agent, src_ip);
 | 
				
			||||||
			char* hashed = get_sha256_hash_hex_str(combined);
 | 
								char* hashed = get_sha256_hash_hex_str(combined);
 | 
				
			||||||
			if(strcmp(hashed, cookie_hash) == 0) {
 | 
								if(strcmp(hashed, cookie_hash) == 0) {
 | 
				
			||||||
				if(expired == 0 && read > 0) {
 | 
									if(expired == 0 && read > 0) {
 | 
				
			||||||
@@ -222,9 +211,6 @@ int main(int argc, char **argv) {
 | 
				
			|||||||
			free(hashed);
 | 
								free(hashed);
 | 
				
			||||||
			free(combined);
 | 
								free(combined);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if(unconditionally_generate == 1) {
 | 
					 | 
				
			||||||
			valid = 1;
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		if(valid == 1 && src_ip != NULL && user_agent != NULL) {
 | 
							if(valid == 1 && src_ip != NULL && user_agent != NULL) {
 | 
				
			||||||
			char* new_hash;
 | 
								char* new_hash;
 | 
				
			||||||
			char* combined;
 | 
								char* combined;
 | 
				
			||||||
@@ -238,20 +224,19 @@ int main(int argc, char **argv) {
 | 
				
			|||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				cookie_exp = get_cookie_time(new_exp_t);
 | 
									cookie_exp = get_cookie_time(new_exp_t);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			combined = safe_strcat(4, root_hash, new_exp, user_agent, src_ip);
 | 
								combined = safe_strcat(4, admin_hash, new_exp, user_agent, src_ip);
 | 
				
			||||||
			new_hash = get_sha256_hash_hex_str(combined);
 | 
								new_hash = get_sha256_hash_hex_str(combined);
 | 
				
			||||||
			if(browser_time == 0) {
 | 
								if(browser_time == 0) {
 | 
				
			||||||
				printf("echo \"Set-Cookie:kagera_sid=%s; Path=/;\"; echo \"Set-Cookie:kagera_exp=%s; Path=/;\"; ", new_hash, new_exp);
 | 
									printf("echo \"Set-Cookie:kagera_sid=%s; Path=/;\"; echo \"Set-Cookie:kagera_usr=%s; Path=/;\"; echo \"Set-Cookie:kagera_exp=%s; Path=/;\"; ", new_hash, username, new_exp);
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				printf("echo \"Set-Cookie:kagera_sid=%s; Expires=%s; Path=/;\"; echo \"Set-Cookie:kagera_exp=%s; Expires=%s; Path=/;\"; ", new_hash, cookie_exp, new_exp, cookie_exp);
 | 
									printf("echo \"Set-Cookie:kagera_sid=%s; Expires=%s; Path=/;\"; echo \"Set-Cookie:kagera_usr=%s; Expires=%s; Path=/;\"; echo \"Set-Cookie:kagera_exp=%s; Expires=%s; Path=/;\"; ", new_hash, cookie_exp, username, cookie_exp, new_exp, cookie_exp);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			free(new_hash);
 | 
								free(new_hash);
 | 
				
			||||||
			free(combined);
 | 
								free(combined);
 | 
				
			||||||
			free(cookie_exp);
 | 
								free(cookie_exp);
 | 
				
			||||||
		} else {
 | 
								printf("VALIDSESS=1\n");
 | 
				
			||||||
			printf("KAGERA_LOGGEDOUT=1\n");
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		free(root_hash);
 | 
							free(admin_hash);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if(redirect != NULL) {
 | 
						if(redirect != NULL) {
 | 
				
			||||||
		char str[20] = "";
 | 
							char str[20] = "";
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,9 +13,8 @@
 | 
				
			|||||||
#define DEFAULT_SESSION_TIMEOUT 15
 | 
					#define DEFAULT_SESSION_TIMEOUT 15
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern char* crypt(const char* key, const char* setting);
 | 
					extern char* crypt(const char* key, const char* setting);
 | 
				
			||||||
 | 
					char* get_admin_hash(const char* username);
 | 
				
			||||||
char* get_cookie_time(time_t t);
 | 
					char* get_cookie_time(time_t t);
 | 
				
			||||||
char* get_root_hash(void);
 | 
					 | 
				
			||||||
char* get_root_hash_from_file(const char* passwd_file);
 | 
					 | 
				
			||||||
void* safe_malloc(size_t size);
 | 
					void* safe_malloc(size_t size);
 | 
				
			||||||
char* safe_strcat(int num_strs, ...);
 | 
					char* safe_strcat(int num_strs, ...);
 | 
				
			||||||
char* safe_strdup(const char* str);
 | 
					char* safe_strdup(const char* str);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user