Merge pull request #1 from sandboxie-plus/master

Update repo
This commit is contained in:
Aleksey Smirnov 2021-01-07 10:50:58 +03:00 committed by GitHub
commit 1a66a892f3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
34 changed files with 6810 additions and 3341 deletions

View File

@ -3,13 +3,25 @@ All notable changes to this project will be documented in this file.
This project adheres to [Semantic Versioning](http://semver.org/).
## [0.5.3b / 5.45.2] - 2021-01-02
### Added
- added settings for the portable boxed root folder option
- added process name to resource log
- added command line column to the process view in the SandMan UI
### Fixed
- fixed a few issues with group handling
- fixed issue with GetRawInputDeviceInfo when running a 32 bit program on a 64 bit system
- fixed issue when pressing apply in the "Resource Access" tab; the last edited value was not always applied
- fixed issue merging entries in resource access monitor
## [0.5.3a / 5.45.2] - 2020-12-29
### Added
- added prompt to choose if links in the Sandman UI should be opened in a sandboxed or unsandboxed browser
- added prompt to choose if links in the SandMan UI should be opened in a sandboxed or unsandboxed browser
- added more recovery options
- added "ClosedClsid=" to block com objects from being used when they cause compatibility issues
- added "ClsidTrace=*" option to trace COM usage
@ -25,7 +37,7 @@ This project adheres to [Semantic Versioning](http://semver.org/).
### Changed
- changed docs and update URLs to the new sandboxie-plus.com domain
- greately improved the setup script (thanks mpheath)
- greatly improved the setup script (thanks mpheath)
- "OpenClsid=" and "ClosedClsid=" now support specifying a program or group name
- by default, when started in portable mode, the sandbox folder will be located in the parent directory of the sandboxie instance

View File

@ -25,6 +25,7 @@ Open Source release
- mpheath - help with inno setup
### Translators
- yuhao2348732 - ZH
- nkh0472 - CN
- bastik-1001 - DE
- JNylson - PT

Binary file not shown.

Binary file not shown.

1
SandboxiePlus/LICENSE Normal file
View File

@ -0,0 +1 @@
Please see the individual modules for their respective licenses.

View File

@ -5,6 +5,10 @@ bool CPanelView::m_SimpleFormat = false;
int CPanelView::m_MaxCellWidth = 0;
QString CPanelView::m_CellSeparator = "\t";
QString CPanelView::m_CopyCell = "Copy Cell";
QString CPanelView::m_CopyRow = "Copy Row";
QString CPanelView::m_CopyPanel = "Copy Panel";
CPanelView::CPanelView(QWidget *parent)
:QWidget(parent)
{
@ -21,12 +25,12 @@ void CPanelView::AddPanelItemsToMenu(bool bAddSeparator)
{
if(bAddSeparator)
m_pMenu->addSeparator();
m_pCopyCell = m_pMenu->addAction(tr("Copy Cell"), this, SLOT(OnCopyCell()));
m_pCopyRow = m_pMenu->addAction(tr("Copy Row"), this, SLOT(OnCopyRow()));
m_pCopyCell = m_pMenu->addAction(m_CopyCell, this, SLOT(OnCopyCell()));
m_pCopyRow = m_pMenu->addAction(m_CopyRow, this, SLOT(OnCopyRow()));
m_pCopyRow->setShortcut(QKeySequence::Copy);
m_pCopyRow->setShortcutContext(Qt::WidgetWithChildrenShortcut);
this->addAction(m_pCopyRow);
m_pCopyPanel = m_pMenu->addAction(tr("Copy Panel"), this, SLOT(OnCopyPanel()));
m_pCopyPanel = m_pMenu->addAction(m_CopyPanel, this, SLOT(OnCopyPanel()));
}
void CPanelView::OnMenu(const QPoint& Point)
@ -35,6 +39,7 @@ void CPanelView::OnMenu(const QPoint& Point)
m_pCopyCell->setEnabled(Index.isValid());
m_pCopyRow->setEnabled(Index.isValid());
m_pCopyPanel->setEnabled(true);
m_pMenu->popup(QCursor::pos());
}

View File

@ -13,6 +13,10 @@ public:
static void SetMaxCellWidth(int iMaxWidth) { m_MaxCellWidth = iMaxWidth; }
static void SetCellSeparator(const QString& Sep) { m_CellSeparator = Sep; }
static QString m_CopyCell;
static QString m_CopyRow;
static QString m_CopyPanel;
protected slots:
virtual void OnMenu(const QPoint& Point);

View File

@ -68,6 +68,10 @@
<OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
<IntDir>$(Platform)\$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
<IntDir>$(Platform)\$(Configuration)\</IntDir>
</PropertyGroup>
<ImportGroup Condition="Exists('$(QtMsBuild)\qt_defaults.props')">
<Import Project="$(QtMsBuild)\qt_defaults.props" />
</ImportGroup>

View File

@ -65,6 +65,10 @@
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<IntDir>$(Platform)\$(Configuration)\</IntDir>
<OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
<IntDir>$(Platform)\$(Configuration)\</IntDir>
</PropertyGroup>
@ -135,6 +139,7 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<TargetMachine>MachineX86</TargetMachine>
<AdditionalOptions> /SUBSYSTEM:WINDOWS</AdditionalOptions>
<AdditionalDependencies>ntdll.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">

View File

@ -28,6 +28,8 @@ typedef long NTSTATUS;
#include "..\..\Sandboxie\common\win32_ntddk.h"
#include <psapi.h> // For access to GetModuleFileNameEx
#include <winnt.h>
//struct SBoxedProcess
//{
//};
@ -52,9 +54,111 @@ CBoxedProcess::~CBoxedProcess()
//delete m;
}
typedef enum _PEB_OFFSET
{
PhpoCurrentDirectory,
PhpoDllPath,
PhpoImagePathName,
PhpoCommandLine,
PhpoWindowTitle,
PhpoDesktopInfo,
PhpoShellInfo,
PhpoRuntimeData,
PhpoTypeMask = 0xffff,
PhpoWow64 = 0x10000
} PEB_OFFSET;
typedef struct _STRING32
{
USHORT Length;
USHORT MaximumLength;
ULONG Buffer;
} UNICODE_STRING32, * PUNICODE_STRING32;
QString CBoxedProcess__GetPebString(HANDLE ProcessHandle, PEB_OFFSET Offset)
{
BOOL is64BitOperatingSystem = FALSE;
BOOL isWow64Process = FALSE;
#ifdef _WIN64
is64BitOperatingSystem = TRUE;
#else // ! _WIN64
IsWow64Process(GetCurrentProcess(), &isWow64Process);
is64BitOperatingSystem = isWow64Process;
#endif _WIN64
BOOL isTargetWow64Process = FALSE;
IsWow64Process(ProcessHandle, &isTargetWow64Process);
BOOL isTarget64BitProcess = is64BitOperatingSystem && !isTargetWow64Process;
ULONG processParametersOffset = isTarget64BitProcess ? 0x20 : 0x10;
ULONG offset = 0;
switch (Offset)
{
case PhpoCurrentDirectory: offset = isTarget64BitProcess ? 0x38 : 0x24; break;
case PhpoCommandLine: offset = isTarget64BitProcess ? 0x70 : 0x40; break;
default:
return QString();
}
wstring s;
if (isTargetWow64Process) // OS : 64Bit, Cur : 32 or 64, Tar: 32bit
{
PVOID peb32;
if (!NT_SUCCESS(NtQueryInformationProcess(ProcessHandle, ProcessWow64Information, &peb32, sizeof(PVOID), NULL)))
return QString();
ULONG procParams;
if (!NT_SUCCESS(NtReadVirtualMemory(ProcessHandle, (PVOID)((ULONG64)peb32 + processParametersOffset), &procParams, sizeof(ULONG), NULL)))
return QString();
UNICODE_STRING32 us;
if (!NT_SUCCESS(NtReadVirtualMemory(ProcessHandle, (PVOID)(procParams + offset), &us, sizeof(UNICODE_STRING32), NULL)))
return QString();
if ((us.Buffer == 0) || (us.Length == 0))
return QString();
s.resize(us.Length / 2);
if (!NT_SUCCESS(NtReadVirtualMemory(ProcessHandle, (PVOID)us.Buffer, (PVOID)s.c_str(), s.length() * 2, NULL)))
return QString();
}
else if (isWow64Process) //Os : 64Bit, Cur 32, Tar 64
{
return QString(); // not supported
}
else // Os,Cur,Tar : 64 or 32
{
PROCESS_BASIC_INFORMATION pbi;
if (!NT_SUCCESS(NtQueryInformationProcess(ProcessHandle, ProcessBasicInformation, &pbi, sizeof(PROCESS_BASIC_INFORMATION), NULL)))
return QString();
ULONG_PTR procParams;
if (!NT_SUCCESS(NtReadVirtualMemory(ProcessHandle, (PVOID)((ULONG64)pbi.PebBaseAddress + processParametersOffset), &procParams, sizeof(ULONG_PTR), NULL)))
return QString();
UNICODE_STRING us;
if (!NT_SUCCESS(NtReadVirtualMemory(ProcessHandle, (PVOID)(procParams + offset), &us, sizeof(UNICODE_STRING), NULL)))
return QString();
if ((us.Buffer == 0) || (us.Length == 0))
return QString();
s.resize(us.Length / 2);
if (!NT_SUCCESS(NtReadVirtualMemory(ProcessHandle, (PVOID)us.Buffer, (PVOID)s.c_str(), s.length() * 2, NULL)))
return QString();
}
return QString::fromWCharArray(s.c_str());
}
bool CBoxedProcess::InitProcessInfo()
{
HANDLE ProcessHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, (DWORD)m_ProcessId);
HANDLE ProcessHandle;
ProcessHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, (DWORD)m_ProcessId);
if (ProcessHandle == INVALID_HANDLE_VALUE) // try with less rights
ProcessHandle = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, (DWORD)m_ProcessId);
if (ProcessHandle == INVALID_HANDLE_VALUE)
return false;
@ -68,6 +172,27 @@ bool CBoxedProcess::InitProcessInfo()
if (DWORD size = GetModuleFileNameEx(ProcessHandle, NULL, filename, MAX_PATH))
m_ImagePath = QString::fromWCharArray(filename);
if (1) // windows 8.1 and later // todo add os version check
{
#define ProcessCommandLineInformation ((PROCESSINFOCLASS)60)
ULONG returnLength = 0;
NTSTATUS status = NtQueryInformationProcess(ProcessHandle, ProcessCommandLineInformation, NULL, 0, &returnLength);
if (!(status != STATUS_BUFFER_OVERFLOW && status != STATUS_BUFFER_TOO_SMALL && status != STATUS_INFO_LENGTH_MISMATCH))
{
PUNICODE_STRING commandLine = (PUNICODE_STRING)malloc(returnLength);
status = NtQueryInformationProcess(ProcessHandle, ProcessCommandLineInformation, commandLine, returnLength, &returnLength);
if (NT_SUCCESS(status) && commandLine->Buffer != NULL)
m_CommandLine = QString::fromWCharArray(commandLine->Buffer);
free(commandLine);
}
#undef ProcessCommandLineInformation
}
if (m_CommandLine.isEmpty()) // fall back to teh win 7 method - requirers PROCESS_VM_READ
{
m_CommandLine = CBoxedProcess__GetPebString(ProcessHandle, PhpoCommandLine);
}
NtClose(ProcessHandle);
return true;
}

View File

@ -34,6 +34,7 @@ public:
virtual quint32 GetProcessId() const { return m_ProcessId; }
virtual quint32 GetParendPID() const { return m_ParendPID; }
virtual QString GetProcessName() const { return m_ImageName; }
virtual QString GetCommandLine() const { return m_CommandLine; }
virtual QString GetFileName() const { return m_ImagePath; }
virtual QDateTime GetTimeStamp() const { return m_StartTime; }
@ -53,6 +54,7 @@ protected:
quint32 m_ParendPID;
QString m_ImageName;
QString m_ImagePath;
QString m_CommandLine;
quint32 m_SessionId;
QDateTime m_StartTime;
quint64 m_uTerminated;

View File

@ -281,7 +281,8 @@ SB_STATUS CSbieAPI::Connect(bool withQueue)
m->lastRecordNum = 0;
#ifndef _DEBUG
QStringList CompatVersions = QStringList () << "5.45.0";
// Note: this lib is not using all functions hence it can be compatible with multiple driver ABI revisions
QStringList CompatVersions = QStringList () << "5.45.0" << "5.46.0";
QString CurVersion = GetVersion();
if (!CompatVersions.contains(CurVersion))
{
@ -1079,7 +1080,9 @@ SB_STATUS CSbieAPI::UpdateProcesses(bool bKeep)
SB_STATUS CSbieAPI__GetProcessPIDs(SSbieAPI* m, const QString& BoxName, ULONG* boxed_pids_512)
{
wstring box_name = BoxName.toStdWString(); // WCHAR [34]
WCHAR box_name[34];
BoxName.toWCharArray(box_name); // fix-me: potential overflow
box_name[BoxName.size()] = L'\0';
BOOLEAN all_sessions = TRUE;
ULONG which_session = 0; // -1 for current session
@ -1088,19 +1091,22 @@ SB_STATUS CSbieAPI__GetProcessPIDs(SSbieAPI* m, const QString& BoxName, ULONG* b
memset(parms, 0, sizeof(parms));
parms[0] = API_ENUM_PROCESSES;
parms[1] = (ULONG64)boxed_pids_512;
parms[2] = (ULONG64)box_name.c_str();
parms[2] = (ULONG64)box_name;
parms[3] = (ULONG64)all_sessions;
parms[4] = (ULONG64)which_session;
return m->IoControl(parms);
NTSTATUS status = m->IoControl(parms);
if (!NT_SUCCESS(status))
return SB_ERR(status);
return SB_OK;
}
SB_STATUS CSbieAPI::UpdateProcesses(bool bKeep, const CSandBoxPtr& pBox)
{
ULONG boxed_pids[512]; // ULONG [512]
NTSTATUS status = CSbieAPI__GetProcessPIDs(m, pBox->GetName(), boxed_pids);
if (!NT_SUCCESS(status))
return SB_ERR(status);
SB_STATUS Status = CSbieAPI__GetProcessPIDs(m, pBox->GetName(), boxed_pids);
if (Status.IsError())
return Status;
QMap<quint32, CBoxedProcessPtr> OldProcessList = pBox->m_ProcessList;
@ -1762,6 +1768,8 @@ CBoxedProcessPtr CSbieAPI::OnProcessBoxed(quint32 ProcessId, const QString& Path
pProcess = CBoxedProcessPtr(NewBoxedProcess(ProcessId, pBox.data()));
pBox->m_ProcessList.insert(ProcessId, pProcess);
m_BoxedProxesses.insert(ProcessId, pProcess);
pProcess->InitProcessInfo();
}
if (pProcess->m_ParendPID == 0){
@ -1891,9 +1899,8 @@ bool CSbieAPI::GetMonitor()
CResLogEntryPtr LogEntry = CResLogEntryPtr(new CResLogEntry(pid, type, Data));
QWriteLocker Lock(&m_ResLogMutex);
if (!m_ResLogList.isEmpty() && m_ResLogList.last()->GetValue() == LogEntry->GetValue())
{
m_ResLogList.last()->IncrCounter();
if (!m_ResLogList.isEmpty() && m_ResLogList.last()->Equals(LogEntry)) {
m_ResLogList.last()->Merge(LogEntry);
return true;
}
m_ResLogList.append(LogEntry);
@ -1954,12 +1961,11 @@ QString CResLogEntry::GetStautsStr() const
if (m_Type.Trace)
return "Trace";
QString Str;
if(m_Type.Open)
Str += "O ";
return "Open";
if(m_Type.Deny)
Str += "X ";
return Str;
return "Closed";
return "";
}
///////////////////////////////////////////////////////////////////////////////

View File

@ -38,9 +38,15 @@ public:
QString GetValue() const { return m_Name; }
QString GetTypeStr() const;
QString GetStautsStr() const;
void IncrCounter() { m_Counter++; }
int GetCount() const { return m_Counter; }
bool Equals(const QSharedDataPointer<CResLogEntry>& pOther) const {
return pOther->m_ProcessId == this->m_ProcessId
//&& pOther->m_Type.Flags == this->m_Type.Flags
&& pOther->m_Name == this->m_Name;
}
void Merge(const QSharedDataPointer<CResLogEntry>& pOther) { m_Counter++; this->m_Type.Flags |= pOther->m_Type.Flags; }
quint64 GetUID() const { return m_uid; }
protected:

View File

@ -6,7 +6,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>357</width>
<width>372</width>
<height>274</height>
</rect>
</property>

View File

@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>622</width>
<height>412</height>
<height>473</height>
</rect>
</property>
<property name="sizePolicy">
@ -45,7 +45,7 @@
<enum>QTabWidget::West</enum>
</property>
<property name="currentIndex">
<number>8</number>
<number>0</number>
</property>
<widget class="QWidget" name="tabGeneral">
<attribute name="title">
@ -64,24 +64,7 @@
<layout class="QGridLayout" name="gridLayout_27">
<item row="1" column="0">
<layout class="QGridLayout" name="gridLayout_8">
<item row="2" column="6">
<widget class="QLabel" name="label_14">
<property name="text">
<string>px Width</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="6" column="1" colspan="6">
<widget class="QCheckBox" name="chkDropRights">
<property name="text">
<string>Drop rights from Administrators and Power Users groups</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<item row="1" column="0" colspan="3">
<widget class="QLabel" name="label_20">
<property name="text">
<string>Sandbox Indicator in title:</string>
@ -91,62 +74,7 @@
</property>
</widget>
</item>
<item row="2" column="2" colspan="2">
<widget class="QComboBox" name="cmbBoxBorder"/>
</item>
<item row="3" column="0" colspan="2">
<widget class="QLabel" name="label_10">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="toolTip">
<string>Protect the system from sandboxed processes</string>
</property>
<property name="text">
<string>General restrictions</string>
</property>
</widget>
</item>
<item row="7" column="2">
<spacer name="verticalSpacer_4">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="4">
<widget class="QToolButton" name="btnBorderColor">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QLabel" name="label_7">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Appearance</string>
</property>
</widget>
</item>
<item row="1" column="2" colspan="2">
<widget class="QComboBox" name="cmbBoxIndicator"/>
</item>
<item row="2" column="5">
<item row="2" column="6">
<widget class="QSpinBox" name="spinBorderWidth">
<property name="minimum">
<number>1</number>
@ -159,6 +87,16 @@
</property>
</widget>
</item>
<item row="2" column="3" colspan="2">
<widget class="QComboBox" name="cmbBoxBorder"/>
</item>
<item row="8" column="1" colspan="6">
<widget class="QCheckBox" name="chkBlockSpooler">
<property name="text">
<string>Block access to the printer spooler</string>
</property>
</widget>
</item>
<item row="4" column="1" colspan="6">
<widget class="QCheckBox" name="chkBlockNetShare">
<property name="text">
@ -166,7 +104,14 @@
</property>
</widget>
</item>
<item row="2" column="0" colspan="2">
<item row="6" column="1" colspan="6">
<widget class="QCheckBox" name="chkDropRights">
<property name="text">
<string>Drop rights from Administrators and Power Users groups</string>
</property>
</widget>
</item>
<item row="2" column="0" colspan="3">
<widget class="QLabel" name="label_21">
<property name="text">
<string>Sandboxed window border:</string>
@ -183,6 +128,136 @@
</property>
</widget>
</item>
<item row="11" column="2" colspan="5">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="7">
<widget class="QLabel" name="label_14">
<property name="text">
<string>px Width</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_30">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>16</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_7">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="text">
<string>Appearance</string>
</property>
</widget>
</item>
<item row="1" column="3" colspan="2">
<widget class="QComboBox" name="cmbBoxIndicator"/>
</item>
<item row="3" column="0" colspan="3">
<widget class="QLabel" name="label_10">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="toolTip">
<string>Protect the system from sandboxed processes</string>
</property>
<property name="text">
<string>General restrictions</string>
</property>
</widget>
</item>
<item row="2" column="5">
<widget class="QToolButton" name="btnBorderColor">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="10" column="2" colspan="5">
<widget class="QCheckBox" name="chkPrintToFile">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Allow the print spooler to print to files outside the sandbox</string>
</property>
</widget>
</item>
<item row="11" column="1">
<spacer name="verticalSpacer_17">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="7" column="0" colspan="3">
<widget class="QLabel" name="label_31">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="toolTip">
<string>Protect the system from sandboxed processes</string>
</property>
<property name="text">
<string>Printing</string>
</property>
</widget>
</item>
<item row="9" column="2" colspan="6">
<widget class="QCheckBox" name="chkOpenSpooler">
<property name="text">
<string>Remove spooler restriction, printers can be installed outside the sandbox</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
@ -192,13 +267,6 @@
<string>Run Menu</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_33">
<item row="1" column="1">
<widget class="QPushButton" name="btnAddExe">
<property name="text">
<string>Browse</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
@ -209,27 +277,6 @@
</property>
</widget>
</item>
<item row="1" column="0" rowspan="4">
<widget class="QTreeWidget" name="treeRun">
<column>
<property name="text">
<string>Name</string>
</property>
</column>
<column>
<property name="text">
<string>Command Line</string>
</property>
</column>
</widget>
</item>
<item row="4" column="1">
<widget class="QPushButton" name="btnDelCmd">
<property name="text">
<string>Remove</string>
</property>
</widget>
</item>
<item row="3" column="1">
<spacer name="verticalSpacer_15">
<property name="orientation">
@ -243,10 +290,55 @@
</property>
</spacer>
</item>
<item row="2" column="1">
<widget class="QPushButton" name="btnAddCmd">
<item row="1" column="0" rowspan="4">
<widget class="QTreeWidget" name="treeRun">
<column>
<property name="text">
<string>Add Command</string>
<string>Name</string>
</property>
</column>
<column>
<property name="text">
<string>Command Line</string>
</property>
</column>
</widget>
</item>
<item row="1" column="1">
<widget class="QToolButton" name="btnAddCmd">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>23</height>
</size>
</property>
<property name="text">
<string>Add program</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QToolButton" name="btnDelCmd">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>23</height>
</size>
</property>
<property name="text">
<string>Remove</string>
</property>
</widget>
</item>
@ -347,6 +439,107 @@
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_6">
<attribute name="title">
<string>Auto Start</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="0">
<widget class="QLabel" name="label_32">
<property name="text">
<string>Here you can specify programs and/or services that are to be started automatically in the sandbox when it is activated</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0" rowspan="4">
<widget class="QTreeWidget" name="treeAutoStart">
<column>
<property name="text">
<string>Type</string>
</property>
</column>
<column>
<property name="text">
<string notr="true">Program/Service</string>
</property>
</column>
</widget>
</item>
<item row="4" column="1">
<widget class="QToolButton" name="btnDelAuto">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>23</height>
</size>
</property>
<property name="text">
<string>Remove</string>
</property>
</widget>
</item>
<item row="3" column="1">
<spacer name="verticalSpacer_4">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="1">
<widget class="QToolButton" name="btnAddAutoExe">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>23</height>
</size>
</property>
<property name="text">
<string>Add program</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QToolButton" name="btnAddAutoSvc">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>23</height>
</size>
</property>
<property name="text">
<string>Add service</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
@ -1107,26 +1300,10 @@ For files access you can use 'Direct All' instead to make it apply to all progra
<layout class="QGridLayout" name="gridLayout_26">
<item row="0" column="1">
<layout class="QGridLayout" name="gridLayout_2">
<item row="12" column="2">
<widget class="QCheckBox" name="chkOpenCredentials">
<item row="8" column="1" colspan="2">
<widget class="QCheckBox" name="chkProtectSCM">
<property name="text">
<string>Open Windows Credentials Store</string>
</property>
</widget>
</item>
<item row="4" column="0" colspan="2">
<widget class="QLabel" name="label_12">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="toolTip">
<string>Protect the sandbox integrity itself</string>
</property>
<property name="text">
<string>Sandbox protection</string>
<string>Limit access to the emulated service control manager to privileged processes</string>
</property>
</widget>
</item>
@ -1143,43 +1320,15 @@ For files access you can use 'Direct All' instead to make it apply to all progra
</property>
</widget>
</item>
<item row="7" column="1" colspan="2">
<widget class="QCheckBox" name="chkProtectSystem">
<property name="text">
<string>Protect sandboxed SYSTEM processes from unprivileged unsandboxed processes</string>
</property>
</widget>
</item>
<item row="3" column="1" colspan="2">
<widget class="QCheckBox" name="chkNoWindowRename">
<property name="text">
<string>Don't alter window class names created by sandboxed programs</string>
</property>
</widget>
</item>
<item row="2" column="1" colspan="2">
<widget class="QCheckBox" name="chkPreferExternalManifest">
<property name="text">
<string>Force usage of custom dummy Manifest files (legacy behaviour)</string>
</property>
</widget>
</item>
<item row="6" column="1" colspan="2">
<item row="9" column="1" colspan="2">
<widget class="QCheckBox" name="chkProtectRpcSs">
<property name="text">
<string>Start the sandboxed RpcSs as a SYSTEM process (breaks some compatibility)</string>
</property>
</widget>
</item>
<item row="11" column="1" colspan="2">
<widget class="QCheckBox" name="chkOpenProtectedStorage">
<property name="text">
<string>Open System Protected Storage</string>
</property>
</widget>
</item>
<item row="10" column="0" colspan="2">
<widget class="QLabel" name="label_18">
<item row="7" column="0" colspan="3">
<widget class="QLabel" name="label_12">
<property name="font">
<font>
<weight>75</weight>
@ -1187,14 +1336,14 @@ For files access you can use 'Direct All' instead to make it apply to all progra
</font>
</property>
<property name="toolTip">
<string>Protect the system from sandboxed processes</string>
<string>Protect the sandbox integrity itself</string>
</property>
<property name="text">
<string>Lift restrictions</string>
<string>Sandbox protection</string>
</property>
</widget>
</item>
<item row="14" column="2">
<item row="15" column="2">
<spacer name="horizontalSpacer_6">
<property name="orientation">
<enum>Qt::Horizontal</enum>
@ -1207,21 +1356,49 @@ For files access you can use 'Direct All' instead to make it apply to all progra
</property>
</spacer>
</item>
<item row="9" column="1" colspan="2">
<widget class="QCheckBox" name="chkAddToJob">
<item row="3" column="1" colspan="2">
<widget class="QCheckBox" name="chkNoWindowRename">
<property name="text">
<string>Add sandboxed processes to job objects (recommended)</string>
<string>Don't alter window class names created by sandboxed programs</string>
</property>
</widget>
</item>
<item row="5" column="1" colspan="2">
<widget class="QCheckBox" name="chkProtectSCM">
<item row="13" column="2">
<widget class="QCheckBox" name="chkOpenCredentials">
<property name="text">
<string>Limit access to the emulated service control manager to privileged processes</string>
<string>Open Windows Credentials Store</string>
</property>
</widget>
</item>
<item row="14" column="1">
<item row="6" column="1" colspan="2">
<widget class="QCheckBox" name="chkRestrictServices">
<property name="text">
<string>Do not start sandboxed services using a system token (recommended)</string>
</property>
</widget>
</item>
<item row="12" column="1" colspan="2">
<widget class="QCheckBox" name="chkOpenProtectedStorage">
<property name="text">
<string>Open System Protected Storage</string>
</property>
</widget>
</item>
<item row="14" column="1" colspan="2">
<widget class="QCheckBox" name="chkOpenSmartCard">
<property name="text">
<string>Allow access to Smart Cards</string>
</property>
</widget>
</item>
<item row="2" column="1" colspan="2">
<widget class="QCheckBox" name="chkPreferExternalManifest">
<property name="text">
<string>Force usage of custom dummy Manifest files (legacy behaviour)</string>
</property>
</widget>
</item>
<item row="15" column="1">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
@ -1234,7 +1411,37 @@ For files access you can use 'Direct All' instead to make it apply to all progra
</property>
</spacer>
</item>
<item row="8" column="0" colspan="2">
<item row="10" column="1" colspan="2">
<widget class="QCheckBox" name="chkProtectSystem">
<property name="text">
<string>Protect sandboxed SYSTEM processes from unprivileged unsandboxed processes</string>
</property>
</widget>
</item>
<item row="5" column="1" colspan="2">
<widget class="QCheckBox" name="chkAddToJob">
<property name="text">
<string>Add sandboxed processes to job objects (recommended)</string>
</property>
</widget>
</item>
<item row="11" column="0" colspan="3">
<widget class="QLabel" name="label_18">
<property name="font">
<font>
<weight>75</weight>
<bold>true</bold>
</font>
</property>
<property name="toolTip">
<string>Protect the system from sandboxed processes</string>
</property>
<property name="text">
<string>Lift security restrictions</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_22">
<property name="font">
<font>
@ -1246,7 +1453,7 @@ For files access you can use 'Direct All' instead to make it apply to all progra
<string>Protect the sandbox integrity itself</string>
</property>
<property name="text">
<string>Sandbox Isolation</string>
<string>Sandbox isolation</string>
</property>
</widget>
</item>
@ -1254,6 +1461,53 @@ For files access you can use 'Direct All' instead to make it apply to all progra
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_2">
<attribute name="title">
<string>Auto Exec</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_35">
<item row="1" column="1">
<widget class="QPushButton" name="btnAddAutoExec">
<property name="text">
<string>Add Command</string>
</property>
</widget>
</item>
<item row="2" column="1">
<spacer name="verticalSpacer_18">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="3" column="1">
<widget class="QPushButton" name="btnDelAutoExec">
<property name="text">
<string>Remove</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_33">
<property name="text">
<string>Here you can specify a list of commands that are executed every time the sandbox is initially populated.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0" rowspan="3">
<widget class="QListWidget" name="lstAutoExec"/>
</item>
</layout>
</widget>
<widget class="QWidget" name="tabHideProcesses">
<property name="font">
<font>
@ -1301,7 +1555,7 @@ For files access you can use 'Direct All' instead to make it apply to all progra
<item row="4" column="1">
<widget class="QPushButton" name="btnDelProcess">
<property name="text">
<string>Remove Process</string>
<string>Remove</string>
</property>
</widget>
</item>
@ -1523,8 +1777,8 @@ instead of &quot;*&quot;.</string>
<rect>
<x>0</x>
<y>0</y>
<width>98</width>
<height>28</height>
<width>530</width>
<height>312</height>
</rect>
</property>
<layout class="QGridLayout" name="dbgLayout">

View File

@ -45,7 +45,7 @@
<enum>QTabWidget::North</enum>
</property>
<property name="currentIndex">
<number>0</number>
<number>1</number>
</property>
<widget class="QWidget" name="tabGeneral">
<attribute name="title">
@ -346,13 +346,6 @@
</property>
</widget>
</item>
<item row="2" column="1" colspan="2">
<widget class="QCheckBox" name="chkSeparateUserFolders">
<property name="text">
<string>Separate user folders</string>
</property>
</widget>
</item>
<item row="10" column="1">
<spacer name="verticalSpacer_2">
<property name="orientation">
@ -373,6 +366,20 @@
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QCheckBox" name="chkSeparateUserFolders">
<property name="text">
<string>Separate user folders</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QCheckBox" name="chkAutoRoot">
<property name="text">
<string>Portable root folder</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>

View File

@ -1,6 +1,7 @@
#include "stdafx.h"
#include "ResMonModel.h"
#include "../MiscHelpers/Common/Common.h"
#include "../SbiePlusAPI.h"
CResMonModel::CResMonModel(QObject *parent)
:CListItemModel(parent)
@ -79,8 +80,8 @@ void CResMonModel::Sync(const QList<CResLogEntryPtr>& List, QSet<quint64> PIDs)
case eProcess: Value = pEntry->GetProcessId(); break;
case eTimeStamp: Value = pEntry->GetTimeStamp(); break;
case eType: Value = pEntry->GetTypeStr(); break;
case eValue: Value = pEntry->GetValue(); break;
case eStatus: Value = pEntry->GetStautsStr(); break;
case eValue: Value = pEntry->GetValue(); break;
}
SResLogNode::SValue& ColValue = pNode->Values[section];
@ -93,7 +94,12 @@ void CResMonModel::Sync(const QList<CResLogEntryPtr>& List, QSet<quint64> PIDs)
switch (section)
{
case eProcess: ColValue.Formated = QString::number(pEntry->GetProcessId()); break;
case eProcess:
{
CBoxedProcessPtr pProcess = theAPI->GetProcessById(pEntry->GetProcessId());
ColValue.Formated = QString("%1 (%2)").arg(pProcess.isNull() ? tr("Unknown") : pProcess->GetProcessName()).arg(pEntry->GetProcessId());
break;
}
case eTimeStamp: ColValue.Formated = pEntry->GetTimeStamp().toString("hh:mm:ss.zzz"); break;
//case eType: ColValue.Formated = ; break;
//case eValue: ColValue.Formated = ; break;
@ -141,8 +147,8 @@ QVariant CResMonModel::headerData(int section, Qt::Orientation orientation, int
case eProcess: return tr("Process");
case eTimeStamp: return tr("Time Stamp");
case eType: return tr("Type");
case eValue: return tr("Value");
case eStatus: return tr("Status");
case eValue: return tr("Value");
}
}
return QVariant();

View File

@ -23,8 +23,8 @@ public:
eProcess = 0,
eTimeStamp,
eType,
eValue,
eStatus,
eValue,
eCount
};

View File

@ -66,12 +66,22 @@ bool CSbieModel::TestProcPath(const QList<QVariant>& Path, const QString& BoxNam
return Path.size() == Index;
}
QString CSbieModel__AddGroupMark(const QString& Name)
{
return Name.isEmpty() ? "" : ("!" + Name);
}
QString CSbieModel__RemoveGroupMark(const QString& Name)
{
return Name.left(1) == "!" ? Name.mid(1) : Name;
}
QString CSbieModel::FindParent(const QVariant& Name, const QMap<QString, QStringList>& Groups)
{
for(auto I = Groups.begin(); I != Groups.end(); ++I)
{
if (I.value().contains(Name.toString(), Qt::CaseInsensitive))
return I.key();
if (I.value().contains(CSbieModel__RemoveGroupMark(Name.toString()), Qt::CaseInsensitive))
return CSbieModel__AddGroupMark(I.key());
}
return QString();
}
@ -99,7 +109,7 @@ QList<QVariant> CSbieModel::Sync(const QMap<QString, CSandBoxPtr>& BoxList, cons
{
if (Group.isEmpty())
continue;
QVariant ID = Group;
QVariant ID = CSbieModel__AddGroupMark(Group);
QHash<QVariant, STreeNode*>::iterator I = Old.find(ID);
SSandBoxNode* pNode = I != Old.end() ? static_cast<SSandBoxNode*>(I.value()) : NULL;
@ -299,7 +309,12 @@ bool CSbieModel::Sync(const CSandBoxPtr& pBox, const QList<QVariant>& Path, cons
//case eTitle: break; // todo
//case eLogCount: break; // todo Value = pProcess->GetResourceLog().count(); break;
case eTimeStamp: Value = pProcess->GetTimeStamp(); break;
case ePath: Value = pProcess->GetFileName(); break;
//case ePath: Value = pProcess->GetFileName(); break;
case ePath: {
QString CmdLine = pProcess->GetCommandLine();
Value = CmdLine.isEmpty() ? pProcess->GetFileName() : CmdLine;
break;
}
}
SSandBoxNode::SValue& ColValue = pNode->Values[section];
@ -400,7 +415,7 @@ QVariant CSbieModel::headerData(int section, Qt::Orientation orientation, int ro
//case eTitle: return tr("Title");
//case eLogCount: return tr("Log Count");
case eTimeStamp: return tr("Start Time");
case ePath: return tr("Path");
case ePath: return tr("Path / Command Line");
}
}
return QVariant();

View File

@ -122,6 +122,10 @@ CSandMan::CSandMan(QWidget *parent)
m_bConnectPending = false;
m_bStopPending = false;
CPanelView::m_CopyCell = tr("Copy Cell");
CPanelView::m_CopyRow = tr("Copy Row");
CPanelView::m_CopyPanel = tr("Copy Panel");
CreateMenus();
m_pMainWidget = new QWidget();
@ -536,9 +540,9 @@ void CSandMan::OnMessage(const QString& Message)
if (Status != "OK")
{
if(m_bStopPending)
QMessageBox::warning(NULL, tr("Sandboxie-Plus - Error"), tr("Failed to stop all sandboxie components"));
QMessageBox::warning(NULL, tr("Sandboxie-Plus - Error"), tr("Failed to stop all Sandboxie components"));
else if(m_bConnectPending)
QMessageBox::warning(NULL, tr("Sandboxie-Plus - Error"), tr("Failed to start required sandboxie components"));
QMessageBox::warning(NULL, tr("Sandboxie-Plus - Error"), tr("Failed to start required Sandboxie components"));
OnLogMessage(tr("Maintenance operation %1").arg(Status));
CheckResults(QList<SB_STATUS>() << SB_ERR(SB_Message, QVariantList() << Status));
@ -676,8 +680,10 @@ void CSandMan::OnSelectionChanged()
void CSandMan::OnStatusChanged()
{
bool isConnected = theAPI->IsConnected();
QString appTitle = tr("Sandboxie-Plus v%1").arg(GetVersion());
if (theAPI->IsConnected())
if (isConnected)
{
OnLogMessage(tr("Sbie Directory: %1").arg(theAPI->GetSbiePath()));
OnLogMessage(tr("Loaded Config: %1").arg(theAPI->GetIniPath()));
@ -689,9 +695,20 @@ void CSandMan::OnStatusChanged()
{
appTitle.append(tr(" - Portable"));
if (theConf->GetBool("Options/PortableRootDir", true))
int PortableRootDir = theConf->GetInt("Options/PortableRootDir", -1);
if (PortableRootDir == -1)
{
QString BoxPath = QDir::cleanPath(QApplication::applicationDirPath() + "/../SandBoxes").replace("/", "\\");
bool State = false;
PortableRootDir = CCheckableMessageBox::question(this, "Sandboxie-Plus", tr("Sandboxie-Plus was started in portable mode, do you want to put the SandBox folder into its parent directory?")
, tr("Don't show this message again."), &State, QDialogButtonBox::Yes | QDialogButtonBox::No, QDialogButtonBox::Yes, QMessageBox::Information) == QDialogButtonBox::Yes ? 1 : 0;
if (State)
theConf->SetValue("Options/PortableRootDir", PortableRootDir);
}
if (PortableRootDir)
{
QString BoxPath = QDir::cleanPath(QApplication::applicationDirPath() + "/../Sandbox/%SANDBOX%").replace("/", "\\");
theAPI->GetGlobalSettings()->SetText("FileRootPath", BoxPath);
}
}
@ -706,6 +723,8 @@ void CSandMan::OnStatusChanged()
}
}
m_pBoxView->Clear();
OnIniReloaded();
if (theConf->GetBool("Options/WatchIni", true))
@ -715,9 +734,26 @@ void CSandMan::OnStatusChanged()
{
appTitle.append(tr(" - NOT connected").arg(theAPI->GetVersion()));
m_pBoxView->Clear();
theAPI->WatchIni(false);
}
this->setWindowTitle(appTitle);
m_pNew->setEnabled(isConnected);
m_pEmptyAll->setEnabled(isConnected);
m_pDisableForce->setEnabled(isConnected);
m_pDisableForce2->setEnabled(isConnected);
//m_pCleanUpMenu->setEnabled(isConnected);
//m_pCleanUpButton->setEnabled(isConnected);
//m_pKeepTerminated->setEnabled(isConnected);
m_pEditIni->setEnabled(isConnected);
m_pReloadIni->setEnabled(isConnected);
m_pEnableMonitoring->setEnabled(isConnected);
m_pEnableLogging->setEnabled(isConnected);
}
void CSandMan::OnMenuHover(QAction* action)
@ -827,6 +863,8 @@ void CSandMan::RecoverFilesAsync(const CSbieProgressPtr& pProgress, const QList<
{
SB_STATUS Status = SB_OK;
int OverwriteOnExist = -1;
QStringList Unrecovered;
for (QList<QPair<QString, QString>>::const_iterator I = FileList.begin(); I != FileList.end(); ++I)
{
@ -838,6 +876,30 @@ void CSandMan::RecoverFilesAsync(const CSbieProgressPtr& pProgress, const QList<
pProgress->ShowMessage(tr("Recovering file %1 to %2").arg(FileName).arg(RecoveryFolder));
QDir().mkpath(RecoveryFolder);
if (QFile::exists(RecoveryPath))
{
int Overwrite = OverwriteOnExist;
if (Overwrite == -1)
{
bool forAll = false;
int retVal = 0;
QMetaObject::invokeMethod(theGUI, "ShowQuestion", Qt::BlockingQueuedConnection, // show this question using the GUI thread
Q_RETURN_ARG(int, retVal),
Q_ARG(QString, tr("The file %1 already exists, do you want to overwrite it?").arg(RecoveryPath)),
Q_ARG(QString, tr("Do this for all files!")),
Q_ARG(bool*, &forAll),
Q_ARG(int, QDialogButtonBox::Yes | QDialogButtonBox::No),
Q_ARG(int, QDialogButtonBox::No)
);
Overwrite = retVal == QDialogButtonBox::Yes ? 1 : 0;
if (forAll)
OverwriteOnExist = Overwrite;
}
if (Overwrite == 1)
QFile::remove(RecoveryPath);
}
if (!QFile::rename(BoxPath, RecoveryPath))
Unrecovered.append(BoxPath);
}
@ -862,6 +924,11 @@ void CSandMan::RecoverFilesAsync(const CSbieProgressPtr& pProgress, const QList<
pProgress->Finish(Status);
}
int CSandMan::ShowQuestion(const QString& question, const QString& checkBoxText, bool* checkBoxSetting, int buttons, int defaultButton)
{
return CCheckableMessageBox::question(this, "Sandboxie-Plus", question, checkBoxText, checkBoxSetting, (QDialogButtonBox::StandardButtons)buttons, (QDialogButtonBox::StandardButton)defaultButton, QMessageBox::Question);
}
void CSandMan::OnNotAuthorized(bool bLoginRequired, bool& bRetry)
{
if (!bLoginRequired)
@ -1140,6 +1207,7 @@ void CSandMan::OnResetMsgs()
{
theConf->SetValue("Options/PortableStop", -1);
theConf->SetValue("Options/PortableStart", -1);
theConf->SetValue("Options/PortableRootDir", -1);
theConf->SetValue("Options/CheckForUpdates", 2);
@ -1224,8 +1292,8 @@ void CSandMan::OnSetLogging()
{
if (theConf->GetBool("Options/ApiLogInfo", true))
{
QString Message = tr("To use API logging you must first set up the LogApiDll from https://github.com/sandboxie-plus/LogApiDll with one or more sand boxes.\n"
"Please download the latest release and set it up with the sandboxie.ini as instructed in the README.md of the project.");
QString Message = tr("To use API logging you must first set up the LogApiDll from https://github.com/sandboxie-plus/LogApiDll with one or more sandboxes.\n"
"Please download the latest release and set it up with the Sandboxie.ini as instructed in the README.md of the project.");
bool State = false;
CCheckableMessageBox::question(this, "Sandboxie-Plus", Message
@ -1611,7 +1679,7 @@ void CSandMan::OnUpdateCheck()
theConf->SetValue("Options/NextCheckForUpdates", QDateTime::currentDateTime().addDays(7).toTime_t());
if (bManual)
QMessageBox::information(this, "Sandboxie-Plus", tr("No new updates found, your Sandboxie-Plus is up to date."));
QMessageBox::information(this, "Sandboxie-Plus", tr("No new updates found, your Sandboxie-Plus is up-to-date."));
}
}
@ -1685,7 +1753,7 @@ void CSandMan::OnAbout()
"<p>Copyright (c) 2020-2021 by DavidXanatos</p>"
).arg(GetVersion());
QString AboutText = tr(
"<p>Sandboxie-Plus is an open source continuation of the well known Sandboxie.</p>"
"<p>Sandboxie-Plus is an open source continuation of Sandboxie.</p>"
"<p></p>"
"<p>Visit <a href=\"https://sandboxie-plus.com\">sandboxie-plus.com</a> for more information.</p>"
"<p></p>"
@ -1769,7 +1837,7 @@ void CSandMan::LoadLanguage()
}
if (!m_LanguageId)
m_LanguageId = 1033; // default to englich
m_LanguageId = 1033; // default to English
}
//////////////////////////////////////////////////////////////////////////////////////////

View File

@ -14,8 +14,8 @@
#define VERSION_MJR 0
#define VERSION_MIN 5
#define VERSION_REV 3
#define VERSION_UPD 1
#define VERSION_REV 4
#define VERSION_UPD 0
//#include "../QSbieAPI/SbieAPI.h"
@ -46,6 +46,8 @@ public:
static QIcon GetIcon(const QString& Name);
bool IsFullyPortable();
protected:
SB_STATUS ConnectSbie();
SB_STATUS ConnectSbieImpl();
@ -54,8 +56,6 @@ protected:
static void RecoverFilesAsync(const CSbieProgressPtr& pProgress, const QList<QPair<QString, QString>>& FileList, int Action = 0);
bool IsFullyPortable();
void closeEvent(QCloseEvent *e);
void timerEvent(QTimerEvent* pEvent);
int m_uTimerID;
@ -100,6 +100,8 @@ public slots:
void OpenUrl(const QUrl& url);
int ShowQuestion(const QString& question, const QString& checkBoxText, bool* checkBoxSetting, int buttons, int defaultButton);
private slots:
void OnSelectionChanged();

View File

@ -75,6 +75,11 @@
<OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
<IntDir>$(Platform)\$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LibraryPath>$(SolutionDir)$(Platform)\$(Configuration)\;$(LibraryPath)</LibraryPath>
<OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
<IntDir>$(Platform)\$(Configuration)\</IntDir>
</PropertyGroup>
<ImportGroup Condition="Exists('$(QtMsBuild)\qt_defaults.props')">
<Import Project="$(QtMsBuild)\qt_defaults.props" />
</ImportGroup>
@ -254,6 +259,7 @@
<None Include="sandman_de.ts" />
<None Include="sandman_pt.ts" />
<None Include="sandman_ru.ts" />
<None Include="sandman_zh.ts" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Condition="Exists('$(QtMsBuild)\qt.targets')">

View File

@ -200,5 +200,8 @@
<None Include="sandman_ru.ts">
<Filter>Translation Files</Filter>
</None>
<None Include="sandman_zh.ts">
<Filter>Translation Files</Filter>
</None>
</ItemGroup>
</Project>

View File

@ -70,16 +70,16 @@ void CSandBoxPlus::UpdateDetails()
m_bDropRights = GetBool("DropAdminRights", false);
if (CheckOpenToken())
if (CheckOpenToken() || GetBool("StripSystemPrivileges", false))
m_iUnsecureDebugging = 1;
else if(GetBool("ExposeBoxedSystem", false) || GetBool("UnrestrictedSCM", false))
else if(GetBool("ExposeBoxedSystem", false) || GetBool("UnrestrictedSCM", false) || GetBool("RunServicesAsSystem", false))
m_iUnsecureDebugging = 2;
else
m_iUnsecureDebugging = 0;
//GetBool("SandboxieLogon", false)
m_bSecurityRestricted = m_iUnsecureDebugging == 0 && (GetBool("DropAdminRights", false) || GetBool("ProtectRpcSs", false));
m_bSecurityRestricted = m_iUnsecureDebugging == 0 && (GetBool("DropAdminRights", false) /*|| GetBool("ProtectRpcSs", false)*/);
CSandBox::UpdateDetails();
}

View File

@ -135,6 +135,12 @@ CSbieView::~CSbieView()
theConf->SetBlob("MainWindow/BoxTree_Columns", m_pSbieTree->saveState());
}
void CSbieView::Clear()
{
m_Groups.clear();
m_pSbieModel->Clear();
}
void CSbieView::Refresh()
{
QList<QVariant> Added = m_pSbieModel->Sync(theAPI->GetAllBoxes(), m_Groups);
@ -177,6 +183,14 @@ void CSbieView::OnToolTipCallback(const QVariant& ID, QString& ToolTip)
void CSbieView::OnMenu(const QPoint& Point)
{
QList<QAction*> MenuActions = m_pMenu->actions();
bool isConnected = theAPI->IsConnected();
if (isConnected) {
foreach(QAction * pAction, MenuActions)
pAction->setEnabled(true);
}
CSandBoxPtr pBox;
CBoxedProcessPtr pProcess;
int iProcessCount = 0;
@ -201,7 +215,6 @@ void CSbieView::OnMenu(const QPoint& Point)
}
}
QList<QAction*> MenuActions = m_pMenu->actions();
for (int i = 0; i < m_iMenuTop; i++)
MenuActions[i]->setVisible(iSandBoxeCount == 0 && iProcessCount == 0);
@ -272,6 +285,11 @@ void CSbieView::OnMenu(const QPoint& Point)
//m_pMenuSuspend->setEnabled(iProcessCount > iSuspendedCount);
//m_pMenuResume->setEnabled(iSuspendedCount > 0);
if (!isConnected) {
foreach(QAction * pAction, MenuActions)
pAction->setEnabled(false);
}
CPanelView::OnMenu(Point);
}
@ -295,7 +313,10 @@ int CSbieView__ParseGroup(const QString& Grouping, QMap<QString, QStringList>& m
if (pos == -1)
break;
if (Grouping.at(pos) == "(")
{
m_Groups[Name] = QStringList();
Index = CSbieView__ParseGroup(Grouping, m_Groups, Name, Index);
}
else if (Grouping.at(pos) == ")")
break;
}
@ -355,7 +376,6 @@ void CSbieView::OnGroupAction()
if (m_pSbieModel->GetType(ModelIndex) == CSbieModel::eGroup)
Parent = m_pSbieModel->GetID(ModelIndex).toString();
if (!Parent.isEmpty())
m_Groups[Parent].append(Name);
}
else if (Action == m_pDelGroupe)

View File

@ -21,6 +21,7 @@ signals:
void RecoveryRequested(const QString& BoxName);
public slots:
void Clear();
void Refresh();
void ReloadGroups();

View File

@ -25,6 +25,8 @@ CNewBoxWindow::CNewBoxWindow(QWidget *parent)
connect(ui.radCopy, SIGNAL(toggled(bool)), this, SLOT(OnPreset()));
ui.radTemplate->setChecked(true);
ui.txtName->setFocus();
restoreGeometry(theConf->GetBlob("NewBoxWindow/Window_Geometry"));
}
@ -72,11 +74,15 @@ void CNewBoxWindow::CreateBox()
{
case eHardened:
pBox.objectCast<CSandBoxPlus>()->SetBool("DropAdminRights", true);
pBox.objectCast<CSandBoxPlus>()->SetBool("ProtectRpcSs", true);
//pBox.objectCast<CSandBoxPlus>()->SetBool("ProtectRpcSs", true); // not compatible with RunServicesAsSystem=n which is on by default
pBox.objectCast<CSandBoxPlus>()->SetBool("ClosePrintSpooler", true);
pBox.objectCast<CSandBoxPlus>()->SetBool("OpenSmartCard", false);
break;
case eLegacy:
pBox.objectCast<CSandBoxPlus>()->SetBool("UnrestrictedSCM", true);
pBox.objectCast<CSandBoxPlus>()->SetBool("ExposeBoxedSystem", true);
//pBox.objectCast<CSandBoxPlus>()->SetBool("RunServicesAsSystem", true); // legacy behavioure but there should be no normal use cases which require this
pBox.objectCast<CSandBoxPlus>()->SetBool("OpenPrintSpooler", true);
break;
}
}

View File

@ -146,6 +146,9 @@ COptionsWindow::COptionsWindow(const QSharedPointer<CSbieIni>& pBox, const QStri
connect(ui.chkBlockNetShare, SIGNAL(clicked(bool)), this, SLOT(OnGeneralChanged()));
connect(ui.chkBlockNetParam, SIGNAL(clicked(bool)), this, SLOT(OnGeneralChanged()));
connect(ui.chkDropRights, SIGNAL(clicked(bool)), this, SLOT(OnGeneralChanged()));
connect(ui.chkBlockSpooler, SIGNAL(clicked(bool)), this, SLOT(OnGeneralChanged()));
connect(ui.chkOpenSpooler, SIGNAL(clicked(bool)), this, SLOT(OnGeneralChanged()));
connect(ui.chkPrintToFile, SIGNAL(clicked(bool)), this, SLOT(OnGeneralChanged()));
connect(ui.txtCopyLimit, SIGNAL(textChanged(const QString&)), this, SLOT(OnGeneralChanged()));
connect(ui.chkCopyLimit, SIGNAL(clicked(bool)), this, SLOT(OnGeneralChanged()));
@ -154,9 +157,21 @@ COptionsWindow::COptionsWindow(const QSharedPointer<CSbieIni>& pBox, const QStri
connect(ui.chkProtectBox, SIGNAL(clicked(bool)), this, SLOT(OnGeneralChanged()));
connect(ui.chkAutoEmpty, SIGNAL(clicked(bool)), this, SLOT(OnGeneralChanged()));
connect(ui.btnAddExe, SIGNAL(clicked(bool)), this, SLOT(OnBrowsePath()));
connect(ui.btnAddCmd, SIGNAL(clicked(bool)), this, SLOT(OnAddCommand()));
QMenu* pRunBtnMenu = new QMenu(ui.btnAddFile);
pRunBtnMenu->addAction(tr("Browse for Program"), this, SLOT(OnBrowsePath()));
ui.btnAddCmd->setPopupMode(QToolButton::MenuButtonPopup);
ui.btnAddCmd->setMenu(pRunBtnMenu);
connect(ui.btnDelCmd, SIGNAL(clicked(bool)), this, SLOT(OnDelCommand()));
connect(ui.btnAddAutoExe, SIGNAL(clicked(bool)), this, SLOT(OnAddAutoCmd()));
QMenu* pAutoBtnMenu = new QMenu(ui.btnAddFile);
pAutoBtnMenu->addAction(tr("Browse for Program"), this, SLOT(OnAddAutoExe()));
ui.btnAddAutoExe->setPopupMode(QToolButton::MenuButtonPopup);
ui.btnAddAutoExe->setMenu(pAutoBtnMenu);
connect(ui.btnAddAutoExe, SIGNAL(clicked(bool)), this, SLOT(OnAddAutoExe()));
connect(ui.btnAddAutoSvc, SIGNAL(clicked(bool)), this, SLOT(OnDelAutoSvc()));
connect(ui.btnDelAuto, SIGNAL(clicked(bool)), this, SLOT(OnDelAuto()));
//
// Groupes
@ -233,11 +248,14 @@ COptionsWindow::COptionsWindow(const QSharedPointer<CSbieIni>& pBox, const QStri
connect(ui.chkNoWindowRename, SIGNAL(clicked(bool)), this, SLOT(OnNoWindowRename()));
connect(ui.chkProtectSCM, SIGNAL(clicked(bool)), this, SLOT(OnAdvancedChanged()));
connect(ui.chkRestrictServices, SIGNAL(clicked(bool)), this, SLOT(OnAdvancedChanged()));
connect(ui.chkProtectRpcSs, SIGNAL(clicked(bool)), this, SLOT(OnAdvancedChanged()));
connect(ui.chkProtectSystem, SIGNAL(clicked(bool)), this, SLOT(OnAdvancedChanged()));
connect(ui.chkOpenCredentials, SIGNAL(clicked(bool)), this, SLOT(OnAdvancedChanged()));
connect(ui.chkOpenProtectedStorage, SIGNAL(clicked(bool)), this, SLOT(OnAdvancedChanged()));
connect(ui.chkOpenSmartCard, SIGNAL(clicked(bool)), this, SLOT(OnAdvancedChanged()));
//connect(ui.chkOpenLsaEndpoint, SIGNAL(clicked(bool)), this, SLOT(OnAdvancedChanged()));
connect(ui.chkAddToJob, SIGNAL(clicked(bool)), this, SLOT(OnAdvancedChanged()));
@ -249,6 +267,9 @@ COptionsWindow::COptionsWindow(const QSharedPointer<CSbieIni>& pBox, const QStri
connect(ui.chkComTrace, SIGNAL(clicked(bool)), this, SLOT(OnAdvancedChanged()));
connect(ui.chkDbgTrace, SIGNAL(clicked(bool)), this, SLOT(OnAdvancedChanged()));
connect(ui.btnAddAutoExec, SIGNAL(pressed()), this, SLOT(OnAddAutoExec()));
connect(ui.btnDelAutoExec, SIGNAL(pressed()), this, SLOT(OnDelAutoExec()));
connect(ui.chkHideOtherBoxes, SIGNAL(clicked(bool)), this, SLOT(OnAdvancedChanged()));
connect(ui.btnAddProcess, SIGNAL(pressed()), this, SLOT(OnAddProcess()));
connect(ui.btnDelProcess, SIGNAL(pressed()), this, SLOT(OnDelProcess()));
@ -293,6 +314,8 @@ COptionsWindow::COptionsWindow(const QSharedPointer<CSbieIni>& pBox, const QStri
QByteArray
Columns = theConf->GetBlob("OptionsWindow/Run_Columns");
if (!Columns.isEmpty()) ui.treeRun->header()->restoreState(Columns);
Columns = theConf->GetBlob("OptionsWindow/AutoRun_Columns");
if (!Columns.isEmpty()) ui.treeAutoStart->header()->restoreState(Columns);
Columns = theConf->GetBlob("OptionsWindow/Groups_Columns");
if (!Columns.isEmpty()) ui.treeGroups->header()->restoreState(Columns);
Columns = theConf->GetBlob("OptionsWindow/Forced_Columns");
@ -316,6 +339,7 @@ COptionsWindow::~COptionsWindow()
theConf->SetBlob("OptionsWindow/Window_Geometry",saveGeometry());
theConf->SetBlob("OptionsWindow/Run_Columns", ui.treeRun->header()->saveState());
theConf->SetBlob("OptionsWindow/AutoRun_Columns", ui.treeAutoStart->header()->saveState());
theConf->SetBlob("OptionsWindow/Groups_Columns", ui.treeGroups->header()->saveState());
theConf->SetBlob("OptionsWindow/Forced_Columns", ui.treeForced->header()->saveState());
theConf->SetBlob("OptionsWindow/Stop_Columns", ui.treeStop->header()->saveState());
@ -374,6 +398,17 @@ void COptionsWindow::LoadConfig()
ui.chkBlockNetShare->setChecked(m_pBox->GetBool("BlockNetworkFiles", true));
ui.chkBlockNetParam->setChecked(m_pBox->GetBool("BlockNetParam", true));
ui.chkDropRights->setChecked(m_pBox->GetBool("DropAdminRights", false));
ui.chkBlockSpooler->setChecked(m_pBox->GetBool("ClosePrintSpooler", false));
ui.chkOpenSpooler->setChecked(m_pBox->GetBool("OpenPrintSpooler", false));
ui.chkOpenSpooler->setEnabled(!ui.chkBlockSpooler->isChecked());
ui.chkPrintToFile->setChecked(m_pBox->GetBool("AllowSpoolerPrintToFile", false));
ui.chkPrintToFile->setEnabled(!ui.chkBlockSpooler->isChecked());
ui.treeAutoStart->clear();
foreach(const QString & Value, m_pBox->GetTextList("StartProgram", m_Template))
AddAutoRunItem(Value, 0);
foreach(const QString & Value, m_pBox->GetTextList("StartService", m_Template))
AddAutoRunItem(Value, 1);
ui.treeRun->clear();
foreach(const QString& Value, m_pBox->GetTextList("RunCommand", m_Template))
@ -425,15 +460,26 @@ void COptionsWindow::LoadConfig()
ui.chkPreferExternalManifest->setChecked(m_pBox->GetBool("PreferExternalManifest", false));
ui.chkProtectSCM->setChecked(!m_pBox->GetBool("UnrestrictedSCM", false));
ui.chkProtectRpcSs->setChecked(m_pBox->GetBool("ProtectRpcSs", false));
ui.chkRestrictServices->setChecked(!m_pBox->GetBool("RunServicesAsSystem", false));
ui.chkProtectRpcSs->setEnabled(!ui.chkRestrictServices->isChecked());
ui.chkProtectRpcSs->setChecked(ui.chkProtectRpcSs->isEnabled() && m_pBox->GetBool("ProtectRpcSs", false));
ui.chkProtectSystem->setChecked(!m_pBox->GetBool("ExposeBoxedSystem", false));
ui.chkOpenProtectedStorage->setChecked(m_pBox->GetBool("OpenProtectedStorage", false));
ui.chkOpenCredentials->setEnabled(!ui.chkOpenProtectedStorage->isChecked());
ui.chkOpenCredentials->setChecked(m_pBox->GetBool("OpenCredentials", false));
ui.chkOpenCredentials->setChecked(!ui.chkOpenCredentials->isEnabled() || m_pBox->GetBool("OpenCredentials", false));
ui.chkOpenSmartCard->setChecked(m_pBox->GetBool("OpenSmartCard", true));
//ui.chkOpenLsaEndpoint->setChecked(m_pBox->GetBool("OpenLsaEndpoint", false));
ui.chkAddToJob->setChecked(!m_pBox->GetBool("NoAddProcessToJob", false));
QStringList AutoExec = m_pBox->GetTextList("AutoExec", m_Template);
ui.lstAutoExec->clear();
ui.lstAutoExec->addItems(AutoExec);
ReadAdvancedCheck("FileTrace", ui.chkFileTrace, "*");
ReadAdvancedCheck("PipeTrace", ui.chkPipeTrace, "*");
ReadAdvancedCheck("KeyTrace", ui.chkKeyTrace, "*");
@ -443,7 +489,7 @@ void COptionsWindow::LoadConfig()
ui.chkDbgTrace->setChecked(m_pBox->GetBool("DebugTrace", false));
ui.chkHideOtherBoxes->setChecked(m_pBox->GetBool("HideOtherBoxes", false));
QStringList Processes = m_pBox->GetTextList("HideHostProcess", false);
QStringList Processes = m_pBox->GetTextList("HideHostProcess", m_Template);
ui.lstProcesses->clear();
ui.lstProcesses->addItems(Processes);
@ -512,6 +558,22 @@ void COptionsWindow::SaveConfig()
m_pBox->SetBool("BlockNetworkFiles", ui.chkBlockNetShare->isChecked());
m_pBox->SetBool("BlockNetParam", ui.chkBlockNetParam->isChecked());
m_pBox->SetBool("DropAdminRights", ui.chkDropRights->isChecked());
m_pBox->SetBool("ClosePrintSpooler", ui.chkBlockSpooler->isChecked());
m_pBox->SetBool("OpenPrintSpooler", ui.chkOpenSpooler->isChecked());
m_pBox->SetBool("AllowSpoolerPrintToFile", ui.chkPrintToFile->isChecked());
QStringList StartProgram;
QStringList StartService;
for (int i = 0; i < ui.treeAutoStart->topLevelItemCount(); i++) {
QTreeWidgetItem* pItem = ui.treeAutoStart->topLevelItem(i);
if (pItem->data(0, Qt::UserRole).toInt())
StartService.append(pItem->text(1));
else
StartProgram.append(pItem->text(1));
}
m_pBox->UpdateTextList("StartProgram", StartProgram, m_Template);
m_pBox->UpdateTextList("StartService", StartService, m_Template);
QStringList RunCommands;
for (int i = 0; i < ui.treeRun->topLevelItemCount(); i++) {
@ -566,14 +628,26 @@ void COptionsWindow::SaveConfig()
else m_pBox->DelValue("PreferExternalManifest");
WriteAdvancedCheck(ui.chkProtectSCM, "UnrestrictedSCM", "", "y");
WriteAdvancedCheck(ui.chkRestrictServices, "RunServicesAsSystem", "", "y");
if(ui.chkProtectRpcSs->isEnabled())
WriteAdvancedCheck(ui.chkProtectRpcSs, "ProtectRpcSs", "y", "");
WriteAdvancedCheck(ui.chkProtectSystem, "ExposeBoxedSystem", "", "y");
WriteAdvancedCheck(ui.chkOpenProtectedStorage, "OpenProtectedStorage", "y", "");
if(ui.chkOpenCredentials->isEnabled())
WriteAdvancedCheck(ui.chkOpenCredentials, "OpenCredentials", "y", "");
WriteAdvancedCheck(ui.chkOpenSmartCard, "OpenSmartCard", "", "n");
//WriteAdvancedCheck(ui.chkOpenLsaEndpoint, "OpenLsaEndpoint", "y", "");
WriteAdvancedCheck(ui.chkAddToJob, "NoAddProcessToJob", "", "y");
QStringList AutoExec;
for (int i = 0; i < ui.lstAutoExec->count(); i++)
AutoExec.append(ui.lstAutoExec->item(i)->text());
m_pBox->UpdateTextList("AutoExec", AutoExec, m_Template);
WriteAdvancedCheck(ui.chkFileTrace, "FileTrace", "*");
WriteAdvancedCheck(ui.chkPipeTrace, "PipeTrace", "*");
WriteAdvancedCheck(ui.chkKeyTrace, "KeyTrace", "*");
@ -587,7 +661,7 @@ void COptionsWindow::SaveConfig()
QStringList Processes;
for (int i = 0; i < ui.lstProcesses->count(); i++)
Processes.append(ui.lstProcesses->item(i)->text());
m_pBox->UpdateTextList("HideHostProcess", Processes, false);
m_pBox->UpdateTextList("HideHostProcess", Processes, m_Template);
QStringList Users;
for (int i = 0; i < ui.lstUsers->count(); i++)
@ -645,6 +719,9 @@ void COptionsWindow::OnGeneralChanged()
ui.chkNoCopyWarn->setEnabled(ui.chkCopyLimit->isChecked());
ui.chkAutoEmpty->setEnabled(!ui.chkProtectBox->isChecked());
ui.chkOpenSpooler->setEnabled(!ui.chkBlockSpooler->isChecked());
ui.chkPrintToFile->setEnabled(!ui.chkBlockSpooler->isChecked());
}
void COptionsWindow::OnPickColor()
@ -657,6 +734,56 @@ void COptionsWindow::OnPickColor()
ui.btnBorderColor->setStyleSheet("background-color: " + m_BorderColor.name());
}
void COptionsWindow::OnAddAutoCmd()
{
QString Value = QInputDialog::getText(this, "Sandboxie-Plus", tr("Please enter a program path"), QLineEdit::Normal);
if (Value.isEmpty())
return;
AddAutoRunItem(Value, 0);
m_GeneralChanged = true;
}
void COptionsWindow::OnAddAutoExe()
{
QString Value = QFileDialog::getOpenFileName(this, tr("Select Program"), "", tr("Executables (*.exe|*.cmd)")).replace("/", "\\");;
if (Value.isEmpty())
return;
AddAutoRunItem(Value, 0);
m_GeneralChanged = true;
}
void COptionsWindow::OnDelAutoSvc()
{
QString Value = QInputDialog::getText(this, "Sandboxie-Plus", tr("Please enter a service identifier"), QLineEdit::Normal);
if (Value.isEmpty())
return;
AddAutoRunItem(Value, 1);
m_GeneralChanged = true;
}
void COptionsWindow::AddAutoRunItem(const QString& Value, int Type)
{
QTreeWidgetItem* pItem = new QTreeWidgetItem();
pItem->setText(0, Type ? tr("Service") : tr("Program"));
pItem->setData(0, Qt::UserRole, Type);
pItem->setText(1, Value);
pItem->setFlags(pItem->flags() | Qt::ItemIsEditable);
ui.treeAutoStart->addTopLevelItem(pItem);
}
void COptionsWindow::OnDelAuto()
{
QTreeWidgetItem* pItem = ui.treeAutoStart->currentItem();
if (!pItem)
return;
delete pItem;
m_GeneralChanged = true;
}
void COptionsWindow::OnBrowsePath()
{
QString Value = QFileDialog::getOpenFileName(this, tr("Select Program"), "", tr("Executables (*.exe|*.cmd)")).replace("/", "\\");;
@ -1600,6 +1727,8 @@ void COptionsWindow::OnDelAccess()
void COptionsWindow::SaveAccessList()
{
CloseAccessEdit(true);
QStringList Keys = QStringList() << "OpenFilePath" << "OpenPipePath" << "ClosedFilePath" << "ReadFilePath" << "WriteFilePath"
<< "OpenKeyPath" << "ClosedKeyPath" << "ReadKeyPath" << "WriteKeyPath"
<< "OpenIpcPath" << "ClosedIpcPath" << "OpenWinClass" << "OpenClsid" << "ClosedClsid" << "ClosedRT";
@ -1736,7 +1865,12 @@ void COptionsWindow::OnDelRecEntry()
void COptionsWindow::OnAdvancedChanged()
{
ui.chkProtectRpcSs->setEnabled(!ui.chkRestrictServices->isChecked());
if (!ui.chkProtectRpcSs->isEnabled()) ui.chkProtectRpcSs->setChecked(false);
ui.chkOpenCredentials->setEnabled(!ui.chkOpenProtectedStorage->isChecked());
if (!ui.chkOpenCredentials->isEnabled()) ui.chkOpenCredentials->setChecked(true);
m_AdvancedChanged = true;
}
@ -1755,6 +1889,25 @@ void COptionsWindow::OnDebugChanged()
m_DebugOptions[pCheck].Changed = true;
}
void COptionsWindow::OnAddAutoExec()
{
QString Process = QInputDialog::getText(this, "Sandboxie-Plus", tr("Please enter an auto exec command"));
if (Process.isEmpty())
return;
ui.lstAutoExec->addItem(Process);
m_AdvancedChanged = true;
}
void COptionsWindow::OnDelAutoExec()
{
foreach(QListWidgetItem * pItem, ui.lstAutoExec->selectedItems())
delete pItem;
m_AdvancedChanged = true;
}
void COptionsWindow::OnAddProcess()
{
QString Process = QInputDialog::getText(this, "Sandboxie-Plus", tr("Please enter a program file name"));
@ -1994,11 +2147,15 @@ void COptionsWindow::OnTab()
else
ui.radStartAll->setChecked(true);
CopyGroupToList("<StartRunAccess>", ui.treeStart);
OnRestrictStart();
}
else if (ui.tabs->currentWidget() == ui.tabInternet)
{
ui.chkBlockINet->setChecked(GetAccessEntry(eFile, "!<InternetAccess>", eClosed, "InternetAccessDevices") != NULL);
CopyGroupToList("<InternetAccess>", ui.treeINet);
OnBlockINet();
}
else if (ui.tabs->currentWidget() == ui.tabAdvanced)
{

View File

@ -30,6 +30,11 @@ private slots:
void OnAddCommand();
void OnDelCommand();
void OnAddAutoCmd();
void OnAddAutoExe();
void OnDelAutoSvc();
void OnDelAuto();
void OnAddGroup();
void OnAddProg();
void OnDelProg();
@ -72,6 +77,9 @@ private slots:
void OnDelRecEntry();
void OnShowRecoveryTmpl() { LoadRecoveryList(); }
void OnAddAutoExec();
void OnDelAutoExec();
void OnAddProcess();
void OnDelProcess();
@ -163,6 +171,8 @@ protected:
void LoadConfig();
void SaveConfig();
void AddAutoRunItem(const QString& Value, int Type);
void AddRunItem(const QString& Name, const QString& Command);
void LoadGroups();

View File

@ -112,6 +112,13 @@ CSettingsWindow::CSettingsWindow(QWidget *parent)
}
m_WarnProgsChanged = false;
int PortableRootDir = theConf->GetInt("Options/PortableRootDir", -1);
if (PortableRootDir != -1 && theConf->IsPortable())
ui.chkAutoRoot->setChecked(PortableRootDir == 0 ? Qt::Unchecked : Qt::Checked);
else
ui.chkAutoRoot->setVisible(false);
connect(ui.chkAutoRoot, SIGNAL(stateChanged(int)), this, SLOT(OnChange()));
connect(ui.btnAddCompat, SIGNAL(pressed()), this, SLOT(OnAddCompat()));
connect(ui.btnDelCompat, SIGNAL(pressed()), this, SLOT(OnDelCompat()));
@ -190,16 +197,19 @@ void CSettingsWindow::apply()
if (theAPI->IsConnected())
{
if (ui.fileRoot->text().isEmpty())
ui.fileRoot->setText("\\??\\%SystemDrive%\\Sandbox\\%USER%\\%SANDBOX%");
theAPI->GetGlobalSettings()->DelValue("FileRootPath"); //ui.fileRoot->setText("\\??\\%SystemDrive%\\Sandbox\\%USER%\\%SANDBOX%");
else
theAPI->GetGlobalSettings()->SetText("FileRootPath", ui.fileRoot->text());
theAPI->GetGlobalSettings()->SetBool("SeparateUserFolders", ui.chkSeparateUserFolders->isChecked());
if (ui.regRoot->text().isEmpty())
ui.regRoot->setText("\\REGISTRY\\USER\\Sandbox_%USER%_%SANDBOX%");
theAPI->GetGlobalSettings()->DelValue("KeyRootPath"); //ui.regRoot->setText("\\REGISTRY\\USER\\Sandbox_%USER%_%SANDBOX%");
else
theAPI->GetGlobalSettings()->SetText("KeyRootPath", ui.regRoot->text());
if (ui.ipcRoot->text().isEmpty())
ui.ipcRoot->setText("\\Sandbox\\%USER%\\%SANDBOX%\\Session_%SESSION%");
theAPI->GetGlobalSettings()->DelValue("IpcRootPath"); //ui.ipcRoot->setText("\\Sandbox\\%USER%\\%SANDBOX%\\Session_%SESSION%");
else
theAPI->GetGlobalSettings()->SetText("IpcRootPath", ui.ipcRoot->text());
@ -262,6 +272,9 @@ void CSettingsWindow::apply()
}
}
if (ui.chkAutoRoot->isVisible())
theConf->SetValue("Options/PortableRootDir", ui.chkAutoRoot->checkState() != Qt::Checked ? 1 : 0);
theConf->SetValue("Options/AutoRunSoftCompat", !ui.chkNoCompat->isChecked());
emit OptionsChanged();
@ -287,6 +300,9 @@ void CSettingsWindow::OnChange()
QStandardItem *item = model->item(0);
item->setFlags((!ui.chkShowTray->isChecked()) ? item->flags() & ~Qt::ItemIsEnabled : item->flags() | Qt::ItemIsEnabled);
if (ui.chkAutoRoot->isVisible() && theGUI->IsFullyPortable())
ui.fileRoot->setEnabled(ui.chkAutoRoot->checkState() != Qt::Checked);
ui.btnSetPassword->setEnabled(ui.chkPassRequired->isChecked());
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -187,10 +187,34 @@
</message>
<message>
<source>COM objects must be specified by their GUID, like: {00000000-0000-0000-0000-000000000000}</source>
<translation type="unfinished"></translation>
<translation type="unfinished">COM-объекты должны быть указаны по их GUID, например: {00000000-0000-0000-0000-000000000000}</translation>
</message>
<message>
<source>RT interfaces must be specified by their name.</source>
<translation type="unfinished">Интерфейсы RT должны быть указаны по их имени.</translation>
</message>
<message>
<source>Browse for Program</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Please enter a program path</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Please enter a service identifier</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Service</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Program</source>
<translation type="unfinished">Программа</translation>
</message>
<message>
<source>Please enter an auto exec command</source>
<translation type="unfinished"></translation>
</message>
</context>
@ -295,7 +319,7 @@
</message>
<message>
<source>Recover to:</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Восстановить в:</translation>
</message>
<message>
<source>Browse</source>
@ -303,15 +327,15 @@
</message>
<message>
<source>Clear folder list</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Очистить список папок</translation>
</message>
<message>
<source>Recover &amp;&amp; Explore</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Восстановить и исследовать</translation>
</message>
<message>
<source>Recover &amp;&amp; Open/Run</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Восстановить и открыть/запустить</translation>
</message>
<message>
<source>Select Directory</source>
@ -370,6 +394,12 @@ Full path: %3</source>
<source>Do you want to allow the print spooler to write outside the sandbox for %1 (%2)?</source>
<translation type="unfinished">Вы хотите, чтобы диспетчер очереди печати мог писать вне песочницы для %1 (%2)?</translation>
</message>
<message>
<source>%1 is eligible for quick recovery from %2.
The file was written by: %3</source>
<translation type="obsolete">%1 имеет право на быстрое восстановление после %2.
Файл записан: %3</translation>
</message>
<message>
<source>Do you want to allow %4 (%5) to copy a %1 large file into sandbox: %2?
File name: %3</source>
@ -436,6 +466,10 @@ Full path: %4</source>
<source>Process</source>
<translation type="unfinished">Процесс</translation>
</message>
<message>
<source>Unknown</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CSandBoxPlus</name>
@ -556,7 +590,7 @@ Full path: %4</source>
</message>
<message>
<source>No new updates found, your Sandboxie-Plus is up to date.</source>
<translation type="unfinished">Обновлений не обнаружено, у вас установлена последняя версия Sandboxie-Plus .</translation>
<translation type="obsolete">Обновлений не обнаружено, у вас установлена последняя версия Sandboxie-Plus .</translation>
</message>
<message>
<source>%1 (%2): </source>
@ -632,7 +666,7 @@ Full path: %4</source>
</message>
<message>
<source>Sbie Messages</source>
<translation type="unfinished">Sbie cообщения</translation>
<translation type="unfinished">Cообщения sbie</translation>
</message>
<message>
<source>Failed to recover some files:
@ -642,7 +676,7 @@ Full path: %4</source>
</message>
<message>
<source>&lt;p&gt;Sandboxie-Plus is an open source continuation of the well known Sandboxie.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Visit &lt;a href=&quot;https://sandboxie-plus.com&quot;&gt;sandboxie-plus.com&lt;/a&gt; for more information.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Icons from &lt;a href=&quot;https://icons8.com&quot;&gt;icons8.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</source>
<translation type="unfinished">&lt;p&gt;Sandboxie-Plus - это продолжение хорошо известной Sandboxie с открытым исходным кодом.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Посетите &lt;a href=&quot;https://sandboxie-plus.com&quot;&gt;sandboxie-plus.com&lt;/a&gt; для дополнительной информации.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Иконки из &lt;a href=&quot;https://icons8.com&quot;&gt;icons8.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</translation>
<translation type="obsolete">&lt;p&gt;Sandboxie-Plus - это продолжение хорошо известной Sandboxie с открытым исходным кодом.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Посетите &lt;a href=&quot;https://sandboxie-plus.com&quot;&gt;sandboxie-plus.com&lt;/a&gt; для дополнительной информации.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Иконки из &lt;a href=&quot;https://icons8.com&quot;&gt;icons8.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</translation>
</message>
<message>
<source>The sandbox name can not be longer than 32 charakters.</source>
@ -674,7 +708,7 @@ Full path: %4</source>
</message>
<message>
<source>Sbie Directory: %1</source>
<translation type="unfinished">Sbie каталог: %1</translation>
<translation type="unfinished">Каталог sbie: %1</translation>
</message>
<message>
<source>&lt;p&gt;Do you want to download the latest version?&lt;/p&gt;</source>
@ -743,7 +777,7 @@ Full path: %4</source>
<message>
<source>To use API logging you must first set up the LogApiDll from https://github.com/sandboxie-plus/LogApiDll with one or more sand boxes.
Please download the latest release and set it up with the sandboxie.ini as instructed in the README.md of the project.</source>
<translation type="unfinished">Для использования API логирования вы должны сперва настроить LogApiDll из https://github.com/sandboxie-plus/LogApiDll с одной или несколькими песочницами.
<translation type="obsolete">Для использования API логирования вы должны сперва настроить LogApiDll из https://github.com/sandboxie-plus/LogApiDll с одной или несколькими песочницами.
Загрузите последний выпуск и настройте его с помощью sandboxie.ini, как указано в README.md проекта.</translation>
</message>
<message>
@ -760,7 +794,7 @@ Please download the latest release and set it up with the sandboxie.ini as instr
</message>
<message>
<source>Failed to stop all sandboxie components</source>
<translation type="unfinished">Не удалось остановить все компоненты песочницы</translation>
<translation type="obsolete">Не удалось остановить все компоненты песочницы</translation>
</message>
<message>
<source>&amp;Sandbox</source>
@ -768,7 +802,7 @@ Please download the latest release and set it up with the sandboxie.ini as instr
</message>
<message>
<source>Failed to start required sandboxie components</source>
<translation type="unfinished">Не удалось запустить необходимые компоненты песочницы</translation>
<translation type="obsolete">Не удалось запустить необходимые компоненты песочницы</translation>
</message>
<message>
<source>&lt;h3&gt;About Sandboxie-Plus&lt;/h3&gt;&lt;p&gt;Version %1&lt;/p&gt;&lt;p&gt;Copyright (c) 2020-2021 by DavidXanatos&lt;/p&gt;</source>
@ -932,70 +966,115 @@ Please download the latest release and set it up with the sandboxie.ini as instr
</message>
<message>
<source>Reset all hidden messages</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Сбросить все скрытые сообщения</translation>
</message>
<message>
<source> - NOT connected</source>
<translation type="unfinished"></translation>
<translation type="unfinished"> - НЕ подключен</translation>
</message>
<message>
<source>Do you also want to reset hidden message boxes (yes), or only all log messages (no)?</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Вы также хотите сбросить скрытые окна сообщений (да) или только все сообщения журнала (нет)?</translation>
</message>
<message>
<source>The changes will be applied automatically whenever the file gets saved.</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Изменения будут применяться автоматически при сохранении файла.</translation>
</message>
<message>
<source>Administrator rights are required for this operation.</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Для этой операции требуются права администратора.</translation>
</message>
<message>
<source>Failed to execute: %1</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Не удалось выполнить: %1</translation>
</message>
<message>
<source>Failed to connect to the driver</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Не удалось подключиться к драйверу</translation>
</message>
<message>
<source>Failed to communicate with Sandboxie Service: %1</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Не удалось связаться со службой Sandboxie: %1</translation>
</message>
<message>
<source>An incompatible Sandboxie %1 was found. Compatible versions: %2</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Обнаружена несовместимая песочница %1. Совместимые версии: %2</translation>
</message>
<message>
<source>Can&apos;t find Sandboxie installation path.</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Не удается найти путь установки Sandboxie.</translation>
</message>
<message>
<source>The sandbox name can not be longer than 32 characters.</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Имя песочницы не может быть длиннее 32 символов.</translation>
</message>
<message>
<source>This Snapshot operation can not be performed while processes are still running in the box.</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Операция снимка не может быть выполнена, пока в песочнице еще выполняются процессы.</translation>
</message>
<message>
<source>Failed to copy RegHive</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Не удалось скопировать RegHive</translation>
</message>
<message>
<source>Can&apos;t remove a snapshot that is shared by multiple later snapshots</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Невозможно удалить снимок, который используется несколькими более поздними снимками</translation>
</message>
<message>
<source>Unknown Error Status: %1</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Неизвестный статус ошибки: %1</translation>
</message>
<message>
<source>Do you want to open %1 in a sandboxed (yes) or unsandboxed (no) Web browser?</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Вы хотите открыть %1 в изолированном (да) или не изолированном (нет) браузере?</translation>
</message>
<message>
<source>Remember choice for later.</source>
<translation type="unfinished">Запомнить выбор.</translation>
</message>
<message>
<source>Copy Cell</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copy Row</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copy Panel</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Failed to stop all Sandboxie components</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Failed to start required Sandboxie components</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Sandboxie-Plus was started in portable mode, do you want to put the SandBox folder into its parent directory?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>The file %1 already exists, do you want to overwrite it?</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Do this for all files!</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>To use API logging you must first set up the LogApiDll from https://github.com/sandboxie-plus/LogApiDll with one or more sandboxes.
Please download the latest release and set it up with the Sandboxie.ini as instructed in the README.md of the project.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>No new updates found, your Sandboxie-Plus is up-to-date.</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>&lt;p&gt;Sandboxie-Plus is an open source continuation of Sandboxie.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Visit &lt;a href=&quot;https://sandboxie-plus.com&quot;&gt;sandboxie-plus.com&lt;/a&gt; for more information.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Icons from &lt;a href=&quot;https://icons8.com&quot;&gt;icons8.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;</source>
<translation type="unfinished"></translation>
</message>
</context>
@ -1007,7 +1086,7 @@ Please download the latest release and set it up with the sandboxie.ini as instr
</message>
<message>
<source>Path</source>
<translation type="unfinished">Путь</translation>
<translation type="obsolete">Путь</translation>
</message>
<message>
<source>Box Groupe</source>
@ -1025,6 +1104,10 @@ Please download the latest release and set it up with the sandboxie.ini as instr
<source>Process ID</source>
<translation type="unfinished">ID процесса</translation>
</message>
<message>
<source>Path / Command Line</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>CSbieProcess</name>
@ -1234,19 +1317,19 @@ Please download the latest release and set it up with the sandboxie.ini as instr
</message>
<message>
<source>Create Shortcut</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Создать ярлык</translation>
</message>
<message>
<source>Allow internet access</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Разрешить доступ в Интернет</translation>
</message>
<message>
<source>Force into this sandbox</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Принудительно в этой песочнице</translation>
</message>
<message>
<source>This box does not have Internet restrictions in place, do you want to enable them?</source>
<translation type="unfinished"></translation>
<translation type="unfinished">В этой песочнице нет ограничений на доступ к Интернет, вы хотите их включить?</translation>
</message>
</context>
<context>
@ -1492,7 +1575,7 @@ If leader processes are defined, all others are treated as lingering processes.<
</message>
<message>
<source>Browse</source>
<translation type="unfinished">Обзор</translation>
<translation type="obsolete">Обзор</translation>
</message>
<message>
<source>Restrict Resource Access monitor to administrators only</source>
@ -1620,7 +1703,7 @@ If leader processes are defined, all others are treated as lingering processes.<
</message>
<message>
<source>Lift restrictions</source>
<translation type="unfinished">Ограничения на подъем</translation>
<translation type="obsolete">Ограничения на подъем</translation>
</message>
<message>
<source>Add Leader Program</source>
@ -1742,7 +1825,7 @@ instead of &quot;*&quot;.</source>
</message>
<message>
<source>Remove Process</source>
<translation type="unfinished">Удалить процесс</translation>
<translation type="obsolete">Удалить процесс</translation>
</message>
<message>
<source>You can exclude folders and file types (or file extensions) from Immediate Recovery.</source>
@ -1790,7 +1873,7 @@ Note: Forced Programs and Force Folders settings for a sandbox do not apply to
</message>
<message>
<source>Sandbox Isolation</source>
<translation type="unfinished">Изоляция песочницы</translation>
<translation type="obsolete">Изоляция песочницы</translation>
</message>
<message>
<source>Add Lingering Program</source>
@ -1847,18 +1930,74 @@ Note: Forced Programs and Force Folders settings for a sandbox do not apply to
</message>
<message>
<source>Prevent change to network and firewall parameters</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Запретить изменение параметров сети и брандмауэра</translation>
</message>
<message>
<source>Start the sandboxed RpcSs as a SYSTEM process (breaks some compatibility)</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Запускать RpcSs в песочнице как СИСТЕМНЫЙ процесс (нарушает некоторую совместимость)</translation>
</message>
<message>
<source>COM Class Trace</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Трассировка COM класса</translation>
</message>
<message>
<source>&lt;- for this one the above does not apply</source>
<translation type="unfinished">&lt;- для этого то что выше не применяется</translation>
</message>
<message>
<source>Block access to the printer spooler</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Allow the print spooler to print to files outside the sandbox</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Printing</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Remove spooler restriction, printers can be installed outside the sandbox</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Add program</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Auto Start</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Here you can specify programs and/or services that are to be started automatically in the sandbox when it is activated</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Add service</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Do not start sandboxed services using a system token (recommended)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Allow access to Smart Cards</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Lift security restrictions</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Sandbox isolation</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Auto Exec</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Here you can specify a list of commands that are executed every time the sandbox is initially populated.</source>
<translation type="unfinished"></translation>
</message>
</context>
@ -2063,18 +2202,22 @@ Note: Forced Programs and Force Folders settings for a sandbox do not apply to
</message>
<message>
<source>Open urls from this ui sandboxed</source>
<translation type="unfinished"></translation>
<translation type="unfinished">Открывать URL-адреса из этого пользовательского интерфейса в песочнице</translation>
</message>
<message>
<source>Sandbox &lt;a href=&quot;sbie://docs/filerootpath&quot;&gt;file system root&lt;/a&gt;: </source>
<translation type="unfinished"></translation>
<translation type="unfinished">Sandbox &lt;a href=&quot;sbie://docs/filerootpath&quot;&gt;корень файловой системы&lt;/a&gt;: </translation>
</message>
<message>
<source>Sandbox &lt;a href=&quot;sbie://docs/ipcrootpath&quot;&gt;ipc root&lt;/a&gt;: </source>
<translation type="unfinished"></translation>
<translation type="unfinished">Sandbox &lt;a href=&quot;sbie://docs/ipcrootpath&quot;&gt;корень ipc&lt;/a&gt;: </translation>
</message>
<message>
<source>Sandbox &lt;a href=&quot;sbie://docs/keyrootpath&quot;&gt;registry root&lt;/a&gt;: </source>
<translation type="unfinished">Sandbox &lt;a href=&quot;sbie://docs/keyrootpath&quot;&gt;корень реестра&lt;/a&gt;: </translation>
</message>
<message>
<source>Portable root folder</source>
<translation type="unfinished"></translation>
</message>
</context>

File diff suppressed because it is too large Load Diff