pref.c
上传用户:s81996212
上传日期:2007-01-04
资源大小:722k
文件大小:8k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1. /*
  2. ** Copyright 1998 - 1999 Double Precision, Inc.  See COPYING for
  3. ** distribution information.
  4. */
  5. /*
  6. ** $Id: pref.c,v 1.12 2000/06/03 05:40:27 mrsam Exp $
  7. */
  8. #include "pref.h"
  9. #include "config.h"
  10. #include "sqwebmail.h"
  11. #include "sqconfig.h"
  12. #include "cgi/cgi.h"
  13. #include <stdio.h>
  14. #include <string.h>
  15. #include <stdlib.h>
  16. #define OLDEST1ST "OLDEST1ST"
  17. #define FULLHEADERS "FULLHEADERS"
  18. #define SORTORDER "SORT"
  19. #define PAGESIZE "PAGESIZE"
  20. #define AUTOPURGE_V "AUTOPURGE"
  21. #define NOHTML "NOHTML"
  22. #define FROM "FROM"
  23. #define LDAP "LDAP"
  24. #define OLDEST1ST_PREF "oldest1st"
  25. #define FULLHEADERS_PREF "fullheaders"
  26. #define HTML_PREF "doshowhtml"
  27. int pref_flagisoldest1st, pref_flagfullheaders;
  28. int pref_showhtml;
  29. int pref_flagsortorder;
  30. int pref_flagpagesize;
  31. int pref_autopurge;
  32. char *pref_from=0;
  33. char *pref_ldap=0;
  34. extern char form_args[];
  35. static char *lab_passworderr;
  36. static char *lab_date;
  37. static char *lab_sender;
  38. static char *lab_subject;
  39. #if ENABLE_WEBPASS
  40. extern int check_sqwebpass(const char *);
  41. extern void set_sqwebpass(const char *);
  42. #endif
  43. extern void output_attrencoded_oknl(const char *);
  44. static const char hex[]="0123456789ABCDEF";
  45. static int nybble(char c)
  46. {
  47. char *p=strchr(hex, c);
  48. if (p) return (p-hex);
  49. return (0);
  50. }
  51. static void decode(char *t)
  52. {
  53. char *s;
  54. for (s=t; *s; s++)
  55. {
  56. if (*s != '+')
  57. {
  58. *t++ = *s;
  59. continue;
  60. }
  61. if (s[1] == 0 || s[2] == 0)
  62. continue;
  63. *t++ = nybble(s[1]) * 16 + nybble(s[2]);
  64. s += 2;
  65. }
  66. *t=0;
  67. }
  68. void pref_init()
  69. {
  70. const char *p;
  71. char *q, *r;
  72. p=read_sqconfig(".", CONFIGFILE, 0);
  73. pref_flagisoldest1st=0;
  74. pref_flagfullheaders=0;
  75. pref_flagsortorder=0;
  76. pref_flagpagesize=10;
  77. pref_autopurge=AUTOPURGE;
  78. pref_showhtml=1;
  79. if(pref_from) {
  80. free(pref_from);
  81. pref_from=0;
  82. }
  83. if(pref_ldap) {
  84. free(pref_ldap);
  85. pref_ldap=0;
  86. }
  87. if (p)
  88. {
  89. q=strdup(p);
  90. if (!q) enomem();
  91. for (r=q; (r=strtok(r, " ")) != 0; r=0)
  92. {
  93. if (strcmp(r, OLDEST1ST) == 0)
  94. pref_flagisoldest1st=1;
  95. if (strcmp(r, FULLHEADERS) == 0)
  96. pref_flagfullheaders=1;
  97. if (strcmp(r, NOHTML) == 0)
  98. pref_showhtml=0;
  99. if (strncmp(r, SORTORDER, sizeof(SORTORDER)-1) == 0
  100. && r[sizeof(SORTORDER)-1] == '=')
  101. pref_flagsortorder=r[sizeof(SORTORDER)];
  102. if (strncmp(r, PAGESIZE, sizeof(PAGESIZE)-1) == 0
  103. && r[sizeof(PAGESIZE)-1] == '=')
  104. pref_flagpagesize=atoi(r+sizeof(PAGESIZE));
  105. if (strncmp(r, AUTOPURGE_V, sizeof(AUTOPURGE_V)-1) == 0
  106. && r[sizeof(AUTOPURGE_V)-1] == '=')
  107. pref_autopurge=atoi(r+sizeof(AUTOPURGE_V));
  108. if (strncmp(r, FROM, sizeof(FROM)-1) == 0
  109. && r[sizeof(FROM)-1] == '=')
  110. {
  111. if (pref_from) free(pref_from);
  112. if ((pref_from=strdup(r+sizeof(FROM))) == 0)
  113. enomem();
  114. decode(pref_from);
  115. }
  116. if (strncmp(r, LDAP, sizeof(LDAP)-1) == 0
  117. && r[sizeof(LDAP)-1] == '=')
  118. {
  119. if (pref_ldap) free(pref_ldap);
  120. if ((pref_ldap=strdup(r+sizeof(LDAP))) == 0)
  121. enomem();
  122. decode(pref_ldap);
  123. }
  124. }
  125. free(q);
  126. }
  127. switch (pref_flagpagesize) {
  128. case 20:
  129. case 50:
  130. break;
  131. default:
  132. pref_flagpagesize=10;
  133. break;
  134. }
  135. if (pref_autopurge < 1) pref_autopurge=1;
  136. if (pref_autopurge > MAXPURGE) pref_autopurge=MAXPURGE;
  137. switch (pref_flagsortorder) {
  138. case 'F':
  139. case 'S':
  140. break;
  141. default:
  142. pref_flagsortorder='D';
  143. break;
  144. }
  145. }
  146. #if ENABLE_WEBPASS
  147. static int goodpass(const char *p)
  148. {
  149. for ( ; *p; p++)
  150. if (*p < ' ') return (0);
  151. return (1);
  152. }
  153. #endif
  154. static char *append_str(const char *prefs, const char *label,
  155. const char *value)
  156. {
  157. int l=strlen(prefs) + sizeof(" =") +
  158. strlen(label)+ (value ? strlen(value):0);
  159. int i;
  160. char *p;
  161. const char *q;
  162. for (i=0; value && value[i]; i++)
  163. if (value[i] <= ' ' || value[i] >= 127
  164. || value[i] == '+')
  165. l += 2;
  166. p=malloc(l);
  167. if (!p) enomem();
  168. strcpy(p, prefs);
  169. if (!value || !*value) return (p);
  170. strcat(strcat(strcat(p, " "), label), "=");
  171. i=strlen(p);
  172. for (q=value; *q; q++)
  173. {
  174. if (*q <= ' ' || *q >= 127 || *q == '+')
  175. {
  176. sprintf(p+i, "+%02X", (int)(unsigned char)*q);
  177. i += 3;
  178. continue;
  179. }
  180. p[i++]= *q;
  181. }
  182. p[i]=0;
  183. return (p);
  184. }
  185. void pref_update()
  186. {
  187. char buf[200];
  188. char *p;
  189. char *q;
  190. sprintf(buf, SORTORDER "=%c " PAGESIZE "=%d " AUTOPURGE_V "=%d",
  191. pref_flagsortorder, pref_flagpagesize, pref_autopurge);
  192. if (pref_flagisoldest1st)
  193. strcat(buf, " " OLDEST1ST);
  194. if (pref_flagfullheaders)
  195. strcat(buf, " " FULLHEADERS);
  196. if (!pref_showhtml)
  197. strcat(buf, " " NOHTML);
  198. p=append_str(buf, FROM, pref_from);
  199. q=append_str(p, LDAP, pref_ldap);
  200. write_sqconfig(".", CONFIGFILE, q);
  201. free(q);
  202. free(p);
  203. }
  204. void pref_setfrom(const char *p)
  205. {
  206. if (pref_from) free(pref_from);
  207. pref_from=strdup(p);
  208. if (!pref_from) enomem();
  209. pref_update();
  210. }
  211. void pref_setldap(const char *p)
  212. {
  213. if (pref_ldap && strcmp(p, pref_ldap) == 0)
  214. return;
  215. if (pref_ldap) free(pref_ldap);
  216. pref_ldap=strdup(p);
  217. if (!pref_ldap) enomem();
  218. pref_update();
  219. }
  220. void pref_setprefs()
  221. {
  222. if (*cgi("do.changeprefs"))
  223. {
  224. char buf[200];
  225. FILE *fp;
  226. char *p;
  227. char *q;
  228. sprintf(buf, SORTORDER "=%c " PAGESIZE "=%s " AUTOPURGE_V "=%s",
  229. *cgi("sortorder"), cgi("pagesize"),
  230. cgi("autopurge"));
  231. if (*cgi(OLDEST1ST_PREF))
  232. strcat(buf, " " OLDEST1ST);
  233. if (*cgi(FULLHEADERS_PREF))
  234. strcat(buf, " " FULLHEADERS);
  235. if (!*cgi(HTML_PREF))
  236. strcat(buf, " " NOHTML);
  237. p=append_str(buf, FROM, pref_from);
  238. q=append_str(p, LDAP, pref_ldap);
  239. write_sqconfig(".", CONFIGFILE, q);
  240. free(p);
  241. free(q);
  242. pref_init();
  243. if ((fp=fopen(SIGNATURE, "w")) != NULL)
  244. {
  245. fprintf(fp, "%s", cgi("signature"));
  246. fclose(fp);
  247. }
  248. }
  249. lab_passworderr=strtok(form_args, "|");
  250. lab_date=strtok(0, "|");
  251. lab_sender=strtok(0, "|");
  252. lab_subject=strtok(0, "|");
  253. if (!lab_passworderr) lab_passworderr="";
  254. if (!lab_date) lab_date="";
  255. if (!lab_sender) lab_sender="";
  256. if (!lab_subject) lab_subject="";
  257. #if ENABLE_WEBPASS
  258. if (*cgi("do.changepwd"))
  259. {
  260. const char *p;
  261. if (check_sqwebpass(cgi("oldpass")) == 0 &&
  262. *(p=cgi("newpass")) &&
  263. goodpass(p) &&
  264. strcmp(p, cgi("newpass2")) == 0)
  265. {
  266. set_sqwebpass(p);
  267. }
  268. else
  269. {
  270. printf("%sn", lab_passworderr);
  271. }
  272. }
  273. #endif
  274. }
  275. void pref_isoldest1st()
  276. {
  277. printf("<INPUT TYPE=CHECKBOX NAME="%s"%s>",
  278. OLDEST1ST_PREF, pref_flagisoldest1st ? " CHECKED":"");
  279. }
  280. void pref_isdisplayfullmsg()
  281. {
  282. printf("<INPUT TYPE=CHECKBOX NAME="%s"%s>",
  283. FULLHEADERS_PREF, pref_flagfullheaders ? " CHECKED":"");
  284. }
  285. void pref_displayhtml()
  286. {
  287. printf("<INPUT TYPE=CHECKBOX NAME="%s"%s>",
  288. HTML_PREF, pref_showhtml ? " CHECKED":"");
  289. }
  290. void pref_displayautopurge()
  291. {
  292. printf("<INPUT TYPE=TEXT NAME="autopurge" VALUE="%d" SIZE=2 MAXLENGTH=2>",
  293. pref_autopurge);
  294. }
  295. void pref_sortorder()
  296. {
  297. static const char selected[]=" SELECTED";
  298. printf("<SELECT NAME=sortorder>");
  299. printf("<OPTION VALUE=DATE%s>%sn",
  300. pref_flagsortorder == 'D' ? selected:"",
  301. lab_date);
  302. printf("<OPTION VALUE=FROM%s>%sn",
  303. pref_flagsortorder == 'F' ? selected:"",
  304. lab_sender);
  305. printf("<OPTION VALUE=SUBJECT%s>%sn",
  306. pref_flagsortorder == 'S' ? selected:"",
  307. lab_subject);
  308. printf("</SELECT>n");
  309. }
  310. void pref_pagesize()
  311. {
  312. static const char selected[]=" SELECTED";
  313. printf("<SELECT NAME=pagesize>");
  314. printf("<OPTION VALUE=10%s>10n",
  315. pref_flagpagesize == 10 ? selected:"");
  316. printf("<OPTION VALUE=20%s>20n",
  317. pref_flagpagesize == 20 ? selected:"");
  318. printf("<OPTION VALUE=50%s>50n",
  319. pref_flagpagesize == 50 ? selected:"");
  320. printf("</SELECT>n");
  321. }
  322. void pref_signature()
  323. {
  324. FILE *fp;
  325. char buf[256];
  326. int n;
  327. printf("<textarea cols=40 rows=4 name="signature" wrap="off">");
  328. if ((fp=fopen(SIGNATURE, "r")) != NULL)
  329. {
  330. while ((n=fread(buf, 1, sizeof(buf)-1, fp)) > 0)
  331. {
  332. buf[n]=0;
  333. output_attrencoded_oknl(buf);
  334. }
  335. fclose(fp);
  336. }
  337. printf("</textarea>");
  338. }