Beispiel #1
0
void Odf::loadConditionValue(const QString &styleCondition, Conditional &newCondition, const ValueParser *parser)
{
    QString val(styleCondition);
    if (val.contains("cell-content()")) {
        val.remove("cell-content()");
        loadCondition(val, newCondition, parser);
    } else if (val.contains("value()")) {
        val.remove("value()");
        loadCondition(val, newCondition, parser);
    }

    //GetFunction ::= cell-content-is-between(Value, Value) | cell-content-is-not-between(Value, Value)
    //for the moment we support just int/double value, not text/date/time :(
    if (val.contains("cell-content-is-between(")) {
        val.remove("cell-content-is-between(");
        val.remove(')');
        QStringList listVal = val.split(',', QString::SkipEmptyParts);
        loadValidationValue(listVal, newCondition, parser);
        newCondition.cond = Conditional::Between;
    } else if (val.contains("cell-content-is-not-between(")) {
        val.remove("cell-content-is-not-between(");
        val.remove(')');
        QStringList listVal = val.split(',', QString::SkipEmptyParts);
        loadValidationValue(listVal, newCondition, parser);
        newCondition.cond = Conditional::Different;
    } else if (val.startsWith(QLatin1String("is-true-formula("))) {
        val.remove(0, 16);
        if (val.endsWith(QLatin1Char(')'))) val.chop(1);
        newCondition.cond = Conditional::IsTrueFormula;
        newCondition.value1 = Value(Odf::decodeFormula(val));
    }
}
Beispiel #2
0
    void testMalformedCondition ()
    {
        testcase ("Malformed Condition");

        // This is malformed and will not load because a
        // feature suite of 0 is not supported.
        auto c1 = loadCondition (
            "cc:3:0:Mjmrcm06fOo-3WOEZu9YDSNfqmn0lj4iOsTVEurtCdI:518");
        BEAST_EXPECT (!c1);

        // The following will load but fail in different ways
        auto c2 = loadCondition ( // only sha256
            "cc:3:1:Mjmrcm06fOo-3WOEZu9YDSNfqmn0lj4iOsTVEurtCdI:518");
        BEAST_EXPECT (c2 && !validate(*c2));

        auto c3 = loadCondition ( // only preimage
            "cc:3:2:Mjmrcm06fOo-3WOEZu9YDSNfqmn0lj4iOsTVEurtCdI:518");
        BEAST_EXPECT (c3 && !validate(*c3));

        auto c4 = loadCondition ( // sha256+preimage
            "cc:4:3:RCmTBlAEqh5MSPTdAVgZTAI0m8xmTNluQA6iaZGKjVE:96");
        BEAST_EXPECT (c4 && !validate(*c4));

        auto c5 = loadCondition ( // Ed25519+sha256+preimage
            "cc:1:23:Yja3qFj7NS_VwwE7aJjPJos-uFCzStJlJLD4VsNy2XM:1");
        BEAST_EXPECT (c5 && !validate(*c5));

        auto c6 = loadCondition ( // rsa+sha256+threshold
            "cc:1:19:Yja3qFj7NS_VwwE7aJjPJos-uFCzStJlJLD4VsNy2XM:1");
        BEAST_EXPECT (c6 && !validate(*c6));

        auto c7 = loadCondition ( // rsa
            "cc:1:10:Yja3qFj7NS_VwwE7aJjPJos-uFCzStJlJLD4VsNy2XM:1");
        BEAST_EXPECT (c7 && !validate(*c7));
    }
Beispiel #3
0
SVConditionParam::SVConditionParam(WContainerWidget *parent,int nConditionType):
WTable(parent)
{
    m_pReturnList = NULL;
    m_pOperateList = NULL;
    m_pParam = NULL;
    m_pLabel = NULL;
    m_pConditionGroup = NULL;
    m_pConditionOR = NULL;
    m_pConditionAND = NULL;

    m_pHelpText = NULL;
    m_pConditionArea = NULL;

    m_bShowHelp = false;
    m_pOperate = NULL;

    m_nConditionType = nConditionType;
    loadCondition();
    initForm();
}
Beispiel #4
0
void Odf::loadConditions(Conditions *condition, const KoXmlElement &element, const ValueParser *parser, const StyleManager *styleManager)
{
    debugSheetsODF << "Loading conditional styles";
    KoXmlNode node(element);

    while (!node.isNull()) {
        KoXmlElement elementItem = node.toElement();
        if (elementItem.tagName() == "map" && elementItem.namespaceURI() == KoXmlNS::style) {
            QString conditionValue = elementItem.attributeNS(KoXmlNS::style, "condition", QString());
            QString applyStyleName;
            if (elementItem.hasAttributeNS(KoXmlNS::style, "apply-style-name"))
                applyStyleName = elementItem.attributeNS(KoXmlNS::style, "apply-style-name", QString());
            if (!applyStyleName.isEmpty() && styleManager) {
                QString odfStyle = styleManager->openDocumentName(applyStyleName);
                if (!odfStyle.isEmpty()) applyStyleName = odfStyle;
            }
            QString baseCellAddress = elementItem.attributeNS(KoXmlNS::style, "base-cell-address");
            loadCondition(condition, conditionValue, applyStyleName, baseCellAddress, parser);
        }
        node = node.nextSibling();
    }
}
Beispiel #5
0
    void testDynamic ()
    {
        testcase ("Dynamic");

        Slice m = makeSlice (knownMessage);

        std::string test = "aaabc";

        RsaSha256 f;
        BEAST_EXPECT (f.sign (goodKey, m));

        {
            auto const f2 = loadFulfillment(makeSlice(to_blob(f)));
            BEAST_EXPECT (f2);
            BEAST_EXPECT (f == *f2);
        }

        // Generate and verify the condition for this fulfillment:
        auto const c = f.condition();

        {
            auto c1 = loadCondition (to_string(c));
            BEAST_EXPECT (c1);
            BEAST_EXPECT (c == *c1);

            auto c2 = loadCondition (makeSlice(to_blob(c)));
            BEAST_EXPECT (c2);
            BEAST_EXPECT (c == *c2);
        }

        // First check against incorrect conditions, using both
        // correct, incorrect and empty buffers.
        char const* const ccs[] =
        {
            "cc:0:3:PWh2oBRt6FdusjlahY3hIT0bksZbd53zozHP1aRYRUY:256",
            "cc:1:25:XkflBmyISKuevH8-850LuMrzN-HT1Ds9zKUEzaZ2Wk0:103",
            "cc:2:2b:d3O4epRCo_3rj17Bf3v8hp5ig7vq84ivPok07T9Rdl0:146",
            "cc:3:11:Mjmrcm06fOo-3WOEZu9YDSNfqmn0lj4iOsTVEurtCdI:518",
            "cc:4:20:O2onvM62pC1io6jQKm8Nc2UyFXcd4kOmOsBIoYtZ2ik:96"
        };

        for (auto cc : ccs)
        {
            auto nc = loadCondition (cc);

            if (BEAST_EXPECT (nc && nc != c))
            {
                check (f, nc.get(), makeSlice(test), m);
                check (f, nc.get(), m, m);
                check (f, nc.get(), { }, m);
            }
        }

        // Now try against the correct condition with various
        // buffers - most are incorrect, some are correct.
        do
        {
            for (Slice t = makeSlice (test); !t.empty(); t += 1)
                check (f, c, t, m);
        } while (std::next_permutation(test.begin(), test.end()));

        // And with an empty buffer:
        check (f, c, Slice { }, m);
    }
Beispiel #6
0
    void testKnown ()
    {
        testcase ("Known");

        Slice m = makeSlice (knownMessage);
        std::string test = "aaabc";

        // Load and test string and binary and text
        // serialization & deserialization
        auto const f = loadFulfillment(knownFulfillment);
        BEAST_EXPECT (f);
        BEAST_EXPECT (to_string (*f) == knownFulfillment);

        {
            auto const f2 = loadFulfillment(makeSlice(to_blob(*f)));
            BEAST_EXPECT (f2);
            BEAST_EXPECT (*f == *f2);
        }

        // Verify the condition for this fulfillment and test
        // binary and text serialization & deserialization
        auto const c = f->condition();
        BEAST_EXPECT (to_string(c) == knownCondition);

        {
            auto c1 = loadCondition (knownCondition);
            BEAST_EXPECT (c1);
            BEAST_EXPECT (c == *c1);

            auto c2 = loadCondition (makeSlice(to_blob(c)));
            BEAST_EXPECT (c2);
            BEAST_EXPECT (c == *c2);
        }

        // First check against incorrect conditions, using both
        // correct, incorrect and empty buffers.
        char const* const ccs[] =
        {
            "cc:0:3:PWh2oBRt6FdusjlahY3hIT0bksZbd53zozHP1aRYRUY:256",
            "cc:1:25:XkflBmyISKuevH8-850LuMrzN-HT1Ds9zKUEzaZ2Wk0:103",
            "cc:2:2b:d3O4epRCo_3rj17Bf3v8hp5ig7vq84ivPok07T9Rdl0:146",
            "cc:3:11:Mjmrcm06fOo-3WOEZu9YDSNfqmn0lj4iOsTVEurtCdI:518",
            "cc:4:20:O2onvM62pC1io6jQKm8Nc2UyFXcd4kOmOsBIoYtZ2ik:96"
        };

        for (auto cc : ccs)
        {
            auto nc = loadCondition (cc);

            if (BEAST_EXPECT (nc && nc != c))
            {
                check (*f, nc.get(), makeSlice(test), m);
                check (*f, nc.get(), m, m);
                check (*f, nc.get(), { }, m);
            }
        }

        // Now try against the correct condition with various
        // buffers - most are incorrect, some are correct.
        do
        {
            for (Slice t = makeSlice (test); !t.empty(); t += 1)
                check (*f, c, t, m);
        } while (std::next_permutation(test.begin(), test.end()));

        // And with an empty buffer:
        check (*f, c, Slice { }, m);

        // Under the existing spec, multiple messages sharing
        // the same key should generate the same fulfillment:
        {
            std::array<std::uint8_t, 3> aaa {{ 'a', 'a', 'a' }};
            std::array<std::uint8_t, 3> bbb {{ 'b', 'b', 'b' }};

            RsaSha256 f1;
            BEAST_EXPECT (f1.sign (goodKey, makeSlice (aaa)));

            RsaSha256 f2;
            BEAST_EXPECT (f2.sign (goodKey, makeSlice (bbb)));

            BEAST_EXPECT (f1.condition () == f2.condition ());
        }
    }