/* * Check basic authentication. Return zero if authenticated. * Return -1 if failed authentication. * Return 1 if authentication not attempted. */ int basicauth_check (XML *xml, char *path, char *req) { int i, n; char *uid, *pw; char buf[DBUFSZ]; debug ("request: %s\n", req); /* is basic auth required? */ if ((n = xml_count (xml, path)) < 1) return (0); /* get authentication header */ uid = strstr (req, "Authorization: Basic "); if (uid == NULL) return (1); uid += 21; /* limit b64 decoding */ if ((pw = strchr (uid, '\n')) != NULL) *pw = 0; b64_decode (buf, uid); if (pw != NULL) /* restore if limited */ *pw = '\n'; uid = buf; if ((pw = strchr (uid, ':')) == NULL) return (1); *pw++ = 0; for (i = 0; i < n; i++) /* check against users */ { if ((strcmp (uid, xml_getf (xml, "%s%c%d%cUserID", path, xml->indx_sep, i, xml->path_sep)) == 0) && (strcmp (pw, xml_getf (xml, "%s%c%d%cPassword", path, xml->indx_sep, i, xml->path_sep)) == 0)) return (0); } return (-1); }
/* * find the index for a repeated configuration item */ cfg_index (XML *xml, char *path, char *name) { int i, n; char *ch; n = xml_count (xml, path); for (i = 0; i < n; i++) { if (!strcmp (name, xml_getf (xml, "%s[%d].Name", path, i))) return (i); } error ("Can't find name matching %s for %s\n", name, path); return (-1); }
/* * A folder polling processor for ebxml queues - register this with * the fpoller. * * This initializes and pushes a queue row. Once queued it moves * the file to a processed point. * * xml - sender's configuration * prefix - xml path to this folder map * fname - file to be queued */ int ebxml_fprocessor (XML *xml, char *prefix, char *fname) { struct stat st; QUEUE *q; QUEUEROW *r; char *ch; int pl; char qname[MAX_PATH], pid[PTIMESZ], buf[MAX_PATH]; if (stat (fname, &st)) { warn ("Can't access %s\n", fname); return (-1); } if (st.st_size == 0) { warn ("File %s empty... discarding\n", fname); unlink (fname); return (-1); } info ("Queuing ebXML folder %s for %s\n", fname, prefix); pl = strlen (prefix); /* * prep a file name */ ppid (pid); sprintf (qname, "%s.%s", basename (fname), pid); /* * move file to processed folder */ ppathf (buf, xml_getf (xml, "%sProcessed", prefix), "%s", qname); if (rename (fname, buf)) { error ("Couldn't move %s to %s - %s\n", fname, buf, strerror (errno)); return (-1); } /* * queue it up */ ch = xml_getf (xml, "%sQueue", prefix); if ((q = queue_find (ch)) == NULL) { error ("Can't find queue for %s\n", ch); return (-1); } r = queue_row_alloc (q); sprintf (buf, "%s-%s", xml_getf (xml, "%sName", prefix), pid); queue_field_set (r, "MESSAGEID", buf); queue_field_set (r, "PAYLOADFILE", qname); queue_field_set (r, "DESTINATIONFILENAME", basename (fname)); queue_field_set (r, "ROUTEINFO", xml_getf (xml, "%sRoute", prefix)); queue_field_set (r, "SERVICE", xml_getf (xml, "%sService", prefix)); queue_field_set (r, "ACTION", xml_getf (xml, "%sAction", prefix)); queue_field_set (r, "ARGUMENTS", xml_getf (xml, "%sArguments", prefix)); queue_field_set (r, "MESSAGERECIPIENT", xml_getf (xml, "%sRecipient", prefix)); queue_field_set (r, "ENCRYPTION", *xml_getf (xml, "%sEncryption.Type", prefix) ? "yes" : "no"); queue_field_set (r, "SIGNATURE", "no"); queue_field_set (r, "PUBLICKEYLDAPADDRESS", ""); queue_field_set (r, "PUBLICKEYLDAPBASEDN", ""); queue_field_set (r, "PUBLICKEYLDAPDN", ""); queue_field_set (r, "CERTIFICATEURL", xml_getf (xml, "%sEncryption.Unc", prefix)); queue_field_set (r, "PROCESSINGSTATUS", "queued"); queue_field_set (r, "TRANSPORTSTATUS", ""); queue_field_set (r, "PRIORITY", "0"); if (pl = queue_push (r) < 1) { error ("Failed queueing %s\n", fname); pl = -1; } queue_row_free (r); info ("ebXML folder %s for %s queueing completed\n", fname, prefix); return (pl); }