mirror of
https://github.com/transmission/transmission
synced 2025-02-23 14:40:43 +00:00
(libT) uncrustify
This commit is contained in:
parent
ecd5ea21fe
commit
b8cff462a7
1 changed files with 133 additions and 110 deletions
|
@ -49,6 +49,25 @@ struct tr_rpc_server
|
||||||
|
|
||||||
#define dbgmsg( fmt... ) tr_deepLog( __FILE__, __LINE__, MY_NAME, ## fmt )
|
#define dbgmsg( fmt... ) tr_deepLog( __FILE__, __LINE__, MY_NAME, ## fmt )
|
||||||
|
|
||||||
|
/**
|
||||||
|
***
|
||||||
|
**/
|
||||||
|
|
||||||
|
static void
|
||||||
|
send_simple_response( struct evhttp_request * req,
|
||||||
|
int code,
|
||||||
|
const char * text )
|
||||||
|
{
|
||||||
|
const char * code_text = tr_webGetResponseStr( code );
|
||||||
|
struct evbuffer * body = evbuffer_new( );
|
||||||
|
|
||||||
|
evbuffer_add_printf( body, "<h1>%s</h1>", code_text );
|
||||||
|
if( text )
|
||||||
|
evbuffer_add_printf( body, "<h2>%s</h2>", text );
|
||||||
|
evhttp_send_reply( req, code, code_text, body );
|
||||||
|
evbuffer_free( body );
|
||||||
|
}
|
||||||
|
|
||||||
static const char*
|
static const char*
|
||||||
tr_memmem( const char * s1,
|
tr_memmem( const char * s1,
|
||||||
size_t l1,
|
size_t l1,
|
||||||
|
@ -67,52 +86,9 @@ tr_memmem( const char * s1,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/****
|
|
||||||
***** ACL UTILITIES
|
|
||||||
****/
|
|
||||||
|
|
||||||
static int
|
|
||||||
isAddressAllowed( const tr_rpc_server * server,
|
|
||||||
const char * address )
|
|
||||||
{
|
|
||||||
const char * acl;
|
|
||||||
|
|
||||||
for( acl=server->acl; acl && *acl; )
|
|
||||||
{
|
|
||||||
const char * delimiter = strchr( acl, ',' );
|
|
||||||
const int len = delimiter ? delimiter-acl : (int)strlen( acl );
|
|
||||||
char * token = tr_strndup( acl, len );
|
|
||||||
const int match = tr_wildmat( address, token+1 );
|
|
||||||
tr_free( token );
|
|
||||||
if( match )
|
|
||||||
return *acl == '+';
|
|
||||||
if( !delimiter )
|
|
||||||
break;
|
|
||||||
acl = delimiter + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
***
|
|
||||||
**/
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
send_simple_response( struct evhttp_request * req, int code, const char * text )
|
handle_upload( struct evhttp_request * req,
|
||||||
{
|
struct tr_rpc_server * server )
|
||||||
const char * code_text = tr_webGetResponseStr( code );
|
|
||||||
struct evbuffer * body = evbuffer_new( );
|
|
||||||
evbuffer_add_printf( body, "<h1>%s</h1>", code_text );
|
|
||||||
if( text )
|
|
||||||
evbuffer_add_printf( body, "<h2>%s</h2>", text );
|
|
||||||
evhttp_send_reply( req, code, code_text, body );
|
|
||||||
evbuffer_free( body );
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
handle_upload( struct evhttp_request * req, struct tr_rpc_server * server )
|
|
||||||
{
|
{
|
||||||
if( req->type != EVHTTP_REQ_POST )
|
if( req->type != EVHTTP_REQ_POST )
|
||||||
{
|
{
|
||||||
|
@ -120,18 +96,21 @@ handle_upload( struct evhttp_request * req, struct tr_rpc_server * server )
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
const char * content_type = evhttp_find_header( req->input_headers,
|
||||||
const char * content_type = evhttp_find_header( req->input_headers, "Content-Type" );
|
"Content-Type" );
|
||||||
|
|
||||||
const char * query = strchr( req->uri, '?' );
|
const char * query = strchr( req->uri, '?' );
|
||||||
const int paused = query && strstr( query+1, "paused=true" );
|
const int paused = query && strstr( query + 1, "paused=true" );
|
||||||
|
|
||||||
const char * in = (const char *) EVBUFFER_DATA( req->input_buffer );
|
const char * in = (const char *) EVBUFFER_DATA( req->input_buffer );
|
||||||
size_t inlen = EVBUFFER_LENGTH( req->input_buffer );
|
size_t inlen = EVBUFFER_LENGTH( req->input_buffer );
|
||||||
|
|
||||||
const char * boundary_key = "boundary=";
|
const char * boundary_key = "boundary=";
|
||||||
const char * boundary_key_begin = strstr( content_type, boundary_key );
|
const char * boundary_key_begin = strstr( content_type,
|
||||||
const char * boundary_val = boundary_key_begin ? boundary_key_begin + strlen( boundary_key ) : "arglebargle";
|
boundary_key );
|
||||||
|
const char * boundary_val =
|
||||||
|
boundary_key_begin ? boundary_key_begin +
|
||||||
|
strlen( boundary_key ) : "arglebargle";
|
||||||
|
|
||||||
char * boundary = tr_strdup_printf( "--%s", boundary_val );
|
char * boundary = tr_strdup_printf( "--%s", boundary_val );
|
||||||
const size_t boundary_len = strlen( boundary );
|
const size_t boundary_len = strlen( boundary );
|
||||||
|
@ -190,7 +169,8 @@ handle_upload( struct evhttp_request * req, struct tr_rpc_server * server )
|
||||||
|
|
||||||
/* use xml here because json responses to file uploads is trouble.
|
/* use xml here because json responses to file uploads is trouble.
|
||||||
* see http://www.malsup.com/jquery/form/#sample7 for details */
|
* see http://www.malsup.com/jquery/form/#sample7 for details */
|
||||||
evhttp_add_header(req->output_headers, "Content-Type", "text/xml; charset=UTF-8" );
|
evhttp_add_header( req->output_headers, "Content-Type",
|
||||||
|
"text/xml; charset=UTF-8" );
|
||||||
send_simple_response( req, HTTP_OK, NULL );
|
send_simple_response( req, HTTP_OK, NULL );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -199,7 +179,9 @@ static const char*
|
||||||
mimetype_guess( const char * path )
|
mimetype_guess( const char * path )
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
const struct {
|
|
||||||
|
const struct
|
||||||
|
{
|
||||||
const char * suffix;
|
const char * suffix;
|
||||||
const char * mime_type;
|
const char * mime_type;
|
||||||
} types[] = {
|
} types[] = {
|
||||||
|
@ -213,19 +195,20 @@ mimetype_guess( const char * path )
|
||||||
};
|
};
|
||||||
const char * dot = strrchr( path, '.' );
|
const char * dot = strrchr( path, '.' );
|
||||||
|
|
||||||
for( i=0; dot && i<TR_N_ELEMENTS(types); ++i )
|
for( i = 0; dot && i < TR_N_ELEMENTS( types ); ++i )
|
||||||
if( !strcmp( dot+1, types[i].suffix ) )
|
if( !strcmp( dot + 1, types[i].suffix ) )
|
||||||
return types[i].mime_type;
|
return types[i].mime_type;
|
||||||
|
|
||||||
return "application/octet-stream";
|
return "application/octet-stream";
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
serve_file( struct evhttp_request * req, const char * path )
|
serve_file( struct evhttp_request * req,
|
||||||
|
const char * path )
|
||||||
{
|
{
|
||||||
if( req->type != EVHTTP_REQ_GET )
|
if( req->type != EVHTTP_REQ_GET )
|
||||||
{
|
{
|
||||||
evhttp_add_header(req->output_headers, "Allow", "GET");
|
evhttp_add_header( req->output_headers, "Allow", "GET" );
|
||||||
send_simple_response( req, 405, NULL );
|
send_simple_response( req, 405, NULL );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -238,31 +221,37 @@ serve_file( struct evhttp_request * req, const char * path )
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
struct evbuffer * buf = evbuffer_new( );
|
struct evbuffer * buf = evbuffer_new( );
|
||||||
evbuffer_read(buf, fd, INT_MAX );
|
evbuffer_read( buf, fd, INT_MAX );
|
||||||
evhttp_add_header(req->output_headers, "Content-Type", mimetype_guess( path ) );
|
evhttp_add_header( req->output_headers, "Content-Type",
|
||||||
|
mimetype_guess(
|
||||||
|
path ) );
|
||||||
evhttp_send_reply( req, HTTP_OK, "OK", buf );
|
evhttp_send_reply( req, HTTP_OK, "OK", buf );
|
||||||
evbuffer_free(buf);
|
evbuffer_free( buf );
|
||||||
close( fd );
|
close( fd );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
handle_clutch( struct evhttp_request * req, struct tr_rpc_server * server )
|
handle_clutch( struct evhttp_request * req,
|
||||||
|
struct tr_rpc_server * server )
|
||||||
{
|
{
|
||||||
const char * uri;
|
const char * uri;
|
||||||
struct evbuffer * buf = evbuffer_new( );
|
struct evbuffer * buf = evbuffer_new( );
|
||||||
|
|
||||||
assert( !strncmp( req->uri, "/transmission/web/", 18 ) );
|
assert( !strncmp( req->uri, "/transmission/web/", 18 ) );
|
||||||
|
|
||||||
evbuffer_add_printf( buf, "%s%s", tr_getClutchDir( server->session ), TR_PATH_DELIMITER_STR );
|
evbuffer_add_printf( buf, "%s%s", tr_getClutchDir(
|
||||||
|
server->session ), TR_PATH_DELIMITER_STR );
|
||||||
uri = req->uri + 18;
|
uri = req->uri + 18;
|
||||||
if( (*uri=='?') || (*uri=='\0') )
|
if( ( *uri == '?' ) || ( *uri == '\0' ) )
|
||||||
evbuffer_add_printf( buf, "index.html" );
|
evbuffer_add_printf( buf, "index.html" );
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
const char * pch = strchr( uri, '?' );
|
const char * pch = strchr( uri, '?' );
|
||||||
if( pch )
|
if( pch )
|
||||||
evbuffer_add_printf( buf, "%*.*s", (int)(pch-uri), (int)(pch-uri), uri );
|
evbuffer_add_printf( buf, "%*.*s", (int)( pch - uri ),
|
||||||
|
(int)( pch - uri ), uri );
|
||||||
else
|
else
|
||||||
evbuffer_add_printf( buf, "%s", uri );
|
evbuffer_add_printf( buf, "%s", uri );
|
||||||
}
|
}
|
||||||
|
@ -276,16 +265,17 @@ handle_clutch( struct evhttp_request * req, struct tr_rpc_server * server )
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
handle_rpc( struct evhttp_request * req, struct tr_rpc_server * server )
|
handle_rpc( struct evhttp_request * req,
|
||||||
|
struct tr_rpc_server * server )
|
||||||
{
|
{
|
||||||
int len = 0;
|
int len = 0;
|
||||||
char * response;
|
char * response = NULL;
|
||||||
struct evbuffer * buf;
|
struct evbuffer * buf;
|
||||||
|
|
||||||
if( req->type == EVHTTP_REQ_GET )
|
if( req->type == EVHTTP_REQ_GET )
|
||||||
{
|
{
|
||||||
const char * q;
|
const char * q;
|
||||||
if(( q = strchr( req->uri, '?' )))
|
if( ( q = strchr( req->uri, '?' ) ) )
|
||||||
response = tr_rpc_request_exec_uri( server->session,
|
response = tr_rpc_request_exec_uri( server->session,
|
||||||
q + 1,
|
q + 1,
|
||||||
strlen( q + 1 ),
|
strlen( q + 1 ),
|
||||||
|
@ -294,24 +284,51 @@ handle_rpc( struct evhttp_request * req, struct tr_rpc_server * server )
|
||||||
else if( req->type == EVHTTP_REQ_POST )
|
else if( req->type == EVHTTP_REQ_POST )
|
||||||
{
|
{
|
||||||
response = tr_rpc_request_exec_json( server->session,
|
response = tr_rpc_request_exec_json( server->session,
|
||||||
EVBUFFER_DATA( req->input_buffer ),
|
EVBUFFER_DATA( req->
|
||||||
EVBUFFER_LENGTH( req->input_buffer ),
|
input_buffer ),
|
||||||
|
EVBUFFER_LENGTH( req->
|
||||||
|
input_buffer ),
|
||||||
&len );
|
&len );
|
||||||
}
|
}
|
||||||
|
|
||||||
buf = evbuffer_new( );
|
buf = evbuffer_new( );
|
||||||
evbuffer_add( buf, response, len );
|
evbuffer_add( buf, response, len );
|
||||||
evhttp_add_header( req->output_headers, "Content-Type", "application/json; charset=UTF-8" );
|
evhttp_add_header( req->output_headers, "Content-Type",
|
||||||
|
"application/json; charset=UTF-8" );
|
||||||
evhttp_send_reply( req, HTTP_OK, "OK", buf );
|
evhttp_send_reply( req, HTTP_OK, "OK", buf );
|
||||||
evbuffer_free( buf );
|
evbuffer_free( buf );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
isAddressAllowed( const tr_rpc_server * server,
|
||||||
|
const char * address )
|
||||||
|
{
|
||||||
|
const char * acl;
|
||||||
|
|
||||||
|
for( acl = server->acl; acl && *acl; )
|
||||||
|
{
|
||||||
|
const char * delimiter = strchr( acl, ',' );
|
||||||
|
const int len = delimiter ? delimiter - acl : (int)strlen( acl );
|
||||||
|
char * token = tr_strndup( acl, len );
|
||||||
|
const int match = tr_wildmat( address, token + 1 );
|
||||||
|
tr_free( token );
|
||||||
|
if( match )
|
||||||
|
return *acl == '+';
|
||||||
|
if( !delimiter )
|
||||||
|
break;
|
||||||
|
acl = delimiter + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
handle_request( struct evhttp_request * req, void * arg )
|
handle_request( struct evhttp_request * req,
|
||||||
|
void * arg )
|
||||||
{
|
{
|
||||||
struct tr_rpc_server * server = arg;
|
struct tr_rpc_server * server = arg;
|
||||||
|
|
||||||
if (req && req->evcon )
|
if( req && req->evcon )
|
||||||
{
|
{
|
||||||
const char * auth;
|
const char * auth;
|
||||||
char * user = NULL;
|
char * user = NULL;
|
||||||
|
@ -325,7 +342,8 @@ handle_request( struct evhttp_request * req, void * arg )
|
||||||
{
|
{
|
||||||
int plen;
|
int plen;
|
||||||
char * p = tr_base64_decode( auth + 6, 0, &plen );
|
char * p = tr_base64_decode( auth + 6, 0, &plen );
|
||||||
if( p && plen && (( pass = strchr( p, ':' )))) {
|
if( p && plen && ( ( pass = strchr( p, ':' ) ) ) )
|
||||||
|
{
|
||||||
user = p;
|
user = p;
|
||||||
*pass++ = '\0';
|
*pass++ = '\0';
|
||||||
}
|
}
|
||||||
|
@ -337,18 +355,22 @@ handle_request( struct evhttp_request * req, void * arg )
|
||||||
}
|
}
|
||||||
else if( server->isPasswordEnabled && ( !pass
|
else if( server->isPasswordEnabled && ( !pass
|
||||||
|| !user
|
|| !user
|
||||||
|| strcmp( server->username, user )
|
|| strcmp( server->username,
|
||||||
|| strcmp( server->password, pass ) ) )
|
user )
|
||||||
|
|| strcmp( server->password,
|
||||||
|
pass ) ) )
|
||||||
{
|
{
|
||||||
evhttp_add_header( req->output_headers,
|
evhttp_add_header( req->output_headers,
|
||||||
"WWW-Authenticate", "Basic realm=\"" MY_REALM "\"" );
|
"WWW-Authenticate",
|
||||||
|
"Basic realm=\"" MY_REALM "\"" );
|
||||||
send_simple_response( req, 401, "Unauthorized User" );
|
send_simple_response( req, 401, "Unauthorized User" );
|
||||||
}
|
}
|
||||||
else if( !strcmp( req->uri, "/transmission/web" ) ||
|
else if( !strcmp( req->uri, "/transmission/web" )
|
||||||
!strcmp( req->uri, "/transmission/clutch" ) ||
|
|| !strcmp( req->uri, "/transmission/clutch" )
|
||||||
!strcmp( req->uri, "/" ) )
|
|| !strcmp( req->uri, "/" ) )
|
||||||
{
|
{
|
||||||
evhttp_add_header( req->output_headers, "Location", "/transmission/web/" );
|
evhttp_add_header( req->output_headers, "Location",
|
||||||
|
"/transmission/web/" );
|
||||||
send_simple_response( req, HTTP_MOVEPERM, NULL );
|
send_simple_response( req, HTTP_MOVEPERM, NULL );
|
||||||
}
|
}
|
||||||
else if( !strncmp( req->uri, "/transmission/web/", 18 ) )
|
else if( !strncmp( req->uri, "/transmission/web/", 18 ) )
|
||||||
|
@ -536,3 +558,4 @@ tr_rpcInit( tr_handle * session,
|
||||||
startServer( s );
|
startServer( s );
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue