commit
1a66a892f3
16
CHANGELOG.md
16
CHANGELOG.md
|
@ -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
|
||||
|
||||
|
|
|
@ -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.
|
@ -0,0 +1 @@
|
|||
Please see the individual modules for their respective licenses.
|
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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'">
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 "";
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>357</width>
|
||||
<width>372</width>
|
||||
<height>274</height>
|
||||
</rect>
|
||||
</property>
|
||||
|
|
|
@ -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>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 Command</string>
|
||||
<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 "*".</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">
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -23,8 +23,8 @@ public:
|
|||
eProcess = 0,
|
||||
eTimeStamp,
|
||||
eType,
|
||||
eValue,
|
||||
eStatus,
|
||||
eValue,
|
||||
eCount
|
||||
};
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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')">
|
||||
|
|
|
@ -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>
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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,8 +376,7 @@ void CSbieView::OnGroupAction()
|
|||
if (m_pSbieModel->GetType(ModelIndex) == CSbieModel::eGroup)
|
||||
Parent = m_pSbieModel->GetID(ModelIndex).toString();
|
||||
|
||||
if (!Parent.isEmpty())
|
||||
m_Groups[Parent].append(Name);
|
||||
m_Groups[Parent].append(Name);
|
||||
}
|
||||
else if (Action == m_pDelGroupe)
|
||||
{
|
||||
|
|
|
@ -21,6 +21,7 @@ signals:
|
|||
void RecoveryRequested(const QString& BoxName);
|
||||
|
||||
public slots:
|
||||
void Clear();
|
||||
void Refresh();
|
||||
void ReloadGroups();
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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.chkProtectRpcSs, "ProtectRpcSs", "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", "");
|
||||
WriteAdvancedCheck(ui.chkOpenCredentials, "OpenCredentials", "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)
|
||||
{
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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,17 +197,20 @@ void CSettingsWindow::apply()
|
|||
if (theAPI->IsConnected())
|
||||
{
|
||||
if (ui.fileRoot->text().isEmpty())
|
||||
ui.fileRoot->setText("\\??\\%SystemDrive%\\Sandbox\\%USER%\\%SANDBOX%");
|
||||
theAPI->GetGlobalSettings()->SetText("FileRootPath", ui.fileRoot->text());
|
||||
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()->SetText("KeyRootPath", ui.regRoot->text());
|
||||
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()->SetText("IpcRootPath", ui.ipcRoot->text());
|
||||
theAPI->GetGlobalSettings()->DelValue("IpcRootPath"); //ui.ipcRoot->setText("\\Sandbox\\%USER%\\%SANDBOX%\\Session_%SESSION%");
|
||||
else
|
||||
theAPI->GetGlobalSettings()->SetText("IpcRootPath", ui.ipcRoot->text());
|
||||
|
||||
|
||||
theAPI->GetGlobalSettings()->SetBool("EditAdminOnly", ui.chkAdminOnly->isChecked());
|
||||
|
@ -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
|
@ -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 && Explore</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation type="unfinished">Восстановить и исследовать</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Recover && 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><p>Sandboxie-Plus is an open source continuation of the well known Sandboxie.</p><p></p><p>Visit <a href="https://sandboxie-plus.com">sandboxie-plus.com</a> for more information.</p><p></p><p></p><p></p><p>Icons from <a href="https://icons8.com">icons8.com</a></p><p></p></source>
|
||||
<translation type="unfinished"><p>Sandboxie-Plus - это продолжение хорошо известной Sandboxie с открытым исходным кодом.</p><p></p><p>Посетите <a href="https://sandboxie-plus.com">sandboxie-plus.com</a> для дополнительной информации.</p><p></p><p></p><p></p><p>Иконки из <a href="https://icons8.com">icons8.com</a></p><p></p></translation>
|
||||
<translation type="obsolete"><p>Sandboxie-Plus - это продолжение хорошо известной Sandboxie с открытым исходным кодом.</p><p></p><p>Посетите <a href="https://sandboxie-plus.com">sandboxie-plus.com</a> для дополнительной информации.</p><p></p><p></p><p></p><p>Иконки из <a href="https://icons8.com">icons8.com</a></p><p></p></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><p>Do you want to download the latest version?</p></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>&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><h3>About Sandboxie-Plus</h3><p>Version %1</p><p>Copyright (c) 2020-2021 by DavidXanatos</p></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'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'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><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><p></p><p></p><p>Icons from <a href="https://icons8.com">icons8.com</a></p><p></p></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 "*".</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><- for this one the above does not apply</source>
|
||||
<translation type="unfinished"><- для этого то что выше не применяется</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 <a href="sbie://docs/filerootpath">file system root</a>: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation type="unfinished">Sandbox <a href="sbie://docs/filerootpath">корень файловой системы</a>: </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Sandbox <a href="sbie://docs/ipcrootpath">ipc root</a>: </source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation type="unfinished">Sandbox <a href="sbie://docs/ipcrootpath">корень ipc</a>: </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Sandbox <a href="sbie://docs/keyrootpath">registry root</a>: </source>
|
||||
<translation type="unfinished">Sandbox <a href="sbie://docs/keyrootpath">корень реестра</a>: </translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Portable root folder</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue