@ -31,6 +31,7 @@
* along with lightdm - webkit2 - greeter ; If not , see < http : //www.gnu.org/licenses/>.
*/
# define _GNU_SOURCE
# include <stdlib.h>
# include <gtk/gtk.h>
# include <glib/gi18n.h>
@ -1487,12 +1488,14 @@ window_object_cleared_callback(WebKitScriptWorld *world,
JSGlobalContextRef jsContext ;
WebKitDOMDOMWindow * dom_window ;
WebKitDOMDocument * dom_document ;
JSStringRef command ;
JSObjectRef gettext_object ,
lightdm_greeter_object ,
config_file_object ,
greeter_util_object ,
globalObject ;
JSStringRef command ;
gchar * lock_hint_message = " LockHint " ;
gchar * page_loaded_message = " PageLoaded " ;
@ -1685,12 +1688,115 @@ autologin_timer_expired_cb(LightDMGreeter *greeter, WebKitWebExtension *extensio
}
static gchar *
get_config_option ( const gchar * section , const gchar * key ) {
gchar * value ;
GError * err = NULL ;
value = g_key_file_get_string ( keyfile , section , key , & err ) ;
if ( err ) {
g_error ( err - > message ) ;
g_error_free ( err ) ;
return " " ;
}
return value ;
}
static gboolean
is_requested_file_path_allowed ( const char * file_path ) {
gchar * background_images_dir ;
gchar * user_image ;
gchar * logo ;
gboolean result = FALSE ;
char * normalized_path ;
if ( NULL = = file_path ) {
return result ;
}
GSList * paths = NULL , * iter = NULL ;
paths = g_slist_prepend ( paths , THEME_DIR ) ;
background_images_dir = get_config_option ( " branding " , " background_images " ) ;
paths = g_slist_prepend ( paths , background_images_dir ) ;
user_image = get_config_option ( " branding " , " user_image " ) ;
paths = g_slist_prepend ( paths , user_image ) ;
logo = get_config_option ( " branding " , " logo " ) ;
paths = g_slist_prepend ( paths , logo ) ;
normalized_path = canonicalize_file_name ( file_path ) ;
if ( NULL ! = normalized_path ) {
for ( iter = paths ; iter ; iter = iter - > next ) {
if ( strcmp ( normalized_path , iter - > data ) = = 0 | | g_str_has_prefix ( normalized_path , iter - > data ) ) {
/* Requested path is allowed */
result = TRUE ;
break ;
}
}
}
g_slist_free_full ( paths , g_free ) ;
g_free ( normalized_path ) ;
return result ;
}
/**
* Callback for the " send-request " signal of a { @ link WebKitWebPage }
*
* @ see https : //goo.gl/mmoHEx
* @ return TRUE to stop other handlers from being invoked for the event ( block the request ) .
* FALSE to continue emission of the event ( allow the request ) .
*/
static gboolean
web_page_send_request_cb ( WebKitWebPage * web_page ,
WebKitURIRequest * request ,
WebKitURIResponse * redirected_response ,
gpointer user_data ) {
char * request_scheme ;
char * request_file_path ;
const char * request_uri = webkit_uri_request_get_uri ( request ) ;
request_scheme = g_uri_parse_scheme ( request_uri ) ;
if ( strcmp ( request_scheme , " file " ) ! = 0 ) {
/* In order to ensure the user's privacy & security, only local requests are allowed. */
g_free ( request_scheme ) ;
return TRUE ;
}
request_file_path = g_filename_from_uri ( request_uri , NULL , NULL ) ;
g_free ( request_scheme ) ;
/* Returning TRUE prevents the request, while FALSE allows it :face_with_rolling_eyes: */
return ( FALSE = = is_requested_file_path_allowed ( request_file_path ) ) ;
}
void
page_created_cb ( WebKitWebExtension * extension ,
WebKitWebPage * web_page ,
gpointer user_data ) {
page_id = webkit_web_page_get_id ( web_page ) ;
g_signal_connect (
web_page ,
" send-request " ,
G_CALLBACK ( web_page_send_request_cb ) ,
NULL
) ;
}
@ -1700,28 +1806,46 @@ webkit_web_extension_initialize(WebKitWebExtension *extension) {
WEB_EXTENSION = extension ;
g_signal_connect ( G_OBJECT ( greeter ) ,
" authentication-complete " ,
G_CALLBACK ( authentication_complete_cb ) ,
extension ) ;
g_signal_connect (
G_OBJECT ( greeter ) ,
" authentication-complete " ,
G_CALLBACK ( authentication_complete_cb ) ,
extension
) ;
g_signal_connect ( G_OBJECT ( greeter ) ,
" autologin-timer-expired " ,
G_CALLBACK ( autologin_timer_expired_cb ) ,
extension ) ;
g_signal_connect (
G_OBJECT ( greeter ) ,
" autologin-timer-expired " ,
G_CALLBACK ( autologin_timer_expired_cb ) ,
extension
) ;
g_signal_connect (
G_OBJECT ( extension ) ,
" page-created " ,
G_CALLBACK ( page_created_cb ) ,
NULL
) ;
g_signal_connect ( G_OBJECT ( extension ) ,
" page-created " ,
G_CALLBACK ( page_created_cb ) ,
NULL ) ;
g_signal_connect (
webkit_script_world_get_default ( ) ,
" window-object-cleared " ,
G_CALLBACK ( window_object_cleared_callback ) ,
greeter
) ;
g_signal_connect ( webkit_script_world_get_default ( ) ,
" window-object-cleared " ,
G_CALLBACK ( window_object_cleared_callback ) ,
greeter ) ;
g_signal_connect (
G_OBJECT ( greeter ) ,
" show-prompt " ,
G_CALLBACK ( show_prompt_cb ) , extension
) ;
g_signal_connect ( G_OBJECT ( greeter ) , " show-prompt " , G_CALLBACK ( show_prompt_cb ) , extension ) ;
g_signal_connect ( G_OBJECT ( greeter ) , " show-message " , G_CALLBACK ( show_message_cb ) , extension ) ;
g_signal_connect (
G_OBJECT ( greeter ) ,
" show-message " ,
G_CALLBACK ( show_message_cb ) ,
extension
) ;
/* TODO: This function was deprecated in lightdm 1.11.x.
* New function is lightdm_greeter_connect_to_daemon_sync