[Libreoffice-commits] core.git: 2 commits - include/sfx2 sfx2/source sw/source
Miklos Vajna
vmiklos at collabora.co.uk
Tue Mar 8 17:20:44 UTC 2016
include/sfx2/classificationhelper.hxx | 6 ++
sfx2/source/view/classificationhelper.cxx | 72 +++++++++++++++++++++++++++---
sw/source/ui/app/app.src | 5 ++
sw/source/uibase/dochdl/swdtflvr.cxx | 25 +++++++++-
sw/source/uibase/inc/app.hrc | 3 -
5 files changed, 101 insertions(+), 10 deletions(-)
New commits:
commit 32c2a2f8dc04af8a49ad3580af0ea647c45eb877
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date: Tue Mar 8 17:58:56 2016 +0100
sw: detect copy&paste between different classification levels
With this we cover all 4 cases of copy&paste between possibly classified
documents. When both are classified, then we also check the
classification level, if they have the same scale.
Change-Id: I8c02781fc9755114cd6a2fb93be11dca7b3441d0
diff --git a/sw/source/ui/app/app.src b/sw/source/ui/app/app.src
index 94b64d7..0b56c96 100644
--- a/sw/source/ui/app/app.src
+++ b/sw/source/ui/app/app.src
@@ -652,4 +652,9 @@ String STR_TARGET_DOC_NOT_CLASSIFIED
Text [ en-US ] = "This document must be classified before the clipboard can be pasted." ;
};
+String STR_DOC_CLASSIFICATION_TOO_LOW
+{
+ Text [ en-US ] = "This document has a lower classificaton level than the clipboard." ;
+};
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/uibase/dochdl/swdtflvr.cxx b/sw/source/uibase/dochdl/swdtflvr.cxx
index 84b1af6..04c3ae1 100644
--- a/sw/source/uibase/dochdl/swdtflvr.cxx
+++ b/sw/source/uibase/dochdl/swdtflvr.cxx
@@ -3222,13 +3222,34 @@ bool lcl_checkClassification(SwDoc* pSourceDoc, SwDoc* pDestinationDoc)
if (!pSourceShell || !pDestinationShell)
return true;
- // Paste from a classified document to a non-classified one -> deny.
- if (SfxClassificationHelper::IsClassified(*pSourceShell) && !SfxClassificationHelper::IsClassified(*pDestinationShell))
+ bool bSourceClassified = SfxClassificationHelper::IsClassified(*pSourceShell);
+ if (!bSourceClassified)
+ // No classification on the source side. Return early, regardless the
+ // state of the destination side.
+ return true;
+
+ bool bDestinationClassified = SfxClassificationHelper::IsClassified(*pDestinationShell);
+ if (bSourceClassified && !bDestinationClassified)
{
+ // Paste from a classified document to a non-classified one -> deny.
ScopedVclPtrInstance<MessageDialog>::Create(nullptr, SW_RES(STR_TARGET_DOC_NOT_CLASSIFIED), VCL_MESSAGE_INFO)->Execute();
return false;
}
+ // Remaining case: paste between two classified documents.
+ SfxClassificationHelper aSource(*pSourceShell);
+ SfxClassificationHelper aDestination(*pDestinationShell);
+ if (aSource.GetImpactScale() != aDestination.GetImpactScale())
+ // It's possible to compare them if they have the same scale.
+ return true;
+
+ if (aSource.GetImpactLevel() > aDestination.GetImpactLevel())
+ {
+ // Paste from a doc that has higher classification -> deny.
+ ScopedVclPtrInstance<MessageDialog>::Create(nullptr, SW_RES(STR_DOC_CLASSIFICATION_TOO_LOW), VCL_MESSAGE_INFO)->Execute();
+ return false;
+ }
+
return true;
}
diff --git a/sw/source/uibase/inc/app.hrc b/sw/source/uibase/inc/app.hrc
index 9962d0c..aab6fd9 100644
--- a/sw/source/uibase/inc/app.hrc
+++ b/sw/source/uibase/inc/app.hrc
@@ -92,8 +92,9 @@
#define STR_WRONG_TABLENAME (RC_APP_BEGIN + 138)
#define STR_SRTERR (RC_APP_BEGIN + 139)
#define STR_TARGET_DOC_NOT_CLASSIFIED (RC_APP_BEGIN + 140)
+#define STR_DOC_CLASSIFICATION_TOO_LOW (RC_APP_BEGIN + 141)
-#define APP_ACT_END STR_TARGET_DOC_NOT_CLASSIFIED
+#define APP_ACT_END STR_DOC_CLASSIFICATION_TOO_LOW
#if APP_ACT_END > RC_APP_END
#error Resource-Id Ueberlauf in #file, #line
commit 740a72e66ddf3efd4028d8268239f9a50f759499
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date: Tue Mar 8 14:29:15 2016 +0100
sfx2 classification: expose impact scale and level
This allows application code to prevent copypaste from a more
confidential to a less confidential document.
Change-Id: I121c7566c948340e7b41d3f8462b0d65a2441b0f
diff --git a/include/sfx2/classificationhelper.hxx b/include/sfx2/classificationhelper.hxx
index 5b007020..5c49db7 100644
--- a/include/sfx2/classificationhelper.hxx
+++ b/include/sfx2/classificationhelper.hxx
@@ -40,9 +40,13 @@ public:
std::vector<OUString> GetBACNames();
/// Setting this sets all the other properties, based on the policy.
void SetBACName(const OUString& rName);
- /// If GetImpactLevelColor() will return something meaningful.
+ /// If GetImpactScale() and GetImpactLevel*() will return something meaningful.
bool HasImpactLevel();
basegfx::BColor GetImpactLevelColor();
+ /// Larger value means more confidential.
+ sal_Int32 GetImpactLevel();
+ /// Comparing the GetImpactLevel() result is only meaningful when the impact scale is the same.
+ OUString GetImpactScale();
OUString GetDocumentWatermark();
/// The selected category has some content for the document header.
bool HasDocumentHeader();
diff --git a/sfx2/source/view/classificationhelper.cxx b/sfx2/source/view/classificationhelper.cxx
index 349c337..c3161b6 100644
--- a/sfx2/source/view/classificationhelper.cxx
+++ b/sfx2/source/view/classificationhelper.cxx
@@ -56,6 +56,18 @@ const OUString& PROP_NONE()
return sProp;
}
+const OUString& PROP_IMPACTSCALE()
+{
+ static OUString sProp("urn:bails:IntellectualProperty:Impact:Scale");
+ return sProp;
+}
+
+const OUString& PROP_IMPACTLEVEL()
+{
+ static OUString sProp("urn:bails:IntellectualProperty:Impact:Level:Confidentiality");
+ return sProp;
+}
+
/// Represents one category of a classification policy.
class SfxClassificationCategory
{
@@ -236,7 +248,7 @@ void SAL_CALL SfxClassificationParser::endElement(const OUString& rName) throw (
{
m_bInScale = false;
if (m_pCategory)
- m_pCategory->m_aLabels["urn:bails:IntellectualProperty:Impact:Scale"] = m_aScale;
+ m_pCategory->m_aLabels[PROP_IMPACTSCALE()] = m_aScale;
}
else if (rName == "baf:ConfidentalityValue")
{
@@ -244,7 +256,7 @@ void SAL_CALL SfxClassificationParser::endElement(const OUString& rName) throw (
if (m_pCategory)
{
std::map<OUString, OUString>& rLabels = m_pCategory->m_aLabels;
- rLabels["urn:bails:IntellectualProperty:Impact:Level:Confidentiality"] = m_aConfidentalityValue;
+ rLabels[PROP_IMPACTLEVEL()] = m_aConfidentalityValue;
// Set the two other type of levels as well, if they're not set
// yet: they're optional in BAF, but not in BAILS.
if (rLabels.find("urn:bails:IntellectualProperty:Impact:Level:Integrity") == rLabels.end())
@@ -451,11 +463,11 @@ const OUString& SfxClassificationHelper::GetBACName()
bool SfxClassificationHelper::HasImpactLevel()
{
- std::map<OUString, OUString>::iterator it = m_pImpl->m_aCategory.m_aLabels.find("urn:bails:IntellectualProperty:Impact:Scale");
+ std::map<OUString, OUString>::iterator it = m_pImpl->m_aCategory.m_aLabels.find(PROP_IMPACTSCALE());
if (it == m_pImpl->m_aCategory.m_aLabels.end())
return false;
- it = m_pImpl->m_aCategory.m_aLabels.find("urn:bails:IntellectualProperty:Impact:Level:Confidentiality");
+ it = m_pImpl->m_aCategory.m_aLabels.find(PROP_IMPACTLEVEL());
if (it == m_pImpl->m_aCategory.m_aLabels.end())
return false;
@@ -484,12 +496,12 @@ basegfx::BColor SfxClassificationHelper::GetImpactLevelColor()
{
basegfx::BColor aRet;
- std::map<OUString, OUString>::iterator it = m_pImpl->m_aCategory.m_aLabels.find("urn:bails:IntellectualProperty:Impact:Scale");
+ std::map<OUString, OUString>::iterator it = m_pImpl->m_aCategory.m_aLabels.find(PROP_IMPACTSCALE());
if (it == m_pImpl->m_aCategory.m_aLabels.end())
return aRet;
OUString aScale = it->second;
- it = m_pImpl->m_aCategory.m_aLabels.find("urn:bails:IntellectualProperty:Impact:Level:Confidentiality");
+ it = m_pImpl->m_aCategory.m_aLabels.find(PROP_IMPACTLEVEL());
if (it == m_pImpl->m_aCategory.m_aLabels.end())
return aRet;
OUString aLevel = it->second;
@@ -530,6 +542,54 @@ basegfx::BColor SfxClassificationHelper::GetImpactLevelColor()
return aRet;
}
+sal_Int32 SfxClassificationHelper::GetImpactLevel()
+{
+ sal_Int32 nRet = -1;
+
+ std::map<OUString, OUString>::iterator it = m_pImpl->m_aCategory.m_aLabels.find(PROP_IMPACTSCALE());
+ if (it == m_pImpl->m_aCategory.m_aLabels.end())
+ return nRet;
+ OUString aScale = it->second;
+
+ it = m_pImpl->m_aCategory.m_aLabels.find(PROP_IMPACTLEVEL());
+ if (it == m_pImpl->m_aCategory.m_aLabels.end())
+ return nRet;
+ OUString aLevel = it->second;
+
+ if (aScale == "UK-Cabinet")
+ {
+ sal_Int32 nValue = aLevel.toInt32();
+ if (nValue < 0 || nValue > 3)
+ return nRet;
+ nRet = nValue;
+ }
+ else if (aScale == "FIPS-199")
+ {
+ static std::map<OUString, sal_Int32> aValues;
+ if (aValues.empty())
+ {
+ aValues["Low"] = 0;
+ aValues["Moderate"] = 1;
+ aValues["High"] = 2;
+ }
+ std::map<OUString, sal_Int32>::iterator itValues = aValues.find(aLevel);
+ if (itValues == aValues.end())
+ return nRet;
+ nRet = itValues->second;
+ }
+
+ return nRet;
+}
+
+OUString SfxClassificationHelper::GetImpactScale()
+{
+ std::map<OUString, OUString>::iterator it = m_pImpl->m_aCategory.m_aLabels.find(PROP_IMPACTSCALE());
+ if (it != m_pImpl->m_aCategory.m_aLabels.end())
+ return it->second;
+
+ return OUString();
+}
+
OUString SfxClassificationHelper::GetDocumentWatermark()
{
std::map<OUString, OUString>::iterator it = m_pImpl->m_aCategory.m_aLabels.find(SfxClassificationHelper::PROP_DOCWATERMARK());
More information about the Libreoffice-commits
mailing list