mirror of
https://github.com/KDE/krfb
synced 2026-07-03 16:31:18 -07:00
Compare commits
43 Commits
Applicatio
...
Applicatio
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8432171959 | ||
|
|
ed7cb43440 | ||
|
|
2f8761080f | ||
|
|
e21d3844bd | ||
|
|
827e1f12e5 | ||
|
|
c8d6973f9f | ||
|
|
ee879c4e4c | ||
|
|
aa189daffd | ||
|
|
9797ff196e | ||
|
|
7519e7918c | ||
|
|
6ef393ba1c | ||
|
|
c47ee269f0 | ||
|
|
a0992f7fea | ||
|
|
ef6491a5c9 | ||
|
|
63d6314b1b | ||
|
|
78ed74ec1e | ||
|
|
1cf5785007 | ||
|
|
0f506011d0 | ||
|
|
d5aff98912 | ||
|
|
d77506c4c2 | ||
|
|
c3d0313280 | ||
|
|
1fc7238699 | ||
|
|
e4a82e3a52 | ||
|
|
c57e9bc5f4 | ||
|
|
2916395ea9 | ||
|
|
3c63cf9563 | ||
|
|
554f2994cc | ||
|
|
313b4bbc67 | ||
|
|
ff5ae6a885 | ||
|
|
f8dfbee9ed | ||
|
|
d6bc236426 | ||
|
|
015518cb9f | ||
|
|
b2fcfeb7f5 | ||
|
|
77c6c35d3e | ||
|
|
d7380a93a3 | ||
|
|
8df92c41c4 | ||
|
|
546a588c18 | ||
|
|
e4fed2991a | ||
|
|
349b99ab47 | ||
|
|
927016cd85 | ||
|
|
abd7bf04ae | ||
|
|
8d19229593 | ||
|
|
c8e4869c8a |
@@ -1,8 +1,8 @@
|
||||
cmake_minimum_required(VERSION 3.0)
|
||||
|
||||
# KDE Application Version, managed by release script
|
||||
set (KDE_APPLICATIONS_VERSION_MAJOR "18")
|
||||
set (KDE_APPLICATIONS_VERSION_MINOR "12")
|
||||
set (KDE_APPLICATIONS_VERSION_MAJOR "19")
|
||||
set (KDE_APPLICATIONS_VERSION_MINOR "04")
|
||||
set (KDE_APPLICATIONS_VERSION_MICRO "3")
|
||||
set (KDE_APPLICATIONS_VERSION "${KDE_APPLICATIONS_VERSION_MAJOR}.${KDE_APPLICATIONS_VERSION_MINOR}.${KDE_APPLICATIONS_VERSION_MICRO}")
|
||||
|
||||
@@ -11,10 +11,8 @@ project(krfb VERSION ${KDE_APPLICATIONS_VERSION})
|
||||
set(QT_MIN_VERSION 5.6.0)
|
||||
set(KF5_MIN_VERSION 5.31.0)
|
||||
|
||||
find_package(Qt5 ${QT_MIN_VERSION} REQUIRED COMPONENTS Core DBus Widgets X11Extras)
|
||||
|
||||
find_package(ECM ${KF5_MIN_VERSION} NO_MODULE REQUIRED)
|
||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR})
|
||||
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules" ${ECM_MODULE_PATH})
|
||||
|
||||
include(KDEInstallDirs)
|
||||
include(KDECMakeSettings)
|
||||
@@ -24,11 +22,9 @@ include(ECMAddAppIcon)
|
||||
include(ECMSetupVersion)
|
||||
include(FeatureSummary)
|
||||
|
||||
ecm_setup_version(PROJECT
|
||||
VARIABLE_PREFIX KRFB
|
||||
VERSION_HEADER "krfb_version.h")
|
||||
find_package(Qt5 ${QT_MIN_VERSION} REQUIRED COMPONENTS Core DBus Widgets X11Extras)
|
||||
|
||||
find_package(KF5 REQUIRED COMPONENTS
|
||||
find_package(KF5 ${KF5_MIN_VERSION} REQUIRED COMPONENTS
|
||||
I18n
|
||||
Completion
|
||||
Config
|
||||
@@ -60,17 +56,26 @@ if(WIN32)
|
||||
set(CMAKE_REQUIRED_INCLUDES ${KDEWIN32_INCLUDES})
|
||||
endif(WIN32)
|
||||
|
||||
add_definitions(${QT_DEFINITIONS} ${QT_QTDBUS_DEFINITIONS})
|
||||
add_definitions(-DQT_USE_FAST_OPERATOR_PLUS)
|
||||
include_directories(${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR} )
|
||||
|
||||
set(CMAKE_MODULE_PATH
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules"
|
||||
${CMAKE_MODULE_PATH}
|
||||
add_definitions(
|
||||
-DQT_DEPRECATED_WARNINGS
|
||||
-DQT_DISABLE_DEPRECATED_BEFORE=0x050600
|
||||
-DQT_USE_QSTRINGBUILDER
|
||||
-DQT_NO_CAST_TO_ASCII
|
||||
-DQT_NO_CAST_FROM_ASCII
|
||||
-DQT_NO_CAST_FROM_BYTEARRAY
|
||||
-DQT_STRICT_ITERATORS
|
||||
-DQT_NO_URL_CAST_FROM_STRING
|
||||
-DQT_NO_SIGNALS_SLOTS_KEYWORDS
|
||||
-DQT_NO_NARROWING_CONVERSIONS_IN_CONNECT
|
||||
)
|
||||
|
||||
include_directories(${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR} )
|
||||
|
||||
find_package(LibVNCServer REQUIRED)
|
||||
|
||||
ecm_setup_version(PROJECT
|
||||
VARIABLE_PREFIX KRFB
|
||||
VERSION_HEADER "krfb_version.h")
|
||||
|
||||
include_directories ("${CMAKE_CURRENT_BINARY_DIR}/krfb"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/krfb"
|
||||
@@ -79,7 +84,7 @@ include_directories ("${CMAKE_CURRENT_BINARY_DIR}/krfb"
|
||||
|
||||
if(Q_WS_X11)
|
||||
if(NOT X11_XTest_FOUND)
|
||||
message(FATAL_ERROR "krfb requires the libXtst (http://xorg.freedesktop.org) to be built")
|
||||
message(FATAL_ERROR "krfb requires the libXtst (https://xorg.freedesktop.org) to be built")
|
||||
endif(NOT X11_XTest_FOUND)
|
||||
endif(Q_WS_X11)
|
||||
|
||||
|
||||
@@ -73,7 +73,7 @@ to help you perform a task.
|
||||
<para>
|
||||
Please report any problems or feature requests to the &kde; mailing
|
||||
lists or file a bug at <ulink
|
||||
url="http://bugs.kde.org">http://bugs.kde.org</ulink>.
|
||||
url="https://bugs.kde.org">https://bugs.kde.org</ulink>.
|
||||
</para>
|
||||
</chapter>
|
||||
|
||||
|
||||
@@ -77,6 +77,6 @@
|
||||
"krfb/framebuffer"
|
||||
],
|
||||
"Version": "0.1",
|
||||
"Website": "http://www.kde.org"
|
||||
"Website": "https://www.kde.org"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -77,6 +77,6 @@
|
||||
"krfb/framebuffer"
|
||||
],
|
||||
"Version": "0.1",
|
||||
"Website": "http://www.kde.org"
|
||||
"Website": "https://www.kde.org"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -598,7 +598,7 @@ QList<QRect> XCBFrameBuffer::modifiedTiles() {
|
||||
} else {
|
||||
// not using shared memory
|
||||
// will use just xcb_image_get() and copy pixels
|
||||
foreach(const QRect &r, tiles) {
|
||||
for (const QRect& r : qAsConst(tiles)) {
|
||||
// I did not find XGetSubImage() analog in XCB!!
|
||||
// need function that copies pixels from one image to another
|
||||
xcb_image_t *damagedImage = xcb_image_get(
|
||||
|
||||
@@ -73,6 +73,10 @@ ki18n_wrap_ui (krfb_SRCS
|
||||
ui/mainwidget.ui
|
||||
)
|
||||
|
||||
qt5_add_resources(krfb_SRCS
|
||||
krfb.qrc
|
||||
)
|
||||
|
||||
add_executable (krfb
|
||||
${krfb_SRCS}
|
||||
)
|
||||
|
||||
@@ -55,7 +55,7 @@ ConnectionDialog<UI>::ConnectionDialog(QWidget *parent)
|
||||
m_connectWidget = new QWidget(this);
|
||||
m_ui.setupUi(m_connectWidget);
|
||||
|
||||
m_ui.pixmapLabel->setPixmap(QIcon::fromTheme("krfb").pixmap(128));
|
||||
m_ui.pixmapLabel->setPixmap(QIcon::fromTheme(QStringLiteral("krfb")).pixmap(128));
|
||||
|
||||
KGuiItem accept = KStandardGuiItem::ok();
|
||||
accept.setText(i18n("Accept Connection"));
|
||||
|
||||
@@ -65,17 +65,17 @@ PendingInvitationsRfbClient::~PendingInvitationsRfbClient()
|
||||
|
||||
void PendingInvitationsRfbClient::processNewClient()
|
||||
{
|
||||
QString host = peerAddress(m_rfbClient->sock) + ':' + QString::number(peerPort(m_rfbClient->sock));
|
||||
QString host = peerAddress(m_rfbClient->sock) + QLatin1Char(':') + QString::number(peerPort(m_rfbClient->sock));
|
||||
|
||||
if (d->askOnConnect == false) {
|
||||
|
||||
KNotification::event("NewConnectionAutoAccepted",
|
||||
KNotification::event(QStringLiteral("NewConnectionAutoAccepted"),
|
||||
i18n("Accepted connection from %1", host));
|
||||
accept(new InvitationsRfbClient(m_rfbClient, parent()));
|
||||
|
||||
} else {
|
||||
|
||||
KNotification::event("NewConnectionOnHold",
|
||||
KNotification::event(QStringLiteral("NewConnectionOnHold"),
|
||||
i18n("Received connection from %1, on hold (waiting for confirmation)",
|
||||
host));
|
||||
|
||||
|
||||
@@ -47,22 +47,17 @@ void InvitationsRfbServer::init()
|
||||
i18n("%1@%2 (shared desktop)",
|
||||
KUser().loginName(),
|
||||
QHostInfo::localHostName()),
|
||||
"_rfb._tcp",
|
||||
QStringLiteral("_rfb._tcp"),
|
||||
KrfbConfig::port());
|
||||
instance->setListeningAddress("0.0.0.0");
|
||||
instance->setListeningPort(KrfbConfig::port());
|
||||
instance->setPasswordRequired(true);
|
||||
|
||||
instance->m_wallet = nullptr;
|
||||
if (KrfbConfig::noWallet()) {
|
||||
instance->walletOpened(false);
|
||||
}
|
||||
else {
|
||||
instance->m_wallet = Wallet::openWallet(
|
||||
Wallet::NetworkWallet(), 0, Wallet::Asynchronous);
|
||||
if(instance->m_wallet) {
|
||||
connect(instance->m_wallet, &KWallet::Wallet::walletOpened,
|
||||
instance, &InvitationsRfbServer::walletOpened);
|
||||
}
|
||||
instance->walletOpened(false);
|
||||
} else {
|
||||
instance->openKWallet();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -115,8 +110,8 @@ void InvitationsRfbServer::toggleUnattendedAccess(bool allow)
|
||||
|
||||
InvitationsRfbServer::InvitationsRfbServer()
|
||||
{
|
||||
m_desktopPassword = readableRandomString(4)+'-'+readableRandomString(3);
|
||||
m_unattendedPassword = readableRandomString(4)+'-'+readableRandomString(3);
|
||||
m_desktopPassword = readableRandomString(4) + QLatin1Char('-') + readableRandomString(3);
|
||||
m_unattendedPassword = readableRandomString(4) + QLatin1Char('-') + readableRandomString(3);
|
||||
KConfigGroup krfbConfig(KSharedConfig::openConfig(),"Security");
|
||||
m_allowUnattendedAccess = krfbConfig.readEntry(
|
||||
"allowUnattendedAccess", QVariant(false)).toBool();
|
||||
@@ -125,19 +120,12 @@ InvitationsRfbServer::InvitationsRfbServer()
|
||||
InvitationsRfbServer::~InvitationsRfbServer()
|
||||
{
|
||||
stop();
|
||||
KConfigGroup krfbConfig(KSharedConfig::openConfig(),"Security");
|
||||
krfbConfig.writeEntry("allowUnattendedAccess",m_allowUnattendedAccess);
|
||||
if(!KrfbConfig::noWallet()) {
|
||||
if (m_wallet && m_wallet->isOpen()) {
|
||||
if( (m_wallet->currentFolder()=="krfb") ||
|
||||
((m_wallet->hasFolder("krfb") || m_wallet->createFolder("krfb")) &&
|
||||
m_wallet->setFolder("krfb")) ) {
|
||||
|
||||
m_wallet->writePassword("desktopSharingPassword",m_desktopPassword);
|
||||
m_wallet->writePassword("unattendedAccessPassword",m_unattendedPassword);
|
||||
}
|
||||
}
|
||||
KConfigGroup krfbConfig(KSharedConfig::openConfig(), "Security");
|
||||
krfbConfig.writeEntry("allowUnattendedAccess", m_allowUnattendedAccess);
|
||||
|
||||
if (!KrfbConfig::noWallet() && m_wallet) {
|
||||
closeKWallet();
|
||||
} else {
|
||||
krfbConfig.writeEntry("desktopPassword",
|
||||
KStringHandler::obscure(m_desktopPassword));
|
||||
@@ -153,22 +141,47 @@ PendingRfbClient* InvitationsRfbServer::newClient(rfbClientPtr client)
|
||||
return new PendingInvitationsRfbClient(client, this);
|
||||
}
|
||||
|
||||
void InvitationsRfbServer::openKWallet()
|
||||
{
|
||||
m_wallet = Wallet::openWallet(Wallet::NetworkWallet(), 0, Wallet::Asynchronous);
|
||||
if (m_wallet) {
|
||||
connect(instance->m_wallet, &KWallet::Wallet::walletOpened,
|
||||
this, &InvitationsRfbServer::walletOpened);
|
||||
}
|
||||
}
|
||||
|
||||
void InvitationsRfbServer::closeKWallet()
|
||||
{
|
||||
if (m_wallet && m_wallet->isOpen()) {
|
||||
const QString krfbFolderName = QStringLiteral("krfb");
|
||||
if ((m_wallet->currentFolder() == krfbFolderName) ||
|
||||
((m_wallet->hasFolder(krfbFolderName) || m_wallet->createFolder(krfbFolderName)) &&
|
||||
m_wallet->setFolder(krfbFolderName)) ) {
|
||||
m_wallet->writePassword(QStringLiteral("desktopSharingPassword"), m_desktopPassword);
|
||||
m_wallet->writePassword(QStringLiteral("unattendedAccessPassword"), m_unattendedPassword);
|
||||
}
|
||||
delete m_wallet; // closes the wallet
|
||||
m_wallet = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
void InvitationsRfbServer::walletOpened(bool opened)
|
||||
{
|
||||
QString desktopPassword;
|
||||
QString unattendedPassword;
|
||||
Q_ASSERT(m_wallet);
|
||||
const QString krfbFolderName = QStringLiteral("krfb");
|
||||
if( opened &&
|
||||
( m_wallet->hasFolder("krfb") || m_wallet->createFolder("krfb") ) &&
|
||||
m_wallet->setFolder("krfb") ) {
|
||||
( m_wallet->hasFolder(krfbFolderName) || m_wallet->createFolder(krfbFolderName) ) &&
|
||||
m_wallet->setFolder(krfbFolderName) ) {
|
||||
|
||||
if(m_wallet->readPassword("desktopSharingPassword", desktopPassword)==0 &&
|
||||
if(m_wallet->readPassword(QStringLiteral("desktopSharingPassword"), desktopPassword)==0 &&
|
||||
!desktopPassword.isEmpty()) {
|
||||
m_desktopPassword = desktopPassword;
|
||||
emit passwordChanged(m_desktopPassword);
|
||||
}
|
||||
|
||||
if(m_wallet->readPassword("unattendedAccessPassword", unattendedPassword)==0 &&
|
||||
if(m_wallet->readPassword(QStringLiteral("unattendedAccessPassword"), unattendedPassword)==0 &&
|
||||
!unattendedPassword.isEmpty()) {
|
||||
m_unattendedPassword = unattendedPassword;
|
||||
}
|
||||
@@ -218,7 +231,7 @@ QString InvitationsRfbServer::readableRandomString(int length)
|
||||
(c == '0')) {
|
||||
continue;
|
||||
}
|
||||
str += c;
|
||||
str += QLatin1Char(c);
|
||||
length--;
|
||||
}
|
||||
return str;
|
||||
|
||||
@@ -50,6 +50,8 @@ public Q_SLOTS:
|
||||
bool start() override;
|
||||
void stop() override;
|
||||
void toggleUnattendedAccess(bool allow);
|
||||
void openKWallet();
|
||||
void closeKWallet();
|
||||
|
||||
protected:
|
||||
InvitationsRfbServer();
|
||||
|
||||
6
krfb/krfb.qrc
Normal file
6
krfb/krfb.qrc
Normal file
@@ -0,0 +1,6 @@
|
||||
<!DOCTYPE RCC>
|
||||
<RCC version="1.0">
|
||||
<qresource prefix="/kxmlgui5/krfb">
|
||||
<file>krfbui.rc</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
7
krfb/krfbui.rc
Normal file
7
krfb/krfbui.rc
Normal file
@@ -0,0 +1,7 @@
|
||||
<!DOCTYPE gui SYSTEM "kpartgui.dtd">
|
||||
<gui name="krfb" version="0">
|
||||
|
||||
<MenuBar>
|
||||
</MenuBar>
|
||||
|
||||
</gui>
|
||||
@@ -78,7 +78,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
KLocalizedString::setApplicationDomain("krfb");
|
||||
|
||||
KAboutData aboutData("krfb",
|
||||
KAboutData aboutData(QStringLiteral("krfb"),
|
||||
i18n("Desktop Sharing"),
|
||||
QStringLiteral(KRFB_VERSION_STRING),
|
||||
i18n(description),
|
||||
@@ -92,12 +92,12 @@ int main(int argc, char *argv[])
|
||||
"(c) 1999, AT&T Laboratories Boston\n"));
|
||||
aboutData.addAuthor(i18n("George Goldberg"),
|
||||
i18n("Telepathy tubes support"),
|
||||
"george.goldberg@collabora.co.uk");
|
||||
QStringLiteral("george.goldberg@collabora.co.uk"));
|
||||
aboutData.addAuthor(i18n("George Kiagiadakis"),
|
||||
QString(),
|
||||
"george.kiagiadakis@collabora.co.uk");
|
||||
aboutData.addAuthor(i18n("Alessandro Praduroux"), i18n("KDE4 porting"), "pradu@pradu.it");
|
||||
aboutData.addAuthor(i18n("Tim Jansen"), i18n("Original author"), "tim@tjansen.de");
|
||||
QStringLiteral("george.kiagiadakis@collabora.co.uk"));
|
||||
aboutData.addAuthor(i18n("Alessandro Praduroux"), i18n("KDE4 porting"), QStringLiteral("pradu@pradu.it"));
|
||||
aboutData.addAuthor(i18n("Tim Jansen"), i18n("Original author"), QStringLiteral("tim@tjansen.de"));
|
||||
aboutData.addCredit(i18n("Johannes E. Schindelin"),
|
||||
i18n("libvncserver"));
|
||||
aboutData.addCredit(i18n("Const Kaplinsky"),
|
||||
@@ -107,18 +107,18 @@ int main(int argc, char *argv[])
|
||||
aboutData.addCredit(i18n("AT&T Laboratories Boston"),
|
||||
i18n("original VNC encoders and "
|
||||
"protocol design"));
|
||||
QCommandLineParser parser;
|
||||
KAboutData::setApplicationData(aboutData);
|
||||
parser.addVersionOption();
|
||||
parser.addHelpOption();
|
||||
|
||||
QCommandLineParser parser;
|
||||
aboutData.setupCommandLine(&parser);
|
||||
const QCommandLineOption nodialogOption(QStringList{ QStringLiteral("nodialog") }, i18n("Do not show the invitations management dialog at startup"));
|
||||
parser.addOption(nodialogOption);
|
||||
|
||||
parser.process(app);
|
||||
aboutData.processCommandLine(&parser);
|
||||
|
||||
KDBusService service(KDBusService::Unique, &app);
|
||||
|
||||
parser.addOption(QCommandLineOption(QStringList() << QLatin1String("nodialog"), i18n("Do not show the invitations management dialog at startup")));
|
||||
|
||||
app.setQuitOnLastWindowClosed(false);
|
||||
|
||||
if (!checkX11Capabilities()) {
|
||||
@@ -139,7 +139,7 @@ int main(int argc, char *argv[])
|
||||
mainWindow.hide();
|
||||
} else if (app.isSessionRestored() && KMainWindow::canBeRestored(1)) {
|
||||
mainWindow.restore(1, false);
|
||||
} else if (!parser.isSet("nodialog")) {
|
||||
} else if (!parser.isSet(nodialogOption)) {
|
||||
mainWindow.show();
|
||||
}
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
#include <KConfigDialog>
|
||||
#include <KLocalizedString>
|
||||
#include <KMessageBox>
|
||||
#include <KMessageWidget>
|
||||
#include <KStandardAction>
|
||||
#include <KActionCollection>
|
||||
#include <KLineEdit>
|
||||
@@ -48,7 +49,20 @@ class Security: public QWidget, public Ui::Security
|
||||
public:
|
||||
Security(QWidget *parent = nullptr) : QWidget(parent) {
|
||||
setupUi(this);
|
||||
walletWarning = new KMessageWidget(this);
|
||||
walletWarning->setText(i18n("Storing passwords in config file is insecure!"));
|
||||
walletWarning->setCloseButtonVisible(false);
|
||||
walletWarning->setMessageType(KMessageWidget::Warning);
|
||||
walletWarning->hide();
|
||||
vboxLayout->addWidget(walletWarning);
|
||||
|
||||
// show warning when "noWallet" checkbox is checked
|
||||
QObject::connect(kcfg_noWallet, &QCheckBox::toggled, [this](bool checked){
|
||||
walletWarning->setVisible(checked);
|
||||
});
|
||||
}
|
||||
|
||||
KMessageWidget *walletWarning = nullptr;
|
||||
};
|
||||
|
||||
class ConfigFramebuffer: public QWidget, public Ui::Framebuffer
|
||||
@@ -98,7 +112,7 @@ MainWindow::MainWindow(QWidget *parent)
|
||||
|
||||
QWidget *mainWidget = new QWidget;
|
||||
m_ui.setupUi(mainWidget);
|
||||
m_ui.krfbIconLabel->setPixmap(QIcon::fromTheme("krfb").pixmap(128));
|
||||
m_ui.krfbIconLabel->setPixmap(QIcon::fromTheme(QStringLiteral("krfb")).pixmap(128));
|
||||
m_ui.enableUnattendedCheckBox->setChecked(
|
||||
InvitationsRfbServer::instance->allowUnattendedAccess());
|
||||
|
||||
@@ -121,14 +135,14 @@ MainWindow::MainWindow(QWidget *parent)
|
||||
|
||||
// Figure out the address
|
||||
int port = KrfbConfig::port();
|
||||
QList<QNetworkInterface> interfaceList = QNetworkInterface::allInterfaces();
|
||||
foreach(const QNetworkInterface & interface, interfaceList) {
|
||||
const QList<QNetworkInterface> interfaceList = QNetworkInterface::allInterfaces();
|
||||
for (const QNetworkInterface& interface : interfaceList) {
|
||||
if(interface.flags() & QNetworkInterface::IsLoopBack)
|
||||
continue;
|
||||
|
||||
if(interface.flags() & QNetworkInterface::IsRunning &&
|
||||
!interface.addressEntries().isEmpty())
|
||||
m_ui.addressDisplayLabel->setText(QString("%1 : %2")
|
||||
m_ui.addressDisplayLabel->setText(QStringLiteral("%1 : %2")
|
||||
.arg(interface.addressEntries().first().ip().toString())
|
||||
.arg(port));
|
||||
}
|
||||
@@ -157,7 +171,7 @@ void MainWindow::editPassword()
|
||||
{
|
||||
if(m_passwordEditable) {
|
||||
m_passwordEditable = false;
|
||||
m_ui.passwordEditButton->setIcon(QIcon::fromTheme("document-properties"));
|
||||
m_ui.passwordEditButton->setIcon(QIcon::fromTheme(QStringLiteral("document-properties")));
|
||||
m_ui.passwordGridLayout->removeWidget(m_passwordLineEdit);
|
||||
InvitationsRfbServer::instance->setDesktopPassword(
|
||||
m_passwordLineEdit->text());
|
||||
@@ -166,7 +180,7 @@ void MainWindow::editPassword()
|
||||
m_passwordLineEdit->setVisible(false);
|
||||
} else {
|
||||
m_passwordEditable = true;
|
||||
m_ui.passwordEditButton->setIcon(QIcon::fromTheme("document-save"));
|
||||
m_ui.passwordEditButton->setIcon(QIcon::fromTheme(QStringLiteral("document-save")));
|
||||
m_ui.passwordGridLayout->addWidget(m_passwordLineEdit,0,0);
|
||||
m_passwordLineEdit->setText(
|
||||
InvitationsRfbServer::instance->desktopPassword());
|
||||
@@ -198,7 +212,7 @@ void MainWindow::toggleDesktopSharing(bool enable)
|
||||
if(m_passwordEditable) {
|
||||
m_passwordEditable = false;
|
||||
m_passwordLineEdit->setVisible(false);
|
||||
m_ui.passwordEditButton->setIcon(QIcon::fromTheme("document-properties"));
|
||||
m_ui.passwordEditButton->setIcon(QIcon::fromTheme(QStringLiteral("document-properties")));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -226,19 +240,21 @@ void MainWindow::aboutUnattendedMode()
|
||||
void MainWindow::showConfiguration()
|
||||
{
|
||||
static QString s_prevFramebufferPlugin;
|
||||
static bool s_prevNoWallet;
|
||||
// ^^ needs to be static, because lambda will be called long time
|
||||
// after showConfiguration() ends, so auto variable would go out of scope
|
||||
// save previously selected framebuffer plugin config
|
||||
s_prevFramebufferPlugin = KrfbConfig::preferredFrameBufferPlugin();
|
||||
s_prevNoWallet = KrfbConfig::noWallet();
|
||||
|
||||
if (KConfigDialog::showDialog("settings")) {
|
||||
if (KConfigDialog::showDialog(QStringLiteral("settings"))) {
|
||||
return;
|
||||
}
|
||||
|
||||
KConfigDialog *dialog = new KConfigDialog(this, "settings", KrfbConfig::self());
|
||||
dialog->addPage(new TCP, i18n("Network"), "network-wired");
|
||||
dialog->addPage(new Security, i18n("Security"), "security-high");
|
||||
dialog->addPage(new ConfigFramebuffer, i18n("Screen capture"), "video-display");
|
||||
KConfigDialog *dialog = new KConfigDialog(this, QStringLiteral("settings"), KrfbConfig::self());
|
||||
dialog->addPage(new TCP, i18n("Network"), QStringLiteral("network-wired"));
|
||||
dialog->addPage(new Security, i18n("Security"), QStringLiteral("security-high"));
|
||||
dialog->addPage(new ConfigFramebuffer, i18n("Screen capture"), QStringLiteral("video-display"));
|
||||
dialog->show();
|
||||
connect(dialog, &KConfigDialog::settingsChanged, [this] () {
|
||||
// check if framebuffer plugin config has changed
|
||||
@@ -246,6 +262,19 @@ void MainWindow::showConfiguration()
|
||||
KMessageBox::information(this, i18n("To apply framebuffer plugin setting, "
|
||||
"you need to restart the program."));
|
||||
}
|
||||
// check if kwallet config has changed
|
||||
if (s_prevNoWallet != KrfbConfig::noWallet()) {
|
||||
// try to apply settings immediately
|
||||
if (KrfbConfig::noWallet()) {
|
||||
InvitationsRfbServer::instance->closeKWallet();
|
||||
} else {
|
||||
InvitationsRfbServer::instance->openKWallet();
|
||||
// erase stored passwords from krfbconfig file
|
||||
KConfigGroup securityConfigGroup(KSharedConfig::openConfig(), "Security");
|
||||
securityConfigGroup.deleteEntry("desktopPassword");
|
||||
securityConfigGroup.deleteEntry("unattendedPassword");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -112,6 +112,7 @@
|
||||
<caption xml:lang="ca">Compartint l'escriptori amb el Krfb</caption>
|
||||
<caption xml:lang="ca-valencia">Compartint l'escriptori amb el Krfb</caption>
|
||||
<caption xml:lang="cs">Sdílím pracovní plochu pomocí Krfb</caption>
|
||||
<caption xml:lang="da">Deler skrivebord med Krfb</caption>
|
||||
<caption xml:lang="de">Freigabe der Arbeitsfläche mit Krfb</caption>
|
||||
<caption xml:lang="en-GB">Sharing desktop with Krfb</caption>
|
||||
<caption xml:lang="es">Compartiendo el escritorio con Krfb</caption>
|
||||
@@ -120,6 +121,7 @@
|
||||
<caption xml:lang="gl">Compartindo o escritorio con Krfb</caption>
|
||||
<caption xml:lang="id">Berbagi desktop dengan Krfb</caption>
|
||||
<caption xml:lang="it">Condivisone del desktop con Krfb</caption>
|
||||
<caption xml:lang="ko">Krfb로 데스크톱 공유</caption>
|
||||
<caption xml:lang="nl">Bureaublad delen met Krfb</caption>
|
||||
<caption xml:lang="pl">Udostępnienie pulpitu przy użyciu Krfb</caption>
|
||||
<caption xml:lang="pt">Partilha do ecrã com o Krfb</caption>
|
||||
|
||||
@@ -43,7 +43,7 @@ struct RfbClient::Private
|
||||
RfbClient::RfbClient(rfbClientPtr client, QObject* parent)
|
||||
: QObject(parent), d(new Private(client))
|
||||
{
|
||||
d->remoteAddressString = peerAddress(d->client->sock) + ':' +
|
||||
d->remoteAddressString = peerAddress(d->client->sock) + QLatin1Char(':') +
|
||||
QString::number(peerPort(d->client->sock));
|
||||
|
||||
d->notifier = new QSocketNotifier(client->sock, QSocketNotifier::Read, this);
|
||||
@@ -221,10 +221,10 @@ bool PendingRfbClient::vncAuthCheckPassword(const QByteArray& password, const QB
|
||||
bzero(passwd, MAXPWLEN);
|
||||
|
||||
if (!password.isEmpty()) {
|
||||
strncpy(passwd, password,
|
||||
strncpy(passwd, password.constData(),
|
||||
(MAXPWLEN <= password.size()) ? MAXPWLEN : password.size());
|
||||
}
|
||||
|
||||
rfbEncryptBytes(challenge, passwd);
|
||||
return memcmp(challenge, encryptedPassword, encryptedPassword.size()) == 0;
|
||||
return memcmp(challenge, encryptedPassword.constData(), encryptedPassword.size()) == 0;
|
||||
}
|
||||
|
||||
@@ -120,7 +120,7 @@ void RfbServerManager::init()
|
||||
d->fb = FrameBufferManager::instance()->frameBuffer(QApplication::desktop()->winId());
|
||||
d->myCursor = rfbMakeXCursor(19, 19, (char *) cur, (char *) mask);
|
||||
d->myCursor->cleanup = false;
|
||||
d->desktopName = QString("%1@%2 (shared desktop)") //FIXME check if we can use utf8
|
||||
d->desktopName = QStringLiteral("%1@%2 (shared desktop)") //FIXME check if we can use utf8
|
||||
.arg(KUser().loginName(),QHostInfo::localHostName()).toLatin1();
|
||||
|
||||
connect(&d->rfbUpdateTimer, &QTimer::timeout, this, &RfbServerManager::updateScreens);
|
||||
@@ -132,7 +132,7 @@ void RfbServerManager::updateScreens()
|
||||
QList<QRect> rects = d->fb->modifiedTiles();
|
||||
QPoint currentCursorPos = QCursor::pos();
|
||||
|
||||
Q_FOREACH(RfbServer *server, d->servers) {
|
||||
for (RfbServer* server : qAsConst(d->servers)) {
|
||||
server->updateScreen(rects);
|
||||
server->updateCursorPosition(currentCursorPos);
|
||||
}
|
||||
@@ -140,8 +140,8 @@ void RfbServerManager::updateScreens()
|
||||
//update() might disconnect some of the clients, which will synchronously
|
||||
//call the removeClient() method and will change d->clients, so we need
|
||||
//to copy the set here to avoid problems.
|
||||
QSet<RfbClient*> clients = d->clients;
|
||||
Q_FOREACH(RfbClient *client, clients) {
|
||||
const QSet<RfbClient*> clients = d->clients;
|
||||
for (RfbClient* client : clients) {
|
||||
client->update();
|
||||
}
|
||||
}
|
||||
@@ -151,10 +151,8 @@ void RfbServerManager::cleanup()
|
||||
//qDebug();
|
||||
|
||||
//copy because d->servers is going to be modified while we delete the servers
|
||||
QSet<RfbServer*> servers = d->servers;
|
||||
Q_FOREACH(RfbServer *server, servers) {
|
||||
delete server;
|
||||
}
|
||||
const QSet<RfbServer*> servers = d->servers;
|
||||
qDeleteAll(servers);
|
||||
|
||||
Q_ASSERT(d->servers.isEmpty());
|
||||
Q_ASSERT(d->clients.isEmpty());
|
||||
@@ -213,7 +211,7 @@ void RfbServerManager::addClient(RfbClient* cc)
|
||||
}
|
||||
d->clients.insert(cc);
|
||||
|
||||
KNotification::event("UserAcceptsConnection",
|
||||
KNotification::event(QStringLiteral("UserAcceptsConnection"),
|
||||
i18n("The remote user %1 is now connected.", cc->name()));
|
||||
|
||||
Q_EMIT clientConnected(cc);
|
||||
@@ -228,7 +226,7 @@ void RfbServerManager::removeClient(RfbClient* cc)
|
||||
d->rfbUpdateTimer.stop();
|
||||
}
|
||||
|
||||
KNotification::event("ConnectionClosed", i18n("The remote user %1 disconnected.", cc->name()));
|
||||
KNotification::event(QStringLiteral("ConnectionClosed"), i18n("The remote user %1 disconnected.", cc->name()));
|
||||
|
||||
Q_EMIT clientDisconnected(cc);
|
||||
}
|
||||
|
||||
@@ -36,19 +36,19 @@ QString peerAddress(int sock)
|
||||
if (getpeername(sock, &sa, &salen) == 0) {
|
||||
if (sa.sa_family == AF_INET) {
|
||||
struct sockaddr_in *si = (struct sockaddr_in *)&sa;
|
||||
return QString(inet_ntoa(si->sin_addr));
|
||||
return QString::fromLatin1(inet_ntoa(si->sin_addr));
|
||||
}
|
||||
|
||||
if (sa.sa_family == AF_INET6) {
|
||||
char inetbuf[ADDR_SIZE];
|
||||
inet_ntop(sa.sa_family, &sa, inetbuf, ADDR_SIZE);
|
||||
return QString(inetbuf);
|
||||
return QString::fromLatin1(inetbuf);
|
||||
}
|
||||
|
||||
return QString("not a network address");
|
||||
return QStringLiteral("not a network address");
|
||||
}
|
||||
|
||||
return QString("unable to determine...");
|
||||
return QStringLiteral("unable to determine...");
|
||||
}
|
||||
|
||||
unsigned short peerPort(int sock)
|
||||
@@ -75,19 +75,19 @@ QString localAddress(int sock)
|
||||
if (getsockname(sock, &sa, &salen) == 0) {
|
||||
if (sa.sa_family == AF_INET) {
|
||||
struct sockaddr_in *si = (struct sockaddr_in *)&sa;
|
||||
return QString(inet_ntoa(si->sin_addr));
|
||||
return QString::fromLatin1(inet_ntoa(si->sin_addr));
|
||||
}
|
||||
|
||||
if (sa.sa_family == AF_INET6) {
|
||||
char inetbuf[ADDR_SIZE];
|
||||
inet_ntop(sa.sa_family, &sa, inetbuf, ADDR_SIZE);
|
||||
return QString(inetbuf);
|
||||
return QString::fromLatin1(inetbuf);
|
||||
}
|
||||
|
||||
return QString("not a network address");
|
||||
return QStringLiteral("not a network address");
|
||||
}
|
||||
|
||||
return QString("unable to determine...");
|
||||
return QStringLiteral("unable to determine...");
|
||||
}
|
||||
|
||||
unsigned short localPort(int sock)
|
||||
|
||||
@@ -96,7 +96,7 @@ ClientActions::~ClientActions()
|
||||
TrayIcon::TrayIcon(QWidget *mainWindow)
|
||||
: KStatusNotifierItem(mainWindow)
|
||||
{
|
||||
setIconByPixmap(QIcon::fromTheme("krfb").pixmap(22, 22, QIcon::Disabled));
|
||||
setIconByPixmap(QIcon::fromTheme(QStringLiteral("krfb")).pixmap(22, 22, QIcon::Disabled));
|
||||
|
||||
setToolTipTitle(i18n("Desktop Sharing - disconnected"));
|
||||
setCategory(KStatusNotifierItem::ApplicationStatus);
|
||||
@@ -113,7 +113,7 @@ TrayIcon::TrayIcon(QWidget *mainWindow)
|
||||
void TrayIcon::onClientConnected(RfbClient* client)
|
||||
{
|
||||
if (m_clientActions.isEmpty()) { //first client connected
|
||||
setIconByName("krfb");
|
||||
setIconByName(QStringLiteral("krfb"));
|
||||
setToolTipTitle(i18n("Desktop Sharing - connected with %1", client->name()));
|
||||
setStatus(KStatusNotifierItem::Active);
|
||||
} else { //Nth client connected, N != 1
|
||||
@@ -129,7 +129,7 @@ void TrayIcon::onClientDisconnected(RfbClient* client)
|
||||
delete actions;
|
||||
|
||||
if (m_clientActions.isEmpty()) {
|
||||
setIconByPixmap(QIcon::fromTheme("krfb").pixmap(22, 22, QIcon::Disabled));
|
||||
setIconByPixmap(QIcon::fromTheme(QStringLiteral("krfb")).pixmap(22, 22, QIcon::Disabled));
|
||||
setToolTipTitle(i18n("Desktop Sharing - disconnected"));
|
||||
setStatus(KStatusNotifierItem::Passive);
|
||||
} else if (m_clientActions.size() == 1) { //clients number dropped back to 1
|
||||
|
||||
@@ -21,6 +21,13 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="kcfg_noWallet">
|
||||
<property name="text">
|
||||
<string>Do not store passwords using KDE wallet</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer>
|
||||
<property name="orientation">
|
||||
|
||||
@@ -10,12 +10,6 @@
|
||||
</rect>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" >
|
||||
<property name="margin" >
|
||||
<number>9</number>
|
||||
</property>
|
||||
<property name="spacing" >
|
||||
<number>6</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="kcfg_publishService" >
|
||||
<property name="text" >
|
||||
@@ -37,14 +31,20 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" >
|
||||
<property name="margin" >
|
||||
<layout class="QFormLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="spacing" >
|
||||
<number>6</number>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label" >
|
||||
<property name="text" >
|
||||
<string>Listening port:</string>
|
||||
@@ -54,7 +54,7 @@
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QSpinBox" name="kcfg_port" >
|
||||
<property name="enabled" >
|
||||
<bool>false</bool>
|
||||
@@ -66,6 +66,19 @@
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<spacer>
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<tabstops>
|
||||
|
||||
Reference in New Issue
Block a user