kasmvncpasswd: Add support for multiple users
							parent
							
								
									e7016550fc
								
							
						
					
					
						commit
						896950ea13
					
				| @ -0,0 +1,114 @@ | ||||
| #include <limits.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <sys/stat.h> | ||||
| #include <unistd.h> | ||||
| 
 | ||||
| #include "kasmpasswd.h" | ||||
| 
 | ||||
| struct kasmpasswd_t *readkasmpasswd(const char path[]) { | ||||
| 
 | ||||
| 	struct kasmpasswd_t *set = calloc(sizeof(struct kasmpasswd_t), 1); | ||||
| 	FILE *f = fopen(path, "r"); | ||||
| 	if (!f) | ||||
| 		return set; | ||||
| 
 | ||||
| 	// Count lines
 | ||||
| 	unsigned lines = 0; | ||||
| 	char buf[4096]; | ||||
| 
 | ||||
| 	while (fgets(buf, 4096, f)) { | ||||
| 		lines++; | ||||
| 	} | ||||
| 
 | ||||
| 	rewind(f); | ||||
| 
 | ||||
| 	set->entries = calloc(sizeof(struct kasmpasswd_entry_t), lines); | ||||
| 
 | ||||
| 	unsigned cur = 0; | ||||
| 	while (fgets(buf, 4096, f)) { | ||||
| 		char *lim = strchr(buf, ':'); | ||||
| 		if (!lim) | ||||
| 			continue; | ||||
| 		*lim = '\0'; | ||||
| 		lim++; | ||||
| 
 | ||||
| 		const char * const pw = lim; | ||||
| 
 | ||||
| 		lim = strchr(lim, ':'); | ||||
| 		if (!lim) | ||||
| 			continue; | ||||
| 		*lim = '\0'; | ||||
| 		lim++; | ||||
| 
 | ||||
| 		const char * const perms = lim; | ||||
| 
 | ||||
| 		lim = strchr(lim, '\n'); | ||||
| 		if (lim) | ||||
| 			*lim = '\0'; | ||||
| 
 | ||||
| 		if (strlen(buf) + 1 > sizeof(((struct kasmpasswd_entry_t *)0)->user)) { | ||||
| 			fprintf(stderr, "Username %s too long\n", buf); | ||||
| 			continue; | ||||
| 		} | ||||
| 		if (strlen(pw) + 1 > sizeof(((struct kasmpasswd_entry_t *)0)->password)) { | ||||
| 			fprintf(stderr, "Password for user %s too long\n", buf); | ||||
| 			continue; | ||||
| 		} | ||||
| 
 | ||||
| 		strcpy(set->entries[cur].user, buf); | ||||
| 		strcpy(set->entries[cur].password, pw); | ||||
| 
 | ||||
| 		if (strchr(perms, 'w')) | ||||
| 			set->entries[cur].write = 1; | ||||
| 		if (strchr(perms, 'o')) | ||||
| 			set->entries[cur].owner = 1; | ||||
| 
 | ||||
| 		cur++; | ||||
| 	} | ||||
| 
 | ||||
| 	fclose(f); | ||||
| 
 | ||||
| 	set->num = cur; | ||||
| 
 | ||||
| 	return set; | ||||
| } | ||||
| 
 | ||||
| void writekasmpasswd(const char path[], const struct kasmpasswd_t *set) { | ||||
| 	char tmpname[PATH_MAX]; | ||||
| 
 | ||||
| 	if (!set || !set->entries || !set->num) | ||||
| 		return; | ||||
| 
 | ||||
| 	snprintf(tmpname, PATH_MAX, "%s.tmp", path); | ||||
| 	tmpname[PATH_MAX - 1] = '\0'; | ||||
| 
 | ||||
| 	FILE *f = fopen(tmpname, "w"); | ||||
| 	if (!f) { | ||||
| 		fprintf(stderr, "Failed to open temp file %s\n", tmpname); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	static const char * const perms[] = { | ||||
| 		"", | ||||
| 		"w", | ||||
| 		"o", | ||||
| 		"ow" | ||||
| 	}; | ||||
| 
 | ||||
| 	unsigned i; | ||||
| 	for (i = 0; i < set->num; i++) { | ||||
| 		fprintf(f, "%s:%s:%s\n", | ||||
| 			set->entries[i].user, | ||||
| 			set->entries[i].password, | ||||
| 			perms[set->entries[i].owner * 2 + set->entries[i].write]); | ||||
| 	} | ||||
| 
 | ||||
| 	fsync(fileno(f)); | ||||
| 	fclose(f); | ||||
| 
 | ||||
| 	if (rename(tmpname, path)) | ||||
| 		fprintf(stderr, "Failed writing the password file %s\n", path); | ||||
| 	chmod(path, S_IRUSR|S_IWUSR); | ||||
| } | ||||
| @ -0,0 +1,27 @@ | ||||
| #ifndef KASMPASSWD_H | ||||
| #define KASMPASSWD_H | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| extern "C" { | ||||
| #endif | ||||
| 
 | ||||
| struct kasmpasswd_entry_t { | ||||
| 	char user[32]; | ||||
| 	char password[128]; | ||||
| 	unsigned char write : 1; | ||||
| 	unsigned char owner : 1; | ||||
| }; | ||||
| 
 | ||||
| struct kasmpasswd_t { | ||||
| 	struct kasmpasswd_entry_t *entries; | ||||
| 	unsigned num; | ||||
| }; | ||||
| 
 | ||||
| struct kasmpasswd_t *readkasmpasswd(const char path[]); | ||||
| void writekasmpasswd(const char path[], const struct kasmpasswd_t *set); | ||||
| 
 | ||||
| #ifdef __cplusplus | ||||
| } // extern C
 | ||||
| #endif | ||||
| 
 | ||||
| #endif | ||||
					Loading…
					
					
				
		Reference in New Issue
	
	 Lauri Kasanen
						Lauri Kasanen