[dovecot-cvs] dovecot/src/auth db-passwd-file.c, 1.20, 1.21 db-passwd-file.h, 1.11, 1.12 passdb-passwd-file.c, 1.27, 1.28 userdb-passwd-file.c, 1.21, 1.22

cras at dovecot.org cras at dovecot.org
Mon Feb 20 18:31:49 EET 2006


Update of /var/lib/cvs/dovecot/src/auth
In directory talvi:/tmp/cvs-serv14325

Modified Files:
	db-passwd-file.c db-passwd-file.h passdb-passwd-file.c 
	userdb-passwd-file.c 
Log Message:
If passwd-file is being used as userdb, complain immediately if some entries
don't have userdb information. Also some other cleanups and crashfix for
today's earlier changes.



Index: db-passwd-file.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/auth/db-passwd-file.c,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -d -r1.20 -r1.21
--- db-passwd-file.c	20 Feb 2006 14:16:00 -0000	1.20
+++ db-passwd-file.c	20 Feb 2006 16:31:46 -0000	1.21
@@ -26,6 +26,7 @@
 	/* args = uid, gid, user info, home dir, shell, extra_fields */
 	struct passwd_user *pu;
 	const char *p, *extra_fields = NULL;
+	char *user;
 
 	if (hash_lookup(pw->users, username) != NULL) {
 		i_error("passwd-file %s: User %s exists more than once",
@@ -34,11 +35,7 @@
 	}
 
 	pu = p_new(pw->pool, struct passwd_user, 1);
-	pu->user_realm = p_strdup(pw->pool, username);
-
-	pu->realm = strchr(pu->user_realm, '@');
-	if (pu->realm != NULL)
-		pu->realm++;
+	user = p_strdup(pw->pool, username);
 
 	p = pass == NULL ? NULL : strchr(pass, '[');
 	if (p == NULL) {
@@ -84,6 +81,14 @@
 			return;
 		}
 		args++;
+	} else {
+		if (pw->db->userdb) {
+			i_error("passwd-file %s: User %s is missing "
+				"userdb info", pw->path, username);
+		}
+		if (pw->first_missing_userdb_info == NULL)
+			pw->first_missing_userdb_info = user;
+		pw->missing_userdb_info_count++;
 	}
 
 	/* user info */
@@ -120,7 +125,7 @@
                         p_strsplit_spaces(pw->pool, extra_fields, " ");
         }
 
-	hash_insert(pw->users, pu->user_realm, pu);
+	hash_insert(pw->users, user, pu);
 }
 
 static struct passwd_file *
@@ -133,7 +138,8 @@
 	pw->path = i_strdup(expanded_path);
 	pw->fd = -1;
 
-	hash_insert(db->files, pw->path, pw);
+	if (db->files != NULL)
+		hash_insert(db->files, pw->path, pw);
 	return pw;
 }
 
@@ -160,6 +166,7 @@
 
 	pw->fd = fd;
 	pw->stamp = st.st_mtime;
+	pw->size = st.st_size;
 
 	pw->pool = pool_alloconly_create("passwd_file", 10240);;
 	pw->users = hash_create(default_pool, pw->pool, 100,
@@ -199,6 +206,9 @@
 		pw->fd = -1;
 	}
 
+	pw->first_missing_userdb_info = NULL;
+	pw->missing_userdb_info_count = 0;
+
 	if (pw->users != NULL) {
 		hash_destroy(pw->users);
 		pw->users = NULL;
@@ -211,7 +221,8 @@
 
 static void passwd_file_free(struct passwd_file *pw)
 {
-	hash_remove(pw->db->files, pw->path);
+	if (pw->db->files != NULL)
+		hash_remove(pw->db->files, pw->path);
 
 	passwd_file_close(pw);
 	i_free(pw->path);
@@ -232,7 +243,7 @@
 		return FALSE;
 	}
 
-	if (st.st_mtime != pw->stamp) {
+	if (st.st_mtime != pw->stamp || st.st_size != pw->size) {
 		passwd_file_close(pw);
 		return passwd_file_open(pw);
 	}
@@ -252,7 +263,7 @@
 }
 
 struct db_passwd_file *
-db_passwd_file_parse(const char *path, bool userdb, bool debug)
+db_passwd_file_init(const char *path, bool userdb, bool debug)
 {
 	struct db_passwd_file *db;
 	const char *p;
@@ -261,13 +272,7 @@
 	db = db_passwd_file_find(path);
 	if (db != NULL) {
 		db->refcount++;
-		if (userdb && !db->userdb) {
-			db->userdb = TRUE;
-			if (db->default_file != NULL) {
-				/* resync */
-				db->default_file->stamp = 0;
-			}
-		}
+		db->userdb = TRUE;
 		return db;
 	}
 
@@ -275,8 +280,6 @@
 	db->refcount = 1;
 	db->userdb = userdb;
 	db->debug = debug;
-	db->files = hash_create(default_pool, default_pool, 100,
-				str_hash, (hash_cmp_callback_t *)strcmp);
 
 	for (p = path; *p != '\0'; p++) {
 		if (*p == '%' && p[1] != '\0') {
@@ -306,12 +309,12 @@
 	}
 
 	db->path = i_strdup(path);
-
-	if (!db->vars) {
-		/* no variables, open the file immediately */
+	if (db->vars) {
+		db->files = hash_create(default_pool, default_pool, 100,
+					str_hash,
+					(hash_cmp_callback_t *)strcmp);
+	} else {
 		db->default_file = passwd_file_new(db, path);
-		if (!passwd_file_open(db->default_file))
-			exit(FATAL_DEFAULT);
 	}
 
 	db->next = passwd_files;
@@ -319,6 +322,15 @@
 	return db;
 }
 
+void db_passwd_file_parse(struct db_passwd_file *db)
+{
+	if (db->default_file != NULL && db->default_file->stamp == 0) {
+		/* no variables, open the file immediately */
+		if (!passwd_file_open(db->default_file))
+			exit(FATAL_DEFAULT);
+	}
+}
+
 void db_passwd_file_unref(struct db_passwd_file **_db)
 {
         struct db_passwd_file *db = *_db;
@@ -338,12 +350,18 @@
 		}
 	}
 
-	iter = hash_iterate_init(db->files);
-	while (hash_iterate(iter, &key, &value))
-		passwd_file_free(value);
-	hash_iterate_deinit(iter);
+	if (db->default_file != NULL)
+		passwd_file_free(db->default_file);
+	else {
+		iter = hash_iterate_init(db->files);
+		while (hash_iterate(iter, &key, &value)) {
+			struct passwd_file *file = value;
 
-	hash_destroy(db->files);
+			passwd_file_free(file);
+		}
+		hash_iterate_deinit(iter);
+		hash_destroy(db->files);
+	}
 	i_free(db->path);
 	i_free(db);
 }

Index: db-passwd-file.h
===================================================================
RCS file: /var/lib/cvs/dovecot/src/auth/db-passwd-file.h,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- db-passwd-file.h	20 Feb 2006 14:16:00 -0000	1.11
+++ db-passwd-file.h	20 Feb 2006 16:31:46 -0000	1.12
@@ -2,9 +2,6 @@
 #define __DB_PASSWD_FILE_H
 
 struct passwd_user {
-	char *user_realm; /* user at realm */
-	const char *realm; /* NULL or points to user_realm */
-
 	uid_t uid;
 	gid_t gid;
 
@@ -19,9 +16,13 @@
 
 	char *path;
 	time_t stamp;
+	off_t size;
 	int fd;
 
 	struct hash_table *users;
+
+	const char *first_missing_userdb_info;
+	unsigned int missing_userdb_info_count;
 };
 
 struct db_passwd_file {
@@ -43,7 +44,8 @@
 db_passwd_file_lookup(struct db_passwd_file *db, struct auth_request *request);
 
 struct db_passwd_file *
-db_passwd_file_parse(const char *path, bool userdb, bool debug);
+db_passwd_file_init(const char *path, bool userdb, bool debug);
+void db_passwd_file_parse(struct db_passwd_file *db);
 void db_passwd_file_unref(struct db_passwd_file **db);
 
 #endif

Index: passdb-passwd-file.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/auth/passdb-passwd-file.c,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -d -r1.27 -r1.28
--- passdb-passwd-file.c	20 Feb 2006 14:16:00 -0000	1.27
+++ passdb-passwd-file.c	20 Feb 2006 16:31:46 -0000	1.28
@@ -50,24 +50,26 @@
 				       crypted_pass, scheme);
         }
 
-	t_push();
-	str = t_str_new(512);
-	table = auth_request_get_var_expand_table(request, NULL);
+	if (pu->extra_fields != NULL) {
+		t_push();
+		str = t_str_new(512);
+		table = auth_request_get_var_expand_table(request, NULL);
 
-	for (p = pu->extra_fields; *p != NULL; p++) {
-		value = strchr(*p, '=');
-		if (value != NULL) {
-			key = t_strdup_until(*p, value);
-			str_truncate(str, 0);
-			var_expand(str, value + 1, table);
-			value = str_c(str);
-		} else {
-			key = *p;
-			value = "";
+		for (p = pu->extra_fields; *p != NULL; p++) {
+			value = strchr(*p, '=');
+			if (value != NULL) {
+				key = t_strdup_until(*p, value);
+				str_truncate(str, 0);
+				var_expand(str, value + 1, table);
+				value = str_c(str);
+			} else {
+				key = *p;
+				value = "";
+			}
+			auth_request_set_field(request, key, value, NULL);
 		}
-		auth_request_set_field(request, key, value, NULL);
+		t_pop();
 	}
-	t_pop();
 
 	ret = auth_request_password_verify(request, password, crypted_pass,
 					   scheme, "passwd-file");
@@ -100,8 +102,7 @@
 }
 
 static struct passdb_module *
-passwd_file_preinit(struct auth_passdb *auth_passdb,
-		    const char *args __attr_unused__)
+passwd_file_preinit(struct auth_passdb *auth_passdb, const char *args)
 {
 	struct passwd_file_passdb_module *module;
 
@@ -110,16 +111,18 @@
 	module->auth = auth_passdb->auth;
 	module->module.cache_key = PASSWD_FILE_CACHE_KEY;
 	module->module.default_pass_scheme = PASSWD_FILE_DEFAULT_SCHEME;
+	module->pwf =
+		db_passwd_file_init(args, FALSE, module->auth->verbose_debug);
 	return &module->module;
 }
 
-static void passwd_file_init(struct passdb_module *_module, const char *args)
+static void passwd_file_init(struct passdb_module *_module,
+			     const char *args __attr_unused__)
 {
 	struct passwd_file_passdb_module *module =
 		(struct passwd_file_passdb_module *)_module;
 
-	module->pwf =
-		db_passwd_file_parse(args, FALSE, module->auth->verbose_debug);
+	db_passwd_file_parse(module->pwf);
 }
 
 static void passwd_file_deinit(struct passdb_module *_module)

Index: userdb-passwd-file.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/auth/userdb-passwd-file.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -d -r1.21 -r1.22
--- userdb-passwd-file.c	20 Feb 2006 14:16:00 -0000	1.21
+++ userdb-passwd-file.c	20 Feb 2006 16:31:46 -0000	1.22
@@ -43,48 +43,51 @@
 	if (pu->home != NULL)
 		auth_stream_reply_add(reply, "home", pu->home);
 
-	t_push();
-	str = t_str_new(512);
-	table = auth_request_get_var_expand_table(auth_request, NULL);
+	if (pu->extra_fields != NULL) {
+		t_push();
+		str = t_str_new(512);
+		table = auth_request_get_var_expand_table(auth_request, NULL);
 
-	for (p = pu->extra_fields; *p != NULL; p++) {
-		if (strncmp(*p, "userdb_", 7) != 0)
-			continue;
+		for (p = pu->extra_fields; *p != NULL; p++) {
+			if (strncmp(*p, "userdb_", 7) != 0)
+				continue;
 
-		key = *p + 7;
-		value = strchr(key, '=');
-		if (value != NULL) {
-			key = t_strdup_until(key, value);
-			str_truncate(str, 0);
-			var_expand(str, value + 1, table);
-			value = str_c(str);
+			key = *p + 7;
+			value = strchr(key, '=');
+			if (value != NULL) {
+				key = t_strdup_until(key, value);
+				str_truncate(str, 0);
+				var_expand(str, value + 1, table);
+				value = str_c(str);
+			}
+			auth_stream_reply_add(reply, key, value);
 		}
-		auth_stream_reply_add(reply, key, value);
+		t_pop();
 	}
-	t_pop();
 
 	callback(reply, auth_request);
 }
 
 static struct userdb_module *
-passwd_file_preinit(struct auth_userdb *auth_userdb,
-		    const char *args __attr_unused__)
+passwd_file_preinit(struct auth_userdb *auth_userdb, const char *args)
 {
 	struct passwd_file_userdb_module *module;
 
 	module = p_new(auth_userdb->auth->pool,
 		       struct passwd_file_userdb_module, 1);
 	module->auth = auth_userdb->auth;
+	module->pwf =
+		db_passwd_file_init(args, TRUE, module->auth->verbose_debug);
 	return &module->module;
 }
 
-static void passwd_file_init(struct userdb_module *_module, const char *args)
+static void passwd_file_init(struct userdb_module *_module,
+			     const char *args __attr_unused__)
 {
 	struct passwd_file_userdb_module *module =
 		(struct passwd_file_userdb_module *)_module;
 
-	module->pwf =
-		db_passwd_file_parse(args, TRUE, module->auth->verbose_debug);
+	db_passwd_file_parse(module->pwf);
 }
 
 static void passwd_file_deinit(struct userdb_module *_module)



More information about the dovecot-cvs mailing list