blob: 9b6f4d8d1b39b73381ed8aa3bb9e69a01a0f7542 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
use {
crate::fidl_hanging_get_responder,
crate::fidl_hanging_get_result_responder,
crate::fidl_process,
crate::fidl_processor::RequestContext,
crate::switchboard::base::{
SettingRequest, SettingResponse, SettingType, SystemLoginOverrideMode,
},
crate::switchboard::hanging_get_handler::Sender,
fidl_fuchsia_settings::{
SystemMarker, SystemRequest, SystemSetResponder, SystemSettings, SystemWatch2Responder,
SystemWatchResponder,
},
fuchsia_async as fasync,
futures::future::LocalBoxFuture,
futures::prelude::*,
};
fidl_hanging_get_responder!(SystemSettings, SystemWatch2Responder, SystemMarker::DEBUG_NAME);
// TODO(fxb/52593): Remove when clients are ported to watch2.
fidl_hanging_get_result_responder!(SystemSettings, SystemWatchResponder, SystemMarker::DEBUG_NAME);
impl From<SettingResponse> for SystemSettings {
fn from(response: SettingResponse) -> Self {
if let SettingResponse::System(info) = response {
let mut system_settings = fidl_fuchsia_settings::SystemSettings::empty();
system_settings.mode =
Some(fidl_fuchsia_settings::LoginOverride::from(info.login_override_mode));
system_settings
} else {
panic!("incorrect value sent to system");
}
}
}
fidl_process!(
System,
SettingType::System,
process_request,
SystemWatch2Responder,
process_request_2
);
// TODO(fxb/52593): Replace with logic from process_request_2
// and remove process_request_2 when clients ported to Watch2 and back.
async fn process_request(
context: RequestContext<SystemSettings, SystemWatchResponder>,
req: SystemRequest,
) -> Result<Option<SystemRequest>, anyhow::Error> {
#[allow(unreachable_patterns)]
match req {
SystemRequest::Watch { responder } => {
context.watch(responder, false).await;
}
_ => {
return Ok(Some(req));
}
}
return Ok(None);
}
async fn process_request_2(
context: RequestContext<SystemSettings, SystemWatch2Responder>,
req: SystemRequest,
) -> Result<Option<SystemRequest>, anyhow::Error> {
#[allow(unreachable_patterns)]
match req {
SystemRequest::Set { settings, responder } => {
if let Some(mode) = settings.mode {
change_login_override(
context.clone(),
SystemLoginOverrideMode::from(mode),
responder,
);
}
}
SystemRequest::Watch2 { responder } => {
context.watch(responder, true).await;
}
_ => {
return Ok(Some(req));
}
}
return Ok(None);
}
/// Sets the login mode and schedules accounts to be cleared. Upon success, the
/// device is scheduled to reboot so the change will take effect.
fn change_login_override(
context: RequestContext<SystemSettings, SystemWatch2Responder>,
mode: SystemLoginOverrideMode,
responder: SystemSetResponder,
) {
fasync::spawn(async move {
if context
.request(SettingType::System, SettingRequest::SetLoginOverrideMode(mode))
.await
.is_err()
{
responder.send(&mut Err(fidl_fuchsia_settings::Error::Failed)).ok();
return;
}
if context
.request(SettingType::Account, SettingRequest::ScheduleClearAccounts)
.await
.is_err()
{
responder.send(&mut Err(fidl_fuchsia_settings::Error::Failed)).ok();
return;
}
if context.request(SettingType::Power, SettingRequest::Reboot).await.is_err() {
responder.send(&mut Err(fidl_fuchsia_settings::Error::Failed)).ok();
return;
}
responder.send(&mut Ok(())).ok();
});
}
impl From<fidl_fuchsia_settings::LoginOverride> for SystemLoginOverrideMode {
fn from(item: fidl_fuchsia_settings::LoginOverride) -> Self {
match item {
fidl_fuchsia_settings::LoginOverride::AutologinGuest => {
SystemLoginOverrideMode::AutologinGuest
}
fidl_fuchsia_settings::LoginOverride::AuthProvider => {
SystemLoginOverrideMode::AuthProvider
}
fidl_fuchsia_settings::LoginOverride::None => SystemLoginOverrideMode::None,
}
}
}
impl From<SystemLoginOverrideMode> for fidl_fuchsia_settings::LoginOverride {
fn from(item: SystemLoginOverrideMode) -> Self {
match item {
SystemLoginOverrideMode::AutologinGuest => {
fidl_fuchsia_settings::LoginOverride::AutologinGuest
}
SystemLoginOverrideMode::AuthProvider => {
fidl_fuchsia_settings::LoginOverride::AuthProvider
}
SystemLoginOverrideMode::None => fidl_fuchsia_settings::LoginOverride::None,
}
}
}