From 9229e610b779ee00ade4a918eab264f5dfaa635f Mon Sep 17 00:00:00 2001 From: Stefan Ritt Date: Thu, 3 Mar 2005 15:33:05 +0000 Subject: [PATCH] Keep parsed password files in memory SVN revision: 1233 --- src/elogd.c | 495 +++++++++++++++++++++++++++++----------------------- 1 file changed, 281 insertions(+), 214 deletions(-) diff --git a/src/elogd.c b/src/elogd.c index 29d24d9f..d7f43db2 100755 --- a/src/elogd.c +++ b/src/elogd.c @@ -6,6 +6,9 @@ Contents: Web server program for Electronic Logbook ELOG $Log$ + Revision 1.579 2005/03/03 15:33:05 ritt + Keep parsed password files in memory + Revision 1.578 2005/03/02 21:03:16 ritt Implemented email subscriptions for individual logbooks @@ -1189,6 +1192,7 @@ typedef struct { EL_INDEX *el_index; int *n_el_index; int n_attr; + PMXML_NODE pwd_xml_tree; } LOGBOOK; typedef struct { @@ -1219,33 +1223,33 @@ int run_service(void); #endif void show_error(char *error); -BOOL enum_user_line(LOGBOOK * lbs, int n, char *user, int size); -int get_user_line(char *logbook_name, char *user, char *password, char *full_name, +BOOL enum_user_line(LOGBOOK *lbs, int n, char *user, int size); +int get_user_line(LOGBOOK *lbs, char *user, char *password, char *full_name, char *email, BOOL email_notify[1000]); int strbreak(char *str, char list[][NAME_LENGTH], int size, char *brk); -int execute_shell(LOGBOOK * lbs, int message_id, char attrib[MAX_N_ATTR][NAME_LENGTH], +int execute_shell(LOGBOOK *lbs, int message_id, char attrib[MAX_N_ATTR][NAME_LENGTH], char att_file[MAX_ATTACHMENTS][256], char *sh_cmd); BOOL isparam(char *param); char *getparam(char *param); -void write_logfile(LOGBOOK * lbs, const char *format, ...); -BOOL check_login_user(LOGBOOK * lbs, char *user); +void write_logfile(LOGBOOK *lbs, const char *format, ...); +BOOL check_login_user(LOGBOOK *lbs, char *user); LBLIST get_logbook_hierarchy(void); BOOL is_logbook_in_group(LBLIST pgrp, char *logbook); BOOL is_admin_user(char *logbook, char *user); BOOL is_admin_user_global(char *user); void free_logbook_hierarchy(LBLIST root); -void show_top_text(LOGBOOK * lbs); -void show_bottom_text(LOGBOOK * lbs); -int set_attributes(LOGBOOK * lbs, char attributes[][NAME_LENGTH], int n); -void show_elog_list(LOGBOOK * lbs, INT past_n, INT last_n, INT page_n, char *info); -int change_config_line(LOGBOOK * lbs, char *option, char *old_value, char *new_value); +void show_top_text(LOGBOOK *lbs); +void show_bottom_text(LOGBOOK *lbs); +int set_attributes(LOGBOOK *lbs, char attributes[][NAME_LENGTH], int n); +void show_elog_list(LOGBOOK *lbs, INT past_n, INT last_n, INT page_n, char *info); +int change_config_line(LOGBOOK *lbs, char *option, char *old_value, char *new_value); int read_password(char *pwd, int size); int getcfg(char *group, char *param, char *value, int vsize); -int build_subst_list(LOGBOOK * lbs, char list[][NAME_LENGTH], char value[][NAME_LENGTH], +int build_subst_list(LOGBOOK *lbs, char list[][NAME_LENGTH], char value[][NAME_LENGTH], char attrib[][NAME_LENGTH], BOOL format_date); void highlight_searchtext(regex_t * re_buf, char *src, char *dst, BOOL hidden); int parse_config_file(char *config_file); -PMXML_NODE load_password_file(char *logbook_name); +PMXML_NODE load_password_file(LOGBOOK *lbs); /*---- Funcions from the MIDAS library -----------------------------*/ @@ -2355,7 +2359,7 @@ INT recv_string(int sock, char *buffer, INT buffer_size, INT millisec) /*-------------------------------------------------------------------*/ -INT sendmail(LOGBOOK * lbs, char *smtp_host, char *from, char *to, +INT sendmail(LOGBOOK *lbs, char *smtp_host, char *from, char *to, char *subject, char *text, BOOL email_to, char *url, char att_file[MAX_ATTACHMENTS][256]) { struct sockaddr_in bind_addr; @@ -2893,6 +2897,7 @@ INT ss_daemon_init() typedef struct { char *param; + char *uparam; char *value; } CONFIG_PARAM; @@ -3022,7 +3027,7 @@ BOOL match_param(char *str, char *param, int conditional_only) int param_compare(const void *p1, const void *p2) { - return stricmp(((CONFIG_PARAM *)p1)->param, ((CONFIG_PARAM *)p2)->param); + return stricmp(((CONFIG_PARAM *)p1)->uparam, ((CONFIG_PARAM *)p2)->uparam); } /*------------------------------------------------------------------*/ @@ -3034,6 +3039,7 @@ void free_config() for (i=0 ; iname, login_name, NULL, NULL, str, NULL); + get_user_line(lbs, login_name, NULL, NULL, str, NULL); if (is_admin_user(lbs->name, login_name) && strchr(str, '@')) break; } @@ -3843,7 +3851,7 @@ int eli_compare(const void *e1, const void *e2) /*------------------------------------------------------------------*/ -int el_build_index(LOGBOOK * lbs, BOOL rebuild) +int el_build_index(LOGBOOK *lbs, BOOL rebuild) /* scan all ??????a.log files and build an index table in eli[] */ { char *file_list, str[256], date[256], dir[256], file_name[MAX_PATH_LENGTH], *buffer, @@ -4174,7 +4182,7 @@ int el_index_logbooks() /*------------------------------------------------------------------*/ -int el_search_message(LOGBOOK * lbs, int mode, int message_id, BOOL head_only) +int el_search_message(LOGBOOK *lbs, int mode, int message_id, BOOL head_only) /********************************************************************\ Routine: el_search_message @@ -4270,7 +4278,7 @@ int el_search_message(LOGBOOK * lbs, int mode, int message_id, BOOL head_only) /*------------------------------------------------------------------*/ -INT el_retrieve(LOGBOOK * lbs, +INT el_retrieve(LOGBOOK *lbs, int message_id, char *date, char attr_list[MAX_N_ATTR][NAME_LENGTH], char attrib[MAX_N_ATTR][NAME_LENGTH], int n_attr, @@ -4464,7 +4472,7 @@ INT el_retrieve(LOGBOOK * lbs, /*------------------------------------------------------------------*/ -int el_submit_attachment(LOGBOOK * lbs, char *afilename, char *buffer, int buffer_size, char *full_name) +int el_submit_attachment(LOGBOOK *lbs, char *afilename, char *buffer, int buffer_size, char *full_name) { char file_name[MAX_PATH_LENGTH], ext_file_name[MAX_PATH_LENGTH + 100], str[MAX_PATH_LENGTH], *p; int fh; @@ -4521,7 +4529,7 @@ int el_submit_attachment(LOGBOOK * lbs, char *afilename, char *buffer, int buffe /*------------------------------------------------------------------*/ -void el_delete_attachment(LOGBOOK * lbs, char *file_name) +void el_delete_attachment(LOGBOOK *lbs, char *file_name) { char str[MAX_PATH_LENGTH]; @@ -4534,7 +4542,7 @@ void el_delete_attachment(LOGBOOK * lbs, char *file_name) /*------------------------------------------------------------------*/ -INT el_retrieve_attachment(LOGBOOK * lbs, int message_id, int n, char name[MAX_PATH_LENGTH]) +INT el_retrieve_attachment(LOGBOOK *lbs, int message_id, int n, char name[MAX_PATH_LENGTH]) { int i, index, size, fh; char file_name[256], *p; @@ -4609,7 +4617,7 @@ INT el_retrieve_attachment(LOGBOOK * lbs, int message_id, int n, char name[MAX_P /*------------------------------------------------------------------*/ -int el_submit(LOGBOOK * lbs, int message_id, BOOL bedit, +int el_submit(LOGBOOK *lbs, int message_id, BOOL bedit, char *date, char attr_name[MAX_N_ATTR][NAME_LENGTH], char attr_value[MAX_N_ATTR][NAME_LENGTH], @@ -4887,7 +4895,7 @@ int el_submit(LOGBOOK * lbs, int message_id, BOOL bedit, /*------------------------------------------------------------------*/ -void remove_reference(LOGBOOK * lbs, int message_id, int remove_id, BOOL reply_to_flag) +void remove_reference(LOGBOOK *lbs, int message_id, int remove_id, BOOL reply_to_flag) { char date[80], attr[MAX_N_ATTR][NAME_LENGTH], enc[80], in_reply_to[80], reply_to[MAX_REPLY_TO * 10], att[MAX_ATTACHMENTS][256], lock[256], *p, *ps, *message; @@ -4934,7 +4942,7 @@ void remove_reference(LOGBOOK * lbs, int message_id, int remove_id, BOOL reply_t /*------------------------------------------------------------------*/ -INT el_delete_message(LOGBOOK * lbs, int message_id, +INT el_delete_message(LOGBOOK *lbs, int message_id, BOOL delete_attachments, char attachment[MAX_ATTACHMENTS][MAX_PATH_LENGTH], BOOL delete_bw_ref, BOOL delete_reply_to) @@ -5133,7 +5141,7 @@ INT el_delete_message(LOGBOOK * lbs, int message_id, /*------------------------------------------------------------------*/ -int el_correct_links(LOGBOOK * lbs, int old_id, int new_id) +int el_correct_links(LOGBOOK *lbs, int old_id, int new_id) /* If a message gets resubmitted, the links to that message are wrong. This routine corrects that. */ { @@ -5209,7 +5217,7 @@ This routine corrects that. */ /*------------------------------------------------------------------*/ -int el_move_message_thread(LOGBOOK * lbs, int message_id) +int el_move_message_thread(LOGBOOK *lbs, int message_id) { int i, n, size, new_id; char date[80], attrib[MAX_N_ATTR][NAME_LENGTH], *text, @@ -5250,7 +5258,7 @@ int el_move_message_thread(LOGBOOK * lbs, int message_id) /*------------------------------------------------------------------*/ -int el_move_message(LOGBOOK * lbs, int old_id, int new_id) +int el_move_message(LOGBOOK *lbs, int old_id, int new_id) { int status, size; char date[80], attrib[MAX_N_ATTR][NAME_LENGTH], *text, in_reply_to[80], @@ -5284,7 +5292,7 @@ int el_move_message(LOGBOOK * lbs, int old_id, int new_id) /*------------------------------------------------------------------*/ -int el_lock_message(LOGBOOK * lbs, int message_id, char *user) +int el_lock_message(LOGBOOK *lbs, int message_id, char *user) /* lock message for editing */ { int size; @@ -5306,7 +5314,7 @@ int el_lock_message(LOGBOOK * lbs, int message_id, char *user) /*------------------------------------------------------------------*/ -void write_logfile(LOGBOOK * lbs, const char *format, ...) +void write_logfile(LOGBOOK *lbs, const char *format, ...) { char file_name[2000]; va_list argptr; @@ -5940,7 +5948,7 @@ void extract_host(char *str) /*------------------------------------------------------------------*/ -void set_location(LOGBOOK * lbs, char *rel_path) +void set_location(LOGBOOK *lbs, char *rel_path) { char str[NAME_LENGTH]; @@ -6008,7 +6016,7 @@ void set_location(LOGBOOK * lbs, char *rel_path) /*------------------------------------------------------------------*/ -void set_redir(LOGBOOK * lbs, char *redir) +void set_redir(LOGBOOK *lbs, char *redir) { char str[NAME_LENGTH]; @@ -6029,7 +6037,7 @@ void set_redir(LOGBOOK * lbs, char *redir) /*------------------------------------------------------------------*/ -void set_cookie(LOGBOOK * lbs, char *name, char *value, BOOL global, char *expiration) +void set_cookie(LOGBOOK *lbs, char *name, char *value, BOOL global, char *expiration) { char lb_name[256], str[NAME_LENGTH], format[80]; double exp; @@ -6087,7 +6095,7 @@ void set_cookie(LOGBOOK * lbs, char *name, char *value, BOOL global, char *expir /*------------------------------------------------------------------*/ -void redirect(LOGBOOK * lbs, char *rel_path) +void redirect(LOGBOOK *lbs, char *rel_path) { /* redirect */ rsprintf("HTTP/1.1 302 Found\r\n"); @@ -6333,7 +6341,7 @@ void show_plain_header(int size, char *file_name) rsprintf("\r\n"); } -void show_html_header(LOGBOOK * lbs, BOOL expires, char *title, BOOL close_head, BOOL rss_feed) +void show_html_header(LOGBOOK *lbs, BOOL expires, char *title, BOOL close_head, BOOL rss_feed) { char css[256], str[256]; @@ -6369,7 +6377,7 @@ void show_html_header(LOGBOOK * lbs, BOOL expires, char *title, BOOL close_head, rsprintf("\n"); } -void show_standard_header(LOGBOOK * lbs, BOOL expires, char *title, char *path, BOOL rss_feed) +void show_standard_header(LOGBOOK *lbs, BOOL expires, char *title, char *path, BOOL rss_feed) { show_html_header(lbs, expires, title, TRUE, rss_feed); @@ -6385,7 +6393,7 @@ void show_standard_header(LOGBOOK * lbs, BOOL expires, char *title, char *path, /*------------------------------------------------------------------*/ -void show_upgrade_page(LOGBOOK * lbs) +void show_upgrade_page(LOGBOOK *lbs) { char str[1000]; @@ -6609,7 +6617,7 @@ BOOL is_logbook_in_group(LBLIST pgrp, char *logbook) /*------------------------------------------------------------------*/ -void change_logbook_in_group(LOGBOOK * lbs, char *new_name) +void change_logbook_in_group(LOGBOOK *lbs, char *new_name) { int i, j, n, flag; char str[1000], grpname[256], grpmembers[1000]; @@ -6645,7 +6653,7 @@ void change_logbook_in_group(LOGBOOK * lbs, char *new_name) /*------------------------------------------------------------------*/ -void add_logbook_to_group(LOGBOOK * lbs, char *new_name) +void add_logbook_to_group(LOGBOOK *lbs, char *new_name) { int i, j, n, flag; char str[1000], grpname[256], grpmembers[1000]; @@ -6822,7 +6830,7 @@ void show_standard_title(char *logbook, char *text, int printable) /*------------------------------------------------------------------*/ -void show_top_text(LOGBOOK * lbs) +void show_top_text(LOGBOOK *lbs) { char str[NAME_LENGTH]; int size; @@ -6858,7 +6866,7 @@ void show_top_text(LOGBOOK * lbs) /*------------------------------------------------------------------*/ -void show_bottom_text(LOGBOOK * lbs) +void show_bottom_text(LOGBOOK *lbs) { char str[NAME_LENGTH]; int size; @@ -6929,7 +6937,7 @@ void show_error(char *error) /*------------------------------------------------------------------*/ -void set_login_cookies(LOGBOOK * lbs, char *user, char *enc_pwd) +void set_login_cookies(LOGBOOK *lbs, char *user, char *enc_pwd) { char str[256], lb_name[256], exp[80]; BOOL global; @@ -7179,7 +7187,7 @@ void strencode2(char *b, char *text) /*------------------------------------------------------------------*/ -int build_subst_list(LOGBOOK * lbs, char list[][NAME_LENGTH], char value[][NAME_LENGTH], +int build_subst_list(LOGBOOK *lbs, char list[][NAME_LENGTH], char value[][NAME_LENGTH], char attrib[][NAME_LENGTH], BOOL format_date) { int i; @@ -7268,7 +7276,7 @@ void add_subst_list(char list[][NAME_LENGTH], char value[][NAME_LENGTH], char *i strcpy(value[(*i)++], str); } -void add_subst_time(LOGBOOK * lbs, +void add_subst_time(LOGBOOK *lbs, char list[][NAME_LENGTH], char value[][NAME_LENGTH], char *item, char *date, int *i) { char format[80], str[256]; @@ -7286,33 +7294,51 @@ void add_subst_time(LOGBOOK * lbs, /*------------------------------------------------------------------*/ -BOOL change_pwd(LOGBOOK * lbs, char *user, char *pwd) +BOOL get_password_file(LOGBOOK *lbs, char *file_name, int size) { - char str[256], file_name[256]; - PMXML_NODE xml_tree, node; + char str[256]; - xml_tree = load_password_file(lbs->name); - if (!xml_tree) + getcfg(lbs->name, "Password file", str, sizeof(str)); + + if (!str[0]) return FALSE; - sprintf(str, "/list/user[name=%s]/password", user); - node = mxml_find_node(xml_tree, str); - if (node == NULL) { - mxml_free_tree(xml_tree); - return FALSE; + if (str[0] == DIR_SEPARATOR || str[1] == ':') + strlcpy(file_name, str, size); + else { + strlcpy(file_name, resource_dir, size); + strlcat(file_name, str, size); } - mxml_replace_node_value(node, pwd); - - mxml_write_tree(file_name, xml_tree); - mxml_free_tree(xml_tree); - return TRUE; } /*------------------------------------------------------------------*/ -void show_change_pwd_page(LOGBOOK * lbs) +BOOL change_pwd(LOGBOOK *lbs, char *user, char *pwd) +{ + char str[256], file_name[256]; + PMXML_NODE node; + + if (!lbs->pwd_xml_tree) + return FALSE; + + sprintf(str, "/list/user[name=%s]/password", user); + node = mxml_find_node(lbs->pwd_xml_tree, str); + if (node == NULL) + return FALSE; + + mxml_replace_node_value(node, pwd); + + if (get_password_file(lbs, file_name, sizeof(file_name))) + mxml_write_tree(file_name, lbs->pwd_xml_tree); + + return TRUE; +} + +/*------------------------------------------------------------------*/ + +void show_change_pwd_page(LOGBOOK *lbs) { char str[256], old_pwd[32], new_pwd[32], new_pwd2[32], act_pwd[32], user[80]; int wrong_pwd; @@ -7334,7 +7360,7 @@ void show_change_pwd_page(LOGBOOK * lbs) if (old_pwd[0] || new_pwd[0]) { if (user[0] - && get_user_line(lbs->name, user, act_pwd, NULL, NULL, NULL)) { + && get_user_line(lbs, user, act_pwd, NULL, NULL, NULL)) { /* administrator does not have to supply old password if changing other user's password */ if (is_admin_user(lbs->name, getparam("unm")) @@ -7413,7 +7439,7 @@ void show_change_pwd_page(LOGBOOK * lbs) /*------------------------------------------------------------------*/ -int get_last_index(LOGBOOK * lbs, int index) +int get_last_index(LOGBOOK *lbs, int index) /* return value of specific attribute of last entry, can be used to auto-increment tags */ { @@ -7440,7 +7466,7 @@ auto-increment tags */ /*------------------------------------------------------------------*/ -BOOL is_author(LOGBOOK * lbs, char attrib[MAX_N_ATTR][NAME_LENGTH], char *owner) +BOOL is_author(LOGBOOK *lbs, char attrib[MAX_N_ATTR][NAME_LENGTH], char *owner) { char str[1000], preset[1000]; int i; @@ -7608,7 +7634,7 @@ void attrib_from_param(int n_attr, char attrib[MAX_N_ATTR][NAME_LENGTH]) /*------------------------------------------------------------------*/ -void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL bupload, BOOL breedit) +void show_edit_form(LOGBOOK *lbs, int message_id, BOOL breply, BOOL bedit, BOOL bupload, BOOL breedit) { int i, j, n, index, aindex, size, width, height, fh, length, input_size, input_maxlen, format_flags[MAX_N_ATTR], year, month, day, n_attr, n_disp_attr, attr_index[MAX_N_ATTR]; @@ -8321,7 +8347,7 @@ void show_edit_form(LOGBOOK * lbs, int message_id, BOOL breply, BOOL bedit, BOOL for (i = 0;; i++) { if (!enum_user_line(lbs, i, login_name, sizeof(login_name))) break; - get_user_line(lbs->name, login_name, NULL, str, NULL, NULL); + get_user_line(lbs, login_name, NULL, str, NULL, NULL); if (strieq(str, attrib[index])) rsprintf("