📄 prefer~1.cpp
字号:
/* preferences.cpp*/#define _GNU_SOURCE#include <errno.h>#include <stdio.h>#include <syslog.h>#include <stdlib.h>#include <string.h>#include <sys/stat.h>#include "mail_process.h"#include "preferences.h"#include "main.h"#include "config.h"#include "addr.h"#include "custom_string.h"#include "session.h"pref_t user_pref;enum pref_status { ps_pending, ps_done, ps_error, ps_nl, ps_addr, ps_sig };int fill_user_pref_struct(FILE*);pref_status parse_pref_line(char*, pref_status);int find_addr_book_start(FILE*);long int find_next_email_order(FILE*, char*, char*);int find_email_position(FILE*, char*, char*, long int*, long int*);int get_reply_to(void);////////////////////////////////////////////////////////////////////This will create and fill the user_preferences struct// returns 0 on success// returns -1 on failureint get_user_pref(void){ FILE* user_pref_file=NULL; int status=0; if(user_ses.loginname == NULL) return(-1); init_user_pref(); setuid(euid); user_pref_file=open_user_pref_file("r",&status); setuid(ruid); if(user_pref_file == NULL) { if(status == 0) { user_pref_file=open_user_pref_file("w+",&status); if(user_pref_file == NULL) syslog(LOG_MAIL | LOG_ERR,"user preference file creation " "failed (%s)",strerror(errno)); } } if(user_pref_file != NULL) { fill_user_pref_struct(user_pref_file); fclose(user_pref_file); } if(user_pref.reply_to.email == NULL) get_reply_to(); return(0);}////////////////////////////////////////////////////////////////////This will open the users preference file// returns file stream if open successful// returns null if failFILE* open_user_pref_file(char* open_mode, int* err){ char* user_pref_filename=NULL; FILE* user_pref_file=NULL; size_t file_name_length=0; mode_t old_mask=0; if(user_ses.loginname == NULL || open_mode == NULL) return(NULL); if(err != NULL) *err=0; file_name_length=sizeof(PREFDIR "/")+ strlen(user_ses.loginname); if( (user_pref_filename=(char*) malloc(file_name_length)) == NULL) { syslog(LOG_MAIL | LOG_ERR,"Out of memory (%s)",strerror(errno)); if(err != NULL) *err=-1; return(NULL); } strcpy(user_pref_filename,PREFDIR "/" ); strcat(user_pref_filename,user_ses.loginname); old_mask=umask(0177); setuid(euid); user_pref_file=fopen(user_pref_filename,open_mode); setuid(ruid); if(user_pref_file == NULL) { if(err != NULL) { if(errno == ENOENT) *err=0; else *err=-1; } umask(old_mask); syslog(LOG_MAIL | LOG_ERR,"could not open %s pref file (%s)", user_ses.loginname,strerror(errno)); free(user_pref_filename); return(NULL); } umask(old_mask); free(user_pref_filename); return(user_pref_file);}////////////////////////////////////////////////////////////////////This will fill a user_preference structureint fill_user_pref_struct(FILE* user_pref_file){ char* file_buff=NULL; size_t file_buff_size=0; ssize_t b_read=0; pref_status status=ps_pending; if(user_pref_file == NULL) return(-1); do { b_read=getline(&file_buff, &file_buff_size, user_pref_file); if(b_read > 0 && file_buff != NULL) status=parse_pref_line(file_buff, status); else status=ps_done; } while(status != ps_error && status != ps_done); if(file_buff != NULL) free(file_buff); return(0);}//////////////////////////////////////////////////////////////////pref_status parse_pref_line(char* buff, pref_status status){ char* temp_ptr=NULL; char* temp_ptr2=NULL; size_t temp_size=0; int x=0; if(buff == NULL) return(ps_error); if(*buff == '\n') return(ps_nl); if(status == ps_addr && *buff == '\t') { if( (inc_addr(&(user_pref.addr))) != 0) return(ps_error); for(x=0; user_pref.addr[x].name || user_pref.addr[x].email; x++); fill_addr(&(user_pref.addr[x]),buff); return(ps_addr); } if(status == ps_sig && *buff == '\t') { temp_size=0; temp_size=strlen(buff+1)+1; if(user_pref.signature != NULL) temp_size+=strlen(user_pref.signature); if( (temp_ptr2=(char*)realloc(user_pref.signature,temp_size)) == NULL) { syslog(LOG_MAIL | LOG_ERR,"Out of memory (%s)",strerror(errno)); return(ps_error); } if(user_pref.signature == NULL) *temp_ptr2='\0'; user_pref.signature=temp_ptr2; strcat(user_pref.signature,buff+1); return(ps_pending); } if(strncmp(buff,"signature",sizeof("signature")-1) == 0) return(ps_sig); if(strncmp(buff,"address_book(main)",sizeof("address_book(main)")-1) == 0) return(ps_addr); if(strncmp(buff,"reply_to",sizeof("reply_to")-1) == 0) { if(user_pref.reply_to.name != NULL || user_pref.reply_to.email != NULL) return(ps_pending); temp_ptr=strchr(buff,'='); if(temp_ptr == NULL) return(ps_error); temp_ptr++; fill_addr( &(user_pref.reply_to), temp_ptr); return(ps_pending); } if(strncmp(buff,"default_sort",sizeof("default_sort")-1) == 0) { temp_ptr=strchr(buff,'='); if(temp_ptr == NULL) { syslog(LOG_MAIL | LOG_ERR,"error in user preference file %s" " (invalid default_sort)",user_ses.loginname); return(ps_pending); } if(user_pref.sort_by != ms_none) { syslog(LOG_MAIL | LOG_ERR,"error in user preference file %s" " (duplicate default_sort)",user_ses.loginname); return(ps_pending); } if(strncmp(temp_ptr,"date_a",sizeof("date_a")-1) == 0) user_pref.sort_by=ms_date_a; else if(strncmp(temp_ptr,"date_d",sizeof("date_d")-1) == 0) user_pref.sort_by=ms_date_d; else if(strncmp(temp_ptr,"sender_a",sizeof("sender_a")-1) == 0) user_pref.sort_by=ms_sender_a; else if(strncmp(temp_ptr,"sender_d",sizeof("sender_d")-1) == 0) user_pref.sort_by=ms_sender_d; else if(strncmp(temp_ptr,"size_a",sizeof("size_a")-1) == 0) user_pref.sort_by=ms_size_a; else if(strncmp(temp_ptr,"size_d",sizeof("size_d")-1) == 0) user_pref.sort_by=ms_size_d; else if(strncmp(temp_ptr,"subject_a",sizeof("subj_a")-1) == 0) user_pref.sort_by=ms_subj_a; else if(strncmp(temp_ptr,"subj_d",sizeof("subject_d")-1) == 0) user_pref.sort_by=ms_subj_d; else syslog(LOG_MAIL | LOG_ERR,"error in user preference file %s" " (invalid default_sort)",user_ses.loginname); return(ps_pending); } if(strncmp(buff,"cookie",sizeof("cookie")-1 ) == 0) { temp_ptr=strchr(buff,'='); if(temp_ptr!=NULL) temp_ptr2=strchr(temp_ptr,';'); if(temp_ptr == NULL || temp_ptr2 == NULL) { syslog(LOG_MAIL | LOG_ERR,"error in user preference file %s" " (invalid cookie defination)",user_ses.loginname); return(ps_pending); } *temp_ptr2='\0'; temp_ptr2++; user_pref.cookie_expire=strtol(temp_ptr,NULL,10); temp_ptr=strchr(temp_ptr2,'\n'); if(temp_ptr != NULL) *temp_ptr='\0'; user_pref.cookie_crypt=strdup(temp_ptr2); return(ps_pending); } return(ps_pending);}//////////////////////////////////////////////////////////////////int init_user_pref(void){ user_pref.addr=NULL; user_pref.reply_to.name=NULL; user_pref.reply_to.email=NULL; user_pref.sort_by=ms_date_a; user_pref.signature=NULL; user_pref.cookie_expire=0; user_pref.cookie_crypt=NULL; return(0);}//////////////////////////////////////////////////////////////////int destroy_user_pref(void){ if(user_pref.addr != NULL) destroy_addr_arr(&(user_pref.addr)); if(user_pref.reply_to.name != NULL) { free(user_pref.reply_to.name); user_pref.reply_to.name=NULL; } if(user_pref.reply_to.email != NULL) { free(user_pref.reply_to.email); user_pref.reply_to.email=NULL; } if(user_pref.signature != NULL) { free(user_pref.signature); user_pref.signature=NULL; } if(user_pref.cookie_crypt != NULL) { free(user_pref.cookie_crypt); user_pref.cookie_crypt=NULL; } return(0);}//////////////////////////////////////////////////////////////////int add_pref_email(FILE* file, char* name, char* email){ long int file_ptr=-1; char* buff=NULL; size_t buff_size=0; if(file == NULL || email == NULL) return(-1);//create address string if(name != NULL) buff_size=strlen(name); buff_size+=strlen(email) + sizeof("\t\"\" <>\n"); buff=(char*)malloc(buff_size); if(buff == NULL) { syslog(LOG_MAIL | LOG_ERR,"out of memory (%s)",strerror(errno)); return(-1); } strcpy(buff,"\t\""); if(name != NULL) strcat(buff,name); strcat(buff,"\" <"); strcat(buff,email); strcat(buff,">\n");//setup to write line if( find_addr_book_start(file) != 0) { if(feof(file) == 0) { syslog(LOG_MAIL | LOG_ERR,"could not find addr book start"); free(buff); return(-1); } else fprintf(file,"address_book(main)\n"); } file_ptr=find_next_email_order(file,name,email);//write email into file if(file_ptr != -1) if( insert_line_in_file(file,buff,file_ptr,file_ptr) != 0) { syslog(LOG_MAIL | LOG_ERR,"could not add email to pref"); free(buff); return(-1); } free(buff); return(0);}//////////////////////////////////////////////////////////////////int delete_pref_email(FILE* file, char* name, char* email){ long int file_ptr_read=-1; long int file_ptr_write=-1; if(file == NULL || email == NULL) return(-1);//setup to delete email if( find_addr_book_start(file) != 0) { syslog(LOG_MAIL | LOG_ERR,"find address_book to delete email failed"); return(-1); } if(find_email_position(file,name,email,&file_ptr_write,&file_ptr_read) != 0) { syslog(LOG_MAIL | LOG_ERR,"find email position for delete failed."); return(-1); } if( insert_line_in_file(file,NULL,file_ptr_read,file_ptr_write) != 0) { syslog(LOG_MAIL | LOG_ERR,"error deleting pref email"); return(-1); } return(0);}//////////////////////////////////////////////////////////////////int modify_pref_email(FILE* file, char* old_name, char* old_email, char* new_name, char* new_email){ long int file_ptr_read=-1; long int file_ptr_write=-1; char* buff=NULL; size_t buff_size=0; if(file == NULL || old_email == NULL || new_email == NULL) return(-1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -