source: protocols/msn/msn.h @ f9258ae

Last change on this file since f9258ae was f9258ae, checked in by Wilmer van der Gaast <wilmer@…>, at 2012-09-16T11:52:35Z

Generate a machine UUID instead of using a hardcoded one.

  • Property mode set to 100644
File size: 8.5 KB
Line 
1  /********************************************************************\
2  * BitlBee -- An IRC to other IM-networks gateway                     *
3  *                                                                    *
4  * Copyright 2002-2010 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., 59 Temple Place,
23  Suite 330, Boston, MA  02111-1307  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#define SB_KEEPALIVE_MESSAGE "\r\r\rDONT HANG UP ON ME!\r\r\r"
35
36#ifdef DEBUG_MSN
37#define debug( text... ) imcb_log( ic, text );
38#else
39#define debug( text... )
40#endif
41
42/* This should be MSN Messenger 7.0.0813
43#define MSNP11_PROD_KEY "CFHUR$52U_{VIX5T"
44#define MSNP11_PROD_ID  "PROD0101{0RM?UBW"
45*/
46
47#define MSN_NS_HOST "messenger.hotmail.com"
48#define MSN_NS_PORT 1863
49
50/* Some other version.
51#define MSNP11_PROD_KEY "O4BG@C7BWLYQX?5G"
52#define MSNP11_PROD_ID  "PROD01065C%ZFN6F"
53*/
54
55/* <= BitlBee 3.0.5
56#define MSNP11_PROD_KEY "ILTXC!4IXB5FB*PX"
57#define MSNP11_PROD_ID  "PROD0119GSJUC$18"
58*/
59
60#define MSNP11_PROD_KEY "C1BX{V4W}Q3*10SM"
61#define MSNP11_PROD_ID  "PROD0120PW!CCV9@"
62#define MSNP_VER        "MSNP18"
63#define MSNP_BUILD      "14.0.8117.416"
64
65#define MSN_SB_NEW         -24062002
66
67#define MSN_MESSAGE_HEADERS "MIME-Version: 1.0\r\n" \
68                            "Content-Type: text/plain; charset=UTF-8\r\n" \
69                            "User-Agent: BitlBee " BITLBEE_VERSION "\r\n" \
70                            "X-MMS-IM-Format: FN=MS%20Shell%20Dlg; EF=; CO=0; CS=0; PF=0\r\n" \
71                            "\r\n"
72
73#define MSN_TYPING_HEADERS "MIME-Version: 1.0\r\n" \
74                           "Content-Type: text/x-msmsgscontrol\r\n" \
75                           "TypingUser: %s\r\n" \
76                           "\r\n\r\n"
77
78#define MSN_NUDGE_HEADERS "MIME-Version: 1.0\r\n" \
79                          "Content-Type: text/x-msnmsgr-datacast\r\n" \
80                          "\r\n" \
81                          "ID: 1\r\n" \
82                          "\r\n"
83
84#define MSN_SB_KEEPALIVE_HEADERS "MIME-Version: 1.0\r\n" \
85                                 "Content-Type: text/x-ping\r\n" \
86                                 "\r\n\r\n"
87
88#define PROFILE_URL "http://members.msn.com/"
89
90typedef enum
91{
92        MSN_GOT_PROFILE = 1,
93        MSN_GOT_PROFILE_DN = 2,
94        MSN_DONE_ADL = 4,
95        MSN_REAUTHING = 8,
96        MSN_EMAIL_UNVERIFIED = 16,
97} msn_flags_t;
98
99struct msn_handler_data
100{
101        int fd, inpa;
102        int rxlen;
103        char *rxq;
104       
105        int msglen;
106        char *cmd_text;
107       
108        /* Either ic or sb */
109        gpointer data;
110       
111        int (*exec_command) ( struct msn_handler_data *handler, char **cmd, int count );
112        int (*exec_message) ( struct msn_handler_data *handler, char *msg, int msglen, char **cmd, int count );
113};
114
115struct msn_data
116{
117        struct im_connection *ic;
118       
119        struct msn_handler_data ns[1];
120        msn_flags_t flags;
121       
122        int trId;
123        char *tokens[4];
124        char *lock_key, *pp_policy;
125        char *uuid;
126       
127        GSList *msgq, *grpq, *soapq;
128        GSList *switchboards;
129        int sb_failures;
130        time_t first_sb_failure;
131       
132        const struct msn_away_state *away_state;
133        GSList *groups;
134        char *profile_rid;
135       
136        /* Mostly used for sending the ADL command; since MSNP13 the client
137           is responsible for downloading the contact list and then sending
138           it to the MSNP server. */
139        GTree *domaintree;
140        int adl_todo;
141};
142
143struct msn_switchboard
144{
145        struct im_connection *ic;
146       
147        /* The following two are also in the handler. TODO: Clean up. */
148        int fd;
149        gint inp;
150        struct msn_handler_data *handler;
151        gint keepalive;
152       
153        int trId;
154        int ready;
155       
156        int session;
157        char *key;
158       
159        GSList *msgq;
160        char *who;
161        struct groupchat *chat;
162};
163
164struct msn_away_state
165{
166        char code[4];
167        char name[16];
168};
169
170struct msn_status_code
171{
172        int number;
173        char *text;
174        int flags;
175};
176
177struct msn_message
178{
179        char *who;
180        char *text;
181};
182
183struct msn_groupadd
184{
185        char *who;
186        char *group;
187};
188
189typedef enum
190{
191        MSN_BUDDY_FL = 1,   /* Warning: FL,AL,BL *must* be 1,2,4. */
192        MSN_BUDDY_AL = 2,
193        MSN_BUDDY_BL = 4,
194        MSN_BUDDY_RL = 8,
195        MSN_BUDDY_PL = 16,
196        MSN_BUDDY_ADL_SYNCED = 256,
197} msn_buddy_flags_t;
198
199struct msn_buddy_data
200{
201        char *cid;
202        msn_buddy_flags_t flags;
203};
204
205struct msn_group
206{
207        char *name;
208        char *id;
209};
210
211/* Bitfield values for msn_status_code.flags */
212#define STATUS_FATAL            1
213#define STATUS_SB_FATAL         2
214#define STATUS_SB_IM_SPARE      4       /* Make one-to-one conversation switchboard available again, invite failed. */
215#define STATUS_SB_CHAT_SPARE    8       /* Same, but also for groupchats (not used yet). */
216
217extern int msn_chat_id;
218extern const struct msn_away_state msn_away_state_list[];
219extern const struct msn_status_code msn_status_code_list[];
220
221/* Keep a list of all the active connections. We need these lists because
222   "connected" callbacks might be called when the connection they belong too
223   is down already (for example, when an impatient user disabled the
224   connection), the callback should check whether it's still listed here
225   before doing *anything* else. */
226extern GSList *msn_connections;
227extern GSList *msn_switchboards;
228
229/* ns.c */
230int msn_ns_write( struct im_connection *ic, int fd, const char *fmt, ... ) G_GNUC_PRINTF( 3, 4 );
231gboolean msn_ns_connect( struct im_connection *ic, struct msn_handler_data *handler, const char *host, int port );
232void msn_ns_close( struct msn_handler_data *handler );
233void msn_auth_got_passport_token( struct im_connection *ic, const char *token, const char *error );
234void msn_auth_got_contact_list( struct im_connection *ic );
235int msn_ns_finish_login( struct im_connection *ic );
236int msn_ns_sendmessage( struct im_connection *ic, struct bee_user *bu, const char *text );
237void msn_ns_oim_send_queue( struct im_connection *ic, GSList **msgq );
238
239/* msn_util.c */
240int msn_logged_in( struct im_connection *ic );
241int msn_buddy_list_add( struct im_connection *ic, msn_buddy_flags_t list, const char *who, const char *realname_, const char *group );
242int msn_buddy_list_remove( struct im_connection *ic, msn_buddy_flags_t list, const char *who, const char *group );
243void msn_buddy_ask( bee_user_t *bu );
244char **msn_linesplit( char *line );
245int msn_handler( struct msn_handler_data *h );
246void msn_msgq_purge( struct im_connection *ic, GSList **list );
247char *msn_p11_challenge( char *challenge );
248gint msn_domaintree_cmp( gconstpointer a_, gconstpointer b_ );
249struct msn_group *msn_group_by_name( struct im_connection *ic, const char *name );
250struct msn_group *msn_group_by_id( struct im_connection *ic, const char *id );
251int msn_ns_set_display_name( struct im_connection *ic, const char *value );
252
253/* tables.c */
254const struct msn_away_state *msn_away_state_by_number( int number );
255const struct msn_away_state *msn_away_state_by_code( char *code );
256const struct msn_away_state *msn_away_state_by_name( char *name );
257const struct msn_status_code *msn_status_by_number( int number );
258
259/* sb.c */
260int msn_sb_write( struct msn_switchboard *sb, const char *fmt, ... ) G_GNUC_PRINTF( 2, 3 );;
261struct msn_switchboard *msn_sb_create( struct im_connection *ic, char *host, int port, char *key, int session );
262struct msn_switchboard *msn_sb_by_handle( struct im_connection *ic, char *handle );
263struct msn_switchboard *msn_sb_by_chat( struct groupchat *c );
264struct msn_switchboard *msn_sb_spare( struct im_connection *ic );
265int msn_sb_sendmessage( struct msn_switchboard *sb, char *text );
266struct groupchat *msn_sb_to_chat( struct msn_switchboard *sb );
267void msn_sb_destroy( struct msn_switchboard *sb );
268gboolean msn_sb_connected( gpointer data, gint source, b_input_condition cond );
269int msn_sb_write_msg( struct im_connection *ic, struct msn_message *m );
270void msn_sb_start_keepalives( struct msn_switchboard *sb, gboolean initial );
271void msn_sb_stop_keepalives( struct msn_switchboard *sb );
272
273#endif //_MSN_H
Note: See TracBrowser for help on using the repository browser.