From bafce3df67de1b1124cb4353b22868a52041c02a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Tue, 10 Mar 2015 21:47:44 +0000 Subject: [PATCH] Network: first steps to an SSH service add-on. --- src/add-ons/network_settings/Jamfile | 1 + src/add-ons/network_settings/sshd/Jamfile | 15 + .../network_settings/sshd/SSHServiceAddOn.cpp | 276 ++++++++++++++++++ 3 files changed, 292 insertions(+) create mode 100644 src/add-ons/network_settings/sshd/Jamfile create mode 100644 src/add-ons/network_settings/sshd/SSHServiceAddOn.cpp diff --git a/src/add-ons/network_settings/Jamfile b/src/add-ons/network_settings/Jamfile index 8b4a68b580..c9b5846d3b 100644 --- a/src/add-ons/network_settings/Jamfile +++ b/src/add-ons/network_settings/Jamfile @@ -2,3 +2,4 @@ SubDir HAIKU_TOP src add-ons network_settings ; SubInclude HAIKU_TOP src add-ons network_settings ipv4 ; SubInclude HAIKU_TOP src add-ons network_settings ipv6 ; +SubInclude HAIKU_TOP src add-ons network_settings sshd ; diff --git a/src/add-ons/network_settings/sshd/Jamfile b/src/add-ons/network_settings/sshd/Jamfile new file mode 100644 index 0000000000..f43cc095c2 --- /dev/null +++ b/src/add-ons/network_settings/sshd/Jamfile @@ -0,0 +1,15 @@ +SubDir HAIKU_TOP src add-ons network_settings sshd ; + +UsePublicHeaders [ FDirName add-ons network_settings ] ; +UsePrivateHeaders shared ; + +Addon SSHService : + SSHServiceAddOn.cpp + + : be bnetapi libshared.a Network [ TargetLibsupc++ ] + [ TargetLibstdc++ ] localestub +; + +DoCatalogs SSHService : x-vnd.Haiku-SSHService : + SSHServiceAddOn.cpp +; diff --git a/src/add-ons/network_settings/sshd/SSHServiceAddOn.cpp b/src/add-ons/network_settings/sshd/SSHServiceAddOn.cpp new file mode 100644 index 0000000000..f2efaaf785 --- /dev/null +++ b/src/add-ons/network_settings/sshd/SSHServiceAddOn.cpp @@ -0,0 +1,276 @@ +/* + * Copyright 2015 Haiku, Inc. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * Axel Dörfler, + */ + + +#include +#include +#include +#include +#include +#include +#include + + +using namespace BNetworkKit; + + +#undef B_TRANSLATION_CONTEXT +#define B_TRANSLATION_CONTEXT "SSHServiceAddOn" + + +static const uint32 kMsgToggleService = 'tgls'; + + +class SSHServiceAddOn : public BNetworkSettingsAddOn { +public: + SSHServiceAddOn(image_id image, + BNetworkSettings& settings); + virtual ~SSHServiceAddOn(); + + virtual BNetworkSettingsItem* + CreateNextItem(uint32& cookie); +}; + + +class ServiceView : public BView { +public: + ServiceView(BNetworkSettings& settings); + virtual ~ServiceView(); + + void ConfigurationUpdated(const BMessage& message); + + virtual void MessageReceived(BMessage* message); + +private: + bool _IsEnabled() const; + void _Enable(); + void _Disable(); + +private: + BNetworkSettings& fSettings; +}; + + +class SSHServiceItem : public BNetworkSettingsItem { +public: + SSHServiceItem(BNetworkSettings& settings); + virtual ~SSHServiceItem(); + + virtual BNetworkSettingsType + Type() const; + + virtual BListItem* ListItem(); + virtual BView* View(); + + virtual status_t Revert(); + virtual bool IsRevertable(); + + virtual void ConfigurationUpdated(const BMessage& message); + +private: + BNetworkSettings& fSettings; + BStringItem* fItem; + ServiceView* fView; +}; + + +// #pragma mark - + + +ServiceView::ServiceView(BNetworkSettings& settings) + : + BView("service", 0), + fSettings(settings) +{ + BStringView* titleView = new BStringView("service", + B_TRANSLATE("SSH server")); + titleView->SetFont(be_bold_font); + titleView->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, B_SIZE_UNSET)); + + BTextView* descriptionView = new BTextView("description"); + descriptionView->SetText(B_TRANSLATE("The SSH server allows you to " + "remotely access your machine with a terminal session, as well as " + "file access using the SCP and SFTP protocols.")); + descriptionView->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); + descriptionView->MakeEditable(false); + + BButton* button = new BButton("toggler", B_TRANSLATE("Enable"), + new BMessage(kMsgToggleService)); + + BLayoutBuilder::Group<>(this, B_VERTICAL) + .Add(titleView) + .Add(descriptionView) + .AddGroup(B_HORIZONTAL) + .AddGlue() + .Add(button); + + SetExplicitMinSize(BSize(200, B_SIZE_UNSET)); +} + + +ServiceView::~ServiceView() +{ +} + + +void +ServiceView::ConfigurationUpdated(const BMessage& message) +{ +} + + +void +ServiceView::MessageReceived(BMessage* message) +{ + switch (message->what) { + case kMsgToggleService: + if (_IsEnabled()) + _Disable(); + else + _Enable(); + break; + default: + BView::MessageReceived(message); + break; + } +} + + +bool +ServiceView::_IsEnabled() const +{ + BNetworkServiceSettings settings = fSettings.Service("ssh"); + return settings.IsEnabled(); +} + + +void +ServiceView::_Enable() +{ + BNetworkServiceSettings settings; + settings.SetName("ssh"); + settings.SetStandAlone(true); + + settings.AddArgument("/bin/sshd"); + settings.AddArgument("-D"); + + BMessage service; + if (settings.GetMessage(service) == B_OK) + fSettings.AddService(service); +} + + +void +ServiceView::_Disable() +{ + fSettings.RemoveService("ssh"); +} + + +// #pragma mark - + + +SSHServiceItem::SSHServiceItem(BNetworkSettings& settings) + : + fSettings(settings), + fItem(new BStringItem(B_TRANSLATE("SSH server"))), + fView(NULL) +{ +} + + +SSHServiceItem::~SSHServiceItem() +{ + if (fView->Parent() == NULL) + delete fView; + + delete fItem; +} + + +BNetworkSettingsType +SSHServiceItem::Type() const +{ + return B_NETWORK_SETTINGS_TYPE_SERVICE; +} + + +BListItem* +SSHServiceItem::ListItem() +{ + return fItem; +} + + +BView* +SSHServiceItem::View() +{ + if (fView == NULL) + fView = new ServiceView(fSettings); + + return fView; +} + + +status_t +SSHServiceItem::Revert() +{ + return B_OK; +} + + +bool +SSHServiceItem::IsRevertable() +{ + return false; +} + + +void +SSHServiceItem::ConfigurationUpdated(const BMessage& message) +{ + if (fView != NULL) + fView->ConfigurationUpdated(message); +} + + +// #pragma mark - + + +SSHServiceAddOn::SSHServiceAddOn(image_id image, + BNetworkSettings& settings) + : + BNetworkSettingsAddOn(image, settings) +{ +} + + +SSHServiceAddOn::~SSHServiceAddOn() +{ +} + + +BNetworkSettingsItem* +SSHServiceAddOn::CreateNextItem(uint32& cookie) +{ + if (cookie++ == 0) + return new SSHServiceItem(Settings()); + + return NULL; +} + + +// #pragma mark - + + +extern "C" +BNetworkSettingsAddOn* +instantiate_network_settings_add_on(image_id image, BNetworkSettings& settings) +{ + return new SSHServiceAddOn(image, settings); +}