mirror of
https://github.com/owntone/owntone-server.git
synced 2024-12-27 15:45:56 -05:00
Make auth requests for plugins work
This commit is contained in:
parent
eed9619063
commit
b4bc212f65
12
src/main.c
12
src/main.c
@ -110,6 +110,7 @@ CONFIG config; /**< Main configuration structure, as read from configfile */
|
|||||||
static void usage(char *program);
|
static void usage(char *program);
|
||||||
static void txt_add(char *txtrecord, char *fmt, ...);
|
static void txt_add(char *txtrecord, char *fmt, ...);
|
||||||
static void main_handler(WS_CONNINFO *pwsc);
|
static void main_handler(WS_CONNINFO *pwsc);
|
||||||
|
static int main_auth(WS_CONNINFO *pwsc, char *username, char *password);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* build a dns text string
|
* build a dns text string
|
||||||
@ -144,6 +145,15 @@ void main_handler(WS_CONNINFO *pwsc) {
|
|||||||
config_handler(pwsc);
|
config_handler(pwsc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int main_auth(WS_CONNINFO *pwsc, char *username, char *password) {
|
||||||
|
if(plugin_url_candispatch(pwsc)) {
|
||||||
|
DPRINTF(E_DBG,L_MAIN,"Dispatching auth for %s to plugin\n",pwsc->uri);
|
||||||
|
return plugin_auth_handle(pwsc,username,password);
|
||||||
|
}
|
||||||
|
|
||||||
|
DPRINTF(E_DBG,L_MAIN,"Dispatching auth for %s to config auth\n",pwsc->uri);
|
||||||
|
return config_auth(pwsc, username, password);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -404,7 +414,7 @@ int main(int argc, char *argv[]) {
|
|||||||
DPRINTF(E_FATAL,L_MAIN|L_WS,"Error staring web server: %s\n",strerror(errno));
|
DPRINTF(E_FATAL,L_MAIN|L_WS,"Error staring web server: %s\n",strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
ws_registerhandler(config.server, "^.*$",main_handler,config_auth,1);
|
ws_registerhandler(config.server, "^.*$",main_handler,main_auth,1);
|
||||||
ws_registerhandler(config.server, "^/server-info$",daap_handler,NULL,0);
|
ws_registerhandler(config.server, "^/server-info$",daap_handler,NULL,0);
|
||||||
ws_registerhandler(config.server, "^/content-codes$",daap_handler,daap_auth,0); /* iTunes 6.0.4+? */
|
ws_registerhandler(config.server, "^/content-codes$",daap_handler,daap_auth,0); /* iTunes 6.0.4+? */
|
||||||
ws_registerhandler(config.server,"^/login$",daap_handler,daap_auth,0);
|
ws_registerhandler(config.server,"^/login$",daap_handler,daap_auth,0);
|
||||||
|
44
src/plugin.c
44
src/plugin.c
@ -267,6 +267,50 @@ void plugin_url_handle(WS_CONNINFO *pwsc) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test password for the handled namespace
|
||||||
|
*
|
||||||
|
* @param pwsc the connection info (including uri) to check
|
||||||
|
* @param username user attempting to login
|
||||||
|
* @param pw password attempting
|
||||||
|
* @returns TRUE if we want to handle it
|
||||||
|
*/
|
||||||
|
int plugin_auth_handle(WS_CONNINFO *pwsc, char *username, char *pw) {
|
||||||
|
PLUGIN_ENTRY *ppi;
|
||||||
|
int (*auth_fn)(WS_CONNINFO *pwsc, char *username, char *pw);
|
||||||
|
int result;
|
||||||
|
|
||||||
|
_plugin_readlock();
|
||||||
|
ppi = _plugin_list.next;
|
||||||
|
while(ppi) {
|
||||||
|
if(ppi->type == PLUGIN_OUTPUT) {
|
||||||
|
if(!regexec(&ppi->regex,pwsc->uri,0,NULL,0)) {
|
||||||
|
/* we have a winner */
|
||||||
|
DPRINTF(E_DBG,L_PLUG,"Dispatching %s to %s\n", pwsc->uri,
|
||||||
|
ppi->versionstring);
|
||||||
|
|
||||||
|
/* so functions must be a tag_plugin_output_fn */
|
||||||
|
auth_fn=(((PLUGIN_OUTPUT_FN*)ppi->functions)->auth);
|
||||||
|
if(auth_fn) {
|
||||||
|
result=auth_fn(pwsc,username,pw);
|
||||||
|
_plugin_unlock();
|
||||||
|
return result;
|
||||||
|
} else {
|
||||||
|
_plugin_unlock();
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ppi = ppi->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* should 500 here or something */
|
||||||
|
ws_returnerror(pwsc, 500, "Can't find plugin handler");
|
||||||
|
_plugin_unlock();
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* plugin wrappers for utility functions & stuff
|
/* plugin wrappers for utility functions & stuff
|
||||||
*
|
*
|
||||||
* these functions need to be wrapped so we can maintain a stable
|
* these functions need to be wrapped so we can maintain a stable
|
||||||
|
@ -31,6 +31,7 @@ extern int plugin_deinit(void);
|
|||||||
/* Interfaces for web */
|
/* Interfaces for web */
|
||||||
extern int plugin_url_candispatch(WS_CONNINFO *pwsc);
|
extern int plugin_url_candispatch(WS_CONNINFO *pwsc);
|
||||||
extern void plugin_url_handle(WS_CONNINFO *pwsc);
|
extern void plugin_url_handle(WS_CONNINFO *pwsc);
|
||||||
|
extern int plugin_auth_handle(WS_CONNINFO *pwsc, char *username, char *pw);
|
||||||
|
|
||||||
#define PLUGIN_E_SUCCESS 0
|
#define PLUGIN_E_SUCCESS 0
|
||||||
#define PLUGIN_E_NOLOAD 1
|
#define PLUGIN_E_NOLOAD 1
|
||||||
@ -46,6 +47,7 @@ extern void plugin_url_handle(WS_CONNINFO *pwsc);
|
|||||||
|
|
||||||
typedef struct tag_plugin_output_fn {
|
typedef struct tag_plugin_output_fn {
|
||||||
void(*handler)(WS_CONNINFO *pwsc);
|
void(*handler)(WS_CONNINFO *pwsc);
|
||||||
|
int(*auth)(WS_CONNINFO *pwsc, char *username, char *pw);
|
||||||
} PLUGIN_OUTPUT_FN;
|
} PLUGIN_OUTPUT_FN;
|
||||||
|
|
||||||
/* version 1 plugin info */
|
/* version 1 plugin info */
|
||||||
|
Loading…
Reference in New Issue
Block a user