diff libsip/req_supp.c @ 49:dec31b1a8b96

sip-in: check Require and Supported
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 06 Sep 2022 22:57:16 -0800
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libsip/req_supp.c	Tue Sep 06 22:57:16 2022 -0800
@@ -0,0 +1,77 @@
+/*
+ * Here we parse Require and Supported headers in a SIP request,
+ * checking whether our supported extensions are also supported
+ * or required by the client, and catching any client requirements
+ * which we don't support.
+ */
+
+#include <ctype.h>
+#include <string.h>
+#include <strings.h>
+#include "parse.h"
+#include "req_supp.h"
+
+parse_require_supported(msg, lsupp, nlsupp, unsupp)
+	struct sip_pkt_rx *msg;
+	struct supported_ext *lsupp;
+	unsigned nlsupp;
+	char **unsupp;
+{
+	struct sip_parse_hdr *hdr, *endhdr;
+	char *cp, *np;
+	unsigned n;
+
+	endhdr = msg->hdr_fields + msg->num_hdr_fields;
+	/* check Require first */
+	for (hdr = msg->hdr_fields; hdr < endhdr; hdr++) {
+		if (strcasecmp(hdr->field_name, "Require"))
+			continue;
+		cp = hdr->field_value;
+		for (;;) {
+			while (isspace(*cp) || *cp == ',')
+				cp++;
+			if (!*cp)
+				break;
+			np = cp;
+			while (*cp && !isspace(*cp) && *cp != ',')
+				cp++;
+			if (*cp)
+				*cp++ = '\0';
+			for (n = 0; n < nlsupp; n++) {
+				if (!strcasecmp(np, lsupp[n].name)) {
+					*lsupp[n].req_flag = 1;
+					break;
+				} else {
+					if (unsupp)
+						*unsupp = np;
+					return(-1);
+				}
+			}
+		}
+	}
+	/* now check Supported */
+	for (hdr = msg->hdr_fields; hdr < endhdr; hdr++) {
+		if (strcasecmp(hdr->field_name, "Supported") &&
+		    strcasecmp(hdr->field_name, "k"))
+			continue;
+		cp = hdr->field_value;
+		for (;;) {
+			while (isspace(*cp) || *cp == ',')
+				cp++;
+			if (!*cp)
+				break;
+			np = cp;
+			while (*cp && !isspace(*cp) && *cp != ',')
+				cp++;
+			if (*cp)
+				*cp++ = '\0';
+			for (n = 0; n < nlsupp; n++) {
+				if (!strcasecmp(np, lsupp[n].name)) {
+					*lsupp[n].sup_flag = 1;
+					break;
+				}
+			}
+		}
+	}
+	return(0);
+}