- FILE *fp;
-
- struct permissions_spec *b, *bl;
- char buf[BUFSIZ], *p, *q;
- int permissions;
- struct file_list *fs;\r
- int i;
-
- if (!check_file_changed(current_permissions_file, permissions_file, &fs))
- {
- /* No need to load */
- if (csp)
- {
- csp->permissions_list = current_permissions_file;
- }
- return(0);
- }
- if (!fs)
- {
- goto load_permissions_error;
- }
-
- fs->f = bl = (struct permissions_spec *)zalloc(sizeof(*bl));
- if (bl == NULL)
- {
- goto load_permissions_error;
- }
-
- if ((fp = fopen(permissions_file, "r")) == NULL)
- {
- goto load_permissions_error;
- }\r
-
-\r
- /*\r
- * default_permissions is set in this file.\r
- *\r
- * Reset it to default first.\r
- */\r
- default_permissions = PERMIT_RE_FILTER;\r
-
- while (read_config_line(buf, sizeof(buf), fp, fs) != NULL)
- {
- p = buf;\r
-\r
- permissions = PERMIT_COOKIE_SET | PERMIT_COOKIE_READ | PERMIT_POPUPS;\r
-\r
- /*\r
- * FIXME: for() loop is a kludge. Want to loop around until we\r
- * find a non-control character. Assume there will be at most 4\r
- * characters.\r
- */\r
- for (i = 0; i < 4; i++)\r
- {\r
- switch ((int)*p)
- {
- case '>':\r
- /*\r
- * Allow cookies to be read by the server, but do\r
- * not allow them to be set.\r
- */\r
- permissions = (permissions & ~PERMIT_COOKIE_SET);
- p++;
- break;
-
- case '<':
- /*\r
- * Allow server to set cookies but do not let the\r
- * server read them.\r
- */\r
- permissions = (permissions & ~PERMIT_COOKIE_READ);\r
- p++;
- break;
-
- case '^':\r
- /*\r
- * Block popups\r
- */\r
- permissions = (permissions & ~PERMIT_POPUPS);\r
- p++;\r
- break;\r
-\r
- case '%':\r
- /*\r
- * Permit filtering using PCRS\r
- */\r
- permissions = (permissions | PERMIT_RE_FILTER);\r
- p++;\r
- break;\r
-\r
- case '~':\r
- /*\r
- * All of the above (maximum filtering).\r
- */
- permissions = PERMIT_RE_FILTER;\r
- p++;
- break;
-
- default:\r
- /*\r
- * FIXME: Should break out of the loop here.\r
- */
- break;
- }\r
- }
-
- /*
- * Elide any of the "special" chars from the
- * front of the pattern
- */
- q = buf;
- if (p > q)\r
- {\r
- while ((*q++ = *p++) != '\0')
- {
- /* nop */
- }\r
- }
-
- /* a lines containing only "special" chars sets default */
- if (*buf == '\0')
- {\r
- default_permissions = permissions;
- continue;
- }
-
- /* allocate a new node */
- if (((b = zalloc(sizeof(*b))) == NULL)
- )
- {
- fclose(fp);
- goto load_permissions_error;
- }
-
- /* add it to the list */
- b->next = bl->next;
- bl->next = b;
-\r
- /* Save flags */
- b->permissions = permissions;\r
-\r
- /* Save the URL pattern */\r
- if (create_url_spec(b->url, buf))\r
- {\r
- fclose(fp);
- goto load_permissions_error;
- }
- }
-
- fclose(fp);
-
-#ifndef SPLIT_PROXY_ARGS
- if (!suppress_blocklists)
- {
- fs->proxy_args = strsav(fs->proxy_args, "</pre>");
- }
-#endif /* ndef SPLIT_PROXY_ARGS */
-
- /* the old one is now obsolete */
- if (current_permissions_file)
- {
- current_permissions_file->unloader = unload_permissions_file;
- }
-
- fs->next = files->next;
- files->next = fs;
- current_permissions_file = fs;
-
- if (csp)
- {
- csp->permissions_list = fs;
- }
-
- return(0);
-
-load_permissions_error:
- log_error(LOG_LEVEL_ERROR, "can't load permissions file '%s': %E", permissions_file);
- return(-1);