static int http_da_session_update(const char *realm, const char *nonce, const char *opaque, const char *cnonce, const char *ncount) { struct http_da_session *session; if (!realm || !nonce || !opaque || !cnonce || !ncount) { #ifdef SOAP_DEBUG fprintf(stderr, "Debug message: authentication update failed, missing authentication data\n"); #endif return SOAP_ERR; } #ifdef SOAP_DEBUG fprintf(stderr, "Debug message: updating session realm=%s nonce=%s\n", realm, nonce); #endif MUTEX_LOCK(http_da_session_lock); for (session = http_da_session; session; session = session->next) if (!strcmp(session->realm, realm) && !strcmp(session->nonce, nonce) && !strcmp(session->opaque, opaque)) break; if (session) { unsigned long nc = soap_strtoul(ncount, NULL, 16); if (session->nc >= nc) { session->modified = 0; /* replay attack: terminate session */ session = NULL; } else { session->nc = nc; session->modified = time(NULL); } } MUTEX_UNLOCK(http_da_session_lock); if (!session) return SOAP_ERR; return SOAP_OK; }
int soap_s2xsd__dateTime(struct soap *soap, const char *s, struct timeval *a) { memset((void*)a, 0, sizeof(struct timeval)); if (s) { char *t; unsigned long d; struct tm T; memset((void*)&T, 0, sizeof(T)); d = soap_strtoul(s, &t, 10); if (*t == '-') { /* YYYY-MM-DD */ T.tm_year = (int)d; T.tm_mon = (int)soap_strtoul(t + 1, &t, 10); T.tm_mday = (int)soap_strtoul(t + 1, &t, 10); } else { /* YYYYMMDD */ T.tm_year = (int)(d / 10000); T.tm_mon = (int)(d / 100 % 100); T.tm_mday = (int)(d % 100); } if (*t == 'T') { d = soap_strtoul(t + 1, &t, 10); if (*t == ':') { /* Thh:mm:ss */ T.tm_hour = (int)d; T.tm_min = (int)soap_strtoul(t + 1, &t, 10); T.tm_sec = (int)soap_strtoul(t + 1, &t, 10); } else { /* Thhmmss */ T.tm_hour = (int)(d / 10000); T.tm_min = (int)(d / 100 % 100); T.tm_sec = (int)(d % 100); } } if (T.tm_year == 1) T.tm_year = 70; else T.tm_year -= 1900; T.tm_mon--; if (*t == '.') { for (t++; *t; t++) if (*t < '0' || *t > '9') break; } if (*t) { #ifndef WITH_NOZONE if (*t == '+' || *t == '-') { int h = 0, m = 0; if (t[3] == ':') { /* +hh:mm */ h = (int)soap_strtol(t, NULL, 10); m = (int)soap_strtol(t + 4, NULL, 10); if (h < 0) m = -m; } else { /* +hhmm */ m = (int)soap_strtol(t, NULL, 10); h = m / 100; m = m % 100; } T.tm_min -= m; T.tm_hour -= h; /* put hour and min in range */ T.tm_hour += T.tm_min / 60; T.tm_min %= 60; if (T.tm_min < 0) { T.tm_min += 60; T.tm_hour--; } T.tm_mday += T.tm_hour / 24; T.tm_hour %= 24; if (T.tm_hour < 0) { T.tm_hour += 24; T.tm_mday--; } /* note: day of the month may be out of range, timegm() handles it */ } #endif a->tv_sec = soap_timegm(&T); } else a->tv_sec = mktime(&T); } return soap->error; }
int soap_s2xsd__dateTime(struct soap *soap, const char *s, struct tm *a) { memset((void*)a, 0, sizeof(struct tm)); if (s) { char *t; unsigned long d; d = soap_strtoul(s, &t, 10); if (*t == '-') { /* YYYY-MM-DD */ a->tm_year = (int)d; a->tm_mon = (int)soap_strtoul(t + 1, &t, 10); a->tm_mday = (int)soap_strtoul(t + 1, &t, 10); } else if (!(soap->mode & SOAP_XML_STRICT)) { /* YYYYMMDD */ a->tm_year = (int)(d / 10000); a->tm_mon = (int)(d / 100 % 100); a->tm_mday = (int)(d % 100); } else return soap->error = SOAP_TYPE; if (*t == 'T' || ((*t == 't' || *t == ' ') && !(soap->mode & SOAP_XML_STRICT))) { d = soap_strtoul(t + 1, &t, 10); if (*t == ':') { /* Thh:mm:ss */ a->tm_hour = (int)d; a->tm_min = (int)soap_strtoul(t + 1, &t, 10); a->tm_sec = (int)soap_strtoul(t + 1, &t, 10); } else if (!(soap->mode & SOAP_XML_STRICT)) { /* Thhmmss */ a->tm_hour = (int)(d / 10000); a->tm_min = (int)(d / 100 % 100); a->tm_sec = (int)(d % 100); } else return soap->error = SOAP_TYPE; } if (a->tm_year == 1) a->tm_year = 70; else a->tm_year -= 1900; a->tm_mon--; if (*t == '.') { for (t++; *t; t++) if (*t < '0' || *t > '9') break; } if (*t == ' ' && !(soap->mode & SOAP_XML_STRICT)) t++; if (*t) { #ifndef WITH_NOZONE if (*t == '+' || *t == '-') { int h, m; m = (int)soap_strtol(t, &t, 10); if (*t == ':') { /* +hh:mm */ h = m; m = (int)soap_strtol(t + 1, &t, 10); if (h < 0) m = -m; } else if (!(soap->mode & SOAP_XML_STRICT)) { /* +hhmm */ h = m / 100; m = m % 100; } else { /* +hh */ h = m; m = 0; } if (*t) return soap->error = SOAP_TYPE; a->tm_min -= m; a->tm_hour -= h; /* put hour and min in range */ a->tm_hour += a->tm_min / 60; a->tm_min %= 60; if (a->tm_min < 0) { a->tm_min += 60; a->tm_hour--; } a->tm_mday += a->tm_hour / 24; a->tm_hour %= 24; if (a->tm_hour < 0) { a->tm_hour += 24; a->tm_mday--; } /* note: day of the month may be out of range, timegm() handles it */ } else if (*t != 'Z') return soap->error = SOAP_TYPE; #endif } else /* no UTC or timezone, so assume we got a localtime */ a->tm_isdst = -1; } return soap->error; }