source: protocols/msn/msn.h @ 75e49de

Last change on this file since 75e49de was b4e96d6, checked in by dequis <dx@…>, at 2015-03-15T14:41:48Z

msn: implement the rest of the http gateway support, enable by default

  • 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};
144
145struct msn_data {
146        int fd, inpa;
147        int rxlen;
148        char *rxq;
149
150        int msglen;
151        char *cmd_text;
152
153        struct im_connection *ic;
154
155        msn_flags_t flags;
156
157        int trId;
158        char *tokens[4];
159        char *lock_key, *pp_policy;
160        char *uuid;
161
162        GSList *msgq, *grpq, *soapq;
163
164        const struct msn_away_state *away_state;
165        GSList *groups;
166        char *profile_rid;
167
168        /* Mostly used for sending the ADL command; since MSNP13 the client
169           is responsible for downloading the contact list and then sending
170           it to the MSNP server. */
171        GTree *domaintree;
172        int adl_todo;
173
174        gboolean is_http;
175        struct msn_gw *gw;
176};
177
178struct msn_away_state {
179        char code[4];
180        char name[16];
181};
182
183struct msn_status_code {
184        int number;
185        char *text;
186        int flags;
187};
188
189struct msn_message {
190        char *who;
191        char *text;
192};
193
194struct msn_groupadd {
195        char *who;
196        char *group;
197};
198
199typedef enum {
200        MSN_BUDDY_FL = 1,   /* Warning: FL,AL,BL *must* be 1,2,4. */
201        MSN_BUDDY_AL = 2,
202        MSN_BUDDY_BL = 4,
203        MSN_BUDDY_RL = 8,
204        MSN_BUDDY_PL = 16,
205        MSN_BUDDY_ADL_SYNCED = 256,
206        MSN_BUDDY_FED = 512,
207} msn_buddy_flags_t;
208
209struct msn_buddy_data {
210        char *cid;
211        msn_buddy_flags_t flags;
212};
213
214struct msn_group {
215        char *name;
216        char *id;
217};
218
219/* Bitfield values for msn_status_code.flags */
220#define STATUS_FATAL            1
221#define STATUS_SB_FATAL         2
222
223extern int msn_chat_id;
224extern const struct msn_away_state msn_away_state_list[];
225extern const struct msn_status_code msn_status_code_list[];
226
227/* Keep a list of all the active connections. We need these lists because
228   "connected" callbacks might be called when the connection they belong too
229   is down already (for example, when an impatient user disabled the
230   connection), the callback should check whether it's still listed here
231   before doing *anything* else. */
232extern GSList *msn_connections;
233
234/* ns.c */
235int msn_ns_write(struct im_connection *ic, int fd, const char *fmt, ...) G_GNUC_PRINTF(3, 4);
236gboolean msn_ns_connect(struct im_connection *ic, const char *host, int port);
237void msn_ns_close(struct msn_data *handler);
238void msn_auth_got_passport_token(struct im_connection *ic, const char *token, const char *error);
239void msn_auth_got_contact_list(struct im_connection *ic);
240int msn_ns_finish_login(struct im_connection *ic);
241int msn_ns_sendmessage(struct im_connection *ic, struct bee_user *bu, const char *text);
242int msn_ns_command(struct msn_data *md, char **cmd, int num_parts);
243int msn_ns_message(struct msn_data *md, char *msg, int msglen, char **cmd, int num_parts);
244
245/* msn_util.c */
246int msn_buddy_list_add(struct im_connection *ic, msn_buddy_flags_t list, const char *who, const char *realname_,
247                       const char *group);
248int msn_buddy_list_remove(struct im_connection *ic, msn_buddy_flags_t list, const char *who, const char *group);
249void msn_buddy_ask(bee_user_t *bu);
250void msn_queue_feed(struct msn_data *h, char *bytes, int st);
251int msn_handler(struct msn_data *h);
252char *msn_p11_challenge(char *challenge);
253gint msn_domaintree_cmp(gconstpointer a_, gconstpointer b_);
254struct msn_group *msn_group_by_name(struct im_connection *ic, const char *name);
255struct msn_group *msn_group_by_id(struct im_connection *ic, const char *id);
256int msn_ns_set_display_name(struct im_connection *ic, const char *value);
257const char *msn_normalize_handle(const char *handle);
258
259/* tables.c */
260const struct msn_away_state *msn_away_state_by_number(int number);
261const struct msn_away_state *msn_away_state_by_code(char *code);
262const struct msn_away_state *msn_away_state_by_name(char *name);
263const struct msn_status_code *msn_status_by_number(int number);
264
265/* gw.c */
266struct msn_gw *msn_gw_new(struct msn_data *md);
267void msn_gw_free(struct msn_gw *gw);
268void msn_gw_open(struct msn_gw *gw);
269ssize_t msn_gw_read(struct msn_gw *gw, char **buf);
270void msn_gw_write(struct msn_gw *gw, char *buf, size_t len);
271
272#endif //_MSN_H
Note: See TracBrowser for help on using the repository browser.