From 633bf43e8e32484d99a0e5acf3847b891a06790b Mon Sep 17 00:00:00 2001
From: kylehuff <code@curetheitch.com>
Date: Sat, 24 Aug 2013 21:51:31 -0400
Subject: [PATCH 4/5] curl binary: add basic SASL XOAUTH2 support to binary

Adds the ability to specify an XOAUTH2 bearer token [RFC6750] via
the option --bearer for authentication using RFC6749 "OAuth 2.0
Authorization Framework".

example usage:
  curl --url "imaps://imap.gmail.com:993/INBOX/;UID=1" --ssl-reqd
  --bearer ya29.AHES6Z...OMfsHYI --user username@domain.tld
---
 src/tool_cfgable.c  |    2 ++
 src/tool_cfgable.h  |    1 +
 src/tool_getparam.c |   12 +++++++++---
 src/tool_operate.c  |    3 +++
 4 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/src/tool_cfgable.c b/src/tool_cfgable.c
index da11f4a..1c55c29 100644
--- a/src/tool_cfgable.c
+++ b/src/tool_cfgable.c
@@ -96,6 +96,8 @@ void free_config_fields(struct Configurable *config)
   Curl_safefree(config->krblevel);
   Curl_safefree(config->trace_dump);
 
+  Curl_safefree(config->xoauth2_bearer);
+
   config->trace_stream = NULL; /* closed elsewhere when appropriate */
 
   Curl_safefree(config->writeout);
diff --git a/src/tool_cfgable.h b/src/tool_cfgable.h
index 144552e..a12bdcd 100644
--- a/src/tool_cfgable.h
+++ b/src/tool_cfgable.h
@@ -208,6 +208,7 @@ struct Configurable {
 #ifdef CURLDEBUG
   bool test_event_based;
 #endif
+  char *xoauth2_bearer;     /* XOAUTH2 bearer token */
 }; /* struct Configurable */
 
 void free_config_fields(struct Configurable *config);
diff --git a/src/tool_getparam.c b/src/tool_getparam.c
index d9deb3b..813cc70 100644
--- a/src/tool_getparam.c
+++ b/src/tool_getparam.c
@@ -75,6 +75,7 @@ static const struct LongShort aliases[]= {
   {"*",  "url",                      TRUE},
   {"*a", "random-file",              TRUE},
   {"*b", "egd-file",                 TRUE},
+  {"*B", "bearer",                   TRUE},
   {"*c", "connect-timeout",          TRUE},
   {"*d", "ciphers",                  TRUE},
   {"*e", "disable-epsv",             FALSE},
@@ -498,6 +499,9 @@ ParameterError getparameter(char *flag,    /* f or -long-flag */
       case 'b': /* egd-file */
         GetStr(&config->egd_file, nextarg);
         break;
+      case 'B': /* XOAUTH2 Bearer */
+        GetStr(&config->xoauth2_bearer, nextarg);
+        break;
       case 'c': /* connect-timeout */
         err = str2udouble(&config->connecttimeout, nextarg);
         if(err)
@@ -1632,9 +1636,11 @@ ParameterError getparameter(char *flag,    /* f or -long-flag */
       /* user:password  */
       GetStr(&config->userpwd, nextarg);
       cleanarg(nextarg);
-      err = checkpasswd("host", &config->userpwd);
-      if(err)
-        return err;
+      if(!config->xoauth2_bearer) {
+        err = checkpasswd("host", &config->userpwd);
+        if(err)
+          return err;
+      }
       break;
     case 'U':
       /* Proxy user:password  */
diff --git a/src/tool_operate.c b/src/tool_operate.c
index 60d09ff..a37e0c8 100644
--- a/src/tool_operate.c
+++ b/src/tool_operate.c
@@ -977,6 +977,9 @@ int operate(struct Configurable *config, int argc, argv_item_t argv[])
         else if(!config->use_metalink)
           my_setopt(curl, CURLOPT_HEADER, config->include_headers?1L:0L);
 
+        if(config->xoauth2_bearer)
+          my_setopt_str(curl, CURLOPT_XOAUTH2_BEARER, config->xoauth2_bearer);
+
 #if !defined(CURL_DISABLE_PROXY)
         {
           /* TODO: Make this a run-time check instead of compile-time one. */
-- 
1.7.5.4

