diff options
Diffstat (limited to 'ot_http.c')
| -rw-r--r-- | ot_http.c | 43 |
1 files changed, 35 insertions, 8 deletions
| @@ -306,13 +306,14 @@ static ot_keywords keywords_announce[] = { { "port", 1 }, { "left", 2 }, { "even | |||
| 306 | { NULL, -3 } }; | 306 | { NULL, -3 } }; |
| 307 | static ot_keywords keywords_announce_event[] = { { "completed", 1 }, { "stopped", 2 }, { NULL, -3 } }; | 307 | static ot_keywords keywords_announce_event[] = { { "completed", 1 }, { "stopped", 2 }, { NULL, -3 } }; |
| 308 | static ssize_t http_handle_announce( const int64 sock, struct ot_workstruct *ws, char *read_ptr ) { | 308 | static ssize_t http_handle_announce( const int64 sock, struct ot_workstruct *ws, char *read_ptr ) { |
| 309 | int numwant, tmp, scanon; | 309 | int numwant, tmp, scanon; |
| 310 | ot_peer peer; | 310 | ot_peer peer; |
| 311 | ot_hash *hash = NULL; | 311 | ot_hash *hash = NULL; |
| 312 | unsigned short port = htons(6881); | 312 | unsigned short port = htons(6881); |
| 313 | char *write_ptr; | 313 | char *write_ptr; |
| 314 | ssize_t len; | 314 | ssize_t len; |
| 315 | 315 | struct http_data *cookie = io_getcookie( sock ); | |
| 316 | |||
| 316 | /* This is to hack around stupid clients that send "announce ?info_hash" */ | 317 | /* This is to hack around stupid clients that send "announce ?info_hash" */ |
| 317 | if( read_ptr[-1] != '?' ) { | 318 | if( read_ptr[-1] != '?' ) { |
| 318 | while( ( *read_ptr != '?' ) && ( *read_ptr != '\n' ) ) ++read_ptr; | 319 | while( ( *read_ptr != '?' ) && ( *read_ptr != '\n' ) ) ++read_ptr; |
| @@ -320,7 +321,33 @@ static ssize_t http_handle_announce( const int64 sock, struct ot_workstruct *ws, | |||
| 320 | ++read_ptr; | 321 | ++read_ptr; |
| 321 | } | 322 | } |
| 322 | 323 | ||
| 323 | OT_SETIP( &peer, ((struct http_data*)io_getcookie( sock ) )->ip ); | 324 | #ifdef WANT_IP_FROM_PROXY |
| 325 | if( accesslist_isblessed( cookie->ip, OT_PERMISSION_MAY_PROXY ) ) { | ||
| 326 | ot_ip6 proxied_ip; | ||
| 327 | char *fwd, *fwd_new = ws->request; | ||
| 328 | |||
| 329 | /* Zero terminate for string routines. Normally we'd only overwrite bollocks */ | ||
| 330 | ws->request[ws->request_size-1] = 0; | ||
| 331 | |||
| 332 | /* Find last occurence of the forwarded header */ | ||
| 333 | do { | ||
| 334 | fwd = fwd_new; | ||
| 335 | fwd_new = strcasestr( fwd_new, "\nX-Forwarded-For:" ); | ||
| 336 | } while( fwd_new ); | ||
| 337 | |||
| 338 | /* Skip spaces between : and the ip address */ | ||
| 339 | if( fwd ) { | ||
| 340 | fwd += 18; /* sizeof( "\nX-Forwarded-For:" ) */ | ||
| 341 | while( *fwd == ' ' ) ++fwd; | ||
| 342 | } | ||
| 343 | |||
| 344 | if( fwd && scan_ip6( fwd, proxied_ip ) ) | ||
| 345 | OT_SETIP( &peer, proxied_ip ); | ||
| 346 | else | ||
| 347 | OT_SETIP( &peer, cookie->ip ); | ||
| 348 | } | ||
| 349 | #endif | ||
| 350 | OT_SETIP( &peer, cookie->ip ); | ||
| 324 | OT_SETPORT( &peer, &port ); | 351 | OT_SETPORT( &peer, &port ); |
| 325 | OT_PEERFLAG( &peer ) = 0; | 352 | OT_PEERFLAG( &peer ) = 0; |
| 326 | numwant = 50; | 353 | numwant = 50; |
