Changeset 767b2d1


Ignore:
Timestamp:
2015-05-31T02:40:04Z (9 years ago)
Author:
dequis <dx@…>
Children:
074c9b6
Parents:
2ca933c
git-author:
dequis <dx@…> (07-04-15 12:59:51)
git-committer:
dequis <dx@…> (31-05-15 02:40:04)
Message:

msn: Start of SSL over TCP code (required for MSNP24)

Location:
protocols/msn
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • protocols/msn/gw.c

    r2ca933c r767b2d1  
    22#include "lib/http_client.h"
    33#include "msn.h"
    4 
    5 #define GATEWAY_HOST "geo.gateway.messenger.live.com"
    6 #define GATEWAY_PORT 443
    74
    85#define REQUEST_TEMPLATE \
     
    1815{
    1916        struct msn_gw *gw = g_new0(struct msn_gw, 1);
    20         gw->last_host = g_strdup(GATEWAY_HOST);
    21         gw->port = GATEWAY_PORT;
    22         gw->ssl = (GATEWAY_PORT == 443);
     17        gw->last_host = g_strdup(MSN_HTTP_HOST);
     18        gw->port = MSN_HTTP_PORT;
     19        gw->ssl = (MSN_HTTP_PORT == 443);
    2320        gw->poll_timeout = -1;
    2421        gw->ic = ic;
  • protocols/msn/msn.c

    r2ca933c r767b2d1  
    4343        s->flags |= SET_NOSAVE | ACC_SET_OFFLINE_ONLY;
    4444
    45         s = set_add(&acc->set, "port", MSN_NS_PORT, set_eval_int, acc);
     45        s = set_add(&acc->set, "port", NULL, set_eval_int, acc);
    4646        s->flags |= ACC_SET_OFFLINE_ONLY;
    4747
     
    6060        struct im_connection *ic = imcb_new(acc);
    6161        struct msn_data *md = g_new0(struct msn_data, 1);
    62         char *server = set_getstr(&ic->acc->set, "server");
     62        char *server = set_getstr(&ic->acc->set, "server") ? : MSN_SSL_HOST;
     63        int port = set_getint(&ic->acc->set, "port") ? : MSN_SSL_PORT;
    6364
    6465        ic->proto_data = md;
    6566        ic->flags |= OPT_PONGS | OPT_PONGED;
    66 
    67         if (!server) {
    68                 server = "geo.gateway.messenger.live.com";
    69         }
    7067
    7168        if (strchr(acc->user, '@') == NULL) {
     
    8481
    8582        imcb_log(ic, "Connecting");
    86         msn_ns_connect(ic, server,
    87                        set_getint(&ic->acc->set, "port"));
     83
     84        msn_ns_connect(ic, server, port);
    8885
    8986        if (set_getbool(&acc->set, "mail_notifications") && set_getstr(&acc->set, "mail_notifications_handle")) {
  • protocols/msn/msn.h

    r2ca933c r767b2d1  
    3232*/
    3333
    34 #define MSN_NS_HOST "messenger.hotmail.com"
    35 #define MSN_NS_PORT "1863"
     34#define MSN_SSL_HOST "s.gateway.messenger.live.com"
     35#define MSN_SSL_PORT 443
     36
     37#define MSN_HTTP_HOST "geo.gateway.messenger.live.com"
     38#define MSN_HTTP_PORT 443
    3639
    3740/* Some other version.
     
    154157        gboolean is_http;
    155158        struct msn_gw *gw;
     159        void *ssl;
    156160};
    157161
  • protocols/msn/ns.c

    r2ca933c r767b2d1  
    3232#include "soap.h"
    3333#include "xmltree.h"
    34 
    35 static gboolean msn_ns_connected(gpointer data, gint source, b_input_condition cond);
     34#include "ssl_client.h"
     35
     36static gboolean msn_ns_connected(gpointer data, int source, void *scd, b_input_condition cond);
    3637static gboolean msn_ns_callback(gpointer data, gint source, b_input_condition cond);
    3738
     
    6869                msn_gw_write(md->gw, out, len);
    6970        } else {
    70                 st = write(fd, out, len);
     71                st = ssl_write(md->ssl, out, len);
    7172        }
    7273
     
    9293                md->gw = msn_gw_new(ic);
    9394                md->gw->callback = msn_ns_callback;
    94                 msn_ns_connected(md, -1, B_EV_IO_READ);
     95                msn_ns_connected(md, 0, NULL, B_EV_IO_READ);
    9596        } else {
    96                 md->fd = proxy_connect(host, port, msn_ns_connected, md);
     97                md->ssl = ssl_connect((char *) host, port, TRUE, msn_ns_connected, md);
     98                md->fd = md->ssl ? ssl_getfd(md->ssl) : -1;
    9799                if (md->fd < 0) {
    98100                        imcb_error(ic, "Could not connect to server");
     
    105107}
    106108
    107 static gboolean msn_ns_connected(gpointer data, gint source, b_input_condition cond)
     109static gboolean msn_ns_connected(gpointer data, int source, void *scd, b_input_condition cond)
    108110{
    109111        struct msn_data *md = data;
    110112        struct im_connection *ic = md->ic;
    111113
    112         if (source == -1 && !md->is_http) {
     114        if (!scd && !md->is_http) {
     115                md->ssl = NULL;
    113116                imcb_error(ic, "Could not connect to server");
    114117                imc_logout(ic, TRUE);
     
    135138        }
    136139
    137         if (msn_ns_write(ic, source, "VER %d %s CVR0\r\n", ++md->trId, MSNP_VER)) {
     140        if (msn_ns_write(ic, -1, "VER %d %s CVR0\r\n", ++md->trId, MSNP_VER)) {
    138141                if (!md->is_http) {
    139142                        md->inpa = b_input_add(md->fd, B_EV_IO_READ, msn_ns_callback, md);
     
    150153                msn_gw_free(md->gw);
    151154        }
    152         if (md->fd >= 0) {
    153                 closesocket(md->fd);
     155
     156        if (md->ssl) {
     157                ssl_disconnect(md->ssl);
    154158                b_event_remove(md->inpa);
    155159        }
    156160
     161        md->ssl = NULL;
    157162        md->fd = md->inpa = -1;
     163
    158164        g_free(md->rxq);
    159165        g_free(md->cmd_text);
     
    175181        } else {
    176182                bytes = g_malloc(1024);
    177                 st = read(md->fd, bytes, 1024);
    178         }
    179 
    180         if (st <= 0) {
     183                st = ssl_read(md->ssl, bytes, 1024);
     184        }
     185
     186        if (st == 0 || (st < 0 && (md->is_http || !ssl_sockerr_again(md->ssl)))) {
    181187                imcb_error(ic, "Error while reading from server");
    182188                imc_logout(ic, TRUE);
     
    188194
    189195        g_free(bytes);
     196
     197        if (!md->is_http && ssl_pending(md->ssl)) {
     198                return msn_ns_callback(data, source, cond);
     199        }
    190200
    191201        return msn_handler(md);
Note: See TracChangeset for help on using the changeset viewer.