source: protocols/msn/msn.h @ 90a45b8

Last change on this file since 90a45b8 was 4e4616a, checked in by dequis <dx@…>, at 2015-11-28T15:59:34Z

msn: Buffer writes a bit to send several commands with a single request

Just a 1msec timeout, so that it will run in the next main loop
iteration.

The official clients send the first few commands in the same request,
which reduces roundtrips during login. This commit doesn't do that.

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