masqmail
diff src/masqmail.c @ 250:a41c013c8458
moved the queue manipulation code to an new function
author | markus schnalke <meillo@marmaro.de> |
---|---|
date | Thu, 04 Nov 2010 12:32:11 -0300 |
parents | f9da5a7caeda |
children | 2babd21e7c75 |
line diff
1.1 --- a/src/masqmail.c Thu Nov 04 11:02:42 2010 -0300 1.2 +++ b/src/masqmail.c Thu Nov 04 12:32:11 2010 -0300 1.3 @@ -289,6 +289,70 @@ 1.4 } 1.5 } 1.6 1.7 +/* 1.8 +currently only the `rm' command is supported 1.9 +until this changes, we don't need any facility for further commands 1.10 +return success if at least one message had been deleted 1.11 +*/ 1.12 +static int 1.13 +manipulate_queue(char* cmd, char* id[]) 1.14 +{ 1.15 + gboolean ok = FALSE; 1.16 + 1.17 + if (strcmp(cmd, "rm") != 0) { 1.18 + fprintf(stderr, "unknown command %s\n", cmd); 1.19 + return FALSE; 1.20 + } 1.21 + 1.22 + set_euidgid(conf.mail_uid, conf.mail_gid, NULL, NULL); 1.23 + 1.24 + /* privileged users may delete any mail */ 1.25 + if (is_privileged_user(conf.orig_uid)) { 1.26 + for (; *id; id++) { 1.27 + fprintf(stderr, "id: %s\n", *id); 1.28 + if (queue_delete(*id)) { 1.29 + ok = TRUE; 1.30 + } 1.31 + } 1.32 + return ok; 1.33 + } 1.34 + 1.35 + struct passwd *pw = getpwuid(conf.orig_uid); 1.36 + if (!pw) { 1.37 + fprintf(stderr, "could not find a passwd entry for uid %d: %s\n", 1.38 + conf.orig_uid, strerror(errno)); 1.39 + return FALSE; 1.40 + } 1.41 + 1.42 + /* non-privileged users may only delete their own messages */ 1.43 + for (; *id; id++) { 1.44 + message *msg = msg_spool_read(*id, FALSE); 1.45 + 1.46 + fprintf(stderr, "id: %s\n", *id); 1.47 + 1.48 + if (!msg->ident) { 1.49 + fprintf(stderr, "message %s does not have an ident\n", *id); 1.50 + continue; 1.51 + } 1.52 + if (strcmp(pw->pw_name, msg->ident) != 0) { 1.53 + fprintf(stderr, "you do not own message id %s\n", *id); 1.54 + continue; 1.55 + } 1.56 + 1.57 + if ( (msg->received_host || (msg->received_prot != PROT_LOCAL)) 1.58 +#ifdef ENABLE_IDENT 1.59 + && !is_in_netlist(msg->received_host, conf.ident_trusted_nets) 1.60 +#endif 1.61 + ) { 1.62 + fprintf(stderr, "message %s was not received locally or from a trusted network\n", *id); 1.63 + continue; 1.64 + } 1.65 + 1.66 + ok = queue_delete(*id); 1.67 + } 1.68 + return ok; 1.69 +} 1.70 + 1.71 int 1.72 main(int argc, char *argv[]) 1.73 { 1.74 @@ -614,50 +678,7 @@ 1.75 break; /* well... */ 1.76 1.77 case MODE_MCMD: 1.78 - if (strcmp(M_cmd, "rm") == 0) { 1.79 - gboolean ok = FALSE; 1.80 - 1.81 - set_euidgid(conf.mail_uid, conf.mail_gid, NULL, NULL); 1.82 - 1.83 - if (is_privileged_user(conf.orig_uid)) { 1.84 - for (; arg < argc; arg++) { 1.85 - if (queue_delete(argv[arg])) 1.86 - ok = TRUE; 1.87 - } 1.88 - } else { 1.89 - struct passwd *pw = getpwuid(conf.orig_uid); 1.90 - if (pw) { 1.91 - for (; arg < argc; arg++) { 1.92 - message *msg = msg_spool_read(argv[arg], FALSE); 1.93 -#ifdef ENABLE_IDENT 1.94 - if (((msg->received_host == NULL) && (msg->received_prot == PROT_LOCAL)) 1.95 - || is_in_netlist(msg->received_host, conf.ident_trusted_nets)) 1.96 -#else 1.97 - if ((msg->received_host == NULL) && (msg->received_prot == PROT_LOCAL)) 1.98 -#endif 1.99 - { 1.100 - if (msg->ident) { 1.101 - if (strcmp(pw->pw_name, msg->ident) == 0) { 1.102 - if (queue_delete(argv[arg])) 1.103 - ok = TRUE; 1.104 - } else { 1.105 - fprintf(stderr, "you do not own message id %s\n", argv[arg]); 1.106 - } 1.107 - } else 1.108 - fprintf(stderr, "message %s does not have an ident.\n", argv[arg]); 1.109 - } else { 1.110 - fprintf(stderr, "message %s was not received locally or from a trusted network.\n", argv[arg]); 1.111 - } 1.112 - } 1.113 - } else { 1.114 - fprintf(stderr, "could not find a passwd entry for uid %d: %s\n", conf.orig_uid, strerror(errno)); 1.115 - } 1.116 - } 1.117 - exit(ok ? EXIT_SUCCESS : EXIT_FAILURE); 1.118 - } else { 1.119 - fprintf(stderr, "unknown command %s\n", M_cmd); 1.120 - exit(EXIT_FAILURE); 1.121 - } 1.122 + exit(manipulate_queue(M_cmd, &argv[arg]) ? 0 : 1); 1.123 break; 1.124 1.125 case MODE_ACCEPT: