X-Git-Url: https://uglyman.kremlin.cc/gitweb/gitweb.cgi?p=systembsd.git;a=blobdiff_plain;f=src%2Finterfaces%2Ftimedated%2Ftimedated.c;h=4de0a2326561d4b289c59d14eb768fbd60be39f3;hp=8fb1ce5bd206396d62373225eecd77e4f45935c6;hb=0e955e924cbf2a60e3f395da9323bde28614f770;hpb=0b7afeee3bb89a0185de1cb3d9937434f24388d7 diff --git a/src/interfaces/timedated/timedated.c b/src/interfaces/timedated/timedated.c index 8fb1ce5..4de0a23 100644 --- a/src/interfaces/timedated/timedated.c +++ b/src/interfaces/timedated/timedated.c @@ -271,7 +271,7 @@ on_handle_set_local_rtc(Timedate1 *td1_passed_interf, const gchar *greet, gpointer data) { - g_dbus_method_invocation_return_dbus_error(invoc, "org.freedesktop.timedate1.Error.ENODEV", "OpenBSD does not support setting the realtime clock in local time, only UTC."); + g_dbus_method_invocation_return_dbus_error(invoc, "org.freedesktop.timedate1.Error.ENODEV", "Unix RTC must be in UTC."); return TRUE; } @@ -280,7 +280,80 @@ on_handle_set_ntp(Timedate1 *td1_passed_interf, GDBusMethodInvocation *invoc, const gchar *greet, gpointer data) { - return FALSE; + + GVariant *params; + const gchar *bus_name; + gboolean policykit_auth; + check_auth_result is_authed; + + /* revert to rcctl when 5.7 rolls around */ + gint ntpd_notrunning, ntpd_notenabled; /* this logic flip is due to rcctl returning 0 on success, + * in this case an error means ntpd is not running or not enabled */ + gboolean proposed_ntpstate; + GError *sh_errors; + + extern int errno; + + params = g_dbus_method_invocation_get_parameters(invoc); + g_variant_get(params, "(bb)", &proposed_ntpstate, &policykit_auth); + bus_name = g_dbus_method_invocation_get_sender(invoc); + + is_authed = polkit_try_auth(bus_name, "org.freedesktop.timedate1.set-ntp", policykit_auth); + + switch(is_authed) { + + case AUTHORIZED_NATIVELY: + case AUTHORIZED_BY_PROMPT: + break; + + case UNAUTHORIZED_NATIVELY: + case UNAUTHORIZED_FAILED_PROMPT: + g_dbus_method_invocation_return_dbus_error(invoc, "org.freedesktop.timedate1.Error.EACCES", "Insufficient permissions to toggle the NTP daemon."); + return FALSE; + + case ERROR_BADBUS: + g_dbus_method_invocation_return_dbus_error(invoc, "org.freedesktop.timedate1.Error.EFAULT", "Provided bus name is invalid."); + return FALSE; + + case ERROR_BADACTION: + g_dbus_method_invocation_return_dbus_error(invoc, "org.freedesktop.timedate1.Error.EFAULT", "Provided action ID is invalid."); + return FALSE; + + case ERROR_GENERIC: + default: + g_dbus_method_invocation_return_dbus_error(invoc, "org.freedesktop.timedate1.Error.ECANCELED", "Failed to toggle the NTP daemon for unknown reasons."); + return FALSE; + } + + ntpd_notrunning = 0; /* GLib does not bother asserting the passed return value int to zero */ + ntpd_notenabled = 0; /* if the program's exit status is also zero, hence this decl. */ + + if((ntpd_notrunning = system("/etc/rc.d/ntpd check > /dev/null 2>&1")) == -1) + return FALSE; + + if((ntpd_notenabled = system("/etc/rc.d/ntpd status > /dev/null 2>&1")) == -1) + return FALSE; + + if(proposed_ntpstate) { + + if(ntpd_notrunning) + system("/etc/rc.d/ntpd -f start > /dev/null 2>&1"); + + if(ntpd_notenabled) + system("/etc/rc.d/ntpd enable > /dev/null 2>&1"); + + } else { + + if(!ntpd_notrunning) + system("/etc/rc.d/ntpd stop > /dev/null 2>&1"); + + if(!ntpd_notenabled) + system("/etc/rc.d/ntpd disable > /dev/null 2>&1"); + } + + timedate1_complete_set_ntp(td1_passed_interf, invoc); + + return TRUE; } const gchar * @@ -324,13 +397,11 @@ our_get_timezone() { if(hash_to_match) g_free(hash_to_match); } - - - + return ret; } -/* openbsd does not support setting the RTC to localtime, only UTC */ +/* Unix time must be in UTC. */ gboolean our_get_local_rtc() { @@ -350,9 +421,18 @@ our_get_can_ntp() { gboolean our_get_ntp() { - const gboolean ret = FALSE; + int system_ret; - return ret; + if((system_ret = system("/etc/rc.d/ntpd check > /dev/null 2>&1")) == -1) { + + g_printf("failed to check NTP\n"); + return FALSE; + } + + if(system_ret) + return FALSE; + + return TRUE; } gboolean