Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • lib/oauth2.c

    r3bda2c2 rba654ec  
    44*  Simple OAuth client (consumer) implementation.                           *
    55*                                                                           *
    6 *  Copyright 2010-2011 Wilmer van der Gaast <wilmer@gaast.net>              *
     6*  Copyright 2010-2012 Wilmer van der Gaast <wilmer@gaast.net>              *
    77*                                                                           *
    88*  This program is free software; you can redistribute it and/or modify     *
     
    2626#include "oauth2.h"
    2727#include "oauth.h"
     28#include "json.h"
    2829#include "url.h"
    2930
     
    4445};
    4546
    46 static char *oauth2_json_dumb_get( const char *json, const char *key );
    4747static void oauth2_access_token_done( struct http_request *req );
    4848
     
    103103        struct oauth2_access_token_data *cb_data = req->data;
    104104        char *atoken = NULL, *rtoken = NULL;
    105         char *content_type;
     105        const char *content_type;
    106106       
    107107        if( getenv( "BITLBEE_DEBUG" ) && req->reply_body )
     
    115115        else if( content_type && strstr( content_type, "application/json" ) )
    116116        {
    117                 atoken = oauth2_json_dumb_get( req->reply_body, "access_token" );
    118                 rtoken = oauth2_json_dumb_get( req->reply_body, "refresh_token" );
     117                json_value *js = json_parse( req->reply_body );
     118                if( js && js->type == json_object )
     119                {
     120                        int i;
     121                       
     122                        for( i = 0; i < js->u.object.length; i ++ )
     123                        {
     124                                if( js->u.object.values[i].value->type != json_string )
     125                                        continue;
     126                                if( strcmp( js->u.object.values[i].name, "access_token" ) == 0 )
     127                                        atoken = g_strdup( js->u.object.values[i].value->u.string.ptr );
     128                                if( strcmp( js->u.object.values[i].name, "refresh_token" ) == 0 )
     129                                        rtoken = g_strdup( js->u.object.values[i].value->u.string.ptr );
     130                        }
     131                }
     132                json_value_free( js );
    119133        }
    120134        else
     
    132146       
    133147        cb_data->func( cb_data->data, atoken, rtoken );
    134         g_free( content_type );
    135148        g_free( atoken );
    136149        g_free( rtoken );
    137150        g_free( cb_data );
    138151}
    139 
    140 /* Super dumb. I absolutely refuse to use/add a complete json parser library
    141    (adding a new dependency to BitlBee for the first time in.. 6 years?) just
    142    to parse 100 bytes of data. So I have to do my own parsing because OAuth2
    143    dropped support for XML. (GRRR!) This is very dumb and for example won't
    144    work for integer values, nor will it strip/handle backslashes. */
    145 static char *oauth2_json_dumb_get( const char *json, const char *key )
    146 {
    147         int is_key = 0; /* 1 == reading key, 0 == reading value */
    148         int found_key = 0;
    149                
    150         while( json && *json )
    151         {
    152                 /* Grab strings and see if they're what we're looking for. */
    153                 if( *json == '"' || *json == '\'' )
    154                 {
    155                         char q = *json;
    156                         const char *str_start;
    157                         json ++;
    158                         str_start = json;
    159                        
    160                         while( *json )
    161                         {
    162                                 /* \' and \" are not string terminators. */
    163                                 if( *json == '\\' && json[1] == q )
    164                                         json ++;
    165                                 /* But without a \ it is. */
    166                                 else if( *json == q )
    167                                         break;
    168                                 json ++;
    169                         }
    170                         if( *json == '\0' )
    171                                 return NULL;
    172                        
    173                         if( is_key && strncmp( str_start, key, strlen( key ) ) == 0 )
    174                         {
    175                                 found_key = 1;
    176                         }
    177                         else if( !is_key && found_key )
    178                         {
    179                                 char *ret = g_memdup( str_start, json - str_start + 1 );
    180                                 ret[json-str_start] = '\0';
    181                                 return ret;
    182                         }
    183                        
    184                 }
    185                 else if( *json == '{' || *json == ',' )
    186                 {
    187                         found_key = 0;
    188                         is_key = 1;
    189                 }
    190                 else if( *json == ':' )
    191                         is_key = 0;
    192                
    193                 json ++;
    194         }
    195        
    196         return NULL;
    197 }
Note: See TracChangeset for help on using the changeset viewer.