source: protocols/msn/msn.h @ ac4999a

Last change on this file since ac4999a was ac4999a, checked in by dequis <dx@…>, at 2015-03-19T16:02:31Z

msn: switch to long polling http

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