diff --git a/app/lib/dup/indexer.js b/app/lib/dup/indexer.js index 4246d5cec67c8429989fa4ce45a4f8af2c43378c..f99fbc9b08f500837af0348e2ab37a5054e63936 100644 --- a/app/lib/dup/indexer.js +++ b/app/lib/dup/indexer.js @@ -518,6 +518,11 @@ const indexer = module.exports = { } })); + // BR_G34 + yield mindex.map((ENTRY) => co(function*() { + ENTRY.isBeingRevoked = !!ENTRY.revoked_on; + })); + // BR_G35 yield iindex.map((ENTRY) => co(function*() { ENTRY.isBeingKicked = ENTRY.member === false; @@ -525,7 +530,9 @@ const indexer = module.exports = { // BR_G36 yield iindex.map((ENTRY) => co(function*() { - ENTRY.hasToBeExcluded = reduce(yield dal.iindexDAL.reducable(ENTRY.pub)).kick; + const isMarkedAsToKick = reduce(yield dal.iindexDAL.reducable(ENTRY.pub)).kick; + const isBeingRevoked = count(_.filter(mindex, (m) => m.isBeingRevoked && m.pub == ENTRY.pub)) == 1; + ENTRY.hasToBeExcluded = isMarkedAsToKick || isBeingRevoked; })); // BR_G22 @@ -634,11 +641,6 @@ const indexer = module.exports = { } })); - // BR_G34 - yield mindex.map((ENTRY) => co(function*() { - ENTRY.isBeingRevoked = ENTRY.revoked; - })); - // BR_G37 yield indexer.prepareCertificationsAge(cindex, HEAD, HEAD_1, conf, dal); @@ -1211,6 +1213,12 @@ const indexer = module.exports = { return false; } } + const beingKicked = _.filter(iindex, (i) => i.member === false); + for (const entry of beingKicked) { + if (!entry.hasToBeExcluded) { + return false; + } + } }), // BR_G103 diff --git a/doc/Protocol.md b/doc/Protocol.md index eb3153f1ee8c28a86d8126ce82198bb5ae604b46..77df8b38b57b5f9b39a9d352299f442f2b123085 100644 --- a/doc/Protocol.md +++ b/doc/Protocol.md @@ -1936,7 +1936,7 @@ For each ENTRY in local MINDEX where `revoked_on != null`: For each ENTRY in local MINDEX where `revoked_on == null`: - ENTRY.isBeingRevoked = false + ENTRY.isBeingRevoked = false For each ENTRY in local MINDEX where `revoked_on != null`: @@ -2310,7 +2310,7 @@ Rule: ENTRY.excludedIsMember == true -###### BR_G86 - Excluded to be kicked +###### BR_G86 - Excluded contains exclatly those to be kicked Rule: @@ -2321,6 +2321,12 @@ For each `REDUCE_BY(GLOBAL_IINDEX[kick=true], 'pub') as TO_KICK`: If `REDUCED.kick` then: COUNT(LOCAL_MINDEX[pub=REDUCED.pub,isBeingKicked=true]) == 1 + +Rule: + +For each `IINDEX[member=false] as ENTRY`: + + ENTRY.hasToBeExcluded = true ###### BR_G103 - Trancation writability diff --git a/package.json b/package.json index 5e4afb9d4d3a2f0b7cb64a6a52264f099f051b01..f6d53d6f778b4224915cb99d90e867fed63e2409 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "duniter-common": "0.1.0", "duniter-crawler": "^0.2.10", "duniter-keypair": "^0.3.0", - "duniter-prover": "^0.2.6", + "duniter-prover": "^0.2.7", "event-stream": "3.3.4", "inquirer": "0.8.5", "jison": "0.4.17", diff --git a/test/integration/identity-kicking-by-certs.js b/test/integration/identity-kicking-by-certs.js index 54e63d134254668f4150e1c1b67fd63e015e51d6..928a4213fe9a60f15ff8b13963373771b1271350 100644 --- a/test/integration/identity-kicking-by-certs.js +++ b/test/integration/identity-kicking-by-certs.js @@ -3,6 +3,7 @@ const _ = require('underscore'); const co = require('co'); const assert = require('assert'); +const should = require('should'); const duniter = require('../../index'); const bma = require('duniter-bma').duniter.methods.bma; const user = require('./tools/user'); @@ -63,10 +64,31 @@ describe("Identities kicking by certs", function() { yield s1.commit({ time: now + 8 }); yield s1.commit({ time: now + 8 }); yield s1.commit({ time: now + 8 }); + yield cat.revoke(); + let err; + try { + yield s1.commit({ time: now + 8, excluded: ['3conGDUXdrTGbQPMQQhEC4Ubu1MCAnFrAYvUaewbUhtk'] }); + } catch (e) { + err = e; + } + should.exist(err); + should.deepEqual(JSON.parse(err.error), { + "ucode": 1002, + "message": "ruleToBeKickedArePresent" + }); yield s1.commit({ time: now + 8 }); })); - it('block#7 should have kicked 2 member', () => s1.expectThat('/blockchain/block/7', (res) => { - assert.equal(res.excluded.length, 2); + it('block#7 should have kicked 2 member', () => s1.expectJSON('/blockchain/block/7', (res) => { + assert.deepEqual(res.excluded, [ + '2LvDg21dVXvetTD9GdkPLURavLYEqP3whauvPWX4c2qc', + 'DKpQPUL4ckzXYdnDRvCRKAm1gNvSdmAXnTrJZ7LvM5Qo' + ]); + })); + + it('block#8 should have kicked 1 member', () => s1.expectJSON('/blockchain/block/8', (res) => { + assert.deepEqual(res.excluded, [ + 'HgTTJLAQ5sqfknMq7yLPZbehtuLSsKj9CxWN7k8QvYJd' + ]); })); });