Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,4 @@ env/
python/setup.py
node_modules
package-lock.json
.cache
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).

## Unreleased

### Changed

- Governance proposal ids are now digests, hex-encoded as strings.

## [0.17.1]

### Changed
Expand Down
10 changes: 5 additions & 5 deletions doc/governance/accept_recovery.rst
Original file line number Diff line number Diff line change
Expand Up @@ -23,21 +23,21 @@ A member proposes to recover the network and other members can vote on the propo

$ scurl.sh https://<ccf-node-address>/gov/proposals --cacert network_cert --key member1_privk --cert member1_cert --data-binary @accept_recovery.json -H "content-type: application/json"
{
"proposal_id": 1,
"proposal_id": "1b7cae1585077104e99e1860ad740efe28ebd498dbf9988e0e7b299e720c5377",
"proposer_id": 0,
"state": "OPEN"
}

$ scurl.sh https://<ccf-node-address>/gov/proposals/1/votes --cacert network_cert --key member2_privk --cert member2_cert --data-binary @vote_accept.json -H "content-type: application/json"
$ scurl.sh https://<ccf-node-address>/gov/proposals/1b7cae1585077104e99e1860ad740efe28ebd498dbf9988e0e7b299e720c5377/votes --cacert network_cert --key member2_privk --cert member2_cert --data-binary @vote_accept.json -H "content-type: application/json"
{
"proposal_id": 1,
"proposal_id": "1b7cae1585077104e99e1860ad740efe28ebd498dbf9988e0e7b299e720c5377",
"proposer_id": 0,
"state": "OPEN"
}

$ scurl.sh https://<ccf-node-address>/gov/proposals/1/votes --cacert network_cert --key member3_privk --cert member3_cert --data-binary @vote_accept.json -H "content-type: application/json"
$ scurl.sh https://<ccf-node-address>/gov/proposals/1b7cae1585077104e99e1860ad740efe28ebd498dbf9988e0e7b299e720c5377/votes --cacert network_cert --key member3_privk --cert member3_cert --data-binary @vote_accept.json -H "content-type: application/json"
{
"proposal_id": 1,
"proposal_id": "1b7cae1585077104e99e1860ad740efe28ebd498dbf9988e0e7b299e720c5377",
"proposer_id": 0,
"state": "ACCEPTED"
}
Expand Down
20 changes: 10 additions & 10 deletions doc/governance/common_member_operations.rst
Original file line number Diff line number Diff line change
Expand Up @@ -61,21 +61,21 @@ To limit the scope of key compromise, members of the consortium can refresh the

$ scurl.sh https://<ccf-node-address>/gov/proposals --cacert network_cert --key member1_privk --cert member1_cert --data-binary @rekey_ledger.json -H "content-type: application/json"
{
"proposal_id": 4,
"proposal_id": "2f739d154b8cddacd7fc6d03cc8d4d20626e477ec4b1af10a74c670bb38bed5e",
"proposer_id": 1,
"state": "OPEN"
}

$ scurl.sh https://<ccf-node-address>/gov/proposals/4/votes --cacert network_cert --key member2_privk --cert member2_cert --data-binary @vote_accept_1.json -H "content-type: application/json"
$ scurl.sh https://<ccf-node-address>/gov/proposals/2f739d154b8cddacd7fc6d03cc8d4d20626e477ec4b1af10a74c670bb38bed5e/votes --cacert network_cert --key member2_privk --cert member2_cert --data-binary @vote_accept_1.json -H "content-type: application/json"
{
"proposal_id": 4,
"proposal_id": "2f739d154b8cddacd7fc6d03cc8d4d20626e477ec4b1af10a74c670bb38bed5e",
"proposer_id": 1,
"state": "OPEN"
}

$ scurl.sh https://<ccf-node-address>/gov/proposals/4/votes --cacert network_cert --key member3_privk --cert member3_cert --data-binary @vote_accept_1.json -H "content-type: application/json"
$ scurl.sh https://<ccf-node-address>/gov/proposals/2f739d154b8cddacd7fc6d03cc8d4d20626e477ec4b1af10a74c670bb38bed5e/votes --cacert network_cert --key member3_privk --cert member3_cert --data-binary @vote_accept_1.json -H "content-type: application/json"
{
"proposal_id": 4,
"proposal_id": "2f739d154b8cddacd7fc6d03cc8d4d20626e477ec4b1af10a74c670bb38bed5e",
"proposer_id": 1,
"state": "ACCEPTED"
}
Expand Down Expand Up @@ -103,21 +103,21 @@ The number of member shares required to restore the private ledger (``recovery_t

$ scurl.sh https://<ccf-node-address>/gov/proposals --cacert network_cert --key member1_privk --cert member1_cert --data-binary @set_recovery_threshold.json -H "content-type: application/json"
{
"proposal_id": 5,
"proposal_id": "b9c08b3861395eca904d913427dcb436136e277cf4712eb14e9e9cddf9d231a8",
"proposer_id": 1,
"state": "OPEN"
}

$ scurl.sh https://<ccf-node-address>/gov/proposals/5/votes --cacert network_cert --key member2_privk --cert member2_cert --data-binary @vote_accept_1.json -H "content-type: application/json"
$ scurl.sh https://<ccf-node-address>/gov/proposals/b9c08b3861395eca904d913427dcb436136e277cf4712eb14e9e9cddf9d231a8/votes --cacert network_cert --key member2_privk --cert member2_cert --data-binary @vote_accept_1.json -H "content-type: application/json"
{
"proposal_id": 5,
"proposal_id": "b9c08b3861395eca904d913427dcb436136e277cf4712eb14e9e9cddf9d231a8",
"proposer_id": 1,
"state": "OPEN"
}

$ scurl.sh https://<ccf-node-address>/gov/proposals/5/votes --cacert network_cert --key member3_privk --cert member3_cert --data-binary @vote_accept_1.json -H "content-type: application/json"
$ scurl.sh https://<ccf-node-address>/gov/proposals/b9c08b3861395eca904d913427dcb436136e277cf4712eb14e9e9cddf9d231a8/votes --cacert network_cert --key member3_privk --cert member3_cert --data-binary @vote_accept_1.json -H "content-type: application/json"
{
"proposal_id": 5,
"proposal_id": "b9c08b3861395eca904d913427dcb436136e277cf4712eb14e9e9cddf9d231a8",
"proposer_id": 1,
"state": "ACCEPTED"
}
Expand Down
12 changes: 6 additions & 6 deletions doc/governance/open_network.rst
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ Then, the certificates of trusted users should be registered in CCF via the memb

$ scurl.sh https://<ccf-node-address>/gov/proposals --cacert network_cert --key member0_privk --cert member0_cert --data-binary @add_user.json -H "content-type: application/json"
{
"proposal_id": 5,
"proposal_id": "f665047e3d1eb184a7b7921944a8ab543cfff117aab5b6358dc87f9e70278253",
"proposer_id": 0,
"state": "OPEN"
}
Expand All @@ -38,9 +38,9 @@ Other members are then allowed to vote for the proposal, using the proposal id r
}
}

$ scurl.sh https://<ccf-node-address>/gov/proposals/5/votes --cacert network_cert --key member1_privk --cert member1_cert --data-binary @vote_accept.json -H "content-type: application/json"
$ scurl.sh https://<ccf-node-address>/gov/proposals/f665047e3d1eb184a7b7921944a8ab543cfff117aab5b6358dc87f9e70278253/votes --cacert network_cert --key member1_privk --cert member1_cert --data-binary @vote_accept.json -H "content-type: application/json"
Comment thread
eddyashton marked this conversation as resolved.
{
"proposal_id": 5,
"proposal_id": "f665047e3d1eb184a7b7921944a8ab543cfff117aab5b6358dc87f9e70278253",
"proposer_id": 0,
"state": "OPEN"
}
Expand All @@ -52,9 +52,9 @@ Other members are then allowed to vote for the proposal, using the proposal id r
}
}

$ scurl.sh https://<ccf-node-address>/gov/proposals/5/votes --cacert network_cert --key member2_privk --cert member2_cert --data-binary @vote_conditional.json -H "content-type: application/json"
$ scurl.sh https://<ccf-node-address>/gov/proposals/f665047e3d1eb184a7b7921944a8ab543cfff117aab5b6358dc87f9e70278253/votes --cacert network_cert --key member2_privk --cert member2_cert --data-binary @vote_conditional.json -H "content-type: application/json"
{
"proposal_id": 5,
"proposal_id": "f665047e3d1eb184a7b7921944a8ab543cfff117aab5b6358dc87f9e70278253",
"proposer_id": 0,
"state": "ACCEPTED"
}
Expand Down Expand Up @@ -134,7 +134,7 @@ Once users are added to the opening network, members should create a proposal to

$ scurl.sh https://<ccf-node-address>/gov/proposals --cacert network_cert --key member0_privk --cert member0_cert --data-binary @open_network.json -H "content-type: application/json"
{
"proposal_id": 10,
"proposal_id": "77374e16de0b2d61f58aec84d01e6218205d19c9401d2df127d893ce62576b81",
"proposer_id": 0,
"state": "OPEN"
}
Expand Down
14 changes: 7 additions & 7 deletions doc/governance/proposals.rst
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ For example, ``member1`` may submit a proposal to add a new member (``member4``)

$ scurl.sh https://<ccf-node-address>/gov/proposals --cacert network_cert --key member1_privk --cert member1_cert --data-binary @add_member.json -H "content-type: application/json"
{
"proposal_id": 4,
"proposal_id": "d4ec2de82267f97d3d1b464020af0bd3241f1bedf769f0fee73cd00f08e9c7fd",
"proposer_id": 1,
"state": "OPEN"
}
Expand All @@ -138,17 +138,17 @@ In this case, a new proposal with id ``4`` has successfully been created and the
}

# Member 2 rejects the proposal (votes in favour: 1/3)
$ scurl.sh https://<ccf-node-address>/gov/proposals/4/votes --cacert network_cert --key member2_privk --cert member2_cert --data-binary @vote_reject.json -H "content-type: application/json"
$ scurl.sh https://<ccf-node-address>/gov/proposals/d4ec2de82267f97d3d1b464020af0bd3241f1bedf769f0fee73cd00f08e9c7fd/votes --cacert network_cert --key member2_privk --cert member2_cert --data-binary @vote_reject.json -H "content-type: application/json"
{
"proposal_id": 4,
"proposal_id": "d4ec2de82267f97d3d1b464020af0bd3241f1bedf769f0fee73cd00f08e9c7fd",
"proposer_id": 1,
"state": "OPEN"
}

# Member 3 accepts the proposal (votes in favour: 2/3)
$ scurl.sh https://<ccf-node-address>/gov/proposals/4/votes --cacert network_cert --key member3_privk --cert member3_cert --data-binary @vote_accept.json -H "content-type: application/json"
$ scurl.sh https://<ccf-node-address>/gov/proposals/d4ec2de82267f97d3d1b464020af0bd3241f1bedf769f0fee73cd00f08e9c7fd/votes --cacert network_cert --key member3_privk --cert member3_cert --data-binary @vote_accept.json -H "content-type: application/json"
{
"proposal_id": 4,
"proposal_id": "d4ec2de82267f97d3d1b464020af0bd3241f1bedf769f0fee73cd00f08e9c7fd",
"proposer_id": 1,
"state": "ACCEPTED"
}
Expand All @@ -167,7 +167,7 @@ The details of pending proposals, including the proposer member id, proposal scr
.. code-block:: bash

# The full proposal state, including votes, can still be retrieved by any member
$ scurl.sh https://<ccf-node-address>/gov/proposals/4 --cacert networkcert.pem --key member3_privk.pem --cert member3_cert.pem -H "content-type: application/json" -X GET
$ scurl.sh https://<ccf-node-address>/gov/proposals/d4ec2de82267f97d3d1b464020af0bd3241f1bedf769f0fee73cd00f08e9c7fd --cacert networkcert.pem --key member3_privk.pem --cert member3_cert.pem -H "content-type: application/json" -X GET
{
"parameter": {...},
"proposer": 1,
Expand Down Expand Up @@ -204,7 +204,7 @@ At any stage during the voting process, before the proposal is accepted, the pro

$ scurl.sh https://<ccf-node-address>/gov/proposals/<proposal-id>/withdraw --cacert networkcert.pem --key member1_privk.pem --cert member1_cert.pem -H "content-type: application/json"
{
"proposal_id": 4,
"proposal_id": "d4ec2de82267f97d3d1b464020af0bd3241f1bedf769f0fee73cd00f08e9c7fd",
"proposer_id": 1,
"state": "WITHDRAWN"
}
Expand Down
2 changes: 1 addition & 1 deletion doc/schemas/gov_openapi.json
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@
"ProposalInfo": {
"properties": {
"proposal_id": {
"$ref": "#/components/schemas/uint64"
"$ref": "#/components/schemas/string"
},
"proposer_id": {
"$ref": "#/components/schemas/uint64"
Expand Down
8 changes: 7 additions & 1 deletion src/http/authentication/sig_auth.h
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,7 @@ namespace ccf
tls::Pem member_cert;
nlohmann::json member_data;
SignedReq signed_request;
std::vector<uint8_t> request_digest;
};

class MemberSignatureAuthnPolicy : public AuthnPolicy
Expand Down Expand Up @@ -187,15 +188,20 @@ namespace ccf
"Members and member certs tables do not match");
}

std::vector<uint8_t> digest;
auto verifier = verifiers.get_verifier(member->cert);
if (verifier->verify(
signed_request->req, signed_request->sig, signed_request->md))
signed_request->req,
signed_request->sig,
signed_request->md,
digest))
{
auto identity = std::make_unique<MemberSignatureAuthnIdentity>();
identity->member_id = member_id.value();
identity->member_cert = member->cert;
identity->member_data = member->member_data;
identity->signed_request = signed_request.value();
identity->request_digest = std::move(digest);
return identity;
}
else
Expand Down
5 changes: 3 additions & 2 deletions src/node/proposals.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,11 +93,12 @@ namespace ccf
DECLARE_JSON_REQUIRED_FIELDS(
Proposal, script, parameter, proposer, state, votes)

using Proposals = kv::Map<ObjectId, Proposal>;
using ProposalId = std::string;
using Proposals = kv::Map<ProposalId, Proposal>;

struct ProposalInfo
{
ObjectId proposal_id;
ProposalId proposal_id;
MemberId proposer_id;
ProposalState state;
};
Expand Down
18 changes: 18 additions & 0 deletions src/node/rpc/endpoint_registry.h
Original file line number Diff line number Diff line change
Expand Up @@ -505,6 +505,24 @@ namespace ccf
return true;
}

template <>
bool get_path_param(
const enclave::PathParams& params,
const std::string& param_name,
std::string& value,
std::string& error)
{
const auto it = params.find(param_name);
if (it == params.end())
{
error = fmt::format("No parameter named '{}' in path", param_name);
return false;
}

value = it->second;
return true;
}

protected:
EndpointPtr default_endpoint;
std::map<std::string, std::map<RESTVerb, EndpointPtr>>
Expand Down
Loading