]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: verify X-Amz-Date
authorJavier M. Mellid <jmunhoz@igalia.com>
Fri, 13 Nov 2015 15:11:07 +0000 (16:11 +0100)
committerJavier M. Mellid <jmunhoz@igalia.com>
Sat, 13 Feb 2016 12:41:28 +0000 (12:41 +0000)
Signed-off-by: Javier M. Mellid <jmunhoz@igalia.com>
src/rgw/rgw_common.cc
src/rgw/rgw_common.h
src/rgw/rgw_rest_s3.cc

index a177fc4f14fd16ad0682ab6076cfe5f471a594cf..e5908935e9422d58a242ad710981b672e1fa877f 100644 (file)
@@ -350,10 +350,18 @@ bool parse_rfc2616(const char *s, struct tm *t)
   return parse_rfc850(s, t) || parse_asctime(s, t) || parse_rfc1123(s, t) || parse_rfc1123_alt(s,t);
 }
 
-bool parse_iso8601(const char *s, struct tm *t)
+bool parse_iso8601(const char *s, struct tm *t, bool extended_format)
 {
   memset(t, 0, sizeof(*t));
-  const char *p = strptime(s, "%Y-%m-%dT%T", t);
+  const char *p;
+
+  if (!s)
+    s = "";
+
+  if (extended_format)
+    p = strptime(s, "%Y-%m-%dT%T", t);
+  else
+    p = strptime(s, "%Y%m%dT%H%M%S", t);
   if (!p) {
     dout(0) << "parse_iso8601 failed" << dendl;
     return false;
index deb361da828403b0cbf9fd04dd6e9670e417cf88..4e7e3a152185be4708fbf6dd9cec7d949934ee71 100644 (file)
@@ -1712,7 +1712,7 @@ extern int parse_key_value(string& in_str, const char *delim, string& key, strin
 /** time parsing */
 extern int parse_time(const char *time_str, time_t *time);
 extern bool parse_rfc2616(const char *s, struct tm *t);
-extern bool parse_iso8601(const char *s, struct tm *t);
+extern bool parse_iso8601(const char *s, struct tm *t, bool extended_format = true);
 extern string rgw_trim_whitespace(const string& src);
 extern string rgw_trim_quotes(const string& val);
 
index 8d6cff041bc146d2cf2df6caff3c0fca0b182725..455a52446115c6de08f1fdf39b01067cdb5c9e5c 100644 (file)
@@ -2904,12 +2904,12 @@ int RGW_Auth_S3::authorize_v4(RGWRados *store, struct req_state *s)
     /* grab date */
 
     const char *d = s->info.env->get("HTTP_X_AMZ_DATE");
-    s->aws4_auth->date = d ? d : "";
-    if (s->aws4_auth->date.empty()) {
+    struct tm t;
+    if (!parse_iso8601(d, &t, false)) {
       dout(10) << "error reading date via http_x_amz_date" << dendl;
-      return -EINVAL;
+      return -EACCES;
     }
-
+    s->aws4_auth->date = d;
   }
 
   /* AKIAIVKTAZLOCF43WNQD/AAAAMMDD/region/host/aws4_request */