/* ** Set the expiration fields for all groups that match this pattern. */ STATIC void EXPmatch(char *p, NEWSGROUP *v, char mod) { NEWSGROUP *ngp; int i; BOOL negate; negate = *p == '!'; if (negate) p++; for (ngp = Groups, i = nGroups; --i >= 0; ngp++) { if (negate ? !wildmat(ngp->Name, p) : wildmat(ngp->Name, p)) if (mod == 'a') { /*|| (mod == 'm' && ngp->Rest[0] == NF_FLAG_MODERATED) || (mod == 'u' && ngp->Rest[0] != NF_FLAG_MODERATED)) { */ ngp->Keep = v->Keep; ngp->Default = v->Default; ngp->Purge = v->Purge; ngp->Poison = v->Poison; if (EXPverbose > 4) { (void)printf("%s", ngp->Name); (void)printf(" %13.13s", ctime(&v->Keep) + 3); (void)printf(" %13.13s", ctime(&v->Default) + 3); (void)printf(" %13.13s", ctime(&v->Purge) + 3); (void)printf(" (%s)\n", p); } } } }
int main() { char p[80]; char text[80]; printf("Wildmat tester. Enter pattern, then strings to test.\n"); printf("A blank line gets prompts for a new pattern; a blank pattern\n"); printf("exits the program.\n"); for ( ; ; ) { printf("\nEnter pattern: "); (void)fflush(stdout); if (gets(p) == NULL || p[0] == '\0') break; for ( ; ; ) { printf("Enter text: "); (void)fflush(stdout); if (gets(text) == NULL) exit(0); if (text[0] == '\0') /* Blank line; go back and get a new pattern. */ break; printf(" %s\n", wildmat(text, p) ? "YES" : "NO"); } } exit(0); /* NOTREACHED */ }
// // Output a room name (newsgroup name) in formats required for LIST and NEWGROUPS command // void output_roomname_in_list_format(struct ctdlroom *qrbuf, int which_format, char *wildmat_pattern) { char n_name[1024]; struct nntp_msglist nm; long low_water_mark = 0; long high_water_mark = 0; room_to_newsgroup(n_name, qrbuf->QRname, sizeof n_name); if ((wildmat_pattern != NULL) && (!IsEmptyStr(wildmat_pattern))) { if (!wildmat(n_name, wildmat_pattern)) { return; } } nm = nntp_fetch_msglist(qrbuf); if ((nm.num_msgs > 0) && (nm.msgnums != NULL)) { low_water_mark = nm.msgnums[0]; high_water_mark = nm.msgnums[nm.num_msgs - 1]; } // Only the mandatory formats are supported switch(which_format) { case NNTP_LIST_ACTIVE: // FIXME we have hardcoded "n" for "no posting allowed" -- fix when we add posting cprintf("%s %ld %ld n\r\n", n_name, high_water_mark, low_water_mark); break; case NNTP_LIST_NEWSGROUPS: cprintf("%s %s\r\n", n_name, qrbuf->QRname); break; } if (nm.msgnums != NULL) { free(nm.msgnums); } }
static int tag_untag(char *pat, int tag) { GETSDIR_ENTRY *d = global_dirdat; int indxr, cntr; if (nrents < 1) return 0; for (indxr = nrents, cntr = 0; indxr; --indxr, ++d) if (S_ISREG(d->mode) && wildmat(d->fname, pat)) { if (tag) { d->cflags |= FL_TAG; ++cntr; } else if (d->cflags & FL_TAG) { d->cflags &= ~FL_TAG; ++cntr; } } return cntr; }
/* * userdeny() checks to see if 'user' is denied access to 'service' * Returns 1 if a matching deny entry exists in DB, otherwise returns 0. */ EXPORTED int userdeny(const char *user, const char *service, char *msgbuf, size_t bufsiz) { int r, ret = 0; /* allow access by default */ const char *data = NULL; size_t datalen; struct buf buf = BUF_INITIALIZER; char *wild = NULL; const char *msg = NULL; tok_t tok; char *pat; int not; if (!denydb) denydb_open(/*create*/0); if (!denydb) return 0; memset(&tok, 0, sizeof(tok)); /* fetch entry for user */ syslog(LOG_DEBUG, "fetching user_deny.db entry for '%s'", user); do { r = cyrusdb_fetch(denydb, user, strlen(user), &data, &datalen, NULL); } while (r == CYRUSDB_AGAIN); /* XXX Should we try to reopen the DB if we get IOERROR? This might be necessary when using SQL backend and we lose the connection. */ if (r || !data || !datalen) { /* ignore non-existent/empty entry, report all other errors */ if (r != CYRUSDB_NOTFOUND) { syslog(LOG_WARNING, "DENYDB_ERROR: error reading entry '%s': %s", user, cyrusdb_strerror(r)); } goto out; } buf_init_ro(&buf, data, datalen); /* parse the data */ r = parse_record(&buf, &wild, &msg); if (r) { syslog(LOG_WARNING, "DENYDB_ERROR: invalid entry for '%s'", user); goto out; } /* scan wildmat right to left for a match against our service */ syslog(LOG_DEBUG, "wild: '%s' service: '%s'", wild, service); tok_initm(&tok, wild, ",", 0); while ((pat = tok_next(&tok))) { /* XXX trim leading & trailing whitespace? */ /* is it a negated pattern? */ not = (*pat == '!'); if (not) ++pat; syslog(LOG_DEBUG, "pat %d:'%s'", not, pat); /* see if pattern matches our service */ if (wildmat(service, pat)) { /* match ==> we're done */ ret = !not; if (msgbuf) strlcpy(msgbuf, msg, bufsiz); break; } } out: tok_fini(&tok); buf_free(&buf); return ret; }
static int _glob_match(void *rock, const char *filename) { return wildmat(filename, rock); }
/* * userdeny() checks to see if 'user' is denied access to 'service' * Returns 1 if a matching deny entry exists in DB, otherwise returns 0. */ int userdeny(const char *user, const char *service, char *msgbuf, size_t bufsiz) { int r, ret = 0; /* allow access by default */ const char *data = NULL; int datalen; if (!deny_dbopen) return 0; /* fetch entry for user */ syslog(LOG_DEBUG, "fetching user_deny.db entry for '%s'", user); do { r = DENYDB->fetch(denydb, user, strlen(user), &data, &datalen, NULL); } while (r == CYRUSDB_AGAIN); /* XXX Should we try to reopen the DB if we get IOERROR? This might be necessary when using SQL backend and we lose the connection. */ if (r || !data || !datalen) { /* ignore non-existent/empty entry, report all other errors */ if (r != CYRUSDB_NOTFOUND) { syslog(LOG_WARNING, "DENYDB_ERROR: error reading entry '%s': %s", user, cyrusdb_strerror(r)); } } else { /* parse the data */ char *buf, *wild; unsigned long version; buf = xstrndup(data, datalen); /* use a working copy */ /* check version */ if (((version = strtoul(buf, &wild, 10)) < 1) || (version > USERDENY_VERSION)) { syslog(LOG_WARNING, "DENYDB_ERROR: invalid version for entry '%s': %lu", user, version); } else if (*wild++ != '\t') { syslog(LOG_WARNING, "DENYDB_ERROR: missing wildmat for entry '%s'", user); } else { char *pat, *msg = "Access to this service has been blocked"; int not; /* check if we have a deny message */ switch (version) { case USERDENY_VERSION: if ((msg = strchr(wild, '\t'))) *msg++ = '\0'; break; } /* scan wildmat right to left for a match against our service */ syslog(LOG_DEBUG, "wild: '%s' service: '%s'", wild, service); do { /* isolate next pattern */ if ((pat = strrchr(wild, ','))) { *pat++ = '\0'; } else { pat = wild; } /* XXX trim leading & trailing whitespace? */ /* is it a negated pattern? */ not = (*pat == '!'); if (not) ++pat; syslog(LOG_DEBUG, "pat %d:'%s'", not, pat); /* see if pattern matches our service */ if (wildmat(service, pat)) { /* match ==> we're done */ ret = !not; if (msgbuf) strlcpy(msgbuf, msg, bufsiz); break; } /* continue until we reach head of wildmat */ } while (pat != wild); } free(buf); } return ret; }
/* * Convert FIDO ^AMSGID/REPLY to RFC Message-ID/References */ char *s_msgid_fido_to_rfc(char *msgid, int *pzone) { char *save; char *origaddr, *serialno; char *p, *s; Node idnode; int zone; TmpS *tmps; save = strsave(msgid); /* * Retrieve `origaddr' part */ if(*save == '\"') /* " */ { /* * Quoted: "abc""def" -> abc"def */ origaddr = save; p = save; s = save+1; while(*s) { if(*s == '\"') /* " */ { if(*(s+1) == '\"') /* " */ s++; else break; } *p++ = *s++; } if(*s == '\"') /* " */ s++; while(*s && is_space(*s)) s++; *p = 0; serialno = s; } else { /* * Not quoted */ origaddr = save; for(p=save; *p && !is_space(*p); p++) ; s = p; while(*s && is_space(*s)) s++; *p = 0; serialno = s; } /* * Retrieve `serialno' part */ for(p=serialno; *p && !is_space(*p); p++) ; *p = 0; /***** New-style converted RFC Message-ID *****/ if(wildmat(origaddr, "<*@*>")) { tmps = tmps_copy(origaddr); xfree(save); if(pzone) *pzone = -2; return tmps->s; } /***** FTN-style *****/ /* * Search for parsable FTN address in origaddr */ for(p=origaddr; *p && !is_digit(*p); p++) ; for(s=p; *s && (is_digit(*s) || *s==':' || *s=='/' || *s=='.'); s++) ; *s = 0; if(asc_to_node(p, &idnode, TRUE) != ERROR) /* Address found */ { zone = idnode.zone; if(pzone) *pzone = zone; } else { zone = cf_zone(); if(pzone) *pzone = -1; } /* * New-style FTN Message-IDs using MIME quoted-printable */ tmps = tmps_alloc(2*MAXINETADDR); str_copy(tmps->s, tmps->len, "<MSGID_"); msgid_mime_quote(tmps->s + strlen(tmps->s), msgid, tmps->len - strlen(tmps->s)); str_append(tmps->s, tmps->len, "@"); str_append(tmps->s, tmps->len, msgid_domain(zone)); str_append(tmps->s, tmps->len, ">"); xfree(save); return tmps->s; }