source: protocols/msn/msn.h @ 767b2d1

Last change on this file since 767b2d1 was 767b2d1, checked in by dequis <dx@…>, at 2015-05-31T02:40:04Z

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

  • Property mode set to 100644
File size: 7.4 KB
Line 
1/********************************************************************\
2  * BitlBee -- An IRC to other IM-networks gateway                     *
3  *                                                                    *
4  * Copyright 2002-2012 Wilmer van der Gaast and others                *
5  \********************************************************************/
6
7/* MSN module                                                           */
8
9/*
10  This program is free software; you can redistribute it and/or modify
11  it under the terms of the GNU General Public License as published by
12  the Free Software Foundation; either version 2 of the License, or
13  (at your option) any later version.
14
15  This program is distributed in the hope that it will be useful,
16  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  GNU General Public License for more details.
19
20  You should have received a copy of the GNU General Public License with
21  the Debian GNU/Linux distribution in /usr/share/common-licenses/GPL;
22  if not, write to the Free Software Foundation, Inc., 51 Franklin St.,
23  Fifth Floor, Boston, MA  02110-1301  USA
24*/
25
26#ifndef _MSN_H
27#define _MSN_H
28
29/* This should be MSN Messenger 7.0.0813
30#define MSNP11_PROD_KEY "CFHUR$52U_{VIX5T"
31#define MSNP11_PROD_ID  "PROD0101{0RM?UBW"
32*/
33
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
39
40/* Some other version.
41#define MSNP11_PROD_KEY "O4BG@C7BWLYQX?5G"
42#define MSNP11_PROD_ID  "PROD01065C%ZFN6F"
43*/
44
45/* <= BitlBee 3.0.5
46#define MSNP11_PROD_KEY "ILTXC!4IXB5FB*PX"
47#define MSNP11_PROD_ID  "PROD0119GSJUC$18"
48*/
49
50#define MSNP11_PROD_KEY "C1BX{V4W}Q3*10SM"
51#define MSNP11_PROD_ID  "PROD0120PW!CCV9@"
52#define MSNP_VER        "MSNP21"
53#define MSNP_BUILD      "14.0.8117.416"
54
55#define MSN_SB_NEW         -24062002
56
57#define MSN_CAP1        0xC000
58#define MSN_CAP2        0x0000
59
60#define MSN_BASE_HEADERS \
61        "Routing: 1.0\r\n" \
62        "To: 1:%s\r\n" \
63        "From: 1:%s;epid={%s}\r\n" \
64        "\r\n" \
65        "Reliability: 1.0\r\n" \
66        "\r\n"
67
68#define MSN_MESSAGE_HEADERS MSN_BASE_HEADERS \
69        "Messaging: 2.0\r\n" \
70        "Message-Type: %s\r\n" \
71        "Content-Length: %zd\r\n" \
72        "Content-Type: text/plain; charset=UTF-8\r\n" \
73        "X-MMS-IM-Format: FN=Segoe%%20UI; EF=; CO=0; CS=0; PF=0\r\n" \
74        "\r\n" \
75        "%s"
76
77#define MSN_PUT_HEADERS MSN_BASE_HEADERS \
78        "Publication: 1.0\r\n" \
79        "Uri: %s\r\n" \
80        "Content-Type: %s\r\n" \
81        "Content-Length: %zd\r\n" \
82        "\r\n" \
83        "%s"
84
85#define MSN_PUT_USER_BODY \
86        "<user>" \
87        "<s n=\"PE\"><UserTileLocation></UserTileLocation><FriendlyName>%s</FriendlyName><PSM>%s</PSM><DDP></DDP>" \
88        "<Scene></Scene><ASN></ASN><ColorScheme>-3</ColorScheme><BDG></BDG><RUM>%s</RUM><RUL></RUL><RLT>0</RLT>" \
89        "<RID></RID><SUL></SUL><MachineGuid>%s</MachineGuid></s>" \
90        "<s n=\"IM\"><Status>%s</Status><CurrentMedia></CurrentMedia></s>" \
91        "<sep n=\"PD\"><ClientType>1</ClientType><EpName>%s</EpName><Idle>%s</Idle><State>%s</State></sep>" \
92        "<sep n=\"PE\"><VER>BitlBee:" BITLBEE_VERSION "</VER><TYP>1</TYP><Capabilities>%d:%d</Capabilities></sep>" \
93        "<sep n=\"IM\"><Capabilities>%d:%d</Capabilities></sep>" \
94        "</user>"
95
96#define PROFILE_URL "http://members.msn.com/"
97
98typedef enum {
99        MSN_GOT_PROFILE = 1,
100        MSN_GOT_PROFILE_DN = 2,
101        MSN_DONE_ADL = 4,
102        MSN_REAUTHING = 8,
103        MSN_EMAIL_UNVERIFIED = 16,
104} msn_flags_t;
105
106struct msn_gw {
107        char *last_host;
108        int port;
109        gboolean ssl;
110
111        char *session_id;
112
113        GByteArray *in;
114        GByteArray *out;
115
116        int poll_timeout;
117
118        b_event_handler callback;
119
120        struct im_connection *ic;
121        struct msn_data *md;
122
123        gboolean open;
124        gboolean waiting;
125        gboolean polling;
126};
127
128struct msn_data {
129        int fd, inpa;
130        int rxlen;
131        char *rxq;
132
133        int msglen;
134        char *cmd_text;
135
136        struct im_connection *ic;
137
138        msn_flags_t flags;
139
140        int trId;
141        char *tokens[4];
142        char *lock_key, *pp_policy;
143        char *uuid;
144
145        GSList *msgq, *grpq, *soapq;
146
147        const struct msn_away_state *away_state;
148        GSList *groups;
149        char *profile_rid;
150
151        /* Mostly used for sending the ADL command; since MSNP13 the client
152           is responsible for downloading the contact list and then sending
153           it to the MSNP server. */
154        GTree *domaintree;
155        int adl_todo;
156
157        gboolean is_http;
158        struct msn_gw *gw;
159        void *ssl;
160};
161
162struct msn_away_state {
163        char code[4];
164        char name[16];
165};
166
167struct msn_status_code {
168        int number;
169        char *text;
170        int flags;
171};
172
173struct msn_message {
174        char *who;
175        char *text;
176};
177
178struct msn_groupadd {
179        char *who;
180        char *group;
181};
182
183typedef enum {
184        MSN_BUDDY_FL = 1,   /* Warning: FL,AL,BL *must* be 1,2,4. */
185        MSN_BUDDY_AL = 2,
186        MSN_BUDDY_BL = 4,
187        MSN_BUDDY_RL = 8,
188        MSN_BUDDY_PL = 16,
189        MSN_BUDDY_ADL_SYNCED = 256,
190        MSN_BUDDY_FED = 512,
191} msn_buddy_flags_t;
192
193struct msn_buddy_data {
194        char *cid;
195        msn_buddy_flags_t flags;
196};
197
198struct msn_group {
199        char *name;
200        char *id;
201};
202
203/* Bitfield values for msn_status_code.flags */
204#define STATUS_FATAL            1
205#define STATUS_SB_FATAL         2
206
207extern int msn_chat_id;
208extern const struct msn_away_state msn_away_state_list[];
209extern const struct msn_status_code msn_status_code_list[];
210
211/* Keep a list of all the active connections. We need these lists because
212   "connected" callbacks might be called when the connection they belong too
213   is down already (for example, when an impatient user disabled the
214   connection), the callback should check whether it's still listed here
215   before doing *anything* else. */
216extern GSList *msn_connections;
217
218/* ns.c */
219int msn_ns_write(struct im_connection *ic, int fd, const char *fmt, ...) G_GNUC_PRINTF(3, 4);
220gboolean msn_ns_connect(struct im_connection *ic, const char *host, int port);
221void msn_ns_close(struct msn_data *handler);
222void msn_auth_got_passport_token(struct im_connection *ic, const char *token, const char *error);
223void msn_auth_got_contact_list(struct im_connection *ic);
224int msn_ns_finish_login(struct im_connection *ic);
225int msn_ns_send_typing(struct im_connection *ic, struct bee_user *bu);
226int msn_ns_send_message(struct im_connection *ic, struct bee_user *bu, const char *text);
227int msn_ns_command(struct msn_data *md, char **cmd, int num_parts);
228int msn_ns_message(struct msn_data *md, char *msg, int msglen, char **cmd, int num_parts);
229
230/* msn_util.c */
231int msn_buddy_list_add(struct im_connection *ic, msn_buddy_flags_t list, const char *who, const char *realname_,
232                       const char *group);
233int msn_buddy_list_remove(struct im_connection *ic, msn_buddy_flags_t list, const char *who, const char *group);
234void msn_buddy_ask(bee_user_t *bu);
235void msn_queue_feed(struct msn_data *h, char *bytes, int st);
236int msn_handler(struct msn_data *h);
237char *msn_p11_challenge(char *challenge);
238gint msn_domaintree_cmp(gconstpointer a_, gconstpointer b_);
239struct msn_group *msn_group_by_name(struct im_connection *ic, const char *name);
240struct msn_group *msn_group_by_id(struct im_connection *ic, const char *id);
241int msn_ns_set_display_name(struct im_connection *ic, const char *value);
242const char *msn_normalize_handle(const char *handle);
243
244/* tables.c */
245const struct msn_away_state *msn_away_state_by_number(int number);
246const struct msn_away_state *msn_away_state_by_code(char *code);
247const struct msn_away_state *msn_away_state_by_name(char *name);
248const struct msn_status_code *msn_status_by_number(int number);
249
250/* gw.c */
251struct msn_gw *msn_gw_new(struct im_connection *ic);
252void msn_gw_free(struct msn_gw *gw);
253void msn_gw_open(struct msn_gw *gw);
254ssize_t msn_gw_read(struct msn_gw *gw, char **buf);
255void msn_gw_write(struct msn_gw *gw, char *buf, size_t len);
256
257#endif //_MSN_H
Note: See TracBrowser for help on using the repository browser.