Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • lib/oauth2.c

    rba654ec r3bda2c2  
    44*  Simple OAuth client (consumer) implementation.                           *
    55*                                                                           *
    6 *  Copyright 2010-2012 Wilmer van der Gaast <wilmer@gaast.net>              *
     6*  Copyright 2010-2011 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"
    2928#include "url.h"
    3029
     
    4544};
    4645
     46static 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         const char *content_type;
     105        char *content_type;
    106106       
    107107        if( getenv( "BITLBEE_DEBUG" ) && req->reply_body )
     
    115115        else if( content_type && strstr( content_type, "application/json" ) )
    116116        {
    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 );
     117                atoken = oauth2_json_dumb_get( req->reply_body, "access_token" );
     118                rtoken = oauth2_json_dumb_get( req->reply_body, "refresh_token" );
    133119        }
    134120        else
     
    146132       
    147133        cb_data->func( cb_data->data, atoken, rtoken );
     134        g_free( content_type );
    148135        g_free( atoken );
    149136        g_free( rtoken );
    150137        g_free( cb_data );
    151138}
     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. */
     145static 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.