diff options
author | Kevin Smith <git@kismith.co.uk> | 2011-03-04 10:56:07 (GMT) |
---|---|---|
committer | Kevin Smith <git@kismith.co.uk> | 2011-03-04 10:58:16 (GMT) |
commit | 37bfeaf6f2e0145731c32f79291ff3d48ae0e1b1 (patch) | |
tree | e6455b4f21b3a5ba716526916a67cfd4b7e55051 /Swiften | |
parent | 12024229138787d7df91cb8101d0986996880e3d (diff) | |
download | swift-37bfeaf6f2e0145731c32f79291ff3d48ae0e1b1.zip swift-37bfeaf6f2e0145731c32f79291ff3d48ae0e1b1.tar.bz2 |
Upgrade XEP-0258 support to match 0.6.
Resolves: #183
Release-Notes: Security labels (XEP-0258) support has been updated to match the latest version of the specification.
Diffstat (limited to 'Swiften')
11 files changed, 120 insertions, 38 deletions
diff --git a/Swiften/Elements/DiscoInfo.cpp b/Swiften/Elements/DiscoInfo.cpp index 9c43ef4..7ed8e88 100644 --- a/Swiften/Elements/DiscoInfo.cpp +++ b/Swiften/Elements/DiscoInfo.cpp @@ -10,6 +10,7 @@ namespace Swift { const std::string DiscoInfo::ChatStatesFeature = std::string("http://jabber.org/protocol/chatstates"); const std::string DiscoInfo::SecurityLabelsFeature = std::string("urn:xmpp:sec-label:0"); +const std::string DiscoInfo::SecurityLabelsCatalogueFeature = std::string("urn:xmpp:sec-label:catalog:2"); const std::string DiscoInfo::JabberSearchFeature = std::string("jabber:iq:search"); @@ -32,5 +33,4 @@ bool DiscoInfo::Identity::operator<(const Identity& other) const { } } -const std::string DiscoInfo::SecurityLabels = "urn:xmpp:sec-label:0"; } diff --git a/Swiften/Elements/DiscoInfo.h b/Swiften/Elements/DiscoInfo.h index 5101884..e433b26 100644 --- a/Swiften/Elements/DiscoInfo.h +++ b/Swiften/Elements/DiscoInfo.h @@ -21,9 +21,9 @@ namespace Swift { static const std::string ChatStatesFeature; static const std::string SecurityLabelsFeature; + static const std::string SecurityLabelsCatalogueFeature; static const std::string JabberSearchFeature; - const static std::string SecurityLabels; class Identity { public: Identity(const std::string& name, const std::string& category = "client", const std::string& type = "pc", const std::string& lang = "") : name_(name), category_(category), type_(type), lang_(lang) { diff --git a/Swiften/Elements/SecurityLabelsCatalog.h b/Swiften/Elements/SecurityLabelsCatalog.h index 1c13fdf..10ef459 100644 --- a/Swiften/Elements/SecurityLabelsCatalog.h +++ b/Swiften/Elements/SecurityLabelsCatalog.h @@ -17,14 +17,41 @@ namespace Swift { class SecurityLabelsCatalog : public Payload { public: + class Item { + public: + Item() : default_(false) {} + const boost::shared_ptr<SecurityLabel> getLabel() const { + return label_; + } + + void setLabel(boost::shared_ptr<SecurityLabel> label) { + label_ = label; + } + + const std::string& getSelector() const { return selector_; } + + void setSelector(const std::string& selector) { + selector_ = selector; + } + + bool getIsDefault() const { return default_; } + + void setIsDefault(bool isDefault) { + default_ = isDefault; + } + private: + boost::shared_ptr<SecurityLabel> label_; + std::string selector_; + bool default_; + }; SecurityLabelsCatalog(const JID& to = JID()) : to_(to) {} - const std::vector<SecurityLabel>& getLabels() const { - return labels_; + const std::vector<Item>& getItems() const { + return items_; } - void addLabel(const SecurityLabel& label) { - labels_.push_back(label); + void addItem(const Item& item) { + items_.push_back(item); } const JID& getTo() const { @@ -55,7 +82,7 @@ namespace Swift { JID to_; std::string name_; std::string description_; - std::vector<SecurityLabel> labels_; + std::vector<Item> items_; }; } diff --git a/Swiften/Parser/PayloadParsers/SecurityLabelParser.cpp b/Swiften/Parser/PayloadParsers/SecurityLabelParser.cpp index bf134d7..b769a47 100644 --- a/Swiften/Parser/PayloadParsers/SecurityLabelParser.cpp +++ b/Swiften/Parser/PayloadParsers/SecurityLabelParser.cpp @@ -62,4 +62,8 @@ void SecurityLabelParser::handleCharacterData(const std::string& data) { } } +boost::shared_ptr<SecurityLabel> SecurityLabelParser::getLabelPayload() { + return getPayloadInternal(); +} + } diff --git a/Swiften/Parser/PayloadParsers/SecurityLabelParser.h b/Swiften/Parser/PayloadParsers/SecurityLabelParser.h index bd80921..b54c3be 100644 --- a/Swiften/Parser/PayloadParsers/SecurityLabelParser.h +++ b/Swiften/Parser/PayloadParsers/SecurityLabelParser.h @@ -20,7 +20,7 @@ namespace Swift { virtual void handleStartElement(const std::string& element, const std::string&, const AttributeMap& attributes); virtual void handleEndElement(const std::string& element, const std::string&); virtual void handleCharacterData(const std::string& data); - + boost::shared_ptr<SecurityLabel> getLabelPayload(); private: enum Level { TopLevel = 0, diff --git a/Swiften/Parser/PayloadParsers/SecurityLabelsCatalogParser.cpp b/Swiften/Parser/PayloadParsers/SecurityLabelsCatalogParser.cpp index 1f2a6bc..a08cd11 100644 --- a/Swiften/Parser/PayloadParsers/SecurityLabelsCatalogParser.cpp +++ b/Swiften/Parser/PayloadParsers/SecurityLabelsCatalogParser.cpp @@ -15,6 +15,7 @@ SecurityLabelsCatalogParser::SecurityLabelsCatalogParser() : level_(TopLevel), l } SecurityLabelsCatalogParser::~SecurityLabelsCatalogParser() { + //delete currentLabel_; delete labelParserFactory_; } @@ -25,6 +26,11 @@ void SecurityLabelsCatalogParser::handleStartElement(const std::string& element, getPayloadInternal()->setName(attributes.getAttribute("name")); getPayloadInternal()->setDescription(attributes.getAttribute("desc")); } + else if (level_ == ItemLevel && element == "item" && ns == "urn:xmpp:sec-label:catalog:2") { + currentItem_ = boost::shared_ptr<SecurityLabelsCatalog::Item>(new SecurityLabelsCatalog::Item()); + currentItem_->setSelector(attributes.getAttribute("selector")); + currentItem_->setIsDefault(attributes.getBoolAttribute("default", false)); + } else if (level_ == LabelLevel) { assert(!labelParser_); if (labelParserFactory_->canParse(element, ns, attributes)) { @@ -42,13 +48,19 @@ void SecurityLabelsCatalogParser::handleEndElement(const std::string& element, c if (labelParser_) { labelParser_->handleEndElement(element, ns); } - if (level_ == LabelLevel && labelParser_) { - SecurityLabel* label = dynamic_cast<SecurityLabel*>(labelParser_->getPayload().get()); - assert(label); - getPayloadInternal()->addLabel(SecurityLabel(*label)); + if (level_ == LabelLevel && labelParser_ && currentItem_) { + boost::shared_ptr<SecurityLabel> currentLabel = labelParser_->getLabelPayload(); + assert(currentLabel); + currentItem_->setLabel(currentLabel); delete labelParser_; labelParser_ = 0; } + else if (level_ == ItemLevel && element == "item" && ns == "urn:xmpp:sec-label:catalog:2") { + if (currentItem_) { + getPayloadInternal()->addItem(SecurityLabelsCatalog::Item(*currentItem_)); + currentItem_.reset(); + } + } --level_; } diff --git a/Swiften/Parser/PayloadParsers/SecurityLabelsCatalogParser.h b/Swiften/Parser/PayloadParsers/SecurityLabelsCatalogParser.h index 2222117..ca422d1 100644 --- a/Swiften/Parser/PayloadParsers/SecurityLabelsCatalogParser.h +++ b/Swiften/Parser/PayloadParsers/SecurityLabelsCatalogParser.h @@ -27,11 +27,13 @@ namespace Swift { enum Level { TopLevel = 0, PayloadLevel = 1, - LabelLevel = 2 + ItemLevel = 2, + LabelLevel = 3 }; int level_; SecurityLabelParserFactory* labelParserFactory_; SecurityLabelParser* labelParser_; + boost::shared_ptr<SecurityLabelsCatalog::Item> currentItem_; }; } diff --git a/Swiften/Parser/PayloadParsers/SecurityLabelsCatalogParserFactory.h b/Swiften/Parser/PayloadParsers/SecurityLabelsCatalogParserFactory.h index bb1da3a..a148d81 100644 --- a/Swiften/Parser/PayloadParsers/SecurityLabelsCatalogParserFactory.h +++ b/Swiften/Parser/PayloadParsers/SecurityLabelsCatalogParserFactory.h @@ -13,7 +13,7 @@ namespace Swift { class SecurityLabelsCatalogParserFactory : public GenericPayloadParserFactory<SecurityLabelsCatalogParser> { public: - SecurityLabelsCatalogParserFactory() : GenericPayloadParserFactory<SecurityLabelsCatalogParser>("catalog", "urn:xmpp:sec-label:catalog:0") {} + SecurityLabelsCatalogParserFactory() : GenericPayloadParserFactory<SecurityLabelsCatalogParser>("catalog", "urn:xmpp:sec-label:catalog:2") {} }; } diff --git a/Swiften/Parser/PayloadParsers/UnitTest/SecurityLabelsCatalogParserTest.cpp b/Swiften/Parser/PayloadParsers/UnitTest/SecurityLabelsCatalogParserTest.cpp index 9925e34..e1e8594 100644 --- a/Swiften/Parser/PayloadParsers/UnitTest/SecurityLabelsCatalogParserTest.cpp +++ b/Swiften/Parser/PayloadParsers/UnitTest/SecurityLabelsCatalogParserTest.cpp @@ -25,26 +25,38 @@ class SecurityLabelsCatalogParserTest : public CppUnit::TestFixture PayloadsParserTester parser; CPPUNIT_ASSERT(parser.parse( - "<catalog desc=\"an example set of labels\" name=\"Default\" to=\"example.com\" xmlns=\"urn:xmpp:sec-label:catalog:0\">" + "<catalog desc=\"an example set of labels\" name=\"Default\" to=\"example.com\" xmlns=\"urn:xmpp:sec-label:catalog:2\">" + "<item selector='Classified|SECRET'>" "<securitylabel xmlns=\"urn:xmpp:sec-label:0\">" "<displaymarking bgcolor=\"red\" fgcolor=\"black\">SECRET</displaymarking>" "<label><esssecuritylabel xmlns=\"urn:xmpp:sec-label:ess:0\">MQYCAQQGASk=</esssecuritylabel></label>" "</securitylabel>" + "</item>" + "<item selector='Classified|CONFIDENTIAL' default='true'>" "<securitylabel xmlns=\"urn:xmpp:sec-label:0\">" "<displaymarking bgcolor=\"navy\" fgcolor=\"black\">CONFIDENTIAL</displaymarking>" "<label><esssecuritylabel xmlns=\"urn:xmpp:sec-label:ess:0\">MQMGASk=</esssecuritylabel></label>" "</securitylabel>" + "</item>" + "<item selector='Unclassified|UNCLASSIFIED'/>" "</catalog>")); SecurityLabelsCatalog* payload = dynamic_cast<SecurityLabelsCatalog*>(parser.getPayload().get()); CPPUNIT_ASSERT_EQUAL(std::string("Default"), payload->getName()); CPPUNIT_ASSERT_EQUAL(std::string("an example set of labels"), payload->getDescription()); CPPUNIT_ASSERT_EQUAL(JID("example.com"), payload->getTo()); - CPPUNIT_ASSERT_EQUAL(2, static_cast<int>(payload->getLabels().size())); - CPPUNIT_ASSERT_EQUAL(std::string("SECRET"), payload->getLabels()[0].getDisplayMarking()); - CPPUNIT_ASSERT_EQUAL(std::string("<esssecuritylabel xmlns=\"urn:xmpp:sec-label:ess:0\">MQYCAQQGASk=</esssecuritylabel>"), payload->getLabels()[0].getLabel()); - CPPUNIT_ASSERT_EQUAL(std::string("CONFIDENTIAL"), payload->getLabels()[1].getDisplayMarking()); - CPPUNIT_ASSERT_EQUAL(std::string("<esssecuritylabel xmlns=\"urn:xmpp:sec-label:ess:0\">MQMGASk=</esssecuritylabel>"), payload->getLabels()[1].getLabel()); + CPPUNIT_ASSERT_EQUAL(3, static_cast<int>(payload->getItems().size())); + CPPUNIT_ASSERT_EQUAL(std::string("SECRET"), payload->getItems()[0].getLabel()->getDisplayMarking()); + CPPUNIT_ASSERT_EQUAL(std::string("<esssecuritylabel xmlns=\"urn:xmpp:sec-label:ess:0\">MQYCAQQGASk=</esssecuritylabel>"), payload->getItems()[0].getLabel()->getLabel()); + CPPUNIT_ASSERT_EQUAL(false, payload->getItems()[0].getIsDefault()); + CPPUNIT_ASSERT_EQUAL(std::string("Classified|SECRET"), payload->getItems()[0].getSelector()); + CPPUNIT_ASSERT_EQUAL(std::string("CONFIDENTIAL"), payload->getItems()[1].getLabel()->getDisplayMarking()); + CPPUNIT_ASSERT_EQUAL(std::string("<esssecuritylabel xmlns=\"urn:xmpp:sec-label:ess:0\">MQMGASk=</esssecuritylabel>"), payload->getItems()[1].getLabel()->getLabel()); + CPPUNIT_ASSERT_EQUAL(true, payload->getItems()[1].getIsDefault()); + CPPUNIT_ASSERT_EQUAL(std::string("Classified|CONFIDENTIAL"), payload->getItems()[1].getSelector()); + CPPUNIT_ASSERT_EQUAL(false, payload->getItems()[2].getIsDefault()); + CPPUNIT_ASSERT_EQUAL(std::string("Unclassified|UNCLASSIFIED"), payload->getItems()[2].getSelector()); + CPPUNIT_ASSERT(!payload->getItems()[2].getLabel()); } }; diff --git a/Swiften/Serializer/PayloadSerializers/SecurityLabelsCatalogSerializer.cpp b/Swiften/Serializer/PayloadSerializers/SecurityLabelsCatalogSerializer.cpp index 5e4d8e4..7424c98 100644 --- a/Swiften/Serializer/PayloadSerializers/SecurityLabelsCatalogSerializer.cpp +++ b/Swiften/Serializer/PayloadSerializers/SecurityLabelsCatalogSerializer.cpp @@ -16,7 +16,7 @@ SecurityLabelsCatalogSerializer::SecurityLabelsCatalogSerializer() : GenericPayl } std::string SecurityLabelsCatalogSerializer::serializePayload(boost::shared_ptr<SecurityLabelsCatalog> catalog) const { - XMLElement element("catalog", "urn:xmpp:sec-label:catalog:0"); + XMLElement element("catalog", "urn:xmpp:sec-label:catalog:2"); if (!catalog->getName().empty()) { element.setAttribute("name", catalog->getName()); } @@ -26,9 +26,17 @@ std::string SecurityLabelsCatalogSerializer::serializePayload(boost::shared_ptr< if (!catalog->getDescription().empty()) { element.setAttribute("desc", catalog->getDescription()); } - foreach (const SecurityLabel& label, catalog->getLabels()) { - std::string serializedLabel = SecurityLabelSerializer().serialize(boost::shared_ptr<SecurityLabel>(new SecurityLabel(label))); - element.addNode(boost::shared_ptr<XMLRawTextNode>(new XMLRawTextNode(serializedLabel))); + foreach (const SecurityLabelsCatalog::Item& item, catalog->getItems()) { + boost::shared_ptr<XMLElement> itemElement(new XMLElement("item")); + itemElement->setAttribute("selector", item.getSelector()); + if (item.getIsDefault()) { + itemElement->setAttribute("default", "true"); + } + if (item.getLabel()) { + std::string serializedLabel = SecurityLabelSerializer().serialize(item.getLabel()); + itemElement->addNode(boost::shared_ptr<XMLRawTextNode>(new XMLRawTextNode(serializedLabel))); + } + element.addNode(itemElement); } return element.serialize(); } diff --git a/Swiften/Serializer/PayloadSerializers/UnitTest/SecurityLabelsCatalogSerializerTest.cpp b/Swiften/Serializer/PayloadSerializers/UnitTest/SecurityLabelsCatalogSerializerTest.cpp index 928f209..a7bf1b9 100644 --- a/Swiften/Serializer/PayloadSerializers/UnitTest/SecurityLabelsCatalogSerializerTest.cpp +++ b/Swiften/Serializer/PayloadSerializers/UnitTest/SecurityLabelsCatalogSerializerTest.cpp @@ -27,30 +27,47 @@ class SecurityLabelsCatalogSerializerTest : public CppUnit::TestFixture catalog->setName("Default"); catalog->setDescription("an example set of labels"); - SecurityLabel securityLabel1; - securityLabel1.setDisplayMarking("SECRET"); - securityLabel1.setForegroundColor("black"); - securityLabel1.setBackgroundColor("red"); - securityLabel1.setLabel("<esssecuritylabel xmlns=\"urn:xmpp:sec-label:ess:0\">MQYCAQQGASk=</esssecuritylabel>"); - catalog->addLabel(securityLabel1); - - SecurityLabel securityLabel2; - securityLabel2.setDisplayMarking("CONFIDENTIAL"); - securityLabel2.setForegroundColor("black"); - securityLabel2.setBackgroundColor("navy"); - securityLabel2.setLabel("<esssecuritylabel xmlns=\"urn:xmpp:sec-label:ess:0\">MQMGASk=</esssecuritylabel>"); - catalog->addLabel(securityLabel2); + SecurityLabelsCatalog::Item item1; + boost::shared_ptr<SecurityLabel> securityLabel1(new SecurityLabel()); + item1.setLabel(securityLabel1); + securityLabel1->setDisplayMarking("SECRET"); + securityLabel1->setForegroundColor("black"); + securityLabel1->setBackgroundColor("red"); + item1.setIsDefault(false); + item1.setSelector("Classified|SECRET"); + securityLabel1->setLabel("<esssecuritylabel xmlns=\"urn:xmpp:sec-label:ess:0\">MQYCAQQGASk=</esssecuritylabel>"); + catalog->addItem(item1); + + SecurityLabelsCatalog::Item item2; + boost::shared_ptr<SecurityLabel> securityLabel2(new SecurityLabel()); + item2.setLabel(securityLabel2); + securityLabel2->setDisplayMarking("CONFIDENTIAL"); + securityLabel2->setForegroundColor("black"); + securityLabel2->setBackgroundColor("navy"); + item2.setIsDefault(true); + item2.setSelector("Classified|CONFIDENTIAL"); + securityLabel2->setLabel("<esssecuritylabel xmlns=\"urn:xmpp:sec-label:ess:0\">MQMGASk=</esssecuritylabel>"); + catalog->addItem(item2); + + SecurityLabelsCatalog::Item item3; + item3.setSelector("Unclassified|UNCLASSIFIED"); + catalog->addItem(item3); CPPUNIT_ASSERT_EQUAL(std::string( - "<catalog desc=\"an example set of labels\" name=\"Default\" to=\"example.com\" xmlns=\"urn:xmpp:sec-label:catalog:0\">" + "<catalog desc=\"an example set of labels\" name=\"Default\" to=\"example.com\" xmlns=\"urn:xmpp:sec-label:catalog:2\">" + "<item selector=\"Classified|SECRET\">" "<securitylabel xmlns=\"urn:xmpp:sec-label:0\">" "<displaymarking bgcolor=\"red\" fgcolor=\"black\">SECRET</displaymarking>" "<label><esssecuritylabel xmlns=\"urn:xmpp:sec-label:ess:0\">MQYCAQQGASk=</esssecuritylabel></label>" "</securitylabel>" + "</item>" + "<item default=\"true\" selector=\"Classified|CONFIDENTIAL\">" "<securitylabel xmlns=\"urn:xmpp:sec-label:0\">" "<displaymarking bgcolor=\"navy\" fgcolor=\"black\">CONFIDENTIAL</displaymarking>" "<label><esssecuritylabel xmlns=\"urn:xmpp:sec-label:ess:0\">MQMGASk=</esssecuritylabel></label>" "</securitylabel>" + "</item>" + "<item selector=\"Unclassified|UNCLASSIFIED\"/>" "</catalog>"), testling.serialize(catalog)); } }; |