Changeset e1c926f


Ignore:
Timestamp:
2011-07-31T15:44:37Z (13 years ago)
Author:
Wilmer van der Gaast <wilmer@…>
Branches:
master
Children:
f138bd2
Parents:
39a939c
Message:

Facebook authentication. This isn't really OAuth in the end: FB doesn't
really support desktop app OAuth in a way that would work with BitlBee.
Plus, it's only OAuth-compliant by, err, name?

Files:
3 edited

Legend:

Unmodified
Added
Removed
  • lib/md5.c

    r39a939c re1c926f  
    2424#include <sys/types.h>
    2525#include <string.h>             /* for memcpy() */
     26#include <stdio.h>
    2627#include "md5.h"
    2728
  • protocols/jabber/jabber.h

    r39a939c re1c926f  
    4747        JFLAG_XMLCONSOLE = 64,          /* If the user added an xmlconsole buddy. */
    4848        JFLAG_STARTTLS_DONE = 128,      /* If a plaintext session was converted to TLS. */
     49       
     50        JFLAG_SASL_FB = 0x10000,        /* Trying Facebook authentication. */
    4951} jabber_flags_t;
    5052
  • protocols/jabber/sasl.c

    r39a939c re1c926f  
    2727#include "base64.h"
    2828#include "oauth2.h"
     29#include "oauth.h"
    2930
    3031xt_status sasl_pkt_mechanisms( struct xt_node *node, gpointer data )
     
    3435        struct xt_node *c, *reply;
    3536        char *s;
    36         int sup_plain = 0, sup_digest = 0, sup_oauth2 = 0;
     37        int sup_plain = 0, sup_digest = 0, sup_oauth2 = 0, sup_fb = 0;
    3738       
    3839        if( !sasl_supported( ic ) )
     
    6263                if( c->text && g_strcasecmp( c->text, "X-OAUTH2" ) == 0 )
    6364                        sup_oauth2 = 1;
     65                if( c->text && g_strcasecmp( c->text, "X-FACEBOOK-PLATFORM" ) == 0 )
     66                        sup_fb = 1;
    6467               
    6568                c = c->next;
     
    101104                reply->text_len = strlen( reply->text );
    102105                g_free( s );
     106        }
     107        else if( sup_fb && strstr( ic->acc->pass, "session_key=" ) )
     108        {
     109                xt_add_attr( reply, "mechanism", "X-FACEBOOK-PLATFORM" );
     110                jd->flags |= JFLAG_SASL_FB;
    103111        }
    104112        else if( sup_digest )
     
    239247        dec = frombase64( node->text );
    240248       
    241         if( !( s = sasl_get_part( dec, "rspauth" ) ) )
     249        if( jd->flags & JFLAG_SASL_FB )
     250        {
     251                GSList *p_in = NULL, *p_out = NULL, *p;
     252                md5_state_t md5;
     253                char time[33], *fmt, *token;
     254                const char *secret;
     255               
     256                oauth_params_parse( &p_in, dec );
     257                oauth_params_add( &p_out, "nonce", oauth_params_get( &p_in, "nonce" ) );
     258                oauth_params_add( &p_out, "method", oauth_params_get( &p_in, "method" ) );
     259                oauth_params_free( &p_in );
     260               
     261                token = g_strdup( ic->acc->pass );
     262                oauth_params_parse( &p_in, token );
     263                g_free( token );
     264                oauth_params_add( &p_out, "session_key", oauth_params_get( &p_in, "session_key" ) );
     265               
     266                g_snprintf( time, sizeof( time ), "%lld", (long long) ( gettime() * 1000 ) );
     267                oauth_params_add( &p_out, "call_id", time );
     268                oauth_params_add( &p_out, "api_key", oauth2_service_facebook.consumer_key );
     269                oauth_params_add( &p_out, "v", "1.0" );
     270                oauth_params_add( &p_out, "format", "XML" );
     271               
     272                md5_init( &md5 );
     273                for( p = p_out; p; p = p->next )
     274                        md5_append( &md5, p->data, strlen( p->data ) );
     275               
     276                secret = oauth_params_get( &p_in, "secret" );
     277                md5_append( &md5, (unsigned char*) secret, strlen( secret ) );
     278                md5_finish_ascii( &md5, time );
     279                oauth_params_add( &p_out, "sig", time );
     280               
     281                fmt = oauth_params_string( p_out );
     282                oauth_params_free( &p_out );
     283                oauth_params_free( &p_in );
     284                s = tobase64( fmt );
     285                g_free( fmt );
     286        }
     287        else if( !( s = sasl_get_part( dec, "rspauth" ) ) )
    242288        {
    243289                /* See RFC 2831 for for information. */
     
    445491                imcb_error( ic, "OAuth failure (missing access token)" );
    446492                imc_logout( ic, TRUE );
     493                return;
    447494        }
    448495        if( refresh_token != NULL )
Note: See TracChangeset for help on using the changeset viewer.