mirror of
git://erdgeist.org/opentracker
synced 2025-03-12 13:41:12 +00:00
Moving accesslist stuff to its own object
This commit is contained in:
parent
0547e2ade2
commit
697e239027
11
Makefile
11
Makefile
@ -1,13 +1,18 @@
|
|||||||
CC?=gcc
|
CC?=gcc
|
||||||
FEATURES=#-DWANT_TRACKER_SYNC -DWANT_BLACKLISTING -DWANT_CLOSED_TRACKER -DWANT_UTORRENT1600_WORKAROUND #-DWANT_IP_FROM_QUERY_STRING -D_DEBUG_HTTPERROR
|
#FEATURES =-DWANT_TRACKER_SYNC
|
||||||
|
#FEATURES+=-DWANT_BLACKLISTING
|
||||||
|
#FEATURES+=-DWANT_CLOSED_TRACKER
|
||||||
|
#FEATURES+=-DWANT_UTORRENT1600_WORKAROUND
|
||||||
|
#FEATURES+=-DWANT_IP_FROM_QUERY_STRING
|
||||||
|
#FEATURES+=-D_DEBUG_HTTPERROR
|
||||||
OPTS_debug=-g -ggdb #-pg # -fprofile-arcs -ftest-coverage
|
OPTS_debug=-g -ggdb #-pg # -fprofile-arcs -ftest-coverage
|
||||||
OPTS_production=-Os
|
OPTS_production=-Os
|
||||||
CFLAGS+=-I../libowfat -Wall -pipe -Wextra #-pedantic -ansi
|
CFLAGS+=-I../libowfat -Wall -pipe -Wextra #-pedantic -ansi
|
||||||
LDFLAGS+=-L../libowfat/ -lowfat
|
LDFLAGS+=-L../libowfat/ -lowfat
|
||||||
|
|
||||||
BINARY =opentracker
|
BINARY =opentracker
|
||||||
HEADERS=trackerlogic.h scan_urlencoded_query.h ot_mutex.h ot_stats.h ot_sync.h ot_vector.h ot_clean.h ot_udp.h ot_iovec.h ot_fullscrape.h
|
HEADERS=trackerlogic.h scan_urlencoded_query.h ot_mutex.h ot_stats.h ot_sync.h ot_vector.h ot_clean.h ot_udp.h ot_iovec.h ot_fullscrape.h ot_accesslist.h
|
||||||
SOURCES=opentracker.c trackerlogic.c scan_urlencoded_query.c ot_mutex.c ot_stats.c ot_sync.c ot_vector.c ot_clean.c ot_udp.c ot_iovec.c ot_fullscrape.c
|
SOURCES=opentracker.c trackerlogic.c scan_urlencoded_query.c ot_mutex.c ot_stats.c ot_sync.c ot_vector.c ot_clean.c ot_udp.c ot_iovec.c ot_fullscrape.c ot_accesslist.c
|
||||||
|
|
||||||
OBJECTS = $(SOURCES:%.c=%.o)
|
OBJECTS = $(SOURCES:%.c=%.o)
|
||||||
OBJECTS_debug = $(SOURCES:%.c=%.debug.o)
|
OBJECTS_debug = $(SOURCES:%.c=%.debug.o)
|
||||||
|
@ -38,6 +38,7 @@
|
|||||||
#include "ot_udp.h"
|
#include "ot_udp.h"
|
||||||
#include "ot_fullscrape.h"
|
#include "ot_fullscrape.h"
|
||||||
#include "ot_iovec.h"
|
#include "ot_iovec.h"
|
||||||
|
#include "ot_accesslist.h"
|
||||||
|
|
||||||
/* Globals */
|
/* Globals */
|
||||||
static const size_t SUCCESS_HTTP_HEADER_LENGTH = 80;
|
static const size_t SUCCESS_HTTP_HEADER_LENGTH = 80;
|
||||||
@ -47,14 +48,6 @@ static unsigned int g_adminip_count = 0;
|
|||||||
time_t ot_start_time;
|
time_t ot_start_time;
|
||||||
time_t g_now;
|
time_t g_now;
|
||||||
|
|
||||||
#if defined ( WANT_BLACKLISTING ) && defined (WANT_CLOSED_TRACKER )
|
|
||||||
#error WANT_BLACKLISTING and WANT_CLOSED_TRACKER are exclusive.
|
|
||||||
#endif
|
|
||||||
#if defined ( WANT_BLACKLISTING ) || defined (WANT_CLOSED_TRACKER )
|
|
||||||
static char *accesslist_filename = NULL;
|
|
||||||
#define WANT_ACCESS_CONTROL
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef WANT_TRACKER_SYNC
|
#ifndef WANT_TRACKER_SYNC
|
||||||
#define add_peer_to_torrent(A,B,C) add_peer_to_torrent(A,B)
|
#define add_peer_to_torrent(A,B,C) add_peer_to_torrent(A,B)
|
||||||
#endif
|
#endif
|
||||||
@ -331,12 +324,13 @@ LOG_TO_STDERR( "sync: %d.%d.%d.%d\n", h->ip[0], h->ip[1], h->ip[2], h->ip[3] );
|
|||||||
}
|
}
|
||||||
|
|
||||||
if( mode == SYNC_OUT ) {
|
if( mode == SYNC_OUT ) {
|
||||||
|
char *reply;
|
||||||
if( !( reply_size = return_changeset_for_tracker( &reply ) ) ) HTTPERROR_500;
|
if( !( reply_size = return_changeset_for_tracker( &reply ) ) ) HTTPERROR_500;
|
||||||
return sendmmapdata( s, reply, reply_size );
|
return sendmmapdata( s, reply, reply_size );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Simple but proof for now */
|
/* Simple but proof for now */
|
||||||
reply = "OK";
|
memmove( static_outbuf + SUCCESS_HTTP_HEADER_LENGTH, "OK", 2);
|
||||||
reply_size = 2;
|
reply_size = 2;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@ -772,48 +766,14 @@ static void ot_try_bind( char ip[4], uint16 port, int is_tcp ) {
|
|||||||
++ot_sockets_count;
|
++ot_sockets_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WANT_ACCESS_CONTROL
|
|
||||||
/* Read initial access list */
|
|
||||||
void read_accesslist_file( int foo ) {
|
|
||||||
FILE * accesslist_filehandle;
|
|
||||||
ot_hash infohash;
|
|
||||||
foo = foo;
|
|
||||||
|
|
||||||
accesslist_filehandle = fopen( accesslist_filename, "r" );
|
|
||||||
|
|
||||||
/* Free accesslist vector in trackerlogic.c*/
|
|
||||||
accesslist_reset();
|
|
||||||
|
|
||||||
if( accesslist_filehandle == NULL ) {
|
|
||||||
fprintf( stderr, "Warning: Can't open accesslist file: %s (but will try to create it later, if necessary and possible).", accesslist_filename );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* We do ignore anything that is not of the form "^[:xdigit:]{40}[^:xdigit:].*" */
|
|
||||||
while( fgets( static_inbuf, sizeof(static_inbuf), accesslist_filehandle ) ) {
|
|
||||||
int i;
|
|
||||||
for( i=0; i<20; ++i ) {
|
|
||||||
int eger = 16 * scan_fromhex( static_inbuf[ 2*i ] ) + scan_fromhex( static_inbuf[ 1 + 2*i ] );
|
|
||||||
if( eger < 0 )
|
|
||||||
continue;
|
|
||||||
infohash[i] = eger;
|
|
||||||
}
|
|
||||||
if( scan_fromhex( static_inbuf[ 40 ] ) >= 0 )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* Append accesslist to accesslist vector */
|
|
||||||
accesslist_addentry( &infohash );
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose( accesslist_filehandle );
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int main( int argc, char **argv ) {
|
int main( int argc, char **argv ) {
|
||||||
struct passwd *pws = NULL;
|
struct passwd *pws = NULL;
|
||||||
char serverip[4] = {0,0,0,0};
|
char serverip[4] = {0,0,0,0};
|
||||||
char *serverdir = ".";
|
char *serverdir = ".";
|
||||||
int scanon = 1;
|
int scanon = 1;
|
||||||
|
#ifdef WANT_ACCESS_CONTROL
|
||||||
|
char *accesslist_filename = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
while( scanon ) {
|
while( scanon ) {
|
||||||
switch( getopt( argc, argv, ":i:p:A:P:d:"
|
switch( getopt( argc, argv, ":i:p:A:P:d:"
|
||||||
@ -863,13 +823,7 @@ int main( int argc, char **argv ) {
|
|||||||
}
|
}
|
||||||
endpwent();
|
endpwent();
|
||||||
|
|
||||||
#ifdef WANT_ACCESS_CONTROL
|
accesslist_init( accesslist_filename );
|
||||||
/* Passing "0" since read_blacklist_file also is SIGHUP handler */
|
|
||||||
if( accesslist_filename ) {
|
|
||||||
read_accesslist_file( 0 );
|
|
||||||
signal( SIGHUP, read_accesslist_file );
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
signal( SIGPIPE, SIG_IGN );
|
signal( SIGPIPE, SIG_IGN );
|
||||||
signal( SIGINT, signal_handler );
|
signal( SIGINT, signal_handler );
|
||||||
|
95
ot_accesslist.c
Normal file
95
ot_accesslist.c
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
/* This software was written by Dirk Engling <erdgeist@erdgeist.org>
|
||||||
|
It is considered beerware. Prost. Skol. Cheers or whatever. */
|
||||||
|
|
||||||
|
/* System */
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
/* Libowfat */
|
||||||
|
#include "byte.h"
|
||||||
|
#include "scan.h"
|
||||||
|
|
||||||
|
/* Opentracker */
|
||||||
|
#include "ot_accesslist.h"
|
||||||
|
|
||||||
|
/* GLOBAL VARIABLES */
|
||||||
|
#ifdef WANT_ACCESS_CONTROL
|
||||||
|
static char *accesslist_filename = NULL;
|
||||||
|
static ot_vector accesslist;
|
||||||
|
|
||||||
|
static void accesslist_reset( void ) {
|
||||||
|
free( accesslist.data );
|
||||||
|
byte_zero( &accesslist, sizeof( accesslist ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
static int accesslist_addentry( ot_hash *infohash ) {
|
||||||
|
int em;
|
||||||
|
void *insert = vector_find_or_insert( &accesslist, infohash, OT_HASH_COMPARE_SIZE, OT_HASH_COMPARE_SIZE, &em );
|
||||||
|
|
||||||
|
if( !insert )
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
memmove( insert, infohash, OT_HASH_COMPARE_SIZE );
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read initial access list */
|
||||||
|
static void accesslist_readfile( int foo ) {
|
||||||
|
FILE * accesslist_filehandle;
|
||||||
|
ot_hash infohash;
|
||||||
|
foo = foo;
|
||||||
|
|
||||||
|
accesslist_filehandle = fopen( accesslist_filename, "r" );
|
||||||
|
|
||||||
|
/* Free accesslist vector in trackerlogic.c*/
|
||||||
|
accesslist_reset();
|
||||||
|
|
||||||
|
if( accesslist_filehandle == NULL ) {
|
||||||
|
fprintf( stderr, "Warning: Can't open accesslist file: %s (but will try to create it later, if necessary and possible).", accesslist_filename );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* We do ignore anything that is not of the form "^[:xdigit:]{40}[^:xdigit:].*" */
|
||||||
|
while( fgets( static_inbuf, sizeof(static_inbuf), accesslist_filehandle ) ) {
|
||||||
|
int i;
|
||||||
|
for( i=0; i<20; ++i ) {
|
||||||
|
int eger = 16 * scan_fromhex( static_inbuf[ 2*i ] ) + scan_fromhex( static_inbuf[ 1 + 2*i ] );
|
||||||
|
if( eger < 0 )
|
||||||
|
continue;
|
||||||
|
infohash[i] = eger;
|
||||||
|
}
|
||||||
|
if( scan_fromhex( static_inbuf[ 40 ] ) >= 0 )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* Append accesslist to accesslist vector */
|
||||||
|
accesslist_addentry( &infohash );
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose( accesslist_filehandle );
|
||||||
|
}
|
||||||
|
|
||||||
|
int accesslist_hashisvalid( ot_hash *hash ) {
|
||||||
|
int exactmatch;
|
||||||
|
binary_search( hash, accesslist.data, accesslist.size, OT_HASH_COMPARE_SIZE, OT_HASH_COMPARE_SIZE, &exactmatch );
|
||||||
|
|
||||||
|
#ifdef WANT_BLACKLISTING
|
||||||
|
exactmatch = !exactmatch;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return exactmatch;
|
||||||
|
}
|
||||||
|
|
||||||
|
void accesslist_init( char *accesslist_filename_in ) {
|
||||||
|
byte_zero( &accesslist, sizeof( accesslist ) );
|
||||||
|
|
||||||
|
/* Passing "0" since read_blacklist_file also is SIGHUP handler */
|
||||||
|
if( accesslist_filename_in ) {
|
||||||
|
accesslist_filename = accesslist_filename_in;
|
||||||
|
accesslist_readfile( 0 );
|
||||||
|
signal( SIGHUP, accesslist_readfile );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
22
ot_accesslist.h
Normal file
22
ot_accesslist.h
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
/* This software was written by Dirk Engling <erdgeist@erdgeist.org>
|
||||||
|
It is considered beerware. Prost. Skol. Cheers or whatever. */
|
||||||
|
|
||||||
|
#ifndef __OT_ACCESSLIST_H__
|
||||||
|
#define __OT_ACCESSLIST_H__
|
||||||
|
|
||||||
|
#include "trackerlogic.h"
|
||||||
|
|
||||||
|
#if defined ( WANT_BLACKLISTING ) && defined (WANT_CLOSED_TRACKER )
|
||||||
|
#error WANT_BLACKLISTING and WANT_CLOSED_TRACKER are exclusive.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined ( WANT_BLACKLISTING ) || defined (WANT_CLOSED_TRACKER )
|
||||||
|
#define WANT_ACCESS_CONTROL
|
||||||
|
void accesslist_init( char *accesslist_filename );
|
||||||
|
int accesslist_hashisvalid( ot_hash *hash );
|
||||||
|
#else
|
||||||
|
#define accesslist_init( accesslist_filename )
|
||||||
|
#define accesslist_hashisvalid( hash ) 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
@ -21,12 +21,7 @@
|
|||||||
#include "ot_mutex.h"
|
#include "ot_mutex.h"
|
||||||
#include "ot_stats.h"
|
#include "ot_stats.h"
|
||||||
#include "ot_clean.h"
|
#include "ot_clean.h"
|
||||||
|
#include "ot_accesslist.h"
|
||||||
/* GLOBAL VARIABLES */
|
|
||||||
#if defined ( WANT_BLACKLISTING ) || defined( WANT_CLOSED_TRACKER )
|
|
||||||
static ot_vector accesslist;
|
|
||||||
#define WANT_ACCESS_CONTROL
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void free_peerlist( ot_peerlist *peer_list ) {
|
void free_peerlist( ot_peerlist *peer_list ) {
|
||||||
size_t i;
|
size_t i;
|
||||||
@ -46,18 +41,10 @@ ot_torrent *add_peer_to_torrent( ot_hash *hash, ot_peer *peer WANT_TRACKER_SYNC
|
|||||||
ot_vector *torrents_list = mutex_bucket_lock_by_hash( hash ), *peer_pool;
|
ot_vector *torrents_list = mutex_bucket_lock_by_hash( hash ), *peer_pool;
|
||||||
int base_pool = 0;
|
int base_pool = 0;
|
||||||
|
|
||||||
#ifdef WANT_ACCESS_CONTROL
|
if( !accesslist_hashisvalid( hash ) ) {
|
||||||
binary_search( hash, accesslist.data, accesslist.size, OT_HASH_COMPARE_SIZE, OT_HASH_COMPARE_SIZE, &exactmatch );
|
|
||||||
|
|
||||||
#ifdef WANT_CLOSED_TRACKER
|
|
||||||
exactmatch = !exactmatch;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if( exactmatch ) {
|
|
||||||
mutex_bucket_unlock_by_hash( hash );
|
mutex_bucket_unlock_by_hash( hash );
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
torrent = vector_find_or_insert( torrents_list, (void*)hash, sizeof( ot_torrent ), OT_HASH_COMPARE_SIZE, &exactmatch );
|
torrent = vector_find_or_insert( torrents_list, (void*)hash, sizeof( ot_torrent ), OT_HASH_COMPARE_SIZE, &exactmatch );
|
||||||
if( !torrent ) {
|
if( !torrent ) {
|
||||||
@ -326,25 +313,6 @@ exit_loop:
|
|||||||
return (size_t)20;
|
return (size_t)20;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WANT_ACCESS_CONTROL
|
|
||||||
void accesslist_reset( void ) {
|
|
||||||
free( accesslist.data );
|
|
||||||
byte_zero( &accesslist, sizeof( accesslist ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
int accesslist_addentry( ot_hash *infohash ) {
|
|
||||||
int em;
|
|
||||||
void *insert = vector_find_or_insert( &accesslist, infohash, OT_HASH_COMPARE_SIZE, OT_HASH_COMPARE_SIZE, &em );
|
|
||||||
|
|
||||||
if( !insert )
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
memmove( insert, infohash, OT_HASH_COMPARE_SIZE );
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int trackerlogic_init( const char * const serverdir ) {
|
int trackerlogic_init( const char * const serverdir ) {
|
||||||
if( serverdir && chdir( serverdir ) ) {
|
if( serverdir && chdir( serverdir ) ) {
|
||||||
fprintf( stderr, "Could not chdir() to %s\n", serverdir );
|
fprintf( stderr, "Could not chdir() to %s\n", serverdir );
|
||||||
@ -352,7 +320,7 @@ int trackerlogic_init( const char * const serverdir ) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
srandom( time(NULL) );
|
srandom( time(NULL) );
|
||||||
|
|
||||||
clean_init( );
|
clean_init( );
|
||||||
mutex_init( );
|
mutex_init( );
|
||||||
|
|
||||||
|
@ -107,11 +107,6 @@ size_t return_tcp_scrape_for_torrent( ot_hash *hash, int amount, char *reply );
|
|||||||
size_t return_udp_scrape_for_torrent( ot_hash *hash, char *reply );
|
size_t return_udp_scrape_for_torrent( ot_hash *hash, char *reply );
|
||||||
void clean_all_torrents( void );
|
void clean_all_torrents( void );
|
||||||
|
|
||||||
#if defined ( WANT_BLACKLISTING ) || defined ( WANT_CLOSED_TRACKER )
|
|
||||||
int accesslist_addentry( ot_hash *hash );
|
|
||||||
void accesslist_reset( void );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Helper, before it moves to its own object */
|
/* Helper, before it moves to its own object */
|
||||||
void fix_mmapallocation( void *buf, size_t old_alloc, size_t new_alloc );
|
void fix_mmapallocation( void *buf, size_t old_alloc, size_t new_alloc );
|
||||||
void free_peerlist( ot_peerlist *peer_list );
|
void free_peerlist( ot_peerlist *peer_list );
|
||||||
|
Loading…
x
Reference in New Issue
Block a user