From 1badefbef1a0fb46235f8a4f6cd1a3c5f26ab0dc Mon Sep 17 00:00:00 2001 From: DavidXanatos <3890945+DavidXanatos@users.noreply.github.com> Date: Mon, 17 Jun 2024 13:23:57 +0200 Subject: [PATCH] 1.14.2 --- CHANGELOG.md | 2 + SandboxiePlus/SandMan/Forms/OptionsWindow.ui | 374 +++++++++--------- .../SandMan/Resources/Actions/Job.png | Bin 0 -> 1389 bytes .../SandMan/Resources/Actions/Job2.png | Bin 0 -> 1410 bytes .../SandMan/Resources/Actions/Job3.png | Bin 0 -> 2103 bytes .../SandMan/Resources/Actions/Job4.png | Bin 0 -> 1678 bytes SandboxiePlus/SandMan/Resources/SandMan.qrc | 4 + .../SandMan/Windows/OptionsAccess.cpp | 41 +- .../SandMan/Windows/OptionsAdvanced.cpp | 85 ++-- .../SandMan/Windows/OptionsGeneral.cpp | 24 +- .../SandMan/Windows/OptionsWindow.cpp | 31 +- SandboxiePlus/SandMan/Windows/OptionsWindow.h | 25 +- 12 files changed, 288 insertions(+), 298 deletions(-) create mode 100644 SandboxiePlus/SandMan/Resources/Actions/Job.png create mode 100644 SandboxiePlus/SandMan/Resources/Actions/Job2.png create mode 100644 SandboxiePlus/SandMan/Resources/Actions/Job3.png create mode 100644 SandboxiePlus/SandMan/Resources/Actions/Job4.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 45db33fa..33ea9785 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Add new option "AllowCoverTaskbar" for [#3975](https://github.com/sandboxie-plus/Sandboxie/issues/3975) - added RPC Port message filter mechanism to block unsafe RDP calls via the driver [#3930](https://github.com/sandboxie-plus/Sandboxie/issues/3930) - Usage: "RpcPortFilter=Port,ID,Label" label is optional +- added "Job Object" Options page to colelct all job object related options ### Changed - Extend "Temp Template" to make it could delete local template section. @@ -36,6 +37,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). + ## [1.14.1 / 5.69.1] - 2024-06-06 ### Added diff --git a/SandboxiePlus/SandMan/Forms/OptionsWindow.ui b/SandboxiePlus/SandMan/Forms/OptionsWindow.ui index 22544996..fb23b793 100644 --- a/SandboxiePlus/SandMan/Forms/OptionsWindow.ui +++ b/SandboxiePlus/SandMan/Forms/OptionsWindow.ui @@ -1572,49 +1572,31 @@ - - - - 50 - false - true - - + - Advanced Security + Job Object - - - - - + + + + + - Using a custom Sandboxie Token allows to isolate individual sandboxes from each other better, and it shows in the user column of task managers the name of the box a process belongs to. Some 3rd party security solutions may however have problems with custom tokens. - - - true + Total Processes Number Limit: - - + + - Do not start sandboxed services using a system token (recommended) + Add sandboxed processes to job objects (recommended) - - - - Allow only privileged processes to access the Service Control Manager - - - - - + + - 75 true true @@ -1627,31 +1609,134 @@ - - + + - Use a Sandboxie login instead of an anonymous token + Total Processes Memory Limit: - - + + + + Single Process Memory Limit: + + + + + + + Leave it blank to disable the setting(Unit:KB) + + + + + + + Leave it blank to disable the setting(Unit:KB) + + + + + + + Leave it blank to disable the setting + + + + + + + Allow use of nested job objects (works on Windows 8 and later) + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + 0 + 0 + + + + + 16 + 0 + + + + + + + + + - 75 true true - Protect the sandbox integrity itself + Protect the system from sandboxed processes - Privilege isolation + Limit restrictions - + + + + + + + + false + true + + + + Advanced Security + + + + + + + + Drop critical privileges from processes running with a SYSTEM token + + + + Qt::Horizontal @@ -1664,10 +1749,20 @@ - - + + - Add sandboxed processes to job objects (recommended) + Allow only privileged processes to access the Service Control Manager + + + + + + + Using a custom Sandboxie Token allows to isolate individual sandboxes from each other better, and it shows in the user column of task managers the name of the box a process belongs to. Some 3rd party security solutions may however have problems with custom tokens. + + + true @@ -1675,7 +1770,6 @@ - 75 true true @@ -1685,7 +1779,37 @@ - + + + + + true + true + + + + Protect the sandbox integrity itself + + + Privilege isolation + + + + + + + Do not start sandboxed services using a system token (recommended) + + + + + + + Use a Sandboxie login instead of an anonymous token + + + + Qt::Vertical @@ -1716,7 +1840,6 @@ - 75 true true @@ -1726,18 +1849,10 @@ - - - - Drop critical privileges from processes running with a SYSTEM token - - - - + - 75 true true @@ -3927,7 +4042,6 @@ The process match level has a higher priority than the specificity and describes - 50 false true @@ -3949,49 +4063,31 @@ The process match level has a higher priority than the specificity and describes + + + + When the global hotkey is pressed 3 times in short succession this exception will be ignored. + + + Exclude this sandbox from being terminated when "Terminate All Processes" is invoked. + + + - - - Emulate sandboxed window station for all processes - - - - - - - - 75 - true - true - - - - Compatibility - - - - Disable the use of RpcMgmtSetComTimeout by default (this may resolve compatibility issues) - - - - Force usage of custom dummy Manifest files (legacy behaviour) - - - - + Use desktop object workaround for all processes - + Qt::Vertical @@ -4004,121 +4100,35 @@ The process match level has a higher priority than the specificity and describes - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Allow use of nested job objects (works on Windows 8 and later) - - - - - - - When the global hotkey is pressed 3 times in short succession this exception will be ignored. - - - Exclude this sandbox from being terminated when "Terminate All Processes" is invoked. - - - - - - - - - - Process Limits - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - + + - 75 true true - - Protect the system from sandboxed processes - - Limit restrictions - - - - - - - Leave it blank to disable the setting(Unit:KB) - - - - - - - Leave it blank to disable the setting - - - - - - - Leave it blank to disable the setting(Unit:KB) - - - - - - - Total Processes Number Limit: + Compatibility - + - Total Processes Memory Limit: + Force usage of custom dummy Manifest files (legacy behaviour) - - + + - Single Process Memory Limit: + Emulate sandboxed window station for all processes - - + + Qt::Horizontal diff --git a/SandboxiePlus/SandMan/Resources/Actions/Job.png b/SandboxiePlus/SandMan/Resources/Actions/Job.png new file mode 100644 index 0000000000000000000000000000000000000000..7dd24941fc01b5fb055cf1f78f26d5dcf7d11261 GIT binary patch literal 1389 zcmV-z1(N!SP)ptFL@HP}d1gX&6T3nC-7+(--B5k~ zZpaSBB-PtsFEiVE>92Nd`)yE6u;zaUoA3KHsD#~-m$yC2_HB={HR4fXBOXN=@hF>N zNs+^nvL2R{wP8tF9hQ{nuxoqimNSJ}9CD@>hT1fP?{LrZEoW+V*tL!I>$!e%SW-4e zBr*eM;Y^&346(2~vM_M9yC?}|@an^(JDrfd>o--7?sP(I@Y<*$iIw2T-(|k`f|(Ny ze)6rZ$gcxU$-lpB1vBUMK+}${NMfMr=&$e6s4N02%c~0v9AQ)Cifq`;giH zS5A9ksW_k<{)T;b4No2pIt=nov!MCbVZ_GerLbu z{KL|Nmmsry?^tB_9(i`&zWYHNtay3-AC1$koE&j+5cLYM*--(nZd5|jUj=*JHE_^V zT+;n^I2ihfg#2A({a$wsnT-s{5^WbC;fpJU= z2h(j9h`6k<;Nd~`RluvyDk0HT4g3E=lFgeyHT>3D1zXou*m=ncvo4OzooH1VrW_W+ zG}FexjMIR~6Q@;v;#3O?g|O+v77L8ESl~fRIgB=!!!OO{FnX;V9yvI8=C;DJR{*&~ zgx8&w@Fs8!i?TcZDu`dNfVFlJ79<{l;6aN;?a^FLdSZVnfOA=a*)|T4E#kE5i_E#K z@-vqeo;t0hXqFM0Dv%o25TkN5;|P|6rN9I_2adHY{A6ALzkm}0fNaR9D>Co4%Fo?o zGZYHVXh|_*RE`R2g}$FC0MEla)EPv;$-z@b;JM2R^KKG-ktMfP#%q7!=1CD1!e&}h zteBc(u+uWdK(pX8Ie46bv+)0MjuAknMTv(cBO=QZFE4v|Sdw^Ph1grd0aS{LQ8`vn zD|8S2WZnXIs=afc51Bdd=3#*fNIW3hip1-Sta*5O)hj^MBak92UOYvL6{9zH92Jla zKBMmmbncVMgS#ladio2w*~=0SD;}OOAsaI4imbQu@;Ywzszq3gO$w#(l&Bb$Ly$Rx zVWIKVUoa=X$eupJdsH3_vLU0c$VNLa%k2VewC9RWNU1l4r$oi_a*W_v!98?8g+2!7 z$(;P@=iyZ*mCb;N;uGXepGXR*P@xnnMsJMX8Y`(4d`I`Gb;1eowE}o5u!-@BfQ-5# zF`ppE$YzlgVettm4KXUmCdxwQKxx>zbtW4O_}lPmkZsF|$X16SZ*_=(!6GVkmY9~{ znbD|~b>L$t&>=#cuo)D=%`~S;v0|)TF`>1jPeJb(15X9w#fZc^#5J}^ONtdMlq)uD zpV%qjCpdiKs*xM{>8vJa$&rw6_#|K+lz}w@9oG~Qe$*97-uUo?xKI2c?i0qgeBz{; v688yXai91-GU|$yR%w-1X_Z#lJ6Qh$3I9@iuC#FO00000NkvXXu0mjf%z=?* literal 0 HcmV?d00001 diff --git a/SandboxiePlus/SandMan/Resources/Actions/Job2.png b/SandboxiePlus/SandMan/Resources/Actions/Job2.png new file mode 100644 index 0000000000000000000000000000000000000000..b6c253e572ae0a9a5ee67aaae1176cfc2f9bb80c GIT binary patch literal 1410 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

rAg`K9&f>;DTh8Vw#aG|`CggmfH>Psh=i)IzVK zqMywPQOiY?S}ul4E(QU0Oo3*gbif!KI}DUwZv^7VM@Cc>lr&%(k$bv;MzpoJV{^g{ zEZKVzOWwbLU-%Wm`S?`~XofH{GJ><`Kc^94acMXjn~Korq#r+yRQBnFbh?YEPIoa# z2#7(w3Z@Gv@$A_% zP^zw(h~tU)C_Mg0oscefaVs053&n=b#?2M-ZMw>d4`ph$))ssHMg_gF(~Il05Wn#{ zfz&_MV0?TW4b5#c5QoAO5EvHs!(1bBVlIe293A;&)U!gS9yu&i6Oy#fiL-^5>D{Tj zw;#X#xM&7q^?@^Z{PbJAc<}<4u3Vpuz=ua-#&kk7TbBO3OD>M-l8eea<>Fh56}4P^ zt5zzwQ@)A!O@Vw(OVY9M@7RZ3U40|HJN5rfgTzZU*qc&{gbURe9+^Z8XdWRXI{78y zk72P74@M~0a15bhQ*x@A!;Tz`&8_Y9?nD+gSrcSB5yar5VZ^4LoF0i|aqS#Ks;Jac zE7&J?q%srdi%L-6*n+N}UbM8UQ1s_AgvO-Im`(?e#Bb&pQe|gnFJTbu!!B(07CUoI zAn-`6HOG)DGBGP^p@@Sa(fA-Z;ta=-Dl#E6AR;mS2W>>scyNTWHz+*unGVFi0uCJy z;}}|nCFGcg#ib1}h>#d%0sDU7(U_DEk3=(wp@5?iHvhlg&ZCaSq`nstlbo;X-hq(l h)IS`KaDLSb{text#fTs(CCC5(002ovPDHLkV1jWl+cp3I literal 0 HcmV?d00001 diff --git a/SandboxiePlus/SandMan/Resources/Actions/Job4.png b/SandboxiePlus/SandMan/Resources/Actions/Job4.png new file mode 100644 index 0000000000000000000000000000000000000000..df5f4d0ec0c6ce82ae7afc26cce64ff18465d8f5 GIT binary patch literal 1678 zcmV;9266d`P)y zB84D|8x79IY=2DW7Pc(e{@DMn_deZ9ZfeqG>8I3^kTy%7&h!eOe9~ zhT2NAdg=8Y!g!3s#CDaLxH;%tbWS=qt)bgttZyvdzAqvKdvJTj<6}AS9nX!bJU*6# z?t?qdhlOahzfnH%fd$bVxBbnJ6(P5aQwJX%Nk=rNzc_V35#lXQef+m$8=^Ub2ewWq zLyA&-58qBjG{?I?#is}vEZppSa3BTIoWa7)$`G$T**Cs_3!*t*dvX|%{EfcxqD_eA zc=I=g0m)1BjTI&#n&Zt&3f~?v3}2*%Pr48F!>&{Jm{_9H|R3 z=9oPZv_@q}-U2~NQZO-c789dC^BFnI9a|7c-v0@CXKN54gdSUnvHuJQGLRcLao?VZ zr;ZGS9$Sd92lmGQqX=1w7v zOAWV0hc4TC+}gbXgSl}S*_VL(`H^L8e=_cuyv~LD9O3mN`x3ahX$`a%ceW1o1`RG| zs2N2_U51*un5jl>h8h<#RH#l@p^_#|joM5V>a#RxG;6_F*W=cn4e;)b$LKte(%j37 z$DN!w^z7n`Z7^wYDND`GTb0h&P?MqJYO2drqs|Zp(QRAN25tg3xYFE z#gDNwmK&3fF9PViQoyB5HE3=128}Z0T9$^nnx(-NgND24k_1#U4OJ-v6LDfHX<R|LgDmUY4Ozpp!vWW{B=8P6EG+&-m$=(O^F>BG)O@7 z+mJ&^VSM<)<_hgY`_>9+Dq4$4N#TBl^nbWY`B$sOq-9#nS~Q!qkb~r;;sw0aN;?-I`npGB?$Bp1bSzIFan0IRD}fO zBA?4bIOnCgXgW#?6IV=JH7Qaq^c?Lo@af9np6HDXf;Iww^%UeMSxC24$8=luV6A#k zP?rD-LCL^GoHQborp+9BZv50M!F_QnLP)#t1HkWbY1W{(K%r@yHA5Gm}O%Xmv zZb+UZPV(d8LR{oX$je|yn2=Tie`Ux6@f2C?_QXl{OghOOuAmCxCDAiGgnK;^5R*>w z$nPRw;2e38L_?!*v6C+1nfiun2>dq)0&N5Vx&m(DR;mqoZahRaQITkCPb!Eh-2X-V zJmeUO)<&NNei!-H?1iDvS`V%Hm1qwh}iwSzvfDG=w#a;1y@ Y0|hf8;KYl+LI3~&07*qoM6N<$f-UY7BLDyZ literal 0 HcmV?d00001 diff --git a/SandboxiePlus/SandMan/Resources/SandMan.qrc b/SandboxiePlus/SandMan/Resources/SandMan.qrc index acf7546b..429a4b5c 100644 --- a/SandboxiePlus/SandMan/Resources/SandMan.qrc +++ b/SandboxiePlus/SandMan/Resources/SandMan.qrc @@ -182,6 +182,10 @@ Actions/TaskBar.png Actions/Desktop.png Actions/Pause.png + Actions/Job.png + Actions/Job2.png + Actions/Job4.png + Actions/Job3.png Boxes/BusyOverlay.png diff --git a/SandboxiePlus/SandMan/Windows/OptionsAccess.cpp b/SandboxiePlus/SandMan/Windows/OptionsAccess.cpp index 110a61c4..0eb62b24 100644 --- a/SandboxiePlus/SandMan/Windows/OptionsAccess.cpp +++ b/SandboxiePlus/SandMan/Windows/OptionsAccess.cpp @@ -13,11 +13,11 @@ void COptionsWindow::CreateAccess() { // Resource Access - connect(ui.chkPrivacy, SIGNAL(clicked(bool)), this, SLOT(OnAccessChanged())); - connect(ui.chkUseSpecificity, SIGNAL(clicked(bool)), this, SLOT(OnAccessChanged())); - connect(ui.chkBlockWMI, SIGNAL(clicked(bool)), this, SLOT(OnAccessChanged())); - connect(ui.chkCloseForBox, SIGNAL(clicked(bool)), this, SLOT(OnAccessChanged())); - connect(ui.chkNoOpenForBox, SIGNAL(clicked(bool)), this, SLOT(OnAccessChanged())); + connect(ui.chkPrivacy, SIGNAL(clicked(bool)), this, SLOT(OnAccessChangedEx())); + connect(ui.chkUseSpecificity, SIGNAL(clicked(bool)), this, SLOT(OnAccessChangedEx())); + connect(ui.chkBlockWMI, SIGNAL(clicked(bool)), this, SLOT(OnAccessChangedEx())); + connect(ui.chkCloseForBox, SIGNAL(clicked(bool)), this, SLOT(OnAccessChangedEx())); + connect(ui.chkNoOpenForBox, SIGNAL(clicked(bool)), this, SLOT(OnAccessChangedEx())); // connect(ui.btnAddFile, SIGNAL(clicked(bool)), this, SLOT(OnAddFile())); @@ -54,8 +54,8 @@ void COptionsWindow::CreateAccess() connect(ui.tabsAccess, SIGNAL(currentChanged(int)), this, SLOT(OnAccessTab())); } -void COptionsWindow::OnAccessChanged() -{ +void COptionsWindow::OnAccessChangedEx() +{ if (sender() == ui.chkPrivacy || sender() == ui.chkUseSpecificity) { if (ui.chkPrivacy->isChecked() || (ui.chkUseSpecificity->isEnabled() && ui.chkUseSpecificity->isChecked())) theGUI->CheckCertificate(this); @@ -67,7 +67,14 @@ void COptionsWindow::OnAccessChanged() ui.chkUseSpecificity->setChecked(m_pBox->GetBool("UseRuleSpecificity", false)); } - m_AccessChanged = true; + OnAccessChanged(); +} + +void COptionsWindow::OnAccessChanged() +{ + UpdateJobOptions(); + + m_AccessChanged = true; OnOptChanged(); } @@ -105,8 +112,7 @@ void COptionsWindow::SetAccessEntry(EAccessType Type, const QString& Program, EA { if (GetAccessEntry(Type, Program, Mode, Path) != NULL) return; // already set - m_AccessChanged = true; - OnOptChanged(); + OnAccessChanged(); AddAccessEntry(Type, Mode, Program, Path); } @@ -115,8 +121,7 @@ void COptionsWindow::DelAccessEntry(EAccessType Type, const QString& Program, EA if(QTreeWidgetItem* pItem = GetAccessEntry(Type, Program, Mode, Path)) { delete pItem; - m_AccessChanged = true; - OnOptChanged(); + OnAccessChanged(); } } @@ -365,8 +370,7 @@ void COptionsWindow::OnBrowseFile() AddAccessEntry(eFile, eOpen, "", Value); - m_AccessChanged = true; - OnOptChanged(); + OnAccessChanged(); } void COptionsWindow::OnBrowseFolder() @@ -377,8 +381,7 @@ void COptionsWindow::OnBrowseFolder() AddAccessEntry(eFile, eOpen, "", Value); - m_AccessChanged = true; - OnOptChanged(); + OnAccessChanged(); } QString COptionsWindow::ExpandPath(EAccessType Type, const QString& Path) @@ -586,8 +589,7 @@ void COptionsWindow::CloseAccessEdit(QTreeWidgetItem* pItem, bool bSave) pItem->setText(3, ExpandPath(Type, Path)); pItem->setData(3, Qt::UserRole, Path); - m_AccessChanged = true; - OnOptChanged(); + OnAccessChanged(); } pTree->setItemWidget(pItem, 1, NULL); @@ -675,8 +677,7 @@ void COptionsWindow::OnAccessChanged(QTreeWidgetItem* pItem, int Column) if (Column != 0) return; - m_AccessChanged = true; - OnOptChanged(); + OnAccessChanged(); } void COptionsWindow::DeleteAccessEntry(QTreeWidgetItem* pItem, int Column) diff --git a/SandboxiePlus/SandMan/Windows/OptionsAdvanced.cpp b/SandboxiePlus/SandMan/Windows/OptionsAdvanced.cpp index 6e788f52..f7f590c6 100644 --- a/SandboxiePlus/SandMan/Windows/OptionsAdvanced.cpp +++ b/SandboxiePlus/SandMan/Windows/OptionsAdvanced.cpp @@ -129,7 +129,9 @@ void COptionsWindow::LoadAdvanced() ui.chkPreferExternalManifest->setChecked(m_pBox->GetBool("PreferExternalManifest", false)); ui.chkElevateCreateProcessFix->setChecked(m_pBox->GetBool("ApplyElevateCreateProcessFix", false)); + ui.chkAddToJob->setChecked(!m_pBox->GetBool("NoAddProcessToJob", false)); ui.chkNestedJobs->setChecked(m_pBox->GetBool("AllowBoxedJobs", false)); + ui.chkUseSbieDeskHack->setChecked(m_pBox->GetBool("UseSbieDeskHack", true)); ui.chkUseSbieWndStation->setChecked(m_pBox->GetBool("UseSbieWndStation", true)); @@ -302,6 +304,8 @@ void COptionsWindow::LoadAdvanced() if (!ui.chkOpenCredentials->isEnabled()) ui.chkOpenCredentials->setChecked(true); m_AdvancedChanged = false; + + UpdateJobOptions(); } void COptionsWindow::OnPSTChanged() @@ -553,16 +557,16 @@ void COptionsWindow::OnIsolationChanged() ui.chkNoOpenForBox->setChecked(m_pBox->GetBool("DontOpenForBoxed", true)); } - m_AdvancedChanged = true; - OnOptChanged(); + OnAdvancedChanged(); } void COptionsWindow::UpdateBoxIsolation() { ui.chkNoSecurityFiltering->setEnabled(ui.chkNoSecurityIsolation->isChecked()); - ui.chkAddToJob->setEnabled(!IsAccessEntrySet(eWnd, "", eOpen, "*") && !ui.chkNoSecurityIsolation->isChecked()); - ui.chkNestedJobs->setEnabled(!ui.chkNoSecurityIsolation->isChecked()); + //ui.chkNotUntrusted->setEnabled(!ui.chkNoSecurityIsolation->isChecked()); + + UpdateJobOptions(); ui.chkOpenDevCMApi->setEnabled(!ui.chkNoSecurityIsolation->isChecked()); ui.chkOpenSamEndpoint->setEnabled(!ui.chkNoSecurityIsolation->isChecked()); @@ -592,13 +596,9 @@ void COptionsWindow::UpdateBoxIsolation() if (ui.chkNoSecurityIsolation->isChecked()) { ui.chkCloseForBox->setChecked(false); ui.chkNoOpenForBox->setChecked(false); - if (!IsAccessEntrySet(eWnd, "", eOpen, "*")) - ui.chkAddToJob->setChecked(false); ui.chkSbieLogon->setChecked(false); } else { - if (!IsAccessEntrySet(eWnd, "", eOpen, "*")) - ui.chkAddToJob->setChecked(!m_pBox->GetBool("NoAddProcessToJob", false)); ReadGlobalCheck(ui.chkSbieLogon, "SandboxieLogon", false); } } @@ -606,8 +606,7 @@ void COptionsWindow::UpdateBoxIsolation() void COptionsWindow::OnSysSvcChanged() { ui.chkElevateRpcss->setDisabled(ui.chkNoSecurityIsolation->isChecked() && (!ui.chkRestrictServices->isChecked() || ui.chkMsiExemptions->isChecked())); - m_AdvancedChanged = true; - OnOptChanged(); + OnAdvancedChanged(); } void COptionsWindow::OnConfidentialChanged() @@ -623,10 +622,25 @@ void COptionsWindow::OnLessConfidentialChanged() void COptionsWindow::OnAdvancedChanged() { + UpdateJobOptions(); + m_AdvancedChanged = true; OnOptChanged(); } +void COptionsWindow::UpdateJobOptions() +{ + bool IsAllWndOpen = ui.chkNoSecurityIsolation->isChecked() || IsAccessEntrySet(eWnd, "", eOpen, "*"); + ui.chkAddToJob->setEnabled(!IsAllWndOpen); + + bool bUseJobObject = !IsAllWndOpen && ui.chkAddToJob->isChecked(); + ui.chkNestedJobs->setEnabled(bUseJobObject); + + ui.lineSingleMemory->setEnabled(bUseJobObject); + ui.lineTotalMemory->setEnabled(bUseJobObject); + ui.lineTotalNumber->setEnabled(bUseJobObject); +} + void COptionsWindow::CheckOpenCOM() { bool bComIpcOpen = IsAccessEntrySet(eIPC, "", eOpen, "\\RPC Control\\epmapper") || IsAccessEntrySet(eIPC, "", eOpen, "*"); @@ -808,8 +822,7 @@ void COptionsWindow::OnAddOption() void COptionsWindow::OnDelOption() { DeleteAccessEntry(ui.treeOptions->currentItem()); - m_AdvancedChanged = true; - OnOptChanged(); + OnAdvancedChanged(); } void COptionsWindow::OnOptionItemDoubleClicked(QTreeWidgetItem* pItem, int Column) @@ -880,8 +893,7 @@ void COptionsWindow::OnOptionChanged(QTreeWidgetItem* pItem, int Column) if (Column != 0) return; - m_AdvancedChanged = true; - OnOptChanged(); + OnAdvancedChanged(); } void COptionsWindow::CloseOptionEdit(bool bSave) @@ -923,8 +935,7 @@ void COptionsWindow::CloseOptionEdit(QTreeWidgetItem* pItem, bool bSave) pItem->setText(2, pValue->currentText()); pItem->setData(2, Qt::UserRole, pValue->currentText()); - m_AdvancedChanged = true; - OnOptChanged(); + OnAdvancedChanged(); } ui.treeOptions->setItemWidget(pItem, 1, NULL); @@ -979,8 +990,7 @@ void COptionsWindow::OnAddAutoRun() return; AddTriggerItem(Value, eOnStartCmd); - m_AdvancedChanged = true; - OnOptChanged(); + OnAdvancedChanged(); } void COptionsWindow::OnAddAutoSvc() @@ -990,8 +1000,7 @@ void COptionsWindow::OnAddAutoSvc() return; AddTriggerItem(Value, eOnStartSvc); - m_AdvancedChanged = true; - OnOptChanged(); + OnAdvancedChanged(); } void COptionsWindow::OnAddAutoExec() @@ -1001,8 +1010,7 @@ void COptionsWindow::OnAddAutoExec() return; AddTriggerItem(Value, eAutoExec); - m_AdvancedChanged = true; - OnOptChanged(); + OnAdvancedChanged(); } void COptionsWindow::OnAddDeleteCmd() @@ -1012,8 +1020,7 @@ void COptionsWindow::OnAddDeleteCmd() return; AddTriggerItem(Value, eDeleteCmd); - m_AdvancedChanged = true; - OnOptChanged(); + OnAdvancedChanged(); } void COptionsWindow::OnAddTerminateCmd() @@ -1023,8 +1030,7 @@ void COptionsWindow::OnAddTerminateCmd() return; AddTriggerItem(Value, eTerminateCmd); - m_AdvancedChanged = true; - OnOptChanged(); + OnAdvancedChanged(); } void COptionsWindow::OnAddRecoveryCheck() @@ -1034,15 +1040,13 @@ void COptionsWindow::OnAddRecoveryCheck() return; AddTriggerItem(Value, eRecoveryCheck); - m_AdvancedChanged = true; - OnOptChanged(); + OnAdvancedChanged(); } void COptionsWindow::OnDelAuto() { DeleteAccessEntry(ui.treeTriggers->currentItem()); - m_AdvancedChanged = true; - OnOptChanged(); + OnAdvancedChanged(); } // @@ -1054,15 +1058,13 @@ void COptionsWindow::OnAddProcess() AddHiddenProcEntry(Process); - m_AdvancedChanged = true; - OnOptChanged(); + OnAdvancedChanged(); } void COptionsWindow::OnDelProcess() { DeleteAccessEntry(ui.treeHideProc->currentItem()); - m_AdvancedChanged = true; - OnOptChanged(); + OnAdvancedChanged(); } void COptionsWindow::OnHostProcessAllow() @@ -1073,8 +1075,7 @@ void COptionsWindow::OnHostProcessAllow() AddHostProcEntry(Process, false); - m_AdvancedChanged = true; - OnOptChanged(); + OnAdvancedChanged(); } void COptionsWindow::OnHostProcessDeny() @@ -1085,15 +1086,13 @@ void COptionsWindow::OnHostProcessDeny() AddHostProcEntry(Process, true); - m_AdvancedChanged = true; - OnOptChanged(); + OnAdvancedChanged(); } void COptionsWindow::OnDelHostProcess() { DeleteAccessEntry(ui.treeHostProc->currentItem()); - m_AdvancedChanged = true; - OnOptChanged(); + OnAdvancedChanged(); } void COptionsWindow::ShowHiddenProcTmpl(bool bUpdate) @@ -1234,8 +1233,7 @@ void COptionsWindow::OnAddUser() ui.lstUsers->addItems(Users); - m_AdvancedChanged = true; - OnOptChanged(); + OnAdvancedChanged(); } void COptionsWindow::OnDelUser() @@ -1243,8 +1241,7 @@ void COptionsWindow::OnDelUser() foreach(QListWidgetItem* pItem, ui.lstUsers->selectedItems()) delete pItem; - m_AdvancedChanged = true; - OnOptChanged(); + OnAdvancedChanged(); } void COptionsWindow::CreateDebug() diff --git a/SandboxiePlus/SandMan/Windows/OptionsGeneral.cpp b/SandboxiePlus/SandMan/Windows/OptionsGeneral.cpp index 68d656be..c2bd7864 100644 --- a/SandboxiePlus/SandMan/Windows/OptionsGeneral.cpp +++ b/SandboxiePlus/SandMan/Windows/OptionsGeneral.cpp @@ -283,11 +283,8 @@ void COptionsWindow::LoadGeneral() ui.chkPrintToFile->setChecked(m_pBox->GetBool("AllowSpoolerPrintToFile", false)); ui.lineSingleMemory->setText(m_pBox->GetText("ProcessMemoryLimit", "")); - ui.lineSingleMemory->setEnabled(true); ui.lineTotalMemory->setText(m_pBox->GetText("TotalMemoryLimit", "")); - ui.lineTotalMemory->setEnabled(true); ui.lineTotalNumber->setText(m_pBox->GetText("TotalNumberLimit", "")); - ui.lineTotalNumber->setEnabled(true); //ui.chkOpenProtectedStorage->setChecked(m_pBox->GetBool("OpenProtectedStorage", false)); ui.chkOpenProtectedStorage->setChecked(m_BoxTemplates.contains("OpenProtectedStorage")); @@ -429,12 +426,12 @@ void COptionsWindow::SaveGeneral() WriteAdvancedCheck(ui.chkOpenSpooler, "OpenPrintSpooler", "y", ""); WriteAdvancedCheck(ui.chkPrintToFile, "AllowSpoolerPrintToFile", "y", ""); - if (!ui.lineSingleMemory->text().isEmpty()) - WriteText("ProcessMemoryLimit", ui.lineSingleMemory->text()); - if (!ui.lineTotalMemory->text().isEmpty()) - WriteText("TotalMemoryLimit", ui.lineTotalMemory->text()); - if (!ui.lineTotalNumber->text().isEmpty()) - WriteText("ProcessNumberLimit", ui.lineTotalNumber->text()); + if (!ui.lineSingleMemory->text().isEmpty()) WriteText("ProcessMemoryLimit", ui.lineSingleMemory->text()); + else m_pBox->DelValue("ProcessMemoryLimit"); + if (!ui.lineTotalMemory->text().isEmpty()) WriteText("TotalMemoryLimit", ui.lineTotalMemory->text()); + else m_pBox->DelValue("TotalMemoryLimit"); + if (!ui.lineTotalNumber->text().isEmpty()) WriteText("ProcessNumberLimit", ui.lineTotalNumber->text()); + else m_pBox->DelValue("ProcessNumberLimit"); //WriteAdvancedCheck(ui.chkOpenProtectedStorage, "OpenProtectedStorage", "y", ""); SetTemplate("OpenProtectedStorage", ui.chkOpenProtectedStorage->isChecked()); @@ -815,10 +812,6 @@ void COptionsWindow::OnGeneralChanged() ui.chkOpenSpooler->setEnabled(!ui.chkBlockSpooler->isChecked() && !ui.chkNoSecurityIsolation->isChecked()); ui.chkPrintToFile->setEnabled(!ui.chkBlockSpooler->isChecked() && !ui.chkNoSecurityFiltering->isChecked()); - ui.lineSingleMemory->setEnabled(ui.chkAddToJob->isChecked()); - ui.lineTotalMemory->setEnabled(ui.chkAddToJob->isChecked()); - ui.lineTotalNumber->setEnabled(ui.chkAddToJob->isChecked()); - ui.chkCoverBar->setEnabled(ui.chkUserOperation->isChecked()); ui.chkOpenCredentials->setEnabled(!ui.chkOpenProtectedStorage->isChecked()); @@ -866,7 +859,7 @@ void COptionsWindow::OnSecurityMode() m_GeneralChanged = true; OnOptChanged(); - OnAccessChanged(); // for rule specificity + OnAccessChangedEx(); // for rule specificity } void COptionsWindow::OnUseIcon(bool bUse) @@ -1142,8 +1135,7 @@ void COptionsWindow::OnVmRead() SetAccessEntry(eIPC, "", eReadOnly, "$:*"); else DelAccessEntry(eIPC, "", eReadOnly, "$:*"); - m_AdvancedChanged = true; - OnOptChanged(); + OnAdvancedChanged(); } void COptionsWindow::OnDiskChanged() diff --git a/SandboxiePlus/SandMan/Windows/OptionsWindow.cpp b/SandboxiePlus/SandMan/Windows/OptionsWindow.cpp index dda21b5d..bea8481b 100644 --- a/SandboxiePlus/SandMan/Windows/OptionsWindow.cpp +++ b/SandboxiePlus/SandMan/Windows/OptionsWindow.cpp @@ -207,14 +207,15 @@ COptionsWindow::COptionsWindow(const QSharedPointer& pBox, const QStri ui.tabsGeneral->setTabIcon(1, CSandMan::GetIcon("Folder")); ui.tabsGeneral->setTabIcon(2, CSandMan::GetIcon("Move")); ui.tabsGeneral->setTabIcon(3, CSandMan::GetIcon("NoAccess")); - ui.tabsGeneral->setTabIcon(4, CSandMan::GetIcon("Fence")); + ui.tabsGeneral->setTabIcon(4, CSandMan::GetIcon("EFence")); ui.tabsGeneral->setTabIcon(5, CSandMan::GetIcon("Run")); ui.tabsSecurity->setCurrentIndex(0); ui.tabsSecurity->setTabIcon(0, CSandMan::GetIcon("Shield7")); ui.tabsSecurity->setTabIcon(1, CSandMan::GetIcon("Fence")); ui.tabsSecurity->setTabIcon(2, CSandMan::GetIcon("Shield15")); - ui.tabsSecurity->setTabIcon(3, CSandMan::GetIcon("Shield12")); + ui.tabsSecurity->setTabIcon(3, CSandMan::GetIcon("Job")); + ui.tabsSecurity->setTabIcon(4, CSandMan::GetIcon("Shield12")); ui.tabsForce->setCurrentIndex(0); ui.tabsForce->setTabIcon(0, CSandMan::GetIcon("Force")); @@ -247,8 +248,7 @@ COptionsWindow::COptionsWindow(const QSharedPointer& pBox, const QStri ui.tabsOther->setCurrentIndex(0); ui.tabsOther->setTabIcon(0, CSandMan::GetIcon("Presets")); - ui.tabsOther->setTabIcon(1, CSandMan::GetIcon("BFance")); - ui.tabsOther->setTabIcon(2, CSandMan::GetIcon("Dll")); + ui.tabsOther->setTabIcon(1, CSandMan::GetIcon("Dll")); ui.tabsAdvanced->setCurrentIndex(0); ui.tabsAdvanced->setTabIcon(0, CSandMan::GetIcon("Presets")); @@ -370,6 +370,8 @@ COptionsWindow::COptionsWindow(const QSharedPointer& pBox, const QStri AddIconToLabel(ui.lblMigration, CSandMan::GetIcon("Move").pixmap(size,size)); AddIconToLabel(ui.lblDelete, CSandMan::GetIcon("Erase").pixmap(size,size)); AddIconToLabel(ui.lblRawDisk, CSandMan::GetIcon("Disk").pixmap(size,size)); + AddIconToLabel(ui.lblJob, CSandMan::GetIcon("Job3").pixmap(size,size)); + AddIconToLabel(ui.lblLimit, CSandMan::GetIcon("Job2").pixmap(size,size)); AddIconToLabel(ui.lblSecurity, CSandMan::GetIcon("Shield5").pixmap(size,size)); AddIconToLabel(ui.lblElevation, CSandMan::GetIcon("Shield9").pixmap(size,size)); AddIconToLabel(ui.lblBoxProtection, CSandMan::GetIcon("BoxConfig").pixmap(size,size)); @@ -385,11 +387,9 @@ COptionsWindow::COptionsWindow(const QSharedPointer& pBox, const QStri AddIconToLabel(ui.lblPolicy, CSandMan::GetIcon("Policy").pixmap(size,size)); AddIconToLabel(ui.lblCompatibility, CSandMan::GetIcon("Compatibility").pixmap(size,size)); - AddIconToLabel(ui.lblLimit, CSandMan::GetIcon("EFence").pixmap(size,size)); //AddIconToLabel(ui.lblComRpc, CSandMan::GetIcon("Objects").pixmap(size,size)); AddIconToLabel(ui.lblPrivilege, CSandMan::GetIcon("Token").pixmap(size,size)); - AddIconToLabel(ui.lblFence, CSandMan::GetIcon("BFance").pixmap(size,size)); AddIconToLabel(ui.lblToken, CSandMan::GetIcon("Sandbox").pixmap(size,size)); AddIconToLabel(ui.lblIsolation, CSandMan::GetIcon("Fence").pixmap(size,size)); AddIconToLabel(ui.lblAccess, CSandMan::GetIcon("NoAccess").pixmap(size,size)); @@ -1173,25 +1173,6 @@ void COptionsWindow::UpdateCurrentTab() { ui.chkVmRead->setChecked(IsAccessEntrySet(eIPC, "", eReadOnly, "$:*")); } - else if (m_pCurrentTab == ui.tabPrivileges || m_pCurrentTab == ui.tabSecurity) - { - if (IsAccessEntrySet(eWnd, "", eOpen, "*")) - { - if (!ui.chkNoSecurityIsolation->isChecked()) - { - ui.chkAddToJob->setEnabled(false); - ui.chkAddToJob->setChecked(false); - } - } - else - { - if (!ui.chkNoSecurityIsolation->isChecked()) - { - ui.chkAddToJob->setEnabled(true); - ui.chkAddToJob->setChecked(!m_pBox->GetBool("NoAddProcessToJob", false)); - } - } - } else if (m_pCurrentTab == ui.tabStart || m_pCurrentTab == ui.tabForce) { if (IsAccessEntrySet(eIPC, "!", eClosed, "*")) diff --git a/SandboxiePlus/SandMan/Windows/OptionsWindow.h b/SandboxiePlus/SandMan/Windows/OptionsWindow.h index c38e70e3..fa612ca8 100644 --- a/SandboxiePlus/SandMan/Windows/OptionsWindow.h +++ b/SandboxiePlus/SandMan/Windows/OptionsWindow.h @@ -159,24 +159,24 @@ private slots: void OnAccessSelectionChanged() { CloseAccessEdit(); OnOptChanged();} void OnAccessChanged(QTreeWidgetItem* pItem, int Column); - void OnAddFile() { AddAccessEntry(eFile, eOpen, "", ""); m_AccessChanged = true; OnOptChanged(); } + void OnAddFile() { AddAccessEntry(eFile, eOpen, "", ""); OnAccessChanged(); } void OnBrowseFile(); void OnBrowseFolder(); - void OnDelFile() { DeleteAccessEntry(ui.treeFiles->currentItem()); m_AccessChanged = true; OnOptChanged(); } + void OnDelFile() { DeleteAccessEntry(ui.treeFiles->currentItem()); OnAccessChanged(); } void OnShowFilesTmpl() { LoadAccessListTmpl(eFile, ui.chkShowFilesTmpl->isChecked(), true); } - void OnAddKey() { AddAccessEntry(eKey, eOpen, "", ""); m_AccessChanged = true; OnOptChanged(); } - void OnDelKey() { DeleteAccessEntry(ui.treeKeys->currentItem()); m_AccessChanged = true; OnOptChanged(); } + void OnAddKey() { AddAccessEntry(eKey, eOpen, "", ""); OnAccessChanged(); } + void OnDelKey() { DeleteAccessEntry(ui.treeKeys->currentItem()); OnAccessChanged(); } void OnShowKeysTmpl() { LoadAccessListTmpl(eKey, ui.chkShowKeysTmpl->isChecked(), true); } - void OnAddIPC() { AddAccessEntry(eIPC, eOpen, "", ""); m_AccessChanged = true; OnOptChanged(); } - void OnDelIPC() { DeleteAccessEntry(ui.treeIPC->currentItem()); m_AccessChanged = true; OnOptChanged(); } + void OnAddIPC() { AddAccessEntry(eIPC, eOpen, "", ""); OnAccessChanged(); } + void OnDelIPC() { DeleteAccessEntry(ui.treeIPC->currentItem()); OnAccessChanged(); } void OnShowIPCTmpl() { LoadAccessListTmpl(eIPC, ui.chkShowIPCTmpl->isChecked(), true); } - void OnAddWnd() { AddAccessEntry(eWnd, eOpen, "", ""); m_AccessChanged = true; OnOptChanged(); } - void OnDelWnd() { DeleteAccessEntry(ui.treeWnd->currentItem()); m_AccessChanged = true; OnOptChanged(); } + void OnAddWnd() { AddAccessEntry(eWnd, eOpen, "", ""); OnAccessChanged(); } + void OnDelWnd() { DeleteAccessEntry(ui.treeWnd->currentItem()); OnAccessChanged(); } void OnShowWndTmpl() { LoadAccessListTmpl(eWnd, ui.chkShowWndTmpl->isChecked(), true); } - void OnAddCOM() { AddAccessEntry(eCOM, eOpen, "", ""); m_AccessChanged = true; OnOptChanged(); } - void OnDelCOM() { DeleteAccessEntry(ui.treeCOM->currentItem()); m_AccessChanged = true; OnOptChanged(); } + void OnAddCOM() { AddAccessEntry(eCOM, eOpen, "", ""); OnAccessChanged(); } + void OnDelCOM() { DeleteAccessEntry(ui.treeCOM->currentItem()); OnAccessChanged(); } void OnShowCOMTmpl() { LoadAccessListTmpl(eCOM, ui.chkShowCOMTmpl->isChecked(), true); } - //void OnDelAccess() { DeleteAccessEntry(ui.treeAccess->currentItem()); m_AccessChanged = true; OnOptChanged(); } + //void OnDelAccess() { DeleteAccessEntry(ui.treeAccess->currentItem()); OnAccessChanged(); } //void OnShowAccessTmpl() { LoadAccessListTmpl(true); } // @@ -249,6 +249,7 @@ private slots: void OnINetBlockChanged() { m_INetBlockChanged = true; OnOptChanged(); } void OnRecoveryChanged() { m_RecoveryChanged = true; OnOptChanged(); } void OnAccessChanged(); + void OnAccessChangedEx(); void OnSysSvcChanged(); void OnAdvancedChanged(); void OnOpenCOM(); @@ -493,6 +494,8 @@ protected: void UpdateAccessPolicy(); + void UpdateJobOptions(); + QTreeWidget* GetAccessTree(EAccessType Type); //