Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 1bdcf9c3cf | |||
| 4ebb9cd239 | |||
| 620d68ea2f |
@@ -4,3 +4,4 @@
|
|||||||
**/node_modules
|
**/node_modules
|
||||||
**/target
|
**/target
|
||||||
dist
|
dist
|
||||||
|
documentation
|
||||||
|
|||||||
@@ -1,2 +0,0 @@
|
|||||||
nym-validator-rewarder/.sqlx/** diff=nodiff
|
|
||||||
nym-node-status-api/nym-node-status-api/.sqlx/** diff=nodiff
|
|
||||||
+11
-1
@@ -14,6 +14,7 @@
|
|||||||
# contracts
|
# contracts
|
||||||
/contracts/mixnet @durch @jstuczyn
|
/contracts/mixnet @durch @jstuczyn
|
||||||
/contracts/vesting @durch @jstuczyn
|
/contracts/vesting @durch @jstuczyn
|
||||||
|
/contracts/service-provider-directory @octol
|
||||||
|
|
||||||
# crypto code
|
# crypto code
|
||||||
/common/crypto/ @jstuczyn
|
/common/crypto/ @jstuczyn
|
||||||
@@ -21,5 +22,14 @@
|
|||||||
/common/dkg/ @jstuczyn
|
/common/dkg/ @jstuczyn
|
||||||
/common/nymsphinx/ @jstuczyn
|
/common/nymsphinx/ @jstuczyn
|
||||||
|
|
||||||
|
# rust sdk
|
||||||
|
/sdk/rust/ @octol
|
||||||
|
|
||||||
|
# nym-connect (rust)
|
||||||
|
/nym-connect/desktop/src-tauri/ @octol
|
||||||
|
|
||||||
|
# nym-wallet (rust)
|
||||||
|
/nym-wallet/src-tauri/ @octol
|
||||||
|
|
||||||
# documentation
|
# documentation
|
||||||
/documentation @mfahampshire
|
/documentation @mfahampshire
|
||||||
+266
-150
@@ -9,7 +9,7 @@
|
|||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/core": "^1.10.1",
|
"@actions/core": "^1.10.1",
|
||||||
"@actions/github": "^6.0.0",
|
"@actions/github": "^5.1.1",
|
||||||
"@octokit/auth-action": "^4.0.1",
|
"@octokit/auth-action": "^4.0.1",
|
||||||
"@octokit/rest": "^20.0.2",
|
"@octokit/rest": "^20.0.2",
|
||||||
"hasha": "^5.2.0",
|
"hasha": "^5.2.0",
|
||||||
@@ -29,34 +29,22 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@actions/github": {
|
"node_modules/@actions/github": {
|
||||||
"version": "6.0.0",
|
"version": "5.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/@actions/github/-/github-6.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/@actions/github/-/github-5.1.1.tgz",
|
||||||
"integrity": "sha512-alScpSVnYmjNEXboZjarjukQEzgCRmjMv6Xj47fsdnqGS73bjJNDpiiXmp8jr0UZLdUB6d9jW63IcmddUP+l0g==",
|
"integrity": "sha512-Nk59rMDoJaV+mHCOJPXuvB1zIbomlKS0dmSIqPGxd0enAXBnOfn4VWF+CGtRCwXZG9Epa54tZA7VIRlJDS8A6g==",
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/http-client": "^2.2.0",
|
"@actions/http-client": "^2.0.1",
|
||||||
"@octokit/core": "^5.0.1",
|
"@octokit/core": "^3.6.0",
|
||||||
"@octokit/plugin-paginate-rest": "^9.0.0",
|
"@octokit/plugin-paginate-rest": "^2.17.0",
|
||||||
"@octokit/plugin-rest-endpoint-methods": "^10.0.0"
|
"@octokit/plugin-rest-endpoint-methods": "^5.13.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@actions/http-client": {
|
"node_modules/@actions/http-client": {
|
||||||
"version": "2.2.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.3.tgz",
|
|
||||||
"integrity": "sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"tunnel": "^0.0.6",
|
|
||||||
"undici": "^5.25.4"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@fastify/busboy": {
|
|
||||||
"version": "2.1.1",
|
"version": "2.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.1.1.tgz",
|
||||||
"integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==",
|
"integrity": "sha512-qhrkRMB40bbbLo7gF+0vu+X+UawOvQQqNAA/5Unx774RS8poaOhThDOG6BGmxvAnxhQnDp2BG/ZUm65xZILTpw==",
|
||||||
"license": "MIT",
|
"dependencies": {
|
||||||
"engines": {
|
"tunnel": "^0.0.6"
|
||||||
"node": ">=14"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@octokit/auth-action": {
|
"node_modules/@octokit/auth-action": {
|
||||||
@@ -71,6 +59,14 @@
|
|||||||
"node": ">= 18"
|
"node": ">= 18"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@octokit/auth-action/node_modules/@octokit/auth-token": {
|
||||||
|
"version": "4.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz",
|
||||||
|
"integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 18"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@octokit/auth-action/node_modules/@octokit/openapi-types": {
|
"node_modules/@octokit/auth-action/node_modules/@octokit/openapi-types": {
|
||||||
"version": "20.0.0",
|
"version": "20.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz",
|
||||||
@@ -85,152 +81,115 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@octokit/auth-token": {
|
"node_modules/@octokit/auth-token": {
|
||||||
"version": "4.0.0",
|
"version": "2.5.0",
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz",
|
||||||
"integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==",
|
"integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==",
|
||||||
"license": "MIT",
|
"dependencies": {
|
||||||
"engines": {
|
"@octokit/types": "^6.0.3"
|
||||||
"node": ">= 18"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@octokit/core": {
|
"node_modules/@octokit/core": {
|
||||||
"version": "5.2.0",
|
"version": "3.6.0",
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz",
|
||||||
"integrity": "sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg==",
|
"integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==",
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@octokit/auth-token": "^4.0.0",
|
"@octokit/auth-token": "^2.4.4",
|
||||||
"@octokit/graphql": "^7.1.0",
|
"@octokit/graphql": "^4.5.8",
|
||||||
"@octokit/request": "^8.3.1",
|
"@octokit/request": "^5.6.3",
|
||||||
"@octokit/request-error": "^5.1.0",
|
"@octokit/request-error": "^2.0.5",
|
||||||
"@octokit/types": "^13.0.0",
|
"@octokit/types": "^6.0.3",
|
||||||
"before-after-hook": "^2.2.0",
|
"before-after-hook": "^2.2.0",
|
||||||
"universal-user-agent": "^6.0.0"
|
"universal-user-agent": "^6.0.0"
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 18"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@octokit/endpoint": {
|
"node_modules/@octokit/endpoint": {
|
||||||
"version": "9.0.6",
|
"version": "6.0.12",
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.6.tgz",
|
"resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz",
|
||||||
"integrity": "sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==",
|
"integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==",
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@octokit/types": "^13.1.0",
|
"@octokit/types": "^6.0.3",
|
||||||
|
"is-plain-object": "^5.0.0",
|
||||||
"universal-user-agent": "^6.0.0"
|
"universal-user-agent": "^6.0.0"
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 18"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@octokit/graphql": {
|
"node_modules/@octokit/graphql": {
|
||||||
"version": "7.1.0",
|
"version": "4.8.0",
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz",
|
||||||
"integrity": "sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==",
|
"integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==",
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@octokit/request": "^8.3.0",
|
"@octokit/request": "^5.6.0",
|
||||||
"@octokit/types": "^13.0.0",
|
"@octokit/types": "^6.0.3",
|
||||||
"universal-user-agent": "^6.0.0"
|
"universal-user-agent": "^6.0.0"
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 18"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@octokit/openapi-types": {
|
"node_modules/@octokit/openapi-types": {
|
||||||
"version": "23.0.1",
|
"version": "12.11.0",
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-23.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz",
|
||||||
"integrity": "sha512-izFjMJ1sir0jn0ldEKhZ7xegCTj/ObmEDlEfpFrx4k/JyZSMRHbO3/rBwgE7f3m2DHt+RrNGIVw4wSmwnm3t/g==",
|
"integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ=="
|
||||||
"license": "MIT"
|
|
||||||
},
|
},
|
||||||
"node_modules/@octokit/plugin-paginate-rest": {
|
"node_modules/@octokit/plugin-paginate-rest": {
|
||||||
"version": "9.2.2",
|
"version": "2.21.3",
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz",
|
||||||
"integrity": "sha512-u3KYkGF7GcZnSD/3UP0S7K5XUFT2FkOQdcfXZGZQPGv3lm4F2Xbf71lvjldr8c1H3nNbF+33cLEkWYbokGWqiQ==",
|
"integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==",
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@octokit/types": "^12.6.0"
|
"@octokit/types": "^6.40.0"
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 18"
|
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@octokit/core": "5"
|
"@octokit/core": ">=2"
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": {
|
|
||||||
"version": "20.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz",
|
|
||||||
"integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==",
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": {
|
|
||||||
"version": "12.6.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz",
|
|
||||||
"integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@octokit/openapi-types": "^20.0.0"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@octokit/plugin-rest-endpoint-methods": {
|
"node_modules/@octokit/plugin-rest-endpoint-methods": {
|
||||||
"version": "10.4.1",
|
"version": "5.16.2",
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz",
|
||||||
"integrity": "sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg==",
|
"integrity": "sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==",
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@octokit/types": "^12.6.0"
|
"@octokit/types": "^6.39.0",
|
||||||
},
|
"deprecation": "^2.3.1"
|
||||||
"engines": {
|
|
||||||
"node": ">= 18"
|
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@octokit/core": "5"
|
"@octokit/core": ">=3"
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": {
|
|
||||||
"version": "20.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz",
|
|
||||||
"integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==",
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": {
|
|
||||||
"version": "12.6.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz",
|
|
||||||
"integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@octokit/openapi-types": "^20.0.0"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@octokit/request": {
|
"node_modules/@octokit/request": {
|
||||||
"version": "8.4.1",
|
"version": "5.6.3",
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz",
|
||||||
"integrity": "sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==",
|
"integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==",
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@octokit/endpoint": "^9.0.6",
|
"@octokit/endpoint": "^6.0.1",
|
||||||
"@octokit/request-error": "^5.1.1",
|
"@octokit/request-error": "^2.1.0",
|
||||||
"@octokit/types": "^13.1.0",
|
"@octokit/types": "^6.16.1",
|
||||||
|
"is-plain-object": "^5.0.0",
|
||||||
|
"node-fetch": "^2.6.7",
|
||||||
"universal-user-agent": "^6.0.0"
|
"universal-user-agent": "^6.0.0"
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 18"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@octokit/request-error": {
|
"node_modules/@octokit/request-error": {
|
||||||
"version": "5.1.1",
|
"version": "2.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz",
|
||||||
"integrity": "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==",
|
"integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==",
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@octokit/types": "^13.1.0",
|
"@octokit/types": "^6.0.3",
|
||||||
"deprecation": "^2.0.0",
|
"deprecation": "^2.0.0",
|
||||||
"once": "^1.4.0"
|
"once": "^1.4.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@octokit/request/node_modules/node-fetch": {
|
||||||
|
"version": "2.7.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
|
||||||
|
"integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
|
||||||
|
"dependencies": {
|
||||||
|
"whatwg-url": "^5.0.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 18"
|
"node": "4.x || >=6.0.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"encoding": "^0.1.0"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"encoding": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@octokit/rest": {
|
"node_modules/@octokit/rest": {
|
||||||
@@ -247,6 +206,89 @@
|
|||||||
"node": ">= 18"
|
"node": ">= 18"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@octokit/rest/node_modules/@octokit/auth-token": {
|
||||||
|
"version": "4.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz",
|
||||||
|
"integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 18"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@octokit/rest/node_modules/@octokit/core": {
|
||||||
|
"version": "5.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.0.0.tgz",
|
||||||
|
"integrity": "sha512-YbAtMWIrbZ9FCXbLwT9wWB8TyLjq9mxpKdgB3dUNxQcIVTf9hJ70gRPwAcqGZdY6WdJPZ0I7jLaaNDCiloGN2A==",
|
||||||
|
"dependencies": {
|
||||||
|
"@octokit/auth-token": "^4.0.0",
|
||||||
|
"@octokit/graphql": "^7.0.0",
|
||||||
|
"@octokit/request": "^8.0.2",
|
||||||
|
"@octokit/request-error": "^5.0.0",
|
||||||
|
"@octokit/types": "^11.0.0",
|
||||||
|
"before-after-hook": "^2.2.0",
|
||||||
|
"universal-user-agent": "^6.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 18"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@octokit/rest/node_modules/@octokit/endpoint": {
|
||||||
|
"version": "9.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.0.tgz",
|
||||||
|
"integrity": "sha512-szrQhiqJ88gghWY2Htt8MqUDO6++E/EIXqJ2ZEp5ma3uGS46o7LZAzSLt49myB7rT+Hfw5Y6gO3LmOxGzHijAQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"@octokit/types": "^11.0.0",
|
||||||
|
"is-plain-object": "^5.0.0",
|
||||||
|
"universal-user-agent": "^6.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 18"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@octokit/rest/node_modules/@octokit/graphql": {
|
||||||
|
"version": "7.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.0.1.tgz",
|
||||||
|
"integrity": "sha512-T5S3oZ1JOE58gom6MIcrgwZXzTaxRnxBso58xhozxHpOqSTgDS6YNeEUvZ/kRvXgPrRz/KHnZhtb7jUMRi9E6w==",
|
||||||
|
"dependencies": {
|
||||||
|
"@octokit/request": "^8.0.1",
|
||||||
|
"@octokit/types": "^11.0.0",
|
||||||
|
"universal-user-agent": "^6.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 18"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@octokit/rest/node_modules/@octokit/openapi-types": {
|
||||||
|
"version": "18.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz",
|
||||||
|
"integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw=="
|
||||||
|
},
|
||||||
|
"node_modules/@octokit/rest/node_modules/@octokit/plugin-paginate-rest": {
|
||||||
|
"version": "9.2.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.1.tgz",
|
||||||
|
"integrity": "sha512-wfGhE/TAkXZRLjksFXuDZdmGnJQHvtU/joFQdweXUgzo1XwvBCD4o4+75NtFfjfLK5IwLf9vHTfSiU3sLRYpRw==",
|
||||||
|
"dependencies": {
|
||||||
|
"@octokit/types": "^12.6.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 18"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@octokit/core": "5"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@octokit/rest/node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": {
|
||||||
|
"version": "20.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz",
|
||||||
|
"integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA=="
|
||||||
|
},
|
||||||
|
"node_modules/@octokit/rest/node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": {
|
||||||
|
"version": "12.6.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz",
|
||||||
|
"integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==",
|
||||||
|
"dependencies": {
|
||||||
|
"@octokit/openapi-types": "^20.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@octokit/rest/node_modules/@octokit/plugin-request-log": {
|
"node_modules/@octokit/rest/node_modules/@octokit/plugin-request-log": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-4.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-4.0.0.tgz",
|
||||||
@@ -258,13 +300,75 @@
|
|||||||
"@octokit/core": ">=5"
|
"@octokit/core": ">=5"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@octokit/types": {
|
"node_modules/@octokit/rest/node_modules/@octokit/plugin-rest-endpoint-methods": {
|
||||||
"version": "13.8.0",
|
"version": "10.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.8.0.tgz",
|
"resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.4.1.tgz",
|
||||||
"integrity": "sha512-x7DjTIbEpEWXK99DMd01QfWy0hd5h4EN+Q7shkdKds3otGQP+oWE/y0A76i1OvH9fygo4ddvNf7ZvF0t78P98A==",
|
"integrity": "sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg==",
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@octokit/openapi-types": "^23.0.1"
|
"@octokit/types": "^12.6.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 18"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@octokit/core": "5"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@octokit/rest/node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": {
|
||||||
|
"version": "20.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-20.0.0.tgz",
|
||||||
|
"integrity": "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA=="
|
||||||
|
},
|
||||||
|
"node_modules/@octokit/rest/node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": {
|
||||||
|
"version": "12.6.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.6.0.tgz",
|
||||||
|
"integrity": "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==",
|
||||||
|
"dependencies": {
|
||||||
|
"@octokit/openapi-types": "^20.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@octokit/rest/node_modules/@octokit/request": {
|
||||||
|
"version": "8.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.1.tgz",
|
||||||
|
"integrity": "sha512-8N+tdUz4aCqQmXl8FpHYfKG9GelDFd7XGVzyN8rc6WxVlYcfpHECnuRkgquzz+WzvHTK62co5di8gSXnzASZPQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"@octokit/endpoint": "^9.0.0",
|
||||||
|
"@octokit/request-error": "^5.0.0",
|
||||||
|
"@octokit/types": "^11.1.0",
|
||||||
|
"is-plain-object": "^5.0.0",
|
||||||
|
"universal-user-agent": "^6.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 18"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@octokit/rest/node_modules/@octokit/request-error": {
|
||||||
|
"version": "5.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.0.tgz",
|
||||||
|
"integrity": "sha512-1ue0DH0Lif5iEqT52+Rf/hf0RmGO9NWFjrzmrkArpG9trFfDM/efx00BJHdLGuro4BR/gECxCU2Twf5OKrRFsQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"@octokit/types": "^11.0.0",
|
||||||
|
"deprecation": "^2.0.0",
|
||||||
|
"once": "^1.4.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 18"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@octokit/rest/node_modules/@octokit/types": {
|
||||||
|
"version": "11.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-11.1.0.tgz",
|
||||||
|
"integrity": "sha512-Fz0+7GyLm/bHt8fwEqgvRBWwIV1S6wRRyq+V6exRKLVWaKGsuy6H9QFYeBVDV7rK6fO3XwHgQOPxv+cLj2zpXQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"@octokit/openapi-types": "^18.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@octokit/types": {
|
||||||
|
"version": "6.41.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz",
|
||||||
|
"integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==",
|
||||||
|
"dependencies": {
|
||||||
|
"@octokit/openapi-types": "^12.11.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@vercel/ncc": {
|
"node_modules/@vercel/ncc": {
|
||||||
@@ -292,8 +396,7 @@
|
|||||||
"node_modules/deprecation": {
|
"node_modules/deprecation": {
|
||||||
"version": "2.3.1",
|
"version": "2.3.1",
|
||||||
"resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz",
|
||||||
"integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==",
|
"integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ=="
|
||||||
"license": "ISC"
|
|
||||||
},
|
},
|
||||||
"node_modules/fetch-blob": {
|
"node_modules/fetch-blob": {
|
||||||
"version": "3.2.0",
|
"version": "3.2.0",
|
||||||
@@ -343,6 +446,14 @@
|
|||||||
"url": "https://github.com/sponsors/sindresorhus"
|
"url": "https://github.com/sponsors/sindresorhus"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/is-plain-object": {
|
||||||
|
"version": "5.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
|
||||||
|
"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=0.10.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/is-stream": {
|
"node_modules/is-stream": {
|
||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
|
||||||
@@ -393,11 +504,15 @@
|
|||||||
"version": "1.4.0",
|
"version": "1.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
||||||
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
|
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
|
||||||
"license": "ISC",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"wrappy": "1"
|
"wrappy": "1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/tr46": {
|
||||||
|
"version": "0.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
|
||||||
|
"integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
|
||||||
|
},
|
||||||
"node_modules/tunnel": {
|
"node_modules/tunnel": {
|
||||||
"version": "0.0.6",
|
"version": "0.0.6",
|
||||||
"resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
|
"resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
|
||||||
@@ -414,18 +529,6 @@
|
|||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/undici": {
|
|
||||||
"version": "5.29.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz",
|
|
||||||
"integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@fastify/busboy": "^2.0.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=14.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/universal-user-agent": {
|
"node_modules/universal-user-agent": {
|
||||||
"version": "6.0.0",
|
"version": "6.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz",
|
||||||
@@ -447,11 +550,24 @@
|
|||||||
"node": ">= 8"
|
"node": ">= 8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/webidl-conversions": {
|
||||||
|
"version": "3.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
|
||||||
|
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
|
||||||
|
},
|
||||||
|
"node_modules/whatwg-url": {
|
||||||
|
"version": "5.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
|
||||||
|
"integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
|
||||||
|
"dependencies": {
|
||||||
|
"tr46": "~0.0.3",
|
||||||
|
"webidl-conversions": "^3.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/wrappy": {
|
"node_modules/wrappy": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
||||||
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
|
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
|
||||||
"license": "ISC"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/core": "^1.10.1",
|
"@actions/core": "^1.10.1",
|
||||||
"@actions/github": "^6.0.0",
|
"@actions/github": "^5.1.1",
|
||||||
"@octokit/auth-action": "^4.0.1",
|
"@octokit/auth-action": "^4.0.1",
|
||||||
"@octokit/rest": "^20.0.2",
|
"@octokit/rest": "^20.0.2",
|
||||||
"hasha": "^5.2.0",
|
"hasha": "^5.2.0",
|
||||||
|
|||||||
@@ -5,28 +5,21 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: arc-ubuntu-22.04
|
runs-on: arc-ubuntu-20.04
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
working-directory: documentation/docs
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Install Dependencies (Linux)
|
- name: Install Dependencies (Linux)
|
||||||
run: sudo apt-get update && sudo apt-get install -y build-essential curl wget libssl-dev libudev-dev squashfs-tools protobuf-compiler git python3 && sudo apt-get update --fix-missing
|
run: sudo apt-get update && sudo apt-get install -y build-essential curl wget libssl-dev libudev-dev squashfs-tools protobuf-compiler git python3 && sudo apt-get update --fix-missing
|
||||||
- name: Install pip3
|
- name: Install pip3
|
||||||
run: sudo apt install -y python3-pip
|
run: sudo apt install -y python3-pip
|
||||||
- name: Install Python3 modules
|
- name: Install Python3 modules
|
||||||
run: sudo pip3 install pandas tabulate
|
run: sudo pip3 install pandas tabulate
|
||||||
- name: Install rsync
|
- name: Install rsync
|
||||||
run: sudo apt-get install -y rsync
|
run: sudo apt-get install rsync
|
||||||
- uses: rlespinasse/github-slug-action@v3.x
|
- uses: rlespinasse/github-slug-action@v3.x
|
||||||
- name: Setup pnpm
|
|
||||||
uses: pnpm/action-setup@v4.1.0
|
|
||||||
with:
|
|
||||||
version: 9
|
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 18
|
||||||
- name: Install Rust stable
|
- name: Install Rust stable
|
||||||
uses: actions-rs/toolchain@v1
|
uses: actions-rs/toolchain@v1
|
||||||
with:
|
with:
|
||||||
@@ -36,13 +29,33 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
command: build
|
command: build
|
||||||
args: --workspace --release
|
args: --workspace --release
|
||||||
|
- name: Install mdbook and plugins
|
||||||
|
run: cd documentation && ./install_mdbook_deps.sh
|
||||||
|
- name: Remove existing Nym config directory (`~/.nym/`)
|
||||||
|
run: cd documentation && ./remove_existing_config.sh
|
||||||
|
continue-on-error: false
|
||||||
|
# This is the original flow
|
||||||
|
# - name: Build all projects in documentation/ & move to ~/dist/docs/
|
||||||
|
# run: cd documentation && ./build_all_to_dist.sh
|
||||||
|
|
||||||
- name: Install project dependencies
|
# This is a workaround replacement which builds on the last working commit b332a6b55668f60988e36961f3f62a794ba82ddb and then on current branch
|
||||||
run: pnpm i
|
- name: Save current branch to ~/current_branch
|
||||||
- name: Build project
|
run: git rev-parse --abbrev-ref HEAD > ~/current_branch
|
||||||
run: pnpm run build
|
- name: Git pull, reset & switch to b332a6b55668f60988e36961f3f62a794ba82ddb
|
||||||
- name: Move files to /dist/
|
run: git pull && git reset --hard && git checkout b332a6b55668f60988e36961f3f62a794ba82ddb
|
||||||
run: ../scripts/move-to-dist.sh
|
- name: Build all projects in documentation/ & move to ~/dist/docs/ from b332a6b55668f60988e36961f3f62a794ba82ddb
|
||||||
|
run: cd documentation && ./build_all_to_dist.sh
|
||||||
|
|
||||||
|
- name: Switch to current branch
|
||||||
|
run: git checkout $echo "$(cat ~/current_branch)"
|
||||||
|
- name: Build all projects in documentation/ & move to ~/dist/docs/ on current branch
|
||||||
|
run: cd documentation && ./build_all_to_dist.sh && rm ~/current_branch
|
||||||
|
|
||||||
|
# End of replacemet
|
||||||
|
|
||||||
|
- name: Post process
|
||||||
|
run: cd documentation && ./post_process.sh
|
||||||
|
continue-on-error: false
|
||||||
|
|
||||||
- name: Create Vercel project file
|
- name: Create Vercel project file
|
||||||
uses: mobiledevops/secret-to-file-action@v1
|
uses: mobiledevops/secret-to-file-action@v1
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
platform: [arc-ubuntu-22.04]
|
platform: [arc-ubuntu-20.04]
|
||||||
|
|
||||||
runs-on: ${{ matrix.platform }}
|
runs-on: ${{ matrix.platform }}
|
||||||
steps:
|
steps:
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-22.04
|
runs-on: arc-ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Install rsync
|
- name: Install rsync
|
||||||
@@ -19,7 +19,7 @@ jobs:
|
|||||||
- uses: rlespinasse/github-slug-action@v3.x
|
- uses: rlespinasse/github-slug-action@v3.x
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 18
|
||||||
- name: Setup yarn
|
- name: Setup yarn
|
||||||
run: npm install -g yarn
|
run: npm install -g yarn
|
||||||
- name: Build
|
- name: Build
|
||||||
|
|||||||
@@ -15,18 +15,35 @@ on:
|
|||||||
type: boolean
|
type: boolean
|
||||||
schedule:
|
schedule:
|
||||||
- cron: "14 0 * * *"
|
- cron: "14 0 * * *"
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- "clients/**"
|
||||||
|
- "common/**"
|
||||||
|
- "explorer-api/**"
|
||||||
|
- "gateway/**"
|
||||||
|
- "integrations/**"
|
||||||
|
- "mixnode/**"
|
||||||
|
- "nym-api/**"
|
||||||
|
- "nym-node/**"
|
||||||
|
- "nym-outfox/**"
|
||||||
|
- 'nym-data-observatory/**'
|
||||||
|
- "nym-validator-rewarder/**"
|
||||||
|
- "sdk/rust/nym-sdk/**"
|
||||||
|
- "service-providers/**"
|
||||||
|
- "tools/**"
|
||||||
|
- "nymvisor/**"
|
||||||
|
- ".github/workflows/ci-build-upload-binaries.yml"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
publish-nym:
|
publish-nym:
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
platform: [ arc-ubuntu-22.04 ]
|
platform: [ arc-ubuntu-20.04 ]
|
||||||
|
|
||||||
runs-on: ${{ matrix.platform }}
|
runs-on: ${{ matrix.platform }}
|
||||||
env:
|
env:
|
||||||
CARGO_TERM_COLOR: always
|
CARGO_TERM_COLOR: always
|
||||||
RUSTUP_PERMIT_COPY_RENAME: 1
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
@@ -80,6 +97,7 @@ jobs:
|
|||||||
target/release/nym-socks5-client
|
target/release/nym-socks5-client
|
||||||
target/release/nym-api
|
target/release/nym-api
|
||||||
target/release/nym-network-requester
|
target/release/nym-network-requester
|
||||||
|
target/release/nym-data-observatory
|
||||||
target/release/nym-cli
|
target/release/nym-cli
|
||||||
target/release/nymvisor
|
target/release/nymvisor
|
||||||
target/release/nym-node
|
target/release/nym-node
|
||||||
@@ -97,9 +115,11 @@ jobs:
|
|||||||
cp target/release/nym-socks5-client $OUTPUT_DIR
|
cp target/release/nym-socks5-client $OUTPUT_DIR
|
||||||
cp target/release/nym-api $OUTPUT_DIR
|
cp target/release/nym-api $OUTPUT_DIR
|
||||||
cp target/release/nym-network-requester $OUTPUT_DIR
|
cp target/release/nym-network-requester $OUTPUT_DIR
|
||||||
|
cp target/release/nym-data-observatory $OUTPUT_DIR
|
||||||
cp target/release/nymvisor $OUTPUT_DIR
|
cp target/release/nymvisor $OUTPUT_DIR
|
||||||
cp target/release/nym-node $OUTPUT_DIR
|
cp target/release/nym-node $OUTPUT_DIR
|
||||||
cp target/release/nym-cli $OUTPUT_DIR
|
cp target/release/nym-cli $OUTPUT_DIR
|
||||||
|
cp target/release/explorer-api $OUTPUT_DIR
|
||||||
if [ ${{ github.event_name == 'workflow_dispatch' && inputs.enable_deb == true }} = true ]; then
|
if [ ${{ github.event_name == 'workflow_dispatch' && inputs.enable_deb == true }} = true ]; then
|
||||||
cp target/debian/*.deb $OUTPUT_DIR
|
cp target/debian/*.deb $OUTPUT_DIR
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ jobs:
|
|||||||
runs-on: arc-ubuntu-22.04
|
runs-on: arc-ubuntu-22.04
|
||||||
env:
|
env:
|
||||||
CARGO_TERM_COLOR: always
|
CARGO_TERM_COLOR: always
|
||||||
RUSTUP_PERMIT_COPY_RENAME: 1
|
|
||||||
steps:
|
steps:
|
||||||
- name: Check out repository code
|
- name: Check out repository code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|||||||
@@ -5,21 +5,19 @@ on:
|
|||||||
paths:
|
paths:
|
||||||
- 'clients/**'
|
- 'clients/**'
|
||||||
- 'common/**'
|
- 'common/**'
|
||||||
|
- 'explorer-api/**'
|
||||||
- 'gateway/**'
|
- 'gateway/**'
|
||||||
- 'integrations/**'
|
- 'integrations/**'
|
||||||
- 'nym-api/**'
|
- 'mixnode/**'
|
||||||
- 'nym-credential-proxy/**'
|
|
||||||
- 'nym-network-monitor/**'
|
|
||||||
- 'nym-node/**'
|
|
||||||
- 'nym-node-status-api/**'
|
|
||||||
- 'nym-statistics-api/**'
|
|
||||||
- 'nym-outfox/**'
|
|
||||||
- 'nym-validator-rewarder/**'
|
|
||||||
- 'nyx-chain-watcher/**'
|
|
||||||
- 'sdk/ffi/**'
|
|
||||||
- 'sdk/rust/**'
|
- 'sdk/rust/**'
|
||||||
|
- 'sdk/lib/**'
|
||||||
- 'service-providers/**'
|
- 'service-providers/**'
|
||||||
- 'nym-browser-extension/storage/**'
|
- 'nym-network-monitor/**'
|
||||||
|
- 'nym-api/**'
|
||||||
|
- 'nym-node/**'
|
||||||
|
- 'nym-outfox/**'
|
||||||
|
- 'nym-data-observatory/**'
|
||||||
|
- 'nym-validator-rewarder/**'
|
||||||
- 'tools/**'
|
- 'tools/**'
|
||||||
- 'wasm/**'
|
- 'wasm/**'
|
||||||
- 'Cargo.toml'
|
- 'Cargo.toml'
|
||||||
@@ -27,23 +25,15 @@ on:
|
|||||||
- '.github/workflows/ci-build.yml'
|
- '.github/workflows/ci-build.yml'
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
concurrency:
|
|
||||||
# only 1 concurrent `ci-build` allowed per branch
|
|
||||||
# https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#example-using-concurrency-and-the-default-behavior
|
|
||||||
group: ${{ github.workflow }}-${{ github.ref }}
|
|
||||||
cancel-in-progress: true
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
os: [ arc-ubuntu-22.04, custom-windows-11, custom-macos-15 ]
|
os: [ arc-ubuntu-20.04, custom-runner-mac-m1 ]
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
env:
|
env:
|
||||||
CARGO_TERM_COLOR: always
|
CARGO_TERM_COLOR: always
|
||||||
IPINFO_API_TOKEN: ${{ secrets.IPINFO_API_TOKEN }}
|
|
||||||
RUSTUP_PERMIT_COPY_RENAME: 1
|
|
||||||
steps:
|
steps:
|
||||||
- name: Install Dependencies (Linux)
|
- name: Install Dependencies (Linux)
|
||||||
run: sudo apt-get update && sudo apt-get -y install libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev libudev-dev squashfs-tools protobuf-compiler
|
run: sudo apt-get update && sudo apt-get -y install libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev libudev-dev squashfs-tools protobuf-compiler
|
||||||
@@ -61,20 +51,6 @@ jobs:
|
|||||||
override: true
|
override: true
|
||||||
components: rustfmt, clippy
|
components: rustfmt, clippy
|
||||||
|
|
||||||
# To avoid running out of disk space, skip generating debug symbols
|
|
||||||
- name: Set debug to false (unix)
|
|
||||||
if: contains(matrix.os, 'ubuntu') || contains(matrix.os, 'mac')
|
|
||||||
run: |
|
|
||||||
sed -i.bak 's/\[profile.dev\]/\[profile.dev\]\ndebug = false/' Cargo.toml
|
|
||||||
git diff
|
|
||||||
|
|
||||||
- name: Set debug to false (win)
|
|
||||||
if: contains(matrix.os, 'windows')
|
|
||||||
shell: pwsh
|
|
||||||
run: |
|
|
||||||
(Get-Content Cargo.toml) -replace '\[profile.dev\]', "`$&`ndebug = false" | Set-Content Cargo.toml
|
|
||||||
git diff
|
|
||||||
|
|
||||||
- name: Check formatting
|
- name: Check formatting
|
||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
with:
|
with:
|
||||||
@@ -102,8 +78,6 @@ jobs:
|
|||||||
- name: Run all tests
|
- name: Run all tests
|
||||||
if: contains(matrix.os, 'ubuntu')
|
if: contains(matrix.os, 'ubuntu')
|
||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
env:
|
|
||||||
NYM_API: https://sandbox-nym-api1.nymtech.net/api
|
|
||||||
with:
|
with:
|
||||||
command: test
|
command: test
|
||||||
args: --workspace
|
args: --workspace
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
cargo-deny:
|
cargo-deny:
|
||||||
runs-on: ubuntu-latest
|
runs-on: arc-ubuntu-22.04-dind
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
checks:
|
checks:
|
||||||
|
|||||||
@@ -1,59 +0,0 @@
|
|||||||
name: ci-check-ns-api-version
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
paths:
|
|
||||||
- "nym-node-status-api/**"
|
|
||||||
|
|
||||||
env:
|
|
||||||
WORKING_DIRECTORY: "nym-node-status-api/nym-node-status-api"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
check-if-tag-exists:
|
|
||||||
runs-on: arc-ubuntu-22.04-dind
|
|
||||||
steps:
|
|
||||||
- name: Checkout repo
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Get version from cargo.toml
|
|
||||||
uses: mikefarah/yq@v4.45.4
|
|
||||||
id: get_version
|
|
||||||
with:
|
|
||||||
cmd: yq -oy '.package.version' ${{ env.WORKING_DIRECTORY }}/Cargo.toml
|
|
||||||
|
|
||||||
- name: Check if git tag exists
|
|
||||||
run: |
|
|
||||||
TAG=${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}
|
|
||||||
if [[ -z "$TAG" ]]; then
|
|
||||||
echo "Tag is empty"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
git ls-remote --tags origin | awk '{print $2}'
|
|
||||||
if git ls-remote --tags origin | awk '{print $2}' | grep -q "refs/tags/$TAG$" ; then
|
|
||||||
echo "Tag '$TAG' ALREADY EXISTS on the remote"
|
|
||||||
exit 1
|
|
||||||
else
|
|
||||||
echo "Tag '$TAG' does not exist on the remote"
|
|
||||||
fi
|
|
||||||
- name: Check if harbor tag exists
|
|
||||||
run: |
|
|
||||||
TAG=${{ steps.get_version.outputs.result }}
|
|
||||||
registry=https://harbor.nymte.ch
|
|
||||||
repo_name=nym/node-status-api
|
|
||||||
if [[ -z $TAG ]]; then
|
|
||||||
echo "Tag is empty"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
# first, list all tags for logging purposes
|
|
||||||
curl -su ${{ secrets.HARBOR_ROBOT_USERNAME }}:${{ secrets.HARBOR_ROBOT_SECRET }} "$registry/v2/$repo_name/tags/list" | jq
|
|
||||||
# check if there's a matching tag
|
|
||||||
exists=$(curl -su ${{ secrets.HARBOR_ROBOT_USERNAME }}:${{ secrets.HARBOR_ROBOT_SECRET }} "$registry/v2/$repo_name/tags/list" | jq -r --arg tag "$TAG" 'any(.tags[]; . == $tag)' )
|
|
||||||
if [[ $exists = "true" ]]; then
|
|
||||||
echo "Version '$TAG' defined in Cargo.toml ALREADY EXISTS as tag in harbor repo"
|
|
||||||
exit 1
|
|
||||||
elif [[ $exists = "false" ]]; then
|
|
||||||
echo "Version '$TAG' doesn't exist on the remote"
|
|
||||||
else
|
|
||||||
echo "Unknown output '$exists'"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
name: ci-check-nym-stats-api-version
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
paths:
|
|
||||||
- "nym-statistics-api/**"
|
|
||||||
|
|
||||||
env:
|
|
||||||
WORKING_DIRECTORY: "nym-statistics-api"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
check-if-tag-exists:
|
|
||||||
runs-on: arc-ubuntu-22.04-dind
|
|
||||||
steps:
|
|
||||||
- name: Checkout repo
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Get version from cargo.toml
|
|
||||||
uses: mikefarah/yq@v4.45.4
|
|
||||||
id: get_version
|
|
||||||
with:
|
|
||||||
cmd: yq -oy '.package.version' ${{ env.WORKING_DIRECTORY }}/Cargo.toml
|
|
||||||
|
|
||||||
- name: Check if git tag exists
|
|
||||||
run: |
|
|
||||||
TAG=${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}
|
|
||||||
if [[ -z "$TAG" ]]; then
|
|
||||||
echo "Tag is empty"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
git ls-remote --tags origin | awk '{print $2}'
|
|
||||||
if git ls-remote --tags origin | awk '{print $2}' | grep -q "refs/tags/$TAG$" ; then
|
|
||||||
echo "Tag '$TAG' ALREADY EXISTS on the remote"
|
|
||||||
exit 1
|
|
||||||
else
|
|
||||||
echo "Tag '$TAG' does not exist on the remote"
|
|
||||||
fi
|
|
||||||
- name: Check if harbor tag exists
|
|
||||||
run: |
|
|
||||||
TAG=${{ steps.get_version.outputs.result }}
|
|
||||||
registry=https://harbor.nymte.ch
|
|
||||||
repo_name=nym/nym-statistics-api
|
|
||||||
if [[ -z $TAG ]]; then
|
|
||||||
echo "Tag is empty"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
# first, list all tags for logging purposes
|
|
||||||
curl -su ${{ secrets.HARBOR_ROBOT_USERNAME }}:${{ secrets.HARBOR_ROBOT_SECRET }} "$registry/v2/$repo_name/tags/list" | jq
|
|
||||||
# check if there's a matching tag
|
|
||||||
exists=$(curl -su ${{ secrets.HARBOR_ROBOT_USERNAME }}:${{ secrets.HARBOR_ROBOT_SECRET }} "$registry/v2/$repo_name/tags/list" | jq -r --arg tag "$TAG" 'any(.tags[]; . == $tag)' )
|
|
||||||
if [[ $exists = "true" ]]; then
|
|
||||||
echo "Version '$TAG' defined in Cargo.toml ALREADY EXISTS as tag in harbor repo"
|
|
||||||
exit 1
|
|
||||||
elif [[ $exists = "false" ]]; then
|
|
||||||
echo "Version '$TAG' doesn't exist on the remote"
|
|
||||||
else
|
|
||||||
echo "Unknown output '$exists'"
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"rust":"stable",
|
||||||
|
"runOnEvent":"always"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"rust":"beta",
|
||||||
|
"runOnEvent":"pull_request"
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -11,7 +11,7 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
check-schema:
|
check-schema:
|
||||||
name: Generate and check schema
|
name: Generate and check schema
|
||||||
runs-on: ubuntu-22.04
|
runs-on: arc-ubuntu-20.04
|
||||||
env:
|
env:
|
||||||
CARGO_TERM_COLOR: always
|
CARGO_TERM_COLOR: always
|
||||||
steps:
|
steps:
|
||||||
|
|||||||
@@ -2,6 +2,11 @@ name: ci-contracts-upload-binaries
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- 'common/**'
|
||||||
|
- 'contracts/**'
|
||||||
|
- '.github/workflows/ci-contracts-upload-binaries.yml'
|
||||||
|
|
||||||
env:
|
env:
|
||||||
NETWORK: mainnet
|
NETWORK: mainnet
|
||||||
@@ -11,7 +16,7 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
platform: [ arc-ubuntu-22.04 ]
|
platform: [ arc-ubuntu-20.04 ]
|
||||||
|
|
||||||
runs-on: ${{ matrix.platform }}
|
runs-on: ${{ matrix.platform }}
|
||||||
env:
|
env:
|
||||||
@@ -31,6 +36,7 @@ jobs:
|
|||||||
- name: Install Rust stable
|
- name: Install Rust stable
|
||||||
uses: actions-rs/toolchain@v1
|
uses: actions-rs/toolchain@v1
|
||||||
with:
|
with:
|
||||||
|
toolchain: 1.77
|
||||||
target: wasm32-unknown-unknown
|
target: wasm32-unknown-unknown
|
||||||
override: true
|
override: true
|
||||||
|
|
||||||
@@ -39,9 +45,6 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
version: '114'
|
version: '114'
|
||||||
|
|
||||||
- name: Install cosmwasm-check
|
|
||||||
run: cargo install cosmwasm-check
|
|
||||||
|
|
||||||
- name: Build release contracts
|
- name: Build release contracts
|
||||||
run: make contracts
|
run: make contracts
|
||||||
|
|
||||||
@@ -52,12 +55,11 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
cp contracts/target/wasm32-unknown-unknown/release/mixnet_contract.wasm $OUTPUT_DIR
|
cp contracts/target/wasm32-unknown-unknown/release/mixnet_contract.wasm $OUTPUT_DIR
|
||||||
cp contracts/target/wasm32-unknown-unknown/release/vesting_contract.wasm $OUTPUT_DIR
|
cp contracts/target/wasm32-unknown-unknown/release/vesting_contract.wasm $OUTPUT_DIR
|
||||||
|
cp contracts/target/wasm32-unknown-unknown/release/nym_coconut_bandwidth.wasm $OUTPUT_DIR
|
||||||
cp contracts/target/wasm32-unknown-unknown/release/nym_coconut_dkg.wasm $OUTPUT_DIR
|
cp contracts/target/wasm32-unknown-unknown/release/nym_coconut_dkg.wasm $OUTPUT_DIR
|
||||||
cp contracts/target/wasm32-unknown-unknown/release/cw3_flex_multisig.wasm $OUTPUT_DIR
|
cp contracts/target/wasm32-unknown-unknown/release/cw3_flex_multisig.wasm $OUTPUT_DIR
|
||||||
cp contracts/target/wasm32-unknown-unknown/release/cw4_group.wasm $OUTPUT_DIR
|
cp contracts/target/wasm32-unknown-unknown/release/cw4_group.wasm $OUTPUT_DIR
|
||||||
cp contracts/target/wasm32-unknown-unknown/release/nym_ecash.wasm $OUTPUT_DIR
|
cp contracts/target/wasm32-unknown-unknown/release/nym_ecash.wasm $OUTPUT_DIR
|
||||||
cp contracts/target/wasm32-unknown-unknown/release/nym_pool_contract.wasm $OUTPUT_DIR
|
|
||||||
cp contracts/target/wasm32-unknown-unknown/release/nym_performance_contract.wasm $OUTPUT_DIR
|
|
||||||
|
|
||||||
- name: Deploy branch to CI www
|
- name: Deploy branch to CI www
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
|
|||||||
@@ -9,18 +9,31 @@ on:
|
|||||||
paths:
|
paths:
|
||||||
- 'contracts/**'
|
- 'contracts/**'
|
||||||
- 'common/**'
|
- 'common/**'
|
||||||
- 'Cargo.lock'
|
|
||||||
- 'Cargo.toml'
|
|
||||||
- '.github/workflows/ci-contracts.yml'
|
- '.github/workflows/ci-contracts.yml'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
matrix_prep:
|
||||||
|
runs-on: arc-ubuntu-20.04
|
||||||
|
outputs:
|
||||||
|
matrix: ${{ steps.set-matrix.outputs.matrix }}
|
||||||
|
steps:
|
||||||
|
# creates the matrix strategy from ci-contracts-matrix-includes.json
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- id: set-matrix
|
||||||
|
uses: JoshuaTheMiller/conditional-build-matrix@main
|
||||||
|
with:
|
||||||
|
inputFile: '.github/workflows/ci-contracts-matrix-includes.json'
|
||||||
|
filter: '[?runOnEvent==`${{ github.event_name }}` || runOnEvent==`always`]'
|
||||||
build:
|
build:
|
||||||
# since it's going to be compiled into wasm, there's absolutely
|
# since it's going to be compiled into wasm, there's absolutely
|
||||||
# no point in running CI on different OS-es
|
# no point in running CI on different OS-es
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-20.04
|
||||||
env:
|
env:
|
||||||
CARGO_TERM_COLOR: always
|
CARGO_TERM_COLOR: always
|
||||||
RUSTUP_PERMIT_COPY_RENAME: 1
|
needs: matrix_prep
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix: ${{fromJson(needs.matrix_prep.outputs.matrix)}}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
@@ -28,20 +41,11 @@ jobs:
|
|||||||
uses: actions-rs/toolchain@v1
|
uses: actions-rs/toolchain@v1
|
||||||
with:
|
with:
|
||||||
profile: minimal
|
profile: minimal
|
||||||
# pinned due to issues building contracts
|
toolchain: ${{ matrix.rust }}
|
||||||
toolchain: 1.86.0
|
|
||||||
target: wasm32-unknown-unknown
|
target: wasm32-unknown-unknown
|
||||||
override: true
|
override: true
|
||||||
components: rustfmt, clippy
|
components: rustfmt, clippy
|
||||||
|
|
||||||
- name: Install cosmwasm-check
|
|
||||||
run: cargo install cosmwasm-check
|
|
||||||
|
|
||||||
- name: Install wasm-opt
|
|
||||||
uses: ./.github/actions/install-wasm-opt
|
|
||||||
with:
|
|
||||||
version: '114'
|
|
||||||
|
|
||||||
- name: Build contracts
|
- name: Build contracts
|
||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
env:
|
env:
|
||||||
@@ -67,7 +71,3 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
command: clippy
|
command: clippy
|
||||||
args: --lib --manifest-path contracts/Cargo.toml --workspace --all-targets -- -D warnings
|
args: --lib --manifest-path contracts/Cargo.toml --workspace --all-targets -- -D warnings
|
||||||
|
|
||||||
- name: Check chain compatibility against release build
|
|
||||||
# this will build contracts in release mode, run wasm-opt and finally cosmwasm-check
|
|
||||||
run: make contracts
|
|
||||||
|
|||||||
@@ -3,37 +3,28 @@ name: ci-docs
|
|||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
push:
|
push:
|
||||||
branches-ignore: [master]
|
branches-ignore: master
|
||||||
paths:
|
paths:
|
||||||
- "documentation/docs/**"
|
- 'documentation/docs/**'
|
||||||
- ".github/workflows/ci-docs.yml"
|
- '.github/workflows/ci-docs.yml'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: arc-ubuntu-22.04
|
runs-on: arc-ubuntu-20.04
|
||||||
env:
|
|
||||||
RUSTUP_PERMIT_COPY_RENAME: 1
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
working-directory: documentation/docs
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Install Dependencies (Linux)
|
- name: Install Dependencies (Linux)
|
||||||
run: sudo apt-get update && sudo apt-get install -y build-essential curl wget libssl-dev libudev-dev squashfs-tools protobuf-compiler git python3 && sudo apt-get update --fix-missing
|
run: sudo apt-get update && sudo apt-get install -y build-essential curl wget libssl-dev libudev-dev squashfs-tools protobuf-compiler git python3 && sudo apt-get update --fix-missing
|
||||||
- name: Install pip3
|
- name: Install pip3
|
||||||
run: sudo apt install -y python3-pip
|
run: sudo apt install -y python3-pip
|
||||||
- name: Install Python3 modules
|
- name: Install Python3 modules
|
||||||
run: sudo pip3 install pandas tabulate
|
run: sudo pip3 install pandas tabulate
|
||||||
- name: Install rsync
|
- name: Install rsync
|
||||||
run: sudo apt-get install -y rsync
|
run: sudo apt-get install rsync
|
||||||
- uses: rlespinasse/github-slug-action@v3.x
|
- uses: rlespinasse/github-slug-action@v3.x
|
||||||
- name: Setup pnpm
|
|
||||||
uses: pnpm/action-setup@v4.1.0
|
|
||||||
with:
|
|
||||||
version: 9
|
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 18
|
||||||
- name: Install Rust stable
|
- name: Install Rust stable
|
||||||
uses: actions-rs/toolchain@v1
|
uses: actions-rs/toolchain@v1
|
||||||
with:
|
with:
|
||||||
@@ -43,13 +34,30 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
command: build
|
command: build
|
||||||
args: --workspace --release
|
args: --workspace --release
|
||||||
|
- name: Install mdbook and plugins
|
||||||
|
run: cd documentation && ./install_mdbook_deps.sh
|
||||||
|
- name: Remove existing Nym config directory (`~/.nym/`)
|
||||||
|
run: cd documentation && ./remove_existing_config.sh
|
||||||
|
continue-on-error: false
|
||||||
|
|
||||||
- name: Install project dependencies
|
# This is the original flow
|
||||||
run: pnpm i
|
# - name: Build all projects in documentation/ & move to ~/dist/docs/
|
||||||
- name: Build project
|
# run: cd documentation && ./build_all_to_dist.sh
|
||||||
run: pnpm run build
|
|
||||||
- name: Move files to /dist/
|
# This is a workaround replacement which builds on the last working commit b332a6b55668f60988e36961f3f62a794ba82ddb and then on current branch
|
||||||
run: ../scripts/move-to-dist.sh
|
- name: Save current branch to ~/current_branch
|
||||||
|
run: git rev-parse --abbrev-ref HEAD > ~/current_branch
|
||||||
|
- name: Git pull, reset & switch to b332a6b55668f60988e36961f3f62a794ba82ddb
|
||||||
|
run: git pull && git reset --hard && git checkout b332a6b55668f60988e36961f3f62a794ba82ddb
|
||||||
|
- name: Build all projects in documentation/ & move to ~/dist/docs/ from b332a6b55668f60988e36961f3f62a794ba82ddb
|
||||||
|
run: cd documentation && ./build_all_to_dist.sh
|
||||||
|
|
||||||
|
- name: Switch to current branch
|
||||||
|
run: git checkout $echo "$(cat ~/current_branch)"
|
||||||
|
- name: Build all projects in documentation/ & move to ~/dist/docs/ on current branch
|
||||||
|
run: cd documentation && ./build_all_to_dist.sh && rm ~/current_branch
|
||||||
|
|
||||||
|
# End of replacemet
|
||||||
|
|
||||||
- name: Deploy branch to CI www
|
- name: Deploy branch to CI www
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
@@ -60,5 +68,5 @@ jobs:
|
|||||||
SOURCE: "dist/docs/"
|
SOURCE: "dist/docs/"
|
||||||
REMOTE_HOST: ${{ secrets.CI_WWW_REMOTE_HOST }}
|
REMOTE_HOST: ${{ secrets.CI_WWW_REMOTE_HOST }}
|
||||||
REMOTE_USER: ${{ secrets.CI_WWW_REMOTE_USER }}
|
REMOTE_USER: ${{ secrets.CI_WWW_REMOTE_USER }}
|
||||||
TARGET: ${{ secrets.CI_WWW_REMOTE_TARGET }}/docs-nextra-${{ env.GITHUB_REF_SLUG }}
|
TARGET: ${{ secrets.CI_WWW_REMOTE_TARGET }}/docs-${{ env.GITHUB_REF_SLUG }}
|
||||||
EXCLUDE: "/node_modules/"
|
EXCLUDE: "/node_modules/"
|
||||||
|
|||||||
@@ -15,16 +15,14 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-22.04
|
runs-on: arc-ubuntu-20.04
|
||||||
env:
|
|
||||||
RUSTUP_PERMIT_COPY_RENAME: 1
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- uses: rlespinasse/github-slug-action@v3.x
|
- uses: rlespinasse/github-slug-action@v3.x
|
||||||
|
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 18
|
||||||
- name: Setup yarn
|
- name: Setup yarn
|
||||||
run: npm install -g yarn
|
run: npm install -g yarn
|
||||||
|
|
||||||
@@ -44,7 +42,7 @@ jobs:
|
|||||||
- name: Set up Go
|
- name: Set up Go
|
||||||
uses: actions/setup-go@v5
|
uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: "1.23.7"
|
go-version: '1.20'
|
||||||
|
|
||||||
- name: Install
|
- name: Install
|
||||||
run: yarn
|
run: yarn
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
name: ci-nym-api-tests
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- "nym-api/**"
|
||||||
|
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
working-directory: nym-api/tests
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
name: nym-api tests
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: install yarn in root
|
||||||
|
run: cd ../.. && yarn install
|
||||||
|
|
||||||
|
- name: Install npm
|
||||||
|
run: npm install
|
||||||
|
|
||||||
|
- name: Node v18
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: 18.1.0
|
||||||
|
|
||||||
|
- name: Install yarn
|
||||||
|
run: yarn install
|
||||||
|
|
||||||
|
- name: Run yarn
|
||||||
|
run: yarn
|
||||||
|
|
||||||
|
- name: Run tests
|
||||||
|
run: yarn test:sandbox
|
||||||
|
working-directory: nym-api/tests
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
name: ci-nym-credential-proxy
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- 'common/**'
|
||||||
|
- 'nym-credential-proxy/**'
|
||||||
|
- '.github/workspace/ci-nym-credential-proxy.yml'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: arc-ubuntu-22.04
|
||||||
|
env:
|
||||||
|
CARGO_TERM_COLOR: always
|
||||||
|
MANIFEST_PATH: "--manifest-path nym-credential-proxy/Cargo.toml"
|
||||||
|
steps:
|
||||||
|
- name: Check out repository code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install rust toolchain
|
||||||
|
uses: actions-rs/toolchain@v1
|
||||||
|
with:
|
||||||
|
profile: minimal
|
||||||
|
toolchain: stable
|
||||||
|
override: true
|
||||||
|
components: rustfmt, clippy
|
||||||
|
|
||||||
|
- name: Check formatting
|
||||||
|
uses: actions-rs/cargo@v1
|
||||||
|
with:
|
||||||
|
command: fmt
|
||||||
|
args: ${{ env.MANIFEST_PATH }} --all -- --check
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
uses: actions-rs/cargo@v1
|
||||||
|
with:
|
||||||
|
command: build
|
||||||
|
args: ${{ env.MANIFEST_PATH }} --workspace --all-targets
|
||||||
|
|
||||||
|
- name: Clippy
|
||||||
|
uses: actions-rs/cargo@v1
|
||||||
|
with:
|
||||||
|
command: clippy
|
||||||
|
args: ${{ env.MANIFEST_PATH }} --workspace --all-targets -- -D warnings
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
name: ci-nym-network-explorer
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- 'explorer/**'
|
||||||
|
- '.github/workflows/ci-nym-network-explorer.yml'
|
||||||
|
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
working-directory: explorer
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: custom-linux
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Install rsync
|
||||||
|
run: sudo apt-get install rsync
|
||||||
|
continue-on-error: true
|
||||||
|
- uses: rlespinasse/github-slug-action@v3.x
|
||||||
|
- uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: 18
|
||||||
|
- name: Setup yarn
|
||||||
|
run: npm install -g yarn
|
||||||
|
continue-on-error: true
|
||||||
|
- name: Build shared packages
|
||||||
|
run: cd .. && yarn && yarn build
|
||||||
|
- name: Set environment from the example
|
||||||
|
run: cp .env.prod .env
|
||||||
|
# - run: yarn test
|
||||||
|
# continue-on-error: true
|
||||||
|
- run: yarn && yarn build
|
||||||
|
continue-on-error: true
|
||||||
|
- run: yarn storybook:build
|
||||||
|
name: Build storybook
|
||||||
|
- name: Deploy branch to CI www
|
||||||
|
continue-on-error: true
|
||||||
|
uses: easingthemes/ssh-deploy@main
|
||||||
|
env:
|
||||||
|
SSH_PRIVATE_KEY: ${{ secrets.CI_WWW_SSH_PRIVATE_KEY }}
|
||||||
|
ARGS: "-rltgoDzvO --delete"
|
||||||
|
SOURCE: "explorer/dist/"
|
||||||
|
REMOTE_HOST: ${{ secrets.CI_WWW_REMOTE_HOST }}
|
||||||
|
REMOTE_USER: ${{ secrets.CI_WWW_REMOTE_USER }}
|
||||||
|
TARGET: ${{ secrets.CI_WWW_REMOTE_TARGET }}/network-explorer-${{ env.GITHUB_REF_SLUG }}
|
||||||
|
EXCLUDE: "/dist/, /node_modules/"
|
||||||
|
- name: Deploy storybook to CI www
|
||||||
|
continue-on-error: true
|
||||||
|
uses: easingthemes/ssh-deploy@main
|
||||||
|
env:
|
||||||
|
SSH_PRIVATE_KEY: ${{ secrets.CI_WWW_SSH_PRIVATE_KEY }}
|
||||||
|
ARGS: "-rltgoDzvO --delete"
|
||||||
|
SOURCE: "explorer/storybook-static/"
|
||||||
|
REMOTE_HOST: ${{ secrets.CI_WWW_REMOTE_HOST }}
|
||||||
|
REMOTE_USER: ${{ secrets.CI_WWW_REMOTE_USER }}
|
||||||
|
TARGET: ${{ secrets.CI_WWW_REMOTE_TARGET }}/ne-sb-${{ env.GITHUB_REF_SLUG }}
|
||||||
|
EXCLUDE: "/dist/, /node_modules/"
|
||||||
|
- name: Matrix - Node Install
|
||||||
|
run: npm install
|
||||||
|
working-directory: .github/workflows/support-files
|
||||||
|
- name: Matrix - Send Notification
|
||||||
|
env:
|
||||||
|
NYM_NOTIFICATION_KIND: network-explorer
|
||||||
|
NYM_PROJECT_NAME: "Network Explorer"
|
||||||
|
NYM_CI_WWW_BASE: "${{ secrets.NYM_CI_WWW_BASE }}"
|
||||||
|
NYM_CI_WWW_LOCATION: "network-explorer-${{ env.GITHUB_REF_SLUG }}"
|
||||||
|
NYM_CI_WWW_LOCATION_STORYBOOK: "ne-sb-${{ env.GITHUB_REF_SLUG }}"
|
||||||
|
GIT_COMMIT_MESSAGE: "${{ github.event.head_commit.message }}"
|
||||||
|
GIT_BRANCH: "${GITHUB_REF##*/}"
|
||||||
|
IS_SUCCESS: "${{ job.status == 'success' }}"
|
||||||
|
MATRIX_SERVER: "${{ secrets.MATRIX_SERVER }}"
|
||||||
|
MATRIX_ROOM: "${{ secrets.MATRIX_ROOM }}"
|
||||||
|
MATRIX_USER_ID: "${{ secrets.MATRIX_USER_ID }}"
|
||||||
|
MATRIX_TOKEN: "${{ secrets.MATRIX_TOKEN }}"
|
||||||
|
MATRIX_DEVICE_ID: "${{ secrets.MATRIX_DEVICE_ID }}"
|
||||||
|
uses: docker://keybaseio/client:stable-node
|
||||||
|
with:
|
||||||
|
args: .github/workflows/support-files/notifications/entry_point.sh
|
||||||
|
- name: Deploy
|
||||||
|
if: github.event_name == 'workflow_dispatch'
|
||||||
|
uses: easingthemes/ssh-deploy@main
|
||||||
|
env:
|
||||||
|
SSH_PRIVATE_KEY: ${{ secrets.CD_PROD_NE_SSH_PRIVATE_KEY }}
|
||||||
|
ARGS: "-rltgoDzvO --delete"
|
||||||
|
SOURCE: "explorer/dist/"
|
||||||
|
REMOTE_HOST: ${{ secrets.CD_PROD_NE_REMOTE_HOST }}
|
||||||
|
REMOTE_USER: ${{ secrets.CD_PROD_NE_REMOTE_USER }}
|
||||||
|
TARGET: ${{ secrets.CD_PROD_NE_REMOTE_TARGET }}
|
||||||
|
EXCLUDE: "/dist/, /node_modules/"
|
||||||
@@ -11,17 +11,12 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: arc-ubuntu-22.04
|
runs-on: arc-ubuntu-20.04
|
||||||
env:
|
env:
|
||||||
CARGO_TERM_COLOR: always
|
CARGO_TERM_COLOR: always
|
||||||
RUSTUP_PERMIT_COPY_RENAME: 1
|
|
||||||
steps:
|
steps:
|
||||||
- name: Install system dependencies
|
- name: Install Dependencies (Linux)
|
||||||
run: |
|
run: sudo apt-get update && sudo apt-get -y install libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev squashfs-tools
|
||||||
sudo apt-get update && sudo apt-get install -y libdbus-1-dev libmnl-dev libnftnl-dev \
|
|
||||||
libwebkit2gtk-4.1-dev build-essential curl wget libssl-dev jq \
|
|
||||||
libgtk-3-dev squashfs-tools libayatana-appindicator3-dev make libfuse2 unzip librsvg2-dev file \
|
|
||||||
libsoup-3.0-dev libjavascriptcoregtk-4.1-dev
|
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
|
|
||||||
- name: Check out repository code
|
- name: Check out repository code
|
||||||
@@ -35,12 +30,6 @@ jobs:
|
|||||||
override: true
|
override: true
|
||||||
components: rustfmt, clippy
|
components: rustfmt, clippy
|
||||||
|
|
||||||
- name: Set debug to false
|
|
||||||
working-directory: nym-wallet
|
|
||||||
run: |
|
|
||||||
sed -i.bak '1s/^/\[profile.dev\]\ndebug = false\n\n/' Cargo.toml
|
|
||||||
git diff
|
|
||||||
|
|
||||||
- name: Build all binaries
|
- name: Build all binaries
|
||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
with:
|
with:
|
||||||
|
|||||||
@@ -0,0 +1,75 @@
|
|||||||
|
name: ci-nym-wallet-storybook
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- 'nym-wallet/**'
|
||||||
|
- '.github/workflows/ci-nym-wallet-storybook.yml'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: custom-linux
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install rsync
|
||||||
|
run: sudo apt-get install rsync
|
||||||
|
continue-on-error: true
|
||||||
|
|
||||||
|
- uses: rlespinasse/github-slug-action@v3.x
|
||||||
|
|
||||||
|
- uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: 18
|
||||||
|
|
||||||
|
- name: Setup yarn
|
||||||
|
run: npm install -g yarn
|
||||||
|
|
||||||
|
- name: Install Rust stable
|
||||||
|
uses: actions-rs/toolchain@v1
|
||||||
|
with:
|
||||||
|
toolchain: stable
|
||||||
|
|
||||||
|
- name: Install wasm-pack
|
||||||
|
run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
|
||||||
|
|
||||||
|
- name: Build dependencies
|
||||||
|
run: yarn && yarn build
|
||||||
|
|
||||||
|
- name: Build storybook
|
||||||
|
run: yarn storybook:build
|
||||||
|
working-directory: ./nym-wallet
|
||||||
|
|
||||||
|
- name: Deploy branch to CI www (storybook)
|
||||||
|
continue-on-error: true
|
||||||
|
uses: easingthemes/ssh-deploy@main
|
||||||
|
env:
|
||||||
|
SSH_PRIVATE_KEY: ${{ secrets.CI_WWW_SSH_PRIVATE_KEY }}
|
||||||
|
ARGS: "-rltgoDzvO --delete"
|
||||||
|
SOURCE: "nym-wallet/storybook-static/"
|
||||||
|
REMOTE_HOST: ${{ secrets.CI_WWW_REMOTE_HOST }}
|
||||||
|
REMOTE_USER: ${{ secrets.CI_WWW_REMOTE_USER }}
|
||||||
|
TARGET: ${{ secrets.CI_WWW_REMOTE_TARGET }}/wallet-${{ env.GITHUB_REF_SLUG }}
|
||||||
|
EXCLUDE: "/dist/, /node_modules/"
|
||||||
|
|
||||||
|
- name: Matrix - Node Install
|
||||||
|
run: npm install
|
||||||
|
working-directory: .github/workflows/support-files
|
||||||
|
|
||||||
|
- name: Matrix - Send Notification
|
||||||
|
env:
|
||||||
|
NYM_NOTIFICATION_KIND: nym-wallet
|
||||||
|
NYM_PROJECT_NAME: "nym-wallet"
|
||||||
|
NYM_CI_WWW_BASE: "${{ secrets.NYM_CI_WWW_BASE }}"
|
||||||
|
NYM_CI_WWW_LOCATION: "wallet-${{ env.GITHUB_REF_SLUG }}"
|
||||||
|
GIT_COMMIT_MESSAGE: "${{ github.event.head_commit.message }}"
|
||||||
|
GIT_BRANCH: "${GITHUB_REF##*/}"
|
||||||
|
IS_SUCCESS: "${{ job.status == 'success' }}"
|
||||||
|
MATRIX_SERVER: "${{ secrets.MATRIX_SERVER }}"
|
||||||
|
MATRIX_ROOM: "${{ secrets.MATRIX_ROOM }}"
|
||||||
|
MATRIX_USER_ID: "${{ secrets.MATRIX_USER_ID }}"
|
||||||
|
MATRIX_TOKEN: "${{ secrets.MATRIX_TOKEN }}"
|
||||||
|
MATRIX_DEVICE_ID: "${{ secrets.MATRIX_DEVICE_ID }}"
|
||||||
|
uses: docker://keybaseio/client:stable-node
|
||||||
|
with:
|
||||||
|
args: .github/workflows/support-files/notifications/entry_point.sh
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
name: ci-sdk-docs-typescript
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- "sdk/typescript/**"
|
||||||
|
- "wasm/**"
|
||||||
|
- '.github/workflows/ci-sdk-docs-typescript.yml'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: custom-linux
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Install rsync
|
||||||
|
run: sudo apt-get install rsync
|
||||||
|
continue-on-error: true
|
||||||
|
- uses: rlespinasse/github-slug-action@v3.x
|
||||||
|
- uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: 18.17
|
||||||
|
- name: Install Rust stable
|
||||||
|
uses: actions-rs/toolchain@v1
|
||||||
|
with:
|
||||||
|
toolchain: stable
|
||||||
|
- name: Setup yarn
|
||||||
|
run: npm install -g yarn
|
||||||
|
|
||||||
|
- name: Set up Go
|
||||||
|
uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version: '1.20'
|
||||||
|
|
||||||
|
- name: Install wasm-pack
|
||||||
|
run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
|
||||||
|
|
||||||
|
- name: Install wasm-opt
|
||||||
|
uses: ./.github/actions/install-wasm-opt
|
||||||
|
with:
|
||||||
|
version: '116'
|
||||||
|
|
||||||
|
- name: Build branch WASM packages
|
||||||
|
run: make sdk-wasm-build
|
||||||
|
|
||||||
|
- name: Install
|
||||||
|
run: yarn
|
||||||
|
- name: Build
|
||||||
|
run: yarn docs:prod:build
|
||||||
|
- name: Deploy branch to CI www (docs)
|
||||||
|
continue-on-error: true
|
||||||
|
uses: easingthemes/ssh-deploy@main
|
||||||
|
env:
|
||||||
|
SSH_PRIVATE_KEY: ${{ secrets.CI_WWW_SSH_PRIVATE_KEY }}
|
||||||
|
ARGS: "-rltgoDzvO --delete"
|
||||||
|
SOURCE: "dist/ts/"
|
||||||
|
REMOTE_HOST: ${{ secrets.CI_WWW_REMOTE_HOST }}
|
||||||
|
REMOTE_USER: ${{ secrets.CI_WWW_REMOTE_USER }}
|
||||||
|
TARGET: ${{ secrets.CI_WWW_REMOTE_TARGET }}/sdk-ts-docs-${{ env.GITHUB_REF_SLUG }}
|
||||||
|
EXCLUDE: "/dist/, /node_modules/"
|
||||||
|
- name: Matrix - Node Install
|
||||||
|
run: npm install
|
||||||
|
working-directory: .github/workflows/support-files
|
||||||
|
- name: Matrix - Send Notification
|
||||||
|
env:
|
||||||
|
NYM_NOTIFICATION_KIND: ts-packages
|
||||||
|
NYM_PROJECT_NAME: "sdk-ts-docs"
|
||||||
|
NYM_CI_WWW_BASE: "${{ secrets.NYM_CI_WWW_BASE }}/docs/sdk/typescript"
|
||||||
|
NYM_CI_WWW_LOCATION: "sdk-ts-docs-${{ env.GITHUB_REF_SLUG }}"
|
||||||
|
GIT_COMMIT_MESSAGE: "${{ github.event.head_commit.message }}"
|
||||||
|
GIT_BRANCH: "${GITHUB_REF##*/}"
|
||||||
|
IS_SUCCESS: "${{ job.status == 'success' }}"
|
||||||
|
MATRIX_SERVER: "${{ secrets.MATRIX_SERVER }}"
|
||||||
|
MATRIX_ROOM: "${{ secrets.MATRIX_ROOM }}"
|
||||||
|
MATRIX_USER_ID: "${{ secrets.MATRIX_USER_ID }}"
|
||||||
|
MATRIX_TOKEN: "${{ secrets.MATRIX_TOKEN }}"
|
||||||
|
MATRIX_DEVICE_ID: "${{ secrets.MATRIX_DEVICE_ID }}"
|
||||||
|
uses: docker://keybaseio/client:stable-node
|
||||||
|
with:
|
||||||
|
args: .github/workflows/support-files/notifications/entry_point.sh
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
name: ci-sdk-wasm
|
name: ci-sdk-wasm
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
|
||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- 'wasm/**'
|
- 'wasm/**'
|
||||||
@@ -11,16 +10,15 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
wasm:
|
wasm:
|
||||||
runs-on: arc-ubuntu-22.04
|
runs-on: arc-ubuntu-20.04
|
||||||
env:
|
env:
|
||||||
CARGO_TERM_COLOR: always
|
CARGO_TERM_COLOR: always
|
||||||
RUSTUP_PERMIT_COPY_RENAME: 1
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 18
|
||||||
|
|
||||||
- uses: actions-rs/toolchain@v1
|
- uses: actions-rs/toolchain@v1
|
||||||
with:
|
with:
|
||||||
@@ -33,7 +31,7 @@ jobs:
|
|||||||
- name: Set up Go
|
- name: Set up Go
|
||||||
uses: actions/setup-go@v5
|
uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: "1.23.7"
|
go-version: '1.20'
|
||||||
|
|
||||||
- name: Install wasm-pack
|
- name: Install wasm-pack
|
||||||
run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
|
run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh
|
||||||
@@ -46,11 +44,6 @@ jobs:
|
|||||||
- name: Install wasm-bindgen-cli
|
- name: Install wasm-bindgen-cli
|
||||||
run: cargo install wasm-bindgen-cli
|
run: cargo install wasm-bindgen-cli
|
||||||
|
|
||||||
- name: Set debug to false
|
|
||||||
run: |
|
|
||||||
sed -i.bak 's/\[profile.dev\]/\[profile.dev\]\ndebug = false/' Cargo.toml
|
|
||||||
git diff
|
|
||||||
|
|
||||||
- name: "Build"
|
- name: "Build"
|
||||||
run: make sdk-wasm-build
|
run: make sdk-wasm-build
|
||||||
|
|
||||||
|
|||||||
@@ -11,11 +11,10 @@ jobs:
|
|||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
rust: [stable, beta]
|
rust: [stable, beta]
|
||||||
os: [ubuntu-22.04, windows-latest, macos-latest]
|
os: [ubuntu-20.04, windows-latest, macos-latest]
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
env:
|
env:
|
||||||
CARGO_TERM_COLOR: always
|
CARGO_TERM_COLOR: always
|
||||||
IPINFO_API_TOKEN: ${{ secrets.IPINFO_API_TOKEN }}
|
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
steps:
|
steps:
|
||||||
- name: Check out repository code
|
- name: Check out repository code
|
||||||
@@ -23,7 +22,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Install Dependencies (Linux)
|
- name: Install Dependencies (Linux)
|
||||||
run: sudo apt-get update && sudo apt-get install -y build-essential curl wget libssl-dev libudev-dev squashfs-tools protobuf-compiler
|
run: sudo apt-get update && sudo apt-get install -y build-essential curl wget libssl-dev libudev-dev squashfs-tools protobuf-compiler
|
||||||
if: matrix.os == 'ubuntu-22.04'
|
if: matrix.os == 'ubuntu-20.04'
|
||||||
|
|
||||||
- name: Install Rust toolchain
|
- name: Install Rust toolchain
|
||||||
uses: actions-rs/toolchain@v1
|
uses: actions-rs/toolchain@v1
|
||||||
@@ -59,7 +58,7 @@ jobs:
|
|||||||
|
|
||||||
# To avoid running out of disk space, skip generating debug symbols
|
# To avoid running out of disk space, skip generating debug symbols
|
||||||
- name: Set debug to false (unix)
|
- name: Set debug to false (unix)
|
||||||
if: matrix.os == 'ubuntu-22.04' || matrix.os == 'macos-latest'
|
if: matrix.os == 'ubuntu-20.04' || matrix.os == 'macos-latest'
|
||||||
run: |
|
run: |
|
||||||
sed -i.bak 's/\[profile.dev\]/\[profile.dev\]\ndebug = false/' Cargo.toml
|
sed -i.bak 's/\[profile.dev\]/\[profile.dev\]\ndebug = false/' Cargo.toml
|
||||||
git diff
|
git diff
|
||||||
@@ -106,7 +105,7 @@ jobs:
|
|||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
if: env.WORKFLOW_CONCLUSION == 'failure'
|
if: env.WORKFLOW_CONCLUSION == 'failure'
|
||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 18
|
||||||
- name: Matrix - Node Install
|
- name: Matrix - Node Install
|
||||||
if: env.WORKFLOW_CONCLUSION == 'failure'
|
if: env.WORKFLOW_CONCLUSION == 'failure'
|
||||||
run: npm install
|
run: npm install
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
os: [ubuntu-22.04, macos-latest, windows-latest]
|
os: [ubuntu-20.04, macos-latest, windows-latest]
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
env:
|
env:
|
||||||
CARGO_TERM_COLOR: always
|
CARGO_TERM_COLOR: always
|
||||||
@@ -22,7 +22,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Install Dependencies (Linux)
|
- name: Install Dependencies (Linux)
|
||||||
run: sudo apt-get update && sudo apt-get install -y libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev squashfs-tools
|
run: sudo apt-get update && sudo apt-get install -y libwebkit2gtk-4.0-dev build-essential curl wget libssl-dev libgtk-3-dev squashfs-tools
|
||||||
if: matrix.os == 'ubuntu-22.04'
|
if: matrix.os == 'ubuntu-20.04'
|
||||||
|
|
||||||
- name: Install rust toolchain
|
- name: Install rust toolchain
|
||||||
uses: actions-rs/toolchain@v1
|
uses: actions-rs/toolchain@v1
|
||||||
@@ -68,7 +68,7 @@ jobs:
|
|||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
if: env.WORKFLOW_CONCLUSION == 'failure'
|
if: env.WORKFLOW_CONCLUSION == 'failure'
|
||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 18
|
||||||
- name: Matrix - Node Install
|
- name: Matrix - Node Install
|
||||||
if: env.WORKFLOW_CONCLUSION == 'failure'
|
if: env.WORKFLOW_CONCLUSION == 'failure'
|
||||||
run: npm install
|
run: npm install
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ on:
|
|||||||
- cron: '5 9 * * *'
|
- cron: '5 9 * * *'
|
||||||
jobs:
|
jobs:
|
||||||
cargo-deny:
|
cargo-deny:
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository code
|
- name: Checkout repository code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -38,7 +38,7 @@ jobs:
|
|||||||
- name: install npm
|
- name: install npm
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 18
|
||||||
- name: Matrix - Node Install
|
- name: Matrix - Node Install
|
||||||
run: npm install
|
run: npm install
|
||||||
working-directory: .github/workflows/support-files
|
working-directory: .github/workflows/support-files
|
||||||
|
|||||||
@@ -1,47 +0,0 @@
|
|||||||
name: Integration Tests
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
paths:
|
|
||||||
- "nym-api/**"
|
|
||||||
- "tests/**"
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
integration-tests:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
env:
|
|
||||||
API_BASE_URL: http://localhost:8000
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Install Rust
|
|
||||||
uses: actions-rs/toolchain@v1
|
|
||||||
with:
|
|
||||||
toolchain: stable
|
|
||||||
override: true
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: sudo apt-get update && sudo apt-get install -y pkg-config libssl-dev
|
|
||||||
|
|
||||||
- name: Build nym-api
|
|
||||||
run: cargo build --package nym-api
|
|
||||||
|
|
||||||
- name: Run nym-api in the background
|
|
||||||
run: |
|
|
||||||
./target/debug/nym-api &
|
|
||||||
|
|
||||||
- name: Wait for nym-api to come alive
|
|
||||||
run: |
|
|
||||||
for i in {1..20}; do
|
|
||||||
curl -sSf http://localhost:8000/v1/status/config-score-details && break
|
|
||||||
echo "Waiting for nym-api to start..."
|
|
||||||
sleep 2
|
|
||||||
done
|
|
||||||
|
|
||||||
- name: Run integration tests
|
|
||||||
env:
|
|
||||||
NYM_API: https://sandbox-nym-api1.nymtech.net/api
|
|
||||||
run: cargo test --test public-api-tests -- --nocapture
|
|
||||||
@@ -4,9 +4,7 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
- develop
|
- develop
|
||||||
- "release/**"
|
- 'release/**'
|
||||||
paths-ignore:
|
|
||||||
- "documentation/**"
|
|
||||||
types:
|
types:
|
||||||
- labeled
|
- labeled
|
||||||
- unlabeled
|
- unlabeled
|
||||||
|
|||||||
@@ -20,10 +20,8 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
platform: [custom-ubuntu-20.04]
|
||||||
- os: arc-ubuntu-22.04
|
runs-on: ${{ matrix.platform }}
|
||||||
target: x86_64-unknown-linux-gnu
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
|
|
||||||
outputs:
|
outputs:
|
||||||
release_id: ${{ steps.create-release.outputs.id }}
|
release_id: ${{ steps.create-release.outputs.id }}
|
||||||
@@ -56,8 +54,7 @@ jobs:
|
|||||||
- name: Install Rust stable
|
- name: Install Rust stable
|
||||||
uses: actions-rs/toolchain@v1
|
uses: actions-rs/toolchain@v1
|
||||||
with:
|
with:
|
||||||
toolchain: 1.86.0
|
toolchain: stable
|
||||||
override: true
|
|
||||||
|
|
||||||
- name: Build all binaries
|
- name: Build all binaries
|
||||||
uses: actions-rs/cargo@v1
|
uses: actions-rs/cargo@v1
|
||||||
@@ -70,6 +67,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
name: my-artifact
|
name: my-artifact
|
||||||
path: |
|
path: |
|
||||||
|
target/release/explorer-api
|
||||||
target/release/nym-client
|
target/release/nym-client
|
||||||
target/release/nym-socks5-client
|
target/release/nym-socks5-client
|
||||||
target/release/nym-api
|
target/release/nym-api
|
||||||
@@ -78,13 +76,14 @@ jobs:
|
|||||||
target/release/nymvisor
|
target/release/nymvisor
|
||||||
target/release/nym-node
|
target/release/nym-node
|
||||||
retention-days: 30
|
retention-days: 30
|
||||||
|
|
||||||
- id: create-release
|
- id: create-release
|
||||||
name: Upload to release based on tag name
|
name: Upload to release based on tag name
|
||||||
uses: softprops/action-gh-release@da05d552573ad5aba039eaac05058a918a7bf631
|
uses: softprops/action-gh-release@v2
|
||||||
if: github.event_name == 'release'
|
if: github.event_name == 'release'
|
||||||
with:
|
with:
|
||||||
files: |
|
files: |
|
||||||
|
target/release/explorer-api
|
||||||
target/release/nym-client
|
target/release/nym-client
|
||||||
target/release/nym-socks5-client
|
target/release/nym-socks5-client
|
||||||
target/release/nym-api
|
target/release/nym-api
|
||||||
|
|||||||
@@ -2,25 +2,25 @@ name: publish-nym-contracts
|
|||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
release:
|
release:
|
||||||
types: [ created ]
|
types: [created]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
if: ${{ (startsWith(github.ref, 'refs/tags/nym-contracts-') && github.event_name == 'release') || github.event_name == 'workflow_dispatch' }}
|
if: ${{ (startsWith(github.ref, 'refs/tags/nym-contracts-') && github.event_name == 'release') || github.event_name == 'workflow_dispatch' }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: [self-hosted, custom-ubuntu-20.04]
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Install Rust stable
|
- name: Install Rust stable
|
||||||
uses: actions-rs/toolchain@v1
|
uses: actions-rs/toolchain@v1
|
||||||
with:
|
with:
|
||||||
|
toolchain: stable
|
||||||
target: wasm32-unknown-unknown
|
target: wasm32-unknown-unknown
|
||||||
override: true
|
override: true
|
||||||
|
components: rustfmt, clippy
|
||||||
|
|
||||||
- name: Install wasm-opt
|
- name: Install wasm-opt
|
||||||
uses: ./.github/actions/install-wasm-opt
|
run: cargo install --version 0.114.0 wasm-opt
|
||||||
with:
|
|
||||||
version: '114'
|
|
||||||
|
|
||||||
- name: Build release contracts
|
- name: Build release contracts
|
||||||
run: make contracts
|
run: make contracts
|
||||||
|
|||||||
@@ -14,11 +14,15 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
platform: [macos-15]
|
platform: [macos-12-large]
|
||||||
runs-on: ${{ matrix.platform }}
|
runs-on: ${{ matrix.platform }}
|
||||||
|
|
||||||
outputs:
|
outputs:
|
||||||
release_tag: ${{ github.ref_name }}
|
release_id: ${{ steps.create-release.outputs.id }}
|
||||||
|
release_date: ${{ fromJSON(steps.create-release.outputs.assets)[0].created_at }}
|
||||||
|
version: ${{ steps.release-info.outputs.version }}
|
||||||
|
filename: ${{ steps.release-info.outputs.filename }}
|
||||||
|
file_hash: ${{ steps.release-info.outputs.file_hash }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
@@ -26,19 +30,11 @@ jobs:
|
|||||||
- name: Node
|
- name: Node
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 21
|
node-version: 18
|
||||||
|
|
||||||
- name: Install Rust stable
|
- name: Install Rust stable
|
||||||
uses: dtolnay/rust-toolchain@stable
|
uses: actions-rs/toolchain@v1
|
||||||
with:
|
with:
|
||||||
toolchain: stable
|
toolchain: stable
|
||||||
|
|
||||||
- name: Add Rust target for x86_64-apple-darwin
|
|
||||||
run: rustup target add x86_64-apple-darwin
|
|
||||||
|
|
||||||
- name: Set Cargo build target to x86_64
|
|
||||||
run: echo "CARGO_BUILD_TARGET=x86_64-apple-darwin" >> $GITHUB_ENV
|
|
||||||
|
|
||||||
- name: Install the Apple developer certificate for code signing
|
- name: Install the Apple developer certificate for code signing
|
||||||
env:
|
env:
|
||||||
APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }}
|
APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }}
|
||||||
@@ -68,19 +64,11 @@ jobs:
|
|||||||
fileName: '.env'
|
fileName: '.env'
|
||||||
encodedString: ${{ secrets.WALLET_ADMIN_ADDRESS }}
|
encodedString: ${{ secrets.WALLET_ADMIN_ADDRESS }}
|
||||||
|
|
||||||
- name: Yarn cache clean
|
|
||||||
shell: bash
|
|
||||||
run: cd .. && yarn cache clean
|
|
||||||
|
|
||||||
- name: Install project dependencies
|
- name: Install project dependencies
|
||||||
shell: bash
|
shell: bash
|
||||||
run: cd .. && yarn --network-timeout 100000
|
run: cd .. && yarn --network-timeout 100000
|
||||||
|
|
||||||
- name: Yarn build
|
- name: Install app dependencies and build it
|
||||||
shell: bash
|
|
||||||
run: cd .. && yarn build
|
|
||||||
|
|
||||||
- name: Install dependencies and build it
|
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
ENABLE_CODE_SIGNING: ${{ secrets.APPLE_CERTIFICATE }}
|
ENABLE_CODE_SIGNING: ${{ secrets.APPLE_CERTIFICATE }}
|
||||||
@@ -90,48 +78,46 @@ jobs:
|
|||||||
APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_IDENTITY_ID }}
|
APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_IDENTITY_ID }}
|
||||||
APPLE_ID: ${{ secrets.APPLE_ID }}
|
APPLE_ID: ${{ secrets.APPLE_ID }}
|
||||||
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
|
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
|
||||||
# Tauri v2 specific environment variables
|
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
|
||||||
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
|
TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
|
||||||
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
|
run: yarn && yarn build
|
||||||
TAURI_NOTARIZATION_USERNAME: ${{ secrets.APPLE_ID }}
|
|
||||||
TAURI_NOTARIZATION_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
|
|
||||||
TAURI_NOTARIZATION_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
|
|
||||||
run: |
|
|
||||||
yarn build-macx86
|
|
||||||
|
|
||||||
- name: Create app tarball
|
|
||||||
run: |
|
|
||||||
# Navigate to where the app bundle is and create the tarball
|
|
||||||
cd target/x86_64-apple-darwin/release/bundle/macos
|
|
||||||
echo "Creating tarball from app bundle"
|
|
||||||
tar -czf nym-wallet.app.tar.gz NymWallet.app
|
|
||||||
cd -
|
|
||||||
|
|
||||||
- name: Upload Artifact
|
- name: Upload Artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: nym-wallet.app.tar.gz
|
name: nym-wallet.app.tar.gz
|
||||||
path: nym-wallet/target/x86_64-apple-darwin/release/bundle/macos/nym-wallet.app.tar.gz
|
path: nym-wallet/target/release/bundle/macos/nym-wallet.app.tar.gz
|
||||||
retention-days: 5
|
retention-days: 5
|
||||||
|
|
||||||
- name: Clean up keychain
|
- name: Clean up keychain
|
||||||
if: ${{ always() }}
|
if: ${{ always() }}
|
||||||
run: |
|
run: |
|
||||||
security delete-keychain $RUNNER_TEMP/app-signing.keychain-db
|
security delete-keychain $RUNNER_TEMP/app-signing.keychain-db
|
||||||
|
|
||||||
- id: create-release
|
- id: create-release
|
||||||
name: Upload to release based on tag name
|
name: Upload to release based on tag name
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@v2
|
||||||
if: github.event_name == 'release'
|
if: github.event_name == 'release'
|
||||||
with:
|
with:
|
||||||
files: |
|
files: |
|
||||||
nym-wallet/target/x86_64-apple-darwin/release/bundle/dmg/*.dmg
|
nym-wallet/target/release/bundle/dmg/*.dmg
|
||||||
nym-wallet/target/x86_64-apple-darwin/release/bundle/macos/*.app.tar.gz*
|
nym-wallet/target/release/bundle/macos/*.app.tar.gz*
|
||||||
|
|
||||||
|
- name: Deploy artifacts to CI www
|
||||||
|
continue-on-error: true
|
||||||
|
uses: easingthemes/ssh-deploy@main
|
||||||
|
env:
|
||||||
|
SSH_PRIVATE_KEY: ${{ secrets.CI_WWW_SSH_PRIVATE_KEY }}
|
||||||
|
ARGS: "-avzr"
|
||||||
|
SOURCE: "nym-wallet/target/release/bundle/macos/nym-wallet.app.tar.gz"
|
||||||
|
REMOTE_HOST: ${{ secrets.CI_WWW_REMOTE_HOST }}
|
||||||
|
REMOTE_USER: ${{ secrets.CI_WWW_REMOTE_USER }}
|
||||||
|
TARGET: ${{ secrets.CI_WWW_REMOTE_TARGET }}/builds/${{ github.ref_name }}/nym-wallet
|
||||||
|
EXCLUDE: "/dist/, /node_modules/"
|
||||||
|
|
||||||
push-release-data:
|
push-release-data:
|
||||||
if: ${{ (startsWith(github.ref, 'refs/tags/nym-wallet-') && github.event_name == 'release') || github.event_name == 'workflow_dispatch' }}
|
if: ${{ (startsWith(github.ref, 'refs/tags/nym-wallet-') && github.event_name == 'release') || github.event_name == 'workflow_dispatch' }}
|
||||||
uses: ./.github/workflows/release-calculate-hash.yml
|
uses: ./.github/workflows/release-calculate-hash.yml
|
||||||
needs: publish-tauri
|
needs: publish-tauri
|
||||||
with:
|
with:
|
||||||
release_tag: ${{ needs.publish-tauri.outputs.release_tag || github.ref_name }}
|
release_tag: ${{ github.ref_name }}
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|||||||
@@ -3,108 +3,71 @@ on:
|
|||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
release:
|
release:
|
||||||
types: [created]
|
types: [created]
|
||||||
|
|
||||||
defaults:
|
defaults:
|
||||||
run:
|
run:
|
||||||
working-directory: nym-wallet
|
working-directory: nym-wallet
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
publish-tauri:
|
publish-tauri:
|
||||||
if: ${{ (startsWith(github.ref, 'refs/tags/nym-wallet-') && github.event_name == 'release') || github.event_name == 'workflow_dispatch' }}
|
if: ${{ (startsWith(github.ref, 'refs/tags/nym-wallet-') && github.event_name == 'release') || github.event_name == 'workflow_dispatch' }}
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
platform: [ubuntu-22.04]
|
platform: [custom-ubuntu-20.04]
|
||||||
runs-on: ${{ matrix.platform }}
|
runs-on: ${{ matrix.platform }}
|
||||||
|
|
||||||
outputs:
|
outputs:
|
||||||
release_tag: ${{ github.ref_name }}
|
release_id: ${{ steps.create-release.outputs.id }}
|
||||||
|
release_date: ${{ fromJSON(steps.create-release.outputs.assets)[0].created_at }}
|
||||||
|
version: ${{ steps.release-info.outputs.version }}
|
||||||
|
filename: ${{ steps.release-info.outputs.filename }}
|
||||||
|
file_hash: ${{ steps.release-info.outputs.file_hash }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Install system dependencies
|
- name: Tauri dependencies
|
||||||
run: |
|
run: >
|
||||||
sudo apt-get update && sudo apt-get install -y libdbus-1-dev libmnl-dev libnftnl-dev \
|
sudo apt-get update &&
|
||||||
libwebkit2gtk-4.1-dev build-essential curl wget libssl-dev jq \
|
sudo apt-get install -y webkit2gtk-4.0
|
||||||
libgtk-3-dev squashfs-tools libayatana-appindicator3-dev make libfuse2 unzip librsvg2-dev file \
|
continue-on-error: true
|
||||||
libsoup-3.0-dev libjavascriptcoregtk-4.1-dev
|
|
||||||
|
|
||||||
- name: Node
|
- name: Node
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 21
|
node-version: 18
|
||||||
cache: 'yarn'
|
|
||||||
|
|
||||||
- name: Install Rust stable
|
- name: Install Rust stable
|
||||||
uses: dtolnay/rust-toolchain@stable
|
uses: actions-rs/toolchain@v1
|
||||||
with:
|
with:
|
||||||
toolchain: stable
|
toolchain: stable
|
||||||
|
|
||||||
- name: Install project dependencies
|
- name: Install project dependencies
|
||||||
shell: bash
|
shell: bash
|
||||||
run: cd .. && yarn --network-timeout 100000
|
run: cd .. && yarn --network-timeout 100000
|
||||||
|
|
||||||
- name: Install app dependencies
|
- name: Install app dependencies
|
||||||
run: yarn
|
run: yarn
|
||||||
|
|
||||||
- name: Create env file
|
- name: Create env file
|
||||||
uses: timheuer/base64-to-file@v1.2
|
uses: timheuer/base64-to-file@v1.2
|
||||||
with:
|
with:
|
||||||
fileName: '.env'
|
fileName: '.env'
|
||||||
encodedString: ${{ secrets.WALLET_ADMIN_ADDRESS }}
|
encodedString: ${{ secrets.WALLET_ADMIN_ADDRESS }}
|
||||||
|
|
||||||
- name: Build app
|
- name: Build app
|
||||||
run: yarn build
|
run: yarn build
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
|
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
|
||||||
TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
|
TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
|
||||||
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
|
|
||||||
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
|
|
||||||
|
|
||||||
- name: Check bundle directory
|
|
||||||
run: |
|
|
||||||
echo "Checking bundle directory structure"
|
|
||||||
ls -la target/release/bundle || echo "Bundle directory not found"
|
|
||||||
if [ -d "target/release/bundle/appimage" ]; then
|
|
||||||
echo "AppImage bundle directory exists, checking contents:"
|
|
||||||
ls -la target/release/bundle/appimage
|
|
||||||
else
|
|
||||||
echo "AppImage bundle directory not found, checking alternatives:"
|
|
||||||
find target/release/bundle -type d -name "*appimage*" -o -name "*AppImage*" || echo "No AppImage directories found"
|
|
||||||
find target/release/bundle -name "*.AppImage" -o -name "*.appimage" || echo "No AppImage files found"
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Create AppImage tarball if needed
|
|
||||||
run: |
|
|
||||||
# Find the AppImage file
|
|
||||||
APPIMAGE_FILE=$(find target/release/bundle -name "*.AppImage" | head -n 1)
|
|
||||||
if [ -n "$APPIMAGE_FILE" ]; then
|
|
||||||
echo "Found AppImage file: $APPIMAGE_FILE"
|
|
||||||
APPIMAGE_DIR=$(dirname "$APPIMAGE_FILE")
|
|
||||||
APPIMAGE_NAME=$(basename "$APPIMAGE_FILE")
|
|
||||||
|
|
||||||
# Create tarball if it doesn't exist
|
|
||||||
if [ ! -f "${APPIMAGE_FILE}.tar.gz" ]; then
|
|
||||||
echo "Creating tarball for $APPIMAGE_NAME"
|
|
||||||
cd "$APPIMAGE_DIR"
|
|
||||||
tar -czf "${APPIMAGE_NAME}.tar.gz" "$APPIMAGE_NAME"
|
|
||||||
cd -
|
|
||||||
echo "Created tarball: ${APPIMAGE_FILE}.tar.gz"
|
|
||||||
else
|
|
||||||
echo "Tarball already exists: ${APPIMAGE_FILE}.tar.gz"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "WARNING: No AppImage file found!"
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Upload Artifact
|
- name: Upload Artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: nym-wallet-appimage.tar.gz
|
name: nym-wallet_1.0.0_amd64.AppImage.tar.gz
|
||||||
path: |
|
path: nym-wallet/target/release/bundle/appimage/nym-wallet*.AppImage.tar.gz
|
||||||
nym-wallet/target/release/bundle/appimage/*.AppImage.tar.gz
|
|
||||||
nym-wallet/target/release/bundle/*/nym-wallet*.AppImage.tar.gz
|
|
||||||
retention-days: 30
|
retention-days: 30
|
||||||
|
|
||||||
- id: create-release
|
- id: create-release
|
||||||
name: Upload to release based on tag name
|
name: Upload to release based on tag name
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@v2
|
||||||
@@ -112,26 +75,24 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
files: |
|
files: |
|
||||||
nym-wallet/target/release/bundle/appimage/*.AppImage
|
nym-wallet/target/release/bundle/appimage/*.AppImage
|
||||||
nym-wallet/target/release/bundle/appimage/*.AppImage.tar.gz
|
nym-wallet/target/release/bundle/appimage/*.AppImage.tar.gz*
|
||||||
nym-wallet/target/release/bundle/*/nym-wallet*.AppImage
|
|
||||||
nym-wallet/target/release/bundle/*/nym-wallet*.AppImage.tar.gz
|
- name: Deploy artifacts to CI www
|
||||||
|
continue-on-error: true
|
||||||
- name: Find AppImage tarball path for deployment
|
uses: easingthemes/ssh-deploy@main
|
||||||
id: find-appimage
|
env:
|
||||||
run: |
|
SSH_PRIVATE_KEY: ${{ secrets.CI_WWW_SSH_PRIVATE_KEY }}
|
||||||
APPIMAGE_TARBALL=$(find target/release/bundle -name "*.AppImage.tar.gz" | head -n 1)
|
ARGS: "-avzr"
|
||||||
if [ -n "$APPIMAGE_TARBALL" ]; then
|
SOURCE: "nym-wallet/target/release/bundle/appimage/nym-wallet*.AppImage.tar.gz"
|
||||||
echo "Found AppImage tarball: $APPIMAGE_TARBALL"
|
REMOTE_HOST: ${{ secrets.CI_WWW_REMOTE_HOST }}
|
||||||
echo "appimage_path=$APPIMAGE_TARBALL" >> $GITHUB_OUTPUT
|
REMOTE_USER: ${{ secrets.CI_WWW_REMOTE_USER }}
|
||||||
else
|
TARGET: ${{ secrets.CI_WWW_REMOTE_TARGET }}/builds/${{ github.ref_name }}/nym-wallet
|
||||||
echo "WARNING: No AppImage tarball found for deployment!"
|
EXCLUDE: "/dist/, /node_modules/"
|
||||||
echo "appimage_path=target/release/bundle/appimage/nym-wallet*.AppImage.tar.gz" >> $GITHUB_OUTPUT
|
|
||||||
fi
|
|
||||||
|
|
||||||
push-release-data:
|
push-release-data:
|
||||||
if: ${{ (startsWith(github.ref, 'refs/tags/nym-wallet-') && github.event_name == 'release') || github.event_name == 'workflow_dispatch' }}
|
if: ${{ (startsWith(github.ref, 'refs/tags/nym-wallet-') && github.event_name == 'release') || github.event_name == 'workflow_dispatch' }}
|
||||||
uses: ./.github/workflows/release-calculate-hash.yml
|
uses: ./.github/workflows/release-calculate-hash.yml
|
||||||
needs: publish-tauri
|
needs: publish-tauri
|
||||||
with:
|
with:
|
||||||
release_tag: ${{ needs.publish-tauri.outputs.release_tag || github.ref_name }}
|
release_tag: ${{ github.ref_name }}
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|||||||
@@ -1,12 +1,6 @@
|
|||||||
name: publish-nym-wallet-win11
|
name: publish-nym-wallet-win11
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
inputs:
|
|
||||||
sign:
|
|
||||||
description: "Sign this build using SSL.com. Signing is billed per signature so be careful"
|
|
||||||
required: false
|
|
||||||
type: boolean
|
|
||||||
default: true
|
|
||||||
release:
|
release:
|
||||||
types: [created]
|
types: [created]
|
||||||
|
|
||||||
@@ -24,61 +18,53 @@ jobs:
|
|||||||
runs-on: ${{ matrix.platform }}
|
runs-on: ${{ matrix.platform }}
|
||||||
|
|
||||||
outputs:
|
outputs:
|
||||||
release_tag: ${{ github.ref_name }}
|
release_id: ${{ steps.create-release.outputs.id }}
|
||||||
|
release_date: ${{ fromJSON(steps.create-release.outputs.assets)[0].created_at }}
|
||||||
|
version: ${{ steps.release-info.outputs.version }}
|
||||||
|
filename: ${{ steps.release-info.outputs.filename }}
|
||||||
|
file_hash: ${{ steps.release-info.outputs.file_hash }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
- name: Clean up first
|
||||||
|
continue-on-error: true
|
||||||
|
working-directory: .
|
||||||
|
run: |
|
||||||
|
cd ..
|
||||||
|
del /s /q /A:H nym
|
||||||
|
rmdir /s /q nym
|
||||||
|
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Install Rust stable
|
- name: Import signing certificate
|
||||||
uses: dtolnay/rust-toolchain@stable
|
env:
|
||||||
with:
|
WINDOWS_CERTIFICATE: ${{ secrets.WINDOWS_CERTIFICATE }}
|
||||||
toolchain: stable
|
WINDOWS_CERTIFICATE_PASSWORD: ${{ secrets.WINDOWS_CERTIFICATE_PASSWORD }}
|
||||||
|
run: |
|
||||||
- name: Setup MSBuild.exe
|
New-Item -ItemType directory -Path certificate
|
||||||
uses: microsoft/setup-msbuild@v2
|
Set-Content -Path certificate/tempCert.txt -Value $env:WINDOWS_CERTIFICATE
|
||||||
|
certutil -decode certificate/tempCert.txt certificate/certificate.pfx
|
||||||
|
Remove-Item -path certificate -include tempCert.txt
|
||||||
|
Import-PfxCertificate -FilePath certificate/certificate.pfx -CertStoreLocation Cert:\CurrentUser\My -Password (ConvertTo-SecureString -String $env:WINDOWS_CERTIFICATE_PASSWORD -Force -AsPlainText)
|
||||||
|
|
||||||
- name: Node
|
- name: Node
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 21
|
node-version: 18
|
||||||
|
|
||||||
|
- name: Install Rust stable
|
||||||
|
uses: actions-rs/toolchain@v1
|
||||||
|
with:
|
||||||
|
toolchain: stable
|
||||||
|
|
||||||
|
- name: Create env file
|
||||||
|
uses: timheuer/base64-to-file@v1.2
|
||||||
|
with:
|
||||||
|
fileName: '.env'
|
||||||
|
encodedString: ${{ secrets.WALLET_ADMIN_ADDRESS }}
|
||||||
|
|
||||||
|
- name: Install Yarn
|
||||||
|
run: npm install -g yarn
|
||||||
|
|
||||||
- name: Download EV CodeSignTool from ssl.com
|
|
||||||
working-directory: nym-wallet/src-tauri
|
|
||||||
if: ${{ inputs.sign }}
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
curl -L0 https://www.ssl.com/download/codesigntool-for-linux-and-macos/ -o codesigntool.zip
|
|
||||||
unzip codesigntool.zip
|
|
||||||
- name: Get EV certificate credential id
|
|
||||||
working-directory: nym-wallet/src-tauri
|
|
||||||
if: ${{ inputs.sign }}
|
|
||||||
id: get_credential_ids
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
echo "SSL_COM_CREDENTIAL_ID=$(./CodeSignTool.sh get_credential_ids -username=${{ secrets.SSL_COM_USERNAME }} -password=${{ secrets.SSL_COM_PASSWORD }} | sed -n '1!p' | sed 's/- //')" >> "$GITHUB_OUTPUT"
|
|
||||||
- name: Add custom sign command to tauri.conf.json
|
|
||||||
working-directory: nym-wallet/src-tauri
|
|
||||||
if: ${{ inputs.sign }}
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
yq eval --inplace '.bundle.windows +=
|
|
||||||
{
|
|
||||||
"signCommand": {
|
|
||||||
"cmd": "C:\Program Files\Git\bin\bash.EXE",
|
|
||||||
"args": [
|
|
||||||
"/c/actions-runner/_work/nym/nym/nym-wallet/src-tauri/CodeSignTool.sh",
|
|
||||||
"sign",
|
|
||||||
"-username ${{ secrets.SSL_COM_USERNAME }}",
|
|
||||||
"-password ${{ secrets.SSL_COM_PASSWORD }}",
|
|
||||||
"-credential_id ${{ steps.get_credential_ids.outputs.SSL_COM_CREDENTIAL_ID }}",
|
|
||||||
"-totp_secret ${{ secrets.SSL_COM_TOTP_SECRET }}",
|
|
||||||
"-program_name NymWallet",
|
|
||||||
"-input_file_path",
|
|
||||||
"%1",
|
|
||||||
"-override"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}' tauri.conf.json
|
|
||||||
- name: Install project dependencies
|
- name: Install project dependencies
|
||||||
shell: bash
|
shell: bash
|
||||||
run: cd .. && yarn --network-timeout 100000
|
run: cd .. && yarn --network-timeout 100000
|
||||||
@@ -91,50 +77,18 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
|
ENABLE_CODE_SIGNING: ${{ secrets.WINDOWS_CERTIFICATE }}
|
||||||
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
|
WINDOWS_CERTIFICATE: ${{ secrets.WINDOWS_CERTIFICATE }}
|
||||||
SSL_COM_USERNAME: ${{ inputs.sign && secrets.SSL_COM_USERNAME }}
|
WINDOWS_CERTIFICATE_PASSWORD: ${{ secrets.WINDOWS_CERTIFICATE_PASSWORD }}
|
||||||
SSL_COM_PASSWORD: ${{ inputs.sign && secrets.SSL_COM_PASSWORD }}
|
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
|
||||||
SSL_COM_CREDENTIAL_ID: ${{ inputs.sign && steps.get_credential_ids.outputs.SSL_COM_CREDENTIAL_ID }}
|
TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
|
||||||
SSL_COM_TOTP_SECRET: ${{ inputs.sign && secrets.SSL_COM_TOTP_SECRET }}
|
run: yarn build
|
||||||
run: |
|
|
||||||
echo "Starting build process..."
|
|
||||||
yarn build
|
|
||||||
|
|
||||||
- name: Check bundle directory
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
echo "Checking bundle directory structure"
|
|
||||||
|
|
||||||
# Check standard location
|
|
||||||
if [ -d "target/release/bundle" ]; then
|
|
||||||
echo "Found bundle directory at standard location"
|
|
||||||
ls -la target/release/bundle || echo "Failed to list bundle directory"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check src-tauri location
|
|
||||||
if [ -d "src-tauri/target/release/bundle" ]; then
|
|
||||||
echo "Found bundle directory in src-tauri"
|
|
||||||
ls -la src-tauri/target/release/bundle || echo "Failed to list src-tauri bundle directory"
|
|
||||||
|
|
||||||
# Use this path for future steps
|
|
||||||
echo "BUNDLE_PATH=src-tauri/target/release/bundle" >> $GITHUB_ENV
|
|
||||||
else
|
|
||||||
echo "Using standard bundle path"
|
|
||||||
echo "BUNDLE_PATH=target/release/bundle" >> $GITHUB_ENV
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check for MSI files in any location
|
|
||||||
find . -name "*.msi" -type f
|
|
||||||
|
|
||||||
- name: Upload Artifact
|
- name: Upload Artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: nym-wallet.msi
|
name: nym-wallet_1.0.0_x64_en-US.msi
|
||||||
path: |
|
path: nym-wallet/target/release/bundle/msi/nym-wallet_1.*.msi
|
||||||
nym-wallet/${{ env.BUNDLE_PATH }}/msi/*.msi
|
|
||||||
nym-wallet/${{ env.BUNDLE_PATH }}/*/nym-wallet*.msi
|
|
||||||
nym-wallet/src-tauri/target/release/bundle/msi/*.msi
|
|
||||||
retention-days: 30
|
retention-days: 30
|
||||||
|
|
||||||
- id: create-release
|
- id: create-release
|
||||||
@@ -143,28 +97,25 @@ jobs:
|
|||||||
if: github.event_name == 'release'
|
if: github.event_name == 'release'
|
||||||
with:
|
with:
|
||||||
files: |
|
files: |
|
||||||
nym-wallet/${{ env.BUNDLE_PATH }}/msi/*.msi
|
nym-wallet/target/release/bundle/msi/*.msi
|
||||||
nym-wallet/${{ env.BUNDLE_PATH }}/msi/*.msi.zip*
|
nym-wallet/target/release/bundle/msi/*.msi.zip*
|
||||||
nym-wallet/${{ env.BUNDLE_PATH }}/*/nym-wallet*.msi
|
|
||||||
nym-wallet/src-tauri/target/release/bundle/msi/*.msi
|
- name: Deploy artifacts to CI www
|
||||||
|
continue-on-error: true
|
||||||
- name: Find MSI path for deployment
|
uses: easingthemes/ssh-deploy@main
|
||||||
id: find-msi
|
env:
|
||||||
shell: bash
|
SSH_PRIVATE_KEY: ${{ secrets.CI_WWW_SSH_PRIVATE_KEY }}
|
||||||
run: |
|
ARGS: "-avzr"
|
||||||
MSI_FILE=$(find . -name "*.msi" -type f | head -n 1)
|
SOURCE: "nym-wallet/target/release/bundle/msi/nym-wallet_1.*.msi"
|
||||||
if [ -n "$MSI_FILE" ]; then
|
REMOTE_HOST: ${{ secrets.CI_WWW_REMOTE_HOST }}
|
||||||
echo "Found MSI file: $MSI_FILE"
|
REMOTE_USER: ${{ secrets.CI_WWW_REMOTE_USER }}
|
||||||
echo "msi_path=$MSI_FILE" >> $GITHUB_OUTPUT
|
TARGET: ${{ secrets.CI_WWW_REMOTE_TARGET }}/builds/${{ github.ref_name }}/nym-wallet
|
||||||
else
|
EXCLUDE: "/dist/, /node_modules/"
|
||||||
echo "WARNING: No MSI file found for deployment!"
|
|
||||||
echo "msi_path=${{ env.BUNDLE_PATH }}/msi/nym-wallet*.msi" >> $GITHUB_OUTPUT
|
|
||||||
fi
|
|
||||||
|
|
||||||
push-release-data:
|
push-release-data:
|
||||||
if: ${{ (startsWith(github.ref, 'refs/tags/nym-wallet-') && github.event_name == 'release') || github.event_name == 'workflow_dispatch' }}
|
if: ${{ (startsWith(github.ref, 'refs/tags/nym-wallet-') && github.event_name == 'release') || github.event_name == 'workflow_dispatch' }}
|
||||||
uses: ./.github/workflows/release-calculate-hash.yml
|
uses: ./.github/workflows/release-calculate-hash.yml
|
||||||
needs: publish-tauri
|
needs: publish-tauri
|
||||||
with:
|
with:
|
||||||
release_tag: ${{ needs.publish-tauri.outputs.release_tag || github.ref_name }}
|
release_tag: ${{ github.ref_name }}
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
name: Build APK
|
name: Build APK
|
||||||
runs-on: custom-ubuntu-22.04
|
runs-on: custom-ubuntu-20.04
|
||||||
env:
|
env:
|
||||||
ANDROID_HOME: ${{ github.workspace }}/android-sdk
|
ANDROID_HOME: ${{ github.workspace }}/android-sdk
|
||||||
NDK_VERSION: 25.2.9519653
|
NDK_VERSION: 25.2.9519653
|
||||||
@@ -49,13 +49,21 @@ jobs:
|
|||||||
"build-tools;$SDK_BUILDTOOLS_VERSION"
|
"build-tools;$SDK_BUILDTOOLS_VERSION"
|
||||||
|
|
||||||
- name: Install Rust toolchain
|
- name: Install Rust toolchain
|
||||||
uses: dtolnay/rust-toolchain@1.100.0
|
uses: dtolnay/rust-toolchain@1.90.0
|
||||||
|
|
||||||
- name: Install rust android targets
|
- name: Install rust android targets
|
||||||
run: |
|
run: |
|
||||||
rustup target add aarch64-linux-android \
|
rustup target add aarch64-linux-android \
|
||||||
x86_64-linux-android
|
x86_64-linux-android
|
||||||
|
|
||||||
|
- name: Build lib nym-socks5-listener
|
||||||
|
working-directory: sdk/lib/socks5-listener/
|
||||||
|
env:
|
||||||
|
RELEASE: true
|
||||||
|
RUSTFLAGS: "-C link-args=-Wl,--hash-style=gnu"
|
||||||
|
# build for arm64 and x86_64
|
||||||
|
run: ./build-android.sh aarch64 x86_64
|
||||||
|
|
||||||
- name: Build APKs (unsigned)
|
- name: Build APKs (unsigned)
|
||||||
working-directory: nym-connect/native/android
|
working-directory: nym-connect/native/android
|
||||||
env:
|
env:
|
||||||
|
|||||||
@@ -4,14 +4,14 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
publish:
|
publish:
|
||||||
runs-on: arc-ubuntu-22.04
|
runs-on: arc-ubuntu-20.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Install Node
|
- name: Install Node
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 18
|
||||||
registry-url: "https://registry.npmjs.org"
|
registry-url: "https://registry.npmjs.org"
|
||||||
|
|
||||||
- name: Setup yarn
|
- name: Setup yarn
|
||||||
@@ -31,7 +31,12 @@ jobs:
|
|||||||
- name: Set up Go
|
- name: Set up Go
|
||||||
uses: actions/setup-go@v5
|
uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: "1.23.7"
|
go-version: "1.20"
|
||||||
|
|
||||||
|
- name: Install TinyGo
|
||||||
|
uses: acifani/setup-tinygo@v2
|
||||||
|
with:
|
||||||
|
tinygo-version: "0.27.0"
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: yarn
|
run: yarn
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ jobs:
|
|||||||
git config --global user.name "Lawrence Stalder"
|
git config --global user.name "Lawrence Stalder"
|
||||||
|
|
||||||
- name: Get version from cargo.toml
|
- name: Get version from cargo.toml
|
||||||
uses: mikefarah/yq@v4.45.4
|
uses: mikefarah/yq@v4.44.3
|
||||||
id: get_version
|
id: get_version
|
||||||
with:
|
with:
|
||||||
cmd: yq -oy '.package.version' ${{ env.WORKING_DIRECTORY }}/nym-credential-proxy/Cargo.toml
|
cmd: yq -oy '.package.version' ${{ env.WORKING_DIRECTORY }}/nym-credential-proxy/Cargo.toml
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ jobs:
|
|||||||
git config --global user.name "Lawrence Stalder"
|
git config --global user.name "Lawrence Stalder"
|
||||||
|
|
||||||
- name: Get version from cargo.toml
|
- name: Get version from cargo.toml
|
||||||
uses: mikefarah/yq@v4.45.4
|
uses: mikefarah/yq@v4.44.3
|
||||||
id: get_version
|
id: get_version
|
||||||
with:
|
with:
|
||||||
cmd: yq -oy '.package.version' ${{ env.WORKING_DIRECTORY }}/Cargo.toml
|
cmd: yq -oy '.package.version' ${{ env.WORKING_DIRECTORY }}/Cargo.toml
|
||||||
|
|||||||
@@ -25,27 +25,31 @@ jobs:
|
|||||||
git config --global user.email "lawrence@nymtech.net"
|
git config --global user.email "lawrence@nymtech.net"
|
||||||
git config --global user.name "Lawrence Stalder"
|
git config --global user.name "Lawrence Stalder"
|
||||||
|
|
||||||
- name: Get version from cargo.toml
|
- name: Get version from package.json
|
||||||
uses: mikefarah/yq@v4.45.4
|
uses: sergeysova/jq-action@v2
|
||||||
id: get_version
|
id: get_version
|
||||||
with:
|
with:
|
||||||
cmd: yq -oy '.package.version' ${{ env.WORKING_DIRECTORY }}/nym-network-monitor/Cargo.toml
|
cmd: jq -r '.version' ${{ env.WORKING_DIRECTORY }}/package.json
|
||||||
|
|
||||||
|
- name: Check if tag exists
|
||||||
|
run: |
|
||||||
|
if git rev-parse ${{ steps.get_version.outputs.value }} >/dev/null 2>&1; then
|
||||||
|
echo "Tag ${{ steps.get_version.outputs.value }} already exists"
|
||||||
|
fi
|
||||||
|
|
||||||
- name: Remove existing tag if exists
|
- name: Remove existing tag if exists
|
||||||
run: |
|
run: |
|
||||||
echo "Checking if tag ${{ env.CONTAINER_NAME }}-${{ steps.get_version.outputs.result }} exists..."
|
if git rev-parse ${{ steps.get_version.outputs.value }} >/dev/null 2>&1; then
|
||||||
if git rev-parse ${{ env.CONTAINER_NAME }}-${{ steps.get_version.outputs.result }} >/dev/null 2>&1; then
|
git push --delete origin ${{ steps.get_version.outputs.value }}
|
||||||
echo "Tag ${{ env.CONTAINER_NAME }}-${{ steps.get_version.outputs.result }} already exists"
|
git tag -d ${{ steps.get_version.outputs.value }}
|
||||||
git push --delete origin ${{ env.CONTAINER_NAME }}-${{ steps.get_version.outputs.result }}
|
|
||||||
git tag -d ${{ env.CONTAINER_NAME }}-${{ steps.get_version.outputs.result }}
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Create tag
|
- name: Create tag
|
||||||
run: |
|
run: |
|
||||||
git tag -a ${{ env.CONTAINER_NAME }}-${{ steps.get_version.outputs.result }} -m "Version ${{ steps.get_version.outputs.result }}"
|
git tag -a ${{ steps.get_version.outputs.value }} -m "Version ${{ steps.get_version.outputs.value }}"
|
||||||
git push origin ${{ env.CONTAINER_NAME }}-${{ steps.get_version.outputs.result }}
|
git push origin ${{ steps.get_version.outputs.value }}
|
||||||
|
|
||||||
- name: BuildAndPushImageOnHarbor
|
- name: BuildAndPushImageOnHarbor
|
||||||
run: |
|
run: |
|
||||||
docker build -f nym-network-monitor.dockerfile ${{ env.WORKING_DIRECTORY }} -t harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }}:${{ steps.get_version.outputs.result }} -t harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }}:latest
|
docker build -f nym-network-monitor.dockerfile ${{ env.WORKING_DIRECTORY }} -t harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }}:${{ steps.get_version.outputs.value }} -t harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }}:latest
|
||||||
docker push harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }} --all-tags
|
docker push harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }} --all-tags
|
||||||
@@ -2,13 +2,9 @@ name: Build and upload Node Status agent container to harbor.nymte.ch
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
inputs:
|
|
||||||
gateway_probe_git_ref:
|
|
||||||
type: string
|
|
||||||
description: Which gateway probe git ref to build the image with
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
WORKING_DIRECTORY: "nym-node-status-api/nym-node-status-agent"
|
WORKING_DIRECTORY: "nym-node-status-agent"
|
||||||
CONTAINER_NAME: "node-status-agent"
|
CONTAINER_NAME: "node-status-agent"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -31,31 +27,30 @@ jobs:
|
|||||||
git config --global user.name "Lawrence Stalder"
|
git config --global user.name "Lawrence Stalder"
|
||||||
|
|
||||||
- name: Get version from cargo.toml
|
- name: Get version from cargo.toml
|
||||||
uses: mikefarah/yq@v4.45.4
|
uses: mikefarah/yq@v4.44.3
|
||||||
id: get_version
|
id: get_version
|
||||||
with:
|
with:
|
||||||
cmd: yq -oy '.package.version' ${{ env.WORKING_DIRECTORY }}/Cargo.toml
|
cmd: yq -oy '.package.version' ${{ env.WORKING_DIRECTORY }}/Cargo.toml
|
||||||
|
|
||||||
- name: cleanup-gateway-probe-ref
|
- name: Check if tag exists
|
||||||
id: cleanup_gateway_probe_ref
|
|
||||||
run: |
|
run: |
|
||||||
GATEWAY_PROBE_GIT_REF=${{ github.event.inputs.gateway_probe_git_ref }}
|
if git rev-parse ${{ steps.get_version.outputs.value }} >/dev/null 2>&1; then
|
||||||
GIT_REF_SLUG="${GATEWAY_PROBE_GIT_REF//\//-}"
|
echo "Tag ${{ steps.get_version.outputs.value }} already exists"
|
||||||
echo "git_ref=${GIT_REF_SLUG}" >> $GITHUB_OUTPUT
|
fi
|
||||||
|
|
||||||
- name: Remove existing tag if exists
|
- name: Remove existing tag if exists
|
||||||
run: |
|
run: |
|
||||||
if git rev-parse ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}-${{ steps.cleanup_gateway_probe_ref.outputs.git_ref }} >/dev/null 2>&1; then
|
if git rev-parse ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }} >/dev/null 2>&1; then
|
||||||
git push --delete origin ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}-${{ steps.cleanup_gateway_probe_ref.outputs.git_ref }}
|
git push --delete origin ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}
|
||||||
git tag -d ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}-${{ steps.cleanup_gateway_probe_ref.outputs.git_ref }}
|
git tag -d ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Create tag
|
- name: Create tag
|
||||||
run: |
|
run: |
|
||||||
git tag -a ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}-${{ steps.cleanup_gateway_probe_ref.outputs.git_ref }} -m "Version ${{ steps.get_version.outputs.result }}-${{ steps.cleanup_gateway_probe_ref.outputs.git_ref }}"
|
git tag -a ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }} -m "Version ${{ steps.get_version.outputs.result }}"
|
||||||
git push origin ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}-${{ steps.cleanup_gateway_probe_ref.outputs.git_ref }}
|
git push origin ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}
|
||||||
|
|
||||||
- name: BuildAndPushImageOnHarbor
|
- name: BuildAndPushImageOnHarbor
|
||||||
run: |
|
run: |
|
||||||
docker build --build-arg GIT_REF=${{ github.event.inputs.gateway_probe_git_ref }} -f ${{ env.WORKING_DIRECTORY }}/Dockerfile . -t harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }}:${{ steps.get_version.outputs.result }}-${{ steps.cleanup_gateway_probe_ref.outputs.git_ref }}
|
docker build -f ${{ env.WORKING_DIRECTORY }}/Dockerfile . -t harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }}:${{ steps.get_version.outputs.result }} -t harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }}:latest
|
||||||
docker push harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }} --all-tags
|
docker push harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }} --all-tags
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ on:
|
|||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
env:
|
env:
|
||||||
WORKING_DIRECTORY: "nym-node-status-api/nym-node-status-api"
|
WORKING_DIRECTORY: "nym-node-status-api"
|
||||||
CONTAINER_NAME: "node-status-api"
|
CONTAINER_NAME: "node-status-api"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -26,7 +26,7 @@ jobs:
|
|||||||
git config --global user.name "Lawrence Stalder"
|
git config --global user.name "Lawrence Stalder"
|
||||||
|
|
||||||
- name: Get version from cargo.toml
|
- name: Get version from cargo.toml
|
||||||
uses: mikefarah/yq@v4.45.4
|
uses: mikefarah/yq@v4.44.3
|
||||||
id: get_version
|
id: get_version
|
||||||
with:
|
with:
|
||||||
cmd: yq -oy '.package.version' ${{ env.WORKING_DIRECTORY }}/Cargo.toml
|
cmd: yq -oy '.package.version' ${{ env.WORKING_DIRECTORY }}/Cargo.toml
|
||||||
|
|||||||
@@ -1,51 +0,0 @@
|
|||||||
name: Build and upload Nym APU container to harbor.nymte.ch
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
env:
|
|
||||||
WORKING_DIRECTORY: "."
|
|
||||||
CONTAINER_NAME: "nym-api"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-container:
|
|
||||||
runs-on: arc-ubuntu-22.04-dind
|
|
||||||
steps:
|
|
||||||
- name: Login to Harbor
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: harbor.nymte.ch
|
|
||||||
username: ${{ secrets.HARBOR_ROBOT_USERNAME }}
|
|
||||||
password: ${{ secrets.HARBOR_ROBOT_SECRET }}
|
|
||||||
|
|
||||||
- name: Checkout repo
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Configure git identity
|
|
||||||
run: |
|
|
||||||
git config --global user.email "lawrence@nymtech.net"
|
|
||||||
git config --global user.name "Lawrence Stalder"
|
|
||||||
|
|
||||||
- name: Get version from cargo.toml
|
|
||||||
uses: mikefarah/yq@v4.45.4
|
|
||||||
id: get_version
|
|
||||||
with:
|
|
||||||
cmd: yq -oy '.package.version' ${{ env.WORKING_DIRECTORY }}/nym-api/Cargo.toml
|
|
||||||
|
|
||||||
- name: Remove existing tag if exists
|
|
||||||
run: |
|
|
||||||
echo "Checking if tag ${{ env.CONTAINER_NAME }}-${{ steps.get_version.outputs.result }} exists..."
|
|
||||||
if git rev-parse ${{ env.CONTAINER_NAME }}-${{ steps.get_version.outputs.result }} >/dev/null 2>&1; then
|
|
||||||
echo "Tag ${{ env.CONTAINER_NAME }}-${{ steps.get_version.outputs.result }} already exists"
|
|
||||||
git push --delete origin ${{ env.CONTAINER_NAME }}-${{ steps.get_version.outputs.result }}
|
|
||||||
git tag -d ${{ env.CONTAINER_NAME }}-${{ steps.get_version.outputs.result }}
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Create tag
|
|
||||||
run: |
|
|
||||||
git tag -a ${{ env.CONTAINER_NAME }}-${{ steps.get_version.outputs.result }} -m "Version ${{ steps.get_version.outputs.result }}"
|
|
||||||
git push origin ${{ env.CONTAINER_NAME }}-${{ steps.get_version.outputs.result }}
|
|
||||||
|
|
||||||
- name: BuildAndPushImageOnHarbor
|
|
||||||
run: |
|
|
||||||
docker build -f nym-api.dockerfile ${{ env.WORKING_DIRECTORY }} -t harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }}:${{ steps.get_version.outputs.result }} -t harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }}:latest
|
|
||||||
docker push harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }} --all-tags
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
name: Build and upload nym node container to harbor.nymte.ch
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
env:
|
|
||||||
WORKING_DIRECTORY: "nym-node"
|
|
||||||
CONTAINER_NAME: "nym-node"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-container:
|
|
||||||
runs-on: arc-ubuntu-22.04-dind
|
|
||||||
steps:
|
|
||||||
- name: Login to Harbor
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: harbor.nymte.ch
|
|
||||||
username: ${{ secrets.HARBOR_ROBOT_USERNAME }}
|
|
||||||
password: ${{ secrets.HARBOR_ROBOT_SECRET }}
|
|
||||||
|
|
||||||
- name: Checkout repo
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Configure git identity
|
|
||||||
run: |
|
|
||||||
git config --global user.email "lawrence@nymtech.net"
|
|
||||||
git config --global user.name "Lawrence Stalder"
|
|
||||||
|
|
||||||
- name: Get version from cargo.toml
|
|
||||||
uses: mikefarah/yq@v4.45.4
|
|
||||||
id: get_version
|
|
||||||
with:
|
|
||||||
cmd: yq -oy '.package.version' ${{ env.WORKING_DIRECTORY }}/Cargo.toml
|
|
||||||
|
|
||||||
- name: Check if tag exists
|
|
||||||
run: |
|
|
||||||
if git rev-parse ${{ steps.get_version.outputs.value }} >/dev/null 2>&1; then
|
|
||||||
echo "Tag ${{ steps.get_version.outputs.value }} already exists"
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Remove existing tag if exists
|
|
||||||
run: |
|
|
||||||
if git rev-parse ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }} >/dev/null 2>&1; then
|
|
||||||
git push --delete origin ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}
|
|
||||||
git tag -d ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Create tag
|
|
||||||
run: |
|
|
||||||
git tag -a ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }} -m "Version ${{ steps.get_version.outputs.result }}"
|
|
||||||
git push origin ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}
|
|
||||||
|
|
||||||
- name: BuildAndPushImageOnHarbor
|
|
||||||
run: |
|
|
||||||
docker build -f ${{ env.WORKING_DIRECTORY }}/Dockerfile . -t harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }}:${{ steps.get_version.outputs.result }} -t harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }}:latest
|
|
||||||
docker push harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }} --all-tags
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
name: Build and upload Nym Statistics API container to harbor.nymte.ch
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
env:
|
|
||||||
WORKING_DIRECTORY: "nym-statistics-api"
|
|
||||||
CONTAINER_NAME: "nym-statistics-api"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-container:
|
|
||||||
runs-on: arc-ubuntu-22.04-dind
|
|
||||||
steps:
|
|
||||||
- name: Login to Harbor
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: harbor.nymte.ch
|
|
||||||
username: ${{ secrets.HARBOR_ROBOT_USERNAME }}
|
|
||||||
password: ${{ secrets.HARBOR_ROBOT_SECRET }}
|
|
||||||
|
|
||||||
- name: Checkout repo
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Configure git identity
|
|
||||||
run: |
|
|
||||||
git config --global user.email "lawrence@nymtech.net"
|
|
||||||
git config --global user.name "Lawrence Stalder"
|
|
||||||
|
|
||||||
- name: Get version from cargo.toml
|
|
||||||
uses: mikefarah/yq@v4.45.4
|
|
||||||
id: get_version
|
|
||||||
with:
|
|
||||||
cmd: yq -oy '.package.version' ${{ env.WORKING_DIRECTORY }}/Cargo.toml
|
|
||||||
|
|
||||||
- name: Create tag
|
|
||||||
run: |
|
|
||||||
git tag -a ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }} -m "Version ${{ steps.get_version.outputs.result }}"
|
|
||||||
git push origin ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}
|
|
||||||
|
|
||||||
- name: BuildAndPushImageOnHarbor
|
|
||||||
run: |
|
|
||||||
docker build -f ${{ env.WORKING_DIRECTORY }}/Dockerfile . -t harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }}:${{ steps.get_version.outputs.result }} -t harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }}:latest
|
|
||||||
docker push harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }} --all-tags
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
name: Build and upload Nyx Chain Watcher container to harbor.nymte.ch
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
env:
|
|
||||||
WORKING_DIRECTORY: "nyx-chain-watcher"
|
|
||||||
CONTAINER_NAME: "nyx-chain-watcher"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-container:
|
|
||||||
runs-on: arc-ubuntu-22.04-dind
|
|
||||||
steps:
|
|
||||||
- name: Login to Harbor
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: harbor.nymte.ch
|
|
||||||
username: ${{ secrets.HARBOR_ROBOT_USERNAME }}
|
|
||||||
password: ${{ secrets.HARBOR_ROBOT_SECRET }}
|
|
||||||
|
|
||||||
- name: Checkout repo
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Configure git identity
|
|
||||||
run: |
|
|
||||||
git config --global user.email "lawrence@nymtech.net"
|
|
||||||
git config --global user.name "Lawrence Stalder"
|
|
||||||
|
|
||||||
- name: Get version from cargo.toml
|
|
||||||
uses: mikefarah/yq@v4.45.4
|
|
||||||
id: get_version
|
|
||||||
with:
|
|
||||||
cmd: yq -oy '.package.version' ${{ env.WORKING_DIRECTORY }}/Cargo.toml
|
|
||||||
|
|
||||||
- name: Check if tag exists
|
|
||||||
run: |
|
|
||||||
if git rev-parse ${{ steps.get_version.outputs.value }} >/dev/null 2>&1; then
|
|
||||||
echo "Tag ${{ steps.get_version.outputs.value }} already exists"
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Remove existing tag if exists
|
|
||||||
run: |
|
|
||||||
if git rev-parse ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }} >/dev/null 2>&1; then
|
|
||||||
git push --delete origin ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}
|
|
||||||
git tag -d ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Create tag
|
|
||||||
run: |
|
|
||||||
git tag -a ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }} -m "Version ${{ steps.get_version.outputs.result }}"
|
|
||||||
git push origin ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}
|
|
||||||
|
|
||||||
- name: BuildAndPushImageOnHarbor
|
|
||||||
run: |
|
|
||||||
docker build -f ${{ env.WORKING_DIRECTORY }}/Dockerfile . -t harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }}:${{ steps.get_version.outputs.result }} -t harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }}:latest
|
|
||||||
docker push harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }} --all-tags
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
name: Build and upload Validator Rewarder container to harbor.nymte.ch
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
env:
|
|
||||||
WORKING_DIRECTORY: "nym-validator-rewarder"
|
|
||||||
CONTAINER_NAME: "validator-rewarder"
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-container:
|
|
||||||
runs-on: arc-ubuntu-22.04-dind
|
|
||||||
steps:
|
|
||||||
- name: Login to Harbor
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
registry: harbor.nymte.ch
|
|
||||||
username: ${{ secrets.HARBOR_ROBOT_USERNAME }}
|
|
||||||
password: ${{ secrets.HARBOR_ROBOT_SECRET }}
|
|
||||||
|
|
||||||
- name: Checkout repo
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Configure git identity
|
|
||||||
run: |
|
|
||||||
git config --global user.email "lawrence@nymtech.net"
|
|
||||||
git config --global user.name "Lawrence Stalder"
|
|
||||||
|
|
||||||
- name: Get version from cargo.toml
|
|
||||||
uses: mikefarah/yq@v4.45.4
|
|
||||||
id: get_version
|
|
||||||
with:
|
|
||||||
cmd: yq -oy '.package.version' ${{ env.WORKING_DIRECTORY }}/Cargo.toml
|
|
||||||
|
|
||||||
- name: Remove existing tag if exists
|
|
||||||
run: |
|
|
||||||
if git rev-parse ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }} >/dev/null 2>&1; then
|
|
||||||
git push --delete origin ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}
|
|
||||||
git tag -d ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Create tag
|
|
||||||
run: |
|
|
||||||
git tag -a ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }} -m "Version ${{ steps.get_version.outputs.result }}"
|
|
||||||
git push origin ${{ env.WORKING_DIRECTORY }}-${{ steps.get_version.outputs.result }}
|
|
||||||
|
|
||||||
- name: BuildAndPushImageOnHarbor
|
|
||||||
run: |
|
|
||||||
docker build -f ${{ env.WORKING_DIRECTORY }}/Dockerfile . -t harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }}:${{ steps.get_version.outputs.result }} -t harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }}:latest
|
|
||||||
docker push harbor.nymte.ch/nym/${{ env.CONTAINER_NAME }} --all-tags
|
|
||||||
@@ -23,7 +23,7 @@ jobs:
|
|||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 18
|
||||||
- uses: nymtech/nym/.github/actions/nym-hash-releases@develop
|
- uses: nymtech/nym/.github/actions/nym-hash-releases@develop
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|||||||
@@ -5,6 +5,8 @@
|
|||||||
>
|
>
|
||||||
> ➡️➡️➡️➡️➡️ **View output:**
|
> ➡️➡️➡️➡️➡️ **View output:**
|
||||||
>
|
>
|
||||||
|
> `storybook`: https://{{ env.NYM_CI_WWW_LOCATION }}.{{ env.NYM_CI_WWW_BASE }}
|
||||||
|
>
|
||||||
> `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }}
|
> `branch` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/tree/{{ env.GIT_BRANCH_NAME }}
|
||||||
>
|
>
|
||||||
> `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }}
|
> `commit` {{ env.GITHUB_SERVER_URL }}/{{ env.GITHUB_REPOSITORY }}/commit/{{ env.GITHUB_SHA }}
|
||||||
|
|||||||
+2
-11
@@ -40,6 +40,7 @@ validator-config
|
|||||||
validator-api-config.toml
|
validator-api-config.toml
|
||||||
dist
|
dist
|
||||||
storybook-static
|
storybook-static
|
||||||
|
envs/qwerty.env
|
||||||
.parcel-cache
|
.parcel-cache
|
||||||
**/.DS_Store
|
**/.DS_Store
|
||||||
cpu-cycles/libcpucycles/build
|
cpu-cycles/libcpucycles/build
|
||||||
@@ -50,14 +51,4 @@ ppa-private-key.b64
|
|||||||
ppa-private-key.asc
|
ppa-private-key.asc
|
||||||
nym-network-monitor/topology.json
|
nym-network-monitor/topology.json
|
||||||
nym-network-monitor/__pycache__
|
nym-network-monitor/__pycache__
|
||||||
nym-network-monitor/*.key
|
nym-network-monitor/*.key
|
||||||
nym-network-monitor/.envrc
|
|
||||||
nym-network-monitor/.envrc
|
|
||||||
nym-api/redocly/formatted-openapi.json
|
|
||||||
|
|
||||||
|
|
||||||
*.sqlite
|
|
||||||
.build
|
|
||||||
|
|
||||||
**/settings.sql
|
|
||||||
**/enter_db.sh
|
|
||||||
+3
-984
File diff suppressed because it is too large
Load Diff
Generated
+2897
-4299
File diff suppressed because it is too large
Load Diff
+157
-162
@@ -19,56 +19,56 @@ members = [
|
|||||||
"clients/native",
|
"clients/native",
|
||||||
"clients/native/websocket-requests",
|
"clients/native/websocket-requests",
|
||||||
"clients/socks5",
|
"clients/socks5",
|
||||||
"common/async-file-watcher",
|
|
||||||
"common/authenticator-requests",
|
"common/authenticator-requests",
|
||||||
|
"common/async-file-watcher",
|
||||||
"common/bandwidth-controller",
|
"common/bandwidth-controller",
|
||||||
"common/bin-common",
|
"common/bin-common",
|
||||||
"common/client-core",
|
"common/client-core",
|
||||||
"common/client-core/config-types",
|
"common/client-core/config-types",
|
||||||
"common/client-core/gateways-storage",
|
|
||||||
"common/client-core/surb-storage",
|
"common/client-core/surb-storage",
|
||||||
|
"common/client-core/gateways-storage",
|
||||||
"common/client-libs/gateway-client",
|
"common/client-libs/gateway-client",
|
||||||
"common/client-libs/mixnet-client",
|
"common/client-libs/mixnet-client",
|
||||||
"common/client-libs/validator-client",
|
"common/client-libs/validator-client",
|
||||||
"common/commands",
|
"common/commands",
|
||||||
"common/config",
|
"common/config",
|
||||||
|
"common/cosmwasm-smart-contracts/coconut-bandwidth-contract",
|
||||||
|
"common/cosmwasm-smart-contracts/ecash-contract",
|
||||||
"common/cosmwasm-smart-contracts/coconut-dkg",
|
"common/cosmwasm-smart-contracts/coconut-dkg",
|
||||||
"common/cosmwasm-smart-contracts/contracts-common",
|
"common/cosmwasm-smart-contracts/contracts-common",
|
||||||
"common/cosmwasm-smart-contracts/contracts-common-testing",
|
|
||||||
"common/cosmwasm-smart-contracts/easy_addr",
|
|
||||||
"common/cosmwasm-smart-contracts/ecash-contract",
|
|
||||||
"common/cosmwasm-smart-contracts/group-contract",
|
"common/cosmwasm-smart-contracts/group-contract",
|
||||||
"common/cosmwasm-smart-contracts/mixnet-contract",
|
"common/cosmwasm-smart-contracts/mixnet-contract",
|
||||||
"common/cosmwasm-smart-contracts/multisig-contract", "common/cosmwasm-smart-contracts/nym-performance-contract",
|
"common/cosmwasm-smart-contracts/multisig-contract",
|
||||||
"common/cosmwasm-smart-contracts/nym-pool-contract",
|
|
||||||
"common/cosmwasm-smart-contracts/vesting-contract",
|
"common/cosmwasm-smart-contracts/vesting-contract",
|
||||||
|
"common/country-group",
|
||||||
"common/credential-storage",
|
"common/credential-storage",
|
||||||
"common/credential-utils",
|
|
||||||
"common/credential-verification",
|
|
||||||
"common/credentials",
|
"common/credentials",
|
||||||
|
"common/credential-utils",
|
||||||
"common/credentials-interface",
|
"common/credentials-interface",
|
||||||
|
"common/credential-verification",
|
||||||
"common/crypto",
|
"common/crypto",
|
||||||
"common/dkg",
|
"common/dkg",
|
||||||
|
"common/ecash-double-spending",
|
||||||
"common/ecash-time",
|
"common/ecash-time",
|
||||||
"common/execute",
|
"common/execute",
|
||||||
"common/exit-policy",
|
"common/exit-policy",
|
||||||
"common/gateway-requests",
|
"common/gateway-requests",
|
||||||
"common/gateway-stats-storage",
|
|
||||||
"common/gateway-storage",
|
"common/gateway-storage",
|
||||||
|
"common/gateway-stats-storage",
|
||||||
"common/http-api-client",
|
"common/http-api-client",
|
||||||
"common/http-api-common",
|
"common/http-api-common",
|
||||||
"common/inclusion-probability",
|
"common/inclusion-probability",
|
||||||
"common/ip-packet-requests",
|
"common/ip-packet-requests",
|
||||||
"common/ledger",
|
"common/ledger",
|
||||||
"common/mixnode-common",
|
"common/mixnode-common",
|
||||||
|
"common/models",
|
||||||
"common/network-defaults",
|
"common/network-defaults",
|
||||||
"common/node-tester-utils",
|
"common/node-tester-utils",
|
||||||
"common/nonexhaustive-delayqueue",
|
"common/nonexhaustive-delayqueue",
|
||||||
|
"common/nymcoconut",
|
||||||
|
"common/nym_offline_compact_ecash",
|
||||||
"common/nym-id",
|
"common/nym-id",
|
||||||
"common/nym-metrics",
|
"common/nym-metrics",
|
||||||
"common/nym_offline_compact_ecash",
|
|
||||||
"common/nymnoise",
|
|
||||||
"common/nymnoise/keys",
|
|
||||||
"common/nymsphinx",
|
"common/nymsphinx",
|
||||||
"common/nymsphinx/acknowledgements",
|
"common/nymsphinx/acknowledgements",
|
||||||
"common/nymsphinx/addressing",
|
"common/nymsphinx/addressing",
|
||||||
@@ -90,54 +90,46 @@ members = [
|
|||||||
"common/statistics",
|
"common/statistics",
|
||||||
"common/store-cipher",
|
"common/store-cipher",
|
||||||
"common/task",
|
"common/task",
|
||||||
"common/ticketbooks-merkle",
|
|
||||||
"common/topology",
|
"common/topology",
|
||||||
"common/tun",
|
"common/tun",
|
||||||
"common/types",
|
"common/types",
|
||||||
"common/verloc",
|
|
||||||
"common/wasm/client-core",
|
"common/wasm/client-core",
|
||||||
"common/wasm/storage",
|
"common/wasm/storage",
|
||||||
"common/wasm/utils",
|
"common/wasm/utils",
|
||||||
"common/wireguard",
|
"common/wireguard",
|
||||||
"common/wireguard-types",
|
"common/wireguard-types",
|
||||||
"documentation/autodoc",
|
"explorer-api",
|
||||||
|
"explorer-api/explorer-api-requests",
|
||||||
|
"explorer-api/explorer-client",
|
||||||
"gateway",
|
"gateway",
|
||||||
"nym-api",
|
"integrations/bity",
|
||||||
"nym-api/nym-api-requests",
|
"mixnode",
|
||||||
"nym-browser-extension/storage",
|
"sdk/lib/socks5-listener",
|
||||||
"nym-credential-proxy/nym-credential-proxy",
|
|
||||||
"nym-credential-proxy/nym-credential-proxy-requests",
|
|
||||||
"nym-credential-proxy/vpn-api-lib-wasm",
|
|
||||||
"nym-network-monitor",
|
|
||||||
"nym-node",
|
|
||||||
"nym-node-status-api/nym-node-status-agent",
|
|
||||||
"nym-node-status-api/nym-node-status-api",
|
|
||||||
"nym-node-status-api/nym-node-status-client",
|
|
||||||
"nym-node/nym-node-metrics",
|
|
||||||
"nym-node/nym-node-requests",
|
|
||||||
"nym-outfox",
|
|
||||||
"nym-statistics-api",
|
|
||||||
"nym-validator-rewarder",
|
|
||||||
"nyx-chain-watcher",
|
|
||||||
"sdk/ffi/cpp",
|
|
||||||
"sdk/ffi/go",
|
|
||||||
"sdk/ffi/shared",
|
|
||||||
"sdk/rust/nym-sdk",
|
"sdk/rust/nym-sdk",
|
||||||
|
"sdk/ffi/shared",
|
||||||
|
"sdk/ffi/go",
|
||||||
|
"sdk/ffi/cpp",
|
||||||
"service-providers/authenticator",
|
"service-providers/authenticator",
|
||||||
"service-providers/common",
|
"service-providers/common",
|
||||||
"service-providers/ip-packet-router",
|
"service-providers/ip-packet-router",
|
||||||
"service-providers/network-requester",
|
"service-providers/network-requester",
|
||||||
"sqlx-pool-guard",
|
"nym-network-monitor",
|
||||||
|
"nym-api",
|
||||||
|
"nym-browser-extension/storage",
|
||||||
|
"nym-api/nym-api-requests",
|
||||||
|
"nym-data-observatory",
|
||||||
|
"nym-node",
|
||||||
|
"nym-node/nym-node-http-api",
|
||||||
|
"nym-node/nym-node-requests",
|
||||||
|
"nym-node-status-api",
|
||||||
|
"nym-node-status-agent",
|
||||||
|
"nym-outfox",
|
||||||
|
"nym-validator-rewarder",
|
||||||
"tools/echo-server",
|
"tools/echo-server",
|
||||||
"tools/internal/contract-state-importer/importer-cli",
|
|
||||||
"tools/internal/contract-state-importer/importer-contract",
|
|
||||||
"tools/internal/mixnet-connectivity-check",
|
|
||||||
# "tools/internal/sdk-version-bump",
|
|
||||||
"tools/internal/ssl-inject",
|
"tools/internal/ssl-inject",
|
||||||
"tools/internal/testnet-manager",
|
# "tools/internal/sdk-version-bump",
|
||||||
"tools/internal/testnet-manager",
|
"tools/internal/testnet-manager",
|
||||||
"tools/internal/testnet-manager/dkg-bypass-contract",
|
"tools/internal/testnet-manager/dkg-bypass-contract",
|
||||||
"tools/internal/validator-status-check",
|
|
||||||
"tools/nym-cli",
|
"tools/nym-cli",
|
||||||
"tools/nym-id-cli",
|
"tools/nym-id-cli",
|
||||||
"tools/nym-nr-query",
|
"tools/nym-nr-query",
|
||||||
@@ -148,26 +140,39 @@ members = [
|
|||||||
"wasm/mix-fetch",
|
"wasm/mix-fetch",
|
||||||
"wasm/node-tester",
|
"wasm/node-tester",
|
||||||
"wasm/zknym-lib",
|
"wasm/zknym-lib",
|
||||||
|
"tools/internal/testnet-manager",
|
||||||
|
"tools/internal/testnet-manager/dkg-bypass-contract",
|
||||||
|
"tools/echo-server",
|
||||||
|
"tools/internal/contract-state-importer/importer-cli",
|
||||||
|
"tools/internal/contract-state-importer/importer-contract",
|
||||||
]
|
]
|
||||||
|
|
||||||
default-members = [
|
default-members = [
|
||||||
"clients/native",
|
"clients/native",
|
||||||
"clients/socks5",
|
"clients/socks5",
|
||||||
|
"common/models",
|
||||||
|
"explorer-api",
|
||||||
|
"gateway",
|
||||||
|
"mixnode",
|
||||||
"nym-api",
|
"nym-api",
|
||||||
"nym-credential-proxy/nym-credential-proxy",
|
"nym-data-observatory",
|
||||||
"nym-node",
|
"nym-node",
|
||||||
"nym-node-status-api/nym-node-status-agent",
|
"nym-node-status-api",
|
||||||
"nym-node-status-api/nym-node-status-api",
|
|
||||||
"nym-statistics-api",
|
|
||||||
"nym-validator-rewarder",
|
"nym-validator-rewarder",
|
||||||
"nyx-chain-watcher",
|
"nym-node-status-api",
|
||||||
"service-providers/authenticator",
|
"service-providers/authenticator",
|
||||||
"service-providers/ip-packet-router",
|
"service-providers/ip-packet-router",
|
||||||
"service-providers/network-requester",
|
"service-providers/network-requester",
|
||||||
"tools/nymvisor",
|
"tools/nymvisor",
|
||||||
]
|
]
|
||||||
|
|
||||||
exclude = ["explorer", "contracts", "nym-wallet", "cpu-cycles"]
|
exclude = [
|
||||||
|
"explorer",
|
||||||
|
"contracts",
|
||||||
|
"nym-wallet",
|
||||||
|
"nym-vpn/ui/src-tauri",
|
||||||
|
"cpu-cycles",
|
||||||
|
]
|
||||||
|
|
||||||
[workspace.package]
|
[workspace.package]
|
||||||
authors = ["Nym Technologies SA"]
|
authors = ["Nym Technologies SA"]
|
||||||
@@ -181,49 +186,47 @@ readme = "README.md"
|
|||||||
|
|
||||||
[workspace.dependencies]
|
[workspace.dependencies]
|
||||||
addr = "0.15.6"
|
addr = "0.15.6"
|
||||||
aead = "0.5.2"
|
|
||||||
aes = "0.8.1"
|
aes = "0.8.1"
|
||||||
aes-gcm = "0.10.1"
|
aes-gcm = "0.10.1"
|
||||||
aes-gcm-siv = "0.11.1"
|
aes-gcm-siv = "0.11.1"
|
||||||
ammonia = "4"
|
aead = "0.5.2"
|
||||||
anyhow = "1.0.98"
|
anyhow = "1.0.90"
|
||||||
arc-swap = "1.7.1"
|
|
||||||
argon2 = "0.5.0"
|
argon2 = "0.5.0"
|
||||||
async-trait = "0.1.88"
|
async-trait = "0.1.83"
|
||||||
axum = "0.7.5"
|
axum = "0.7.5"
|
||||||
axum-client-ip = "0.6.1"
|
|
||||||
axum-extra = "0.9.4"
|
axum-extra = "0.9.4"
|
||||||
axum-test = "16.2.0"
|
|
||||||
base64 = "0.22.1"
|
base64 = "0.22.1"
|
||||||
base85rs = "0.1.3"
|
|
||||||
bincode = "1.3.3"
|
bincode = "1.3.3"
|
||||||
bip39 = { version = "2.0.0", features = ["zeroize"] }
|
bip39 = { version = "2.0.0", features = ["zeroize"] }
|
||||||
bit-vec = "0.7.0" # can we unify those?
|
|
||||||
|
# can we unify those?
|
||||||
|
bit-vec = "0.7.0"
|
||||||
bitvec = "1.0.0"
|
bitvec = "1.0.0"
|
||||||
blake3 = "1.7.0"
|
|
||||||
bloomfilter = "3.0.1"
|
blake3 = "1.5.4"
|
||||||
|
bloomfilter = "1.0.14"
|
||||||
bs58 = "0.5.1"
|
bs58 = "0.5.1"
|
||||||
bytecodec = "0.4.15"
|
bytecodec = "0.4.15"
|
||||||
bytes = "1.10.1"
|
bytes = "1.7.2"
|
||||||
cargo_metadata = "0.19.2"
|
cargo_metadata = "0.18.1"
|
||||||
celes = "2.6.0"
|
celes = "2.4.0"
|
||||||
cfg-if = "1.0.0"
|
cfg-if = "1.0.0"
|
||||||
chacha20 = "0.9.0"
|
chacha20 = "0.9.0"
|
||||||
chacha20poly1305 = "0.10.1"
|
chacha20poly1305 = "0.10.1"
|
||||||
chrono = "0.4.41"
|
chrono = "0.4.31"
|
||||||
cipher = "0.4.3"
|
cipher = "0.4.3"
|
||||||
clap = "4.5.38"
|
clap = "4.5.20"
|
||||||
clap_complete = "4.5"
|
clap_complete = "4.5"
|
||||||
clap_complete_fig = "4.5"
|
clap_complete_fig = "4.5"
|
||||||
colored = "2.2"
|
colored = "2.0"
|
||||||
comfy-table = "7.1.4"
|
comfy-table = "7.1.1"
|
||||||
console = "0.15.11"
|
console = "0.15.8"
|
||||||
console-subscriber = "0.1.1"
|
console-subscriber = "0.1.1"
|
||||||
console_error_panic_hook = "0.1"
|
console_error_panic_hook = "0.1"
|
||||||
const-str = "0.5.6"
|
const-str = "0.5.6"
|
||||||
const_format = "0.2.34"
|
const_format = "0.2.33"
|
||||||
criterion = "0.5"
|
criterion = "0.4"
|
||||||
csv = "1.3.1"
|
csv = "1.3.0"
|
||||||
ctr = "0.9.1"
|
ctr = "0.9.1"
|
||||||
cupid = "0.6.1"
|
cupid = "0.6.1"
|
||||||
curve25519-dalek = "4.1"
|
curve25519-dalek = "4.1"
|
||||||
@@ -236,40 +239,37 @@ doc-comment = "0.3"
|
|||||||
dotenvy = "0.15.6"
|
dotenvy = "0.15.6"
|
||||||
ecdsa = "0.16"
|
ecdsa = "0.16"
|
||||||
ed25519-dalek = "2.1"
|
ed25519-dalek = "2.1"
|
||||||
encoding_rs = "0.8.35"
|
|
||||||
env_logger = "0.11.8"
|
|
||||||
envy = "0.4"
|
|
||||||
etherparse = "0.13.0"
|
etherparse = "0.13.0"
|
||||||
|
envy = "0.4"
|
||||||
eyre = "0.6.9"
|
eyre = "0.6.9"
|
||||||
fastrand = "2.1.1"
|
fastrand = "2.1.1"
|
||||||
flate2 = "1.1.1"
|
flate2 = "1.0.34"
|
||||||
futures = "0.3.31"
|
futures = "0.3.28"
|
||||||
futures-util = "0.3"
|
futures-util = "0.3"
|
||||||
generic-array = "0.14.7"
|
generic-array = "0.14.7"
|
||||||
getrandom = "0.2.10"
|
getrandom = "0.2.10"
|
||||||
getset = "0.1.5"
|
getset = "0.1.3"
|
||||||
handlebars = "3.5.5"
|
handlebars = "3.5.5"
|
||||||
headers = "0.4.0"
|
headers = "0.4.0"
|
||||||
hex = "0.4.3"
|
hex = "0.4.3"
|
||||||
hex-literal = "0.3.3"
|
hex-literal = "0.3.3"
|
||||||
hickory-resolver = "0.25"
|
|
||||||
hkdf = "0.12.3"
|
hkdf = "0.12.3"
|
||||||
hmac = "0.12.1"
|
hmac = "0.12.1"
|
||||||
http = "1"
|
http = "1"
|
||||||
http-body-util = "0.1"
|
http-body-util = "0.1"
|
||||||
httpcodec = "0.2.3"
|
httpcodec = "0.2.3"
|
||||||
human-repr = "1.1.0"
|
humantime = "2.1.0"
|
||||||
humantime = "2.2.0"
|
|
||||||
humantime-serde = "1.1.1"
|
humantime-serde = "1.1.1"
|
||||||
hyper = "1.6.0"
|
hyper = "1.4.1"
|
||||||
hyper-util = "0.1"
|
hyper-util = "0.1"
|
||||||
indicatif = "0.17.11"
|
indicatif = "0.17.8"
|
||||||
inquire = "0.6.2"
|
inquire = "0.6.2"
|
||||||
ip_network = "0.4.1"
|
ip_network = "0.4.1"
|
||||||
ipnetwork = "0.20"
|
ipnetwork = "0.20"
|
||||||
itertools = "0.14.0"
|
isocountry = "0.3.2"
|
||||||
|
itertools = "0.13.0"
|
||||||
k256 = "0.13"
|
k256 = "0.13"
|
||||||
lazy_static = "1.5.0"
|
lazy_static = "1.4.0"
|
||||||
ledger-transport = "0.10.0"
|
ledger-transport = "0.10.0"
|
||||||
ledger-transport-hid = "0.10.0"
|
ledger-transport-hid = "0.10.0"
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
@@ -279,16 +279,16 @@ moka = { version = "0.12", features = ["future"] }
|
|||||||
nix = "0.27.1"
|
nix = "0.27.1"
|
||||||
notify = "5.1.0"
|
notify = "5.1.0"
|
||||||
okapi = "0.7.0"
|
okapi = "0.7.0"
|
||||||
once_cell = "1.21.3"
|
once_cell = "1.7.2"
|
||||||
opentelemetry = "0.19.0"
|
opentelemetry = "0.19.0"
|
||||||
opentelemetry-jaeger = "0.18.0"
|
opentelemetry-jaeger = "0.18.0"
|
||||||
parking_lot = "0.12.3"
|
parking_lot = "0.12.3"
|
||||||
pem = "0.8"
|
pem = "0.8"
|
||||||
petgraph = "0.6.5"
|
petgraph = "0.6.5"
|
||||||
pin-project = "1.1"
|
pin-project = "1.1"
|
||||||
pin-project-lite = "0.2.16"
|
pin-project-lite = "0.2.14"
|
||||||
publicsuffix = "2.3.0"
|
pretty_env_logger = "0.4.0"
|
||||||
proc_pidinfo = "0.1.3"
|
publicsuffix = "2.2.3"
|
||||||
quote = "1"
|
quote = "1"
|
||||||
rand = "0.8.5"
|
rand = "0.8.5"
|
||||||
rand_chacha = "0.3"
|
rand_chacha = "0.3"
|
||||||
@@ -298,115 +298,116 @@ rand_pcg = "0.3.1"
|
|||||||
rand_seeder = "0.2.3"
|
rand_seeder = "0.2.3"
|
||||||
rayon = "1.5.1"
|
rayon = "1.5.1"
|
||||||
regex = "1.10.6"
|
regex = "1.10.6"
|
||||||
reqwest = { version = "0.12.15", default-features = false }
|
reqwest = { version = "0.12.4", default-features = false }
|
||||||
rs_merkle = "1.5.0"
|
rocket = "0.5.0"
|
||||||
|
rocket_cors = "0.6.0"
|
||||||
|
rocket_okapi = "0.8.0"
|
||||||
safer-ffi = "0.1.13"
|
safer-ffi = "0.1.13"
|
||||||
schemars = "0.8.22"
|
schemars = "0.8.21"
|
||||||
semver = "1.0.26"
|
semver = "1.0.23"
|
||||||
serde = "1.0.219"
|
serde = "1.0.211"
|
||||||
serde_bytes = "0.11.17"
|
serde_bytes = "0.11.15"
|
||||||
serde_derive = "1.0"
|
serde_derive = "1.0"
|
||||||
serde_json = "1.0.140"
|
serde_json = "1.0.132"
|
||||||
serde_json_path = "0.7.2"
|
serde_json_path = "0.6.7"
|
||||||
serde_repr = "0.1"
|
serde_repr = "0.1"
|
||||||
serde_with = "3.9.0"
|
serde_with = "3.9.0"
|
||||||
serde_yaml = "0.9.25"
|
serde_yaml = "0.9.25"
|
||||||
sha2 = "0.10.9"
|
sha2 = "0.10.8"
|
||||||
si-scale = "0.2.3"
|
si-scale = "0.2.3"
|
||||||
snow = "0.9.6"
|
sphinx-packet = "0.1.1"
|
||||||
sphinx-packet = "=0.6.0"
|
sqlx = "0.7.4"
|
||||||
sqlx = "0.8.6"
|
|
||||||
strum = "0.26"
|
strum = "0.26"
|
||||||
strum_macros = "0.26"
|
strum_macros = "0.26"
|
||||||
subtle-encoding = "0.5"
|
subtle-encoding = "0.5"
|
||||||
syn = "1"
|
syn = "1"
|
||||||
sysinfo = "0.33.0"
|
sysinfo = "0.30.13"
|
||||||
tap = "1.0.1"
|
tap = "1.0.1"
|
||||||
tar = "0.4.44"
|
tar = "0.4.42"
|
||||||
tempfile = "3.20"
|
tempfile = "3.5.0"
|
||||||
thiserror = "2.0"
|
thiserror = "1.0.64"
|
||||||
time = "0.3.41"
|
time = "0.3.30"
|
||||||
tokio = "1.45"
|
tokio = "1.39"
|
||||||
tokio-postgres = "0.7"
|
tokio-stream = "0.1.16"
|
||||||
tokio-stream = "0.1.17"
|
|
||||||
tokio-test = "0.4.4"
|
tokio-test = "0.4.4"
|
||||||
tokio-tun = "0.11.5"
|
tokio-tun = "0.11.5"
|
||||||
tokio-tungstenite = { version = "0.20.1" }
|
tokio-tungstenite = { version = "0.20.1" }
|
||||||
tokio-util = "0.7.15"
|
tokio-util = "0.7.12"
|
||||||
toml = "0.8.22"
|
toml = "0.8.14"
|
||||||
tower = "0.5.2"
|
tower = "0.4.13"
|
||||||
tower-http = "0.5.2"
|
tower-http = "0.5.2"
|
||||||
tracing = "0.1.41"
|
tracing = "0.1.37"
|
||||||
tracing-log = "0.2"
|
|
||||||
tracing-opentelemetry = "0.19.0"
|
tracing-opentelemetry = "0.19.0"
|
||||||
tracing-subscriber = "0.3.19"
|
tracing-subscriber = "0.3.16"
|
||||||
tracing-tree = "0.2.2"
|
tracing-tree = "0.2.2"
|
||||||
tracing-indicatif = "0.3.9"
|
tracing-log = "0.2"
|
||||||
ts-rs = "10.1.0"
|
ts-rs = "10.0.0"
|
||||||
tungstenite = { version = "0.20.1", default-features = false }
|
tungstenite = { version = "0.20.1", default-features = false }
|
||||||
uniffi = "0.29.2"
|
|
||||||
uniffi_build = "0.29.0"
|
|
||||||
url = "2.5"
|
url = "2.5"
|
||||||
utoipa = "5.2"
|
utoipa = "4.2"
|
||||||
utoipa-swagger-ui = "8.1"
|
utoipa-swagger-ui = "7.1"
|
||||||
utoipauto = "0.2"
|
utoipauto = "0.1"
|
||||||
uuid = "*"
|
uuid = "*"
|
||||||
vergen = { version = "=8.3.1", default-features = false }
|
vergen = { version = "=8.3.1", default-features = false }
|
||||||
walkdir = "2"
|
walkdir = "2"
|
||||||
|
wasm-bindgen-test = "0.3.43"
|
||||||
x25519-dalek = "2.0.0"
|
x25519-dalek = "2.0.0"
|
||||||
zeroize = "1.7.0"
|
zeroize = "1.6.0"
|
||||||
|
|
||||||
prometheus = { version = "0.14.0" }
|
prometheus = { version = "0.13.0" }
|
||||||
|
|
||||||
# coconut/DKG related
|
# coconut/DKG related
|
||||||
# unfortunately until https://github.com/zkcrypto/bls12_381/issues/10 is resolved, we have to rely on the fork
|
# unfortunately until https://github.com/zkcrypto/bls12_381/issues/10 is resolved, we have to rely on the fork
|
||||||
# as we need to be able to serialize Gt so that we could create the lookup table for baby-step-giant-step algorithm
|
# as we need to be able to serialize Gt so that we could create the lookup table for baby-step-giant-step algorithm
|
||||||
# plus to make our live easier we need serde support from https://github.com/zkcrypto/bls12_381/pull/125
|
# plus to make our live easier we need serde support from https://github.com/zkcrypto/bls12_381/pull/125
|
||||||
bls12_381 = { git = "https://github.com/jstuczyn/bls12_381", default-features = false, branch = "temp/experimental-serdect-updated" }
|
bls12_381 = { git = "https://github.com/jstuczyn/bls12_381", default-features = false, branch = "temp/experimental-serdect" }
|
||||||
group = { version = "0.13.0", default-features = false }
|
group = { version = "0.13.0", default-features = false }
|
||||||
ff = { version = "0.13.1", default-features = false }
|
ff = { version = "0.13.0", default-features = false }
|
||||||
subtle = "2.5.0"
|
subtle = "2.5.0"
|
||||||
|
|
||||||
# cosmwasm-related
|
# cosmwasm-related
|
||||||
cosmwasm-schema = "=2.2.2"
|
cosmwasm-schema = "=1.4.3"
|
||||||
cosmwasm-std = "=2.2.2"
|
cosmwasm-std = "=1.4.3"
|
||||||
|
# use 0.5.0 as that's the version used by cosmwasm-std 1.4.3
|
||||||
|
# (and ideally we don't want to pull the same dependency twice)
|
||||||
|
serde-json-wasm = "=0.5.0"
|
||||||
|
cosmwasm-storage = "=1.4.3"
|
||||||
# same version as used by cosmwasm
|
# same version as used by cosmwasm
|
||||||
cw-utils = "=2.0.0"
|
cw-utils = "=1.0.1"
|
||||||
cw-storage-plus = "=2.0.0"
|
cw-storage-plus = "=1.2.0"
|
||||||
cw2 = { version = "=2.0.0" }
|
cw2 = { version = "=1.1.2" }
|
||||||
cw3 = { version = "=2.0.0" }
|
cw3 = { version = "=1.1.2" }
|
||||||
cw4 = { version = "=2.0.0" }
|
cw4 = { version = "=1.1.2" }
|
||||||
cw-controllers = { version = "=2.0.0" }
|
cw-controllers = { version = "=1.1.0" }
|
||||||
cw-multi-test = "=2.3.2"
|
|
||||||
|
|
||||||
# cosmrs-related
|
# cosmrs-related
|
||||||
bip32 = { version = "0.5.3", default-features = false }
|
bip32 = { version = "0.5.2", default-features = false }
|
||||||
|
|
||||||
|
# temporarily using a fork again (yay.) because we need staking and slashing support (which are already on main but not released)
|
||||||
cosmrs = { version = "0.21.1" }
|
# plus response message parsing (which is, as of the time of writing this message, waiting to get merged)
|
||||||
tendermint = "0.40.4"
|
#cosmrs = { path = "../cosmos-rust-fork/cosmos-rust/cosmrs" }
|
||||||
tendermint-rpc = "0.40.4"
|
cosmrs = { git = "https://github.com/cosmos/cosmos-rust", rev = "4b1332e6d8258ac845cef71589c8d362a669675a" } # unfortuntely we need a fork by yours truly to get the staking support
|
||||||
prost = { version = "0.13", default-features = false }
|
tendermint = "0.37.0" # same version as used by cosmrs
|
||||||
|
tendermint-rpc = "0.37.0" # same version as used by cosmrs
|
||||||
|
prost = { version = "0.12", default-features = false }
|
||||||
|
|
||||||
# wasm-related dependencies
|
# wasm-related dependencies
|
||||||
gloo-utils = "0.2.0"
|
gloo-utils = "0.2.0"
|
||||||
gloo-net = "0.6.0"
|
gloo-net = "0.5.0"
|
||||||
|
|
||||||
indexed_db_futures = "0.6.4"
|
# use a separate branch due to feature unification failures
|
||||||
js-sys = "0.3.76"
|
# this is blocked until the upstream removes outdates `wasm_bindgen` feature usage
|
||||||
|
# indexed_db_futures = "0.4.1"
|
||||||
|
indexed_db_futures = { git = "https://github.com/TiemenSch/rust-indexed-db", branch = "update-uuid" }
|
||||||
|
js-sys = "0.3.70"
|
||||||
serde-wasm-bindgen = "0.6.5"
|
serde-wasm-bindgen = "0.6.5"
|
||||||
tsify = "0.4.5"
|
tsify = "0.4.5"
|
||||||
wasm-bindgen = "0.2.99"
|
wasm-bindgen = "0.2.95"
|
||||||
wasm-bindgen-futures = "0.4.49"
|
wasm-bindgen-futures = "0.4.45"
|
||||||
wasm-bindgen-test = "0.3.49"
|
wasmtimer = "0.2.0"
|
||||||
wasmtimer = "0.4.1"
|
web-sys = "0.3.72"
|
||||||
web-sys = "0.3.76"
|
|
||||||
|
|
||||||
|
|
||||||
# for local development:
|
|
||||||
#[patch.crates-io]
|
|
||||||
#sphinx-packet = { path = "../sphinx" }
|
|
||||||
|
|
||||||
# Profile settings for individual crates
|
# Profile settings for individual crates
|
||||||
|
|
||||||
# Compile-time verified queries do quite a bit of work at compile time. Incremental
|
# Compile-time verified queries do quite a bit of work at compile time. Incremental
|
||||||
@@ -415,6 +416,10 @@ web-sys = "0.3.76"
|
|||||||
[profile.dev.package.sqlx-macros]
|
[profile.dev.package.sqlx-macros]
|
||||||
opt-level = 3
|
opt-level = 3
|
||||||
|
|
||||||
|
[profile.release.package.nym-socks5-listener]
|
||||||
|
strip = true
|
||||||
|
codegen-units = 1
|
||||||
|
|
||||||
[profile.release.package.nym-client-wasm]
|
[profile.release.package.nym-client-wasm]
|
||||||
# lto = true
|
# lto = true
|
||||||
opt-level = 'z'
|
opt-level = 'z'
|
||||||
@@ -433,13 +438,3 @@ opt-level = 'z'
|
|||||||
[profile.release.package.mix-fetch-wasm]
|
[profile.release.package.mix-fetch-wasm]
|
||||||
# lto = true
|
# lto = true
|
||||||
opt-level = 'z'
|
opt-level = 'z'
|
||||||
|
|
||||||
[workspace.lints.clippy]
|
|
||||||
unwrap_used = "deny"
|
|
||||||
expect_used = "deny"
|
|
||||||
todo = "deny"
|
|
||||||
dbg_macro = "deny"
|
|
||||||
exit = "deny"
|
|
||||||
panic = "deny"
|
|
||||||
unimplemented = "deny"
|
|
||||||
unreachable = "deny"
|
|
||||||
|
|||||||
@@ -1,23 +0,0 @@
|
|||||||
Boost Software License - Version 1.0 - August 17th, 2003
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person or organization
|
|
||||||
obtaining a copy of the software and accompanying documentation covered by
|
|
||||||
this license (the "Software") to use, reproduce, display, distribute,
|
|
||||||
execute, and transmit the Software, and to prepare derivative works of the
|
|
||||||
Software, and to permit third-parties to whom the Software is furnished to
|
|
||||||
do so, all subject to the following:
|
|
||||||
|
|
||||||
The copyright notices in the Software and this entire statement, including
|
|
||||||
the above license grant, this restriction and the following disclaimer,
|
|
||||||
must be included in all copies of the Software, in whole or in part, and
|
|
||||||
all derivative works of the Software, unless such copies or derivative
|
|
||||||
works are solely in the form of machine-executable object code generated by
|
|
||||||
a source language processor.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
|
||||||
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
|
||||||
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
|
||||||
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
||||||
DEALINGS IN THE SOFTWARE.
|
|
||||||
@@ -133,22 +133,17 @@ clippy: sdk-wasm-lint
|
|||||||
# Build contracts ready for deploy
|
# Build contracts ready for deploy
|
||||||
# -----------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
CONTRACTS=vesting_contract mixnet_contract nym_ecash cw3_flex_multisig cw4_group nym_coconut_dkg nym_pool_contract nym_performance_contract
|
CONTRACTS=vesting_contract mixnet_contract nym_ecash
|
||||||
CONTRACTS_WASM=$(addsuffix .wasm, $(CONTRACTS))
|
CONTRACTS_WASM=$(addsuffix .wasm, $(CONTRACTS))
|
||||||
CONTRACTS_OUT_DIR=contracts/target/wasm32-unknown-unknown/release
|
CONTRACTS_OUT_DIR=contracts/target/wasm32-unknown-unknown/release
|
||||||
|
|
||||||
contracts: build-release-contracts wasm-opt-contracts cosmwasm-check-contracts
|
contracts: build-release-contracts wasm-opt-contracts
|
||||||
|
|
||||||
wasm-opt-contracts:
|
wasm-opt-contracts:
|
||||||
for contract in $(CONTRACTS_WASM); do \
|
for contract in $(CONTRACTS_WASM); do \
|
||||||
wasm-opt --signext-lowering -Os $(CONTRACTS_OUT_DIR)/$$contract -o $(CONTRACTS_OUT_DIR)/$$contract; \
|
wasm-opt --signext-lowering -Os $(CONTRACTS_OUT_DIR)/$$contract -o $(CONTRACTS_OUT_DIR)/$$contract; \
|
||||||
done
|
done
|
||||||
|
|
||||||
cosmwasm-check-contracts:
|
|
||||||
for contract in $(CONTRACTS_WASM); do \
|
|
||||||
cosmwasm-check $(CONTRACTS_OUT_DIR)/$$contract; \
|
|
||||||
done
|
|
||||||
|
|
||||||
# Consider adding 's' to make plural consistent (beware: used in github workflow)
|
# Consider adding 's' to make plural consistent (beware: used in github workflow)
|
||||||
contract-schema:
|
contract-schema:
|
||||||
$(MAKE) -C contracts schema
|
$(MAKE) -C contracts schema
|
||||||
@@ -157,9 +152,18 @@ contract-schema:
|
|||||||
# Convenience targets for crates that are already part of the main workspace
|
# Convenience targets for crates that are already part of the main workspace
|
||||||
# -----------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
build-explorer-api:
|
||||||
|
cargo build -p explorer-api
|
||||||
|
|
||||||
build-nym-cli:
|
build-nym-cli:
|
||||||
cargo build -p nym-cli --release
|
cargo build -p nym-cli --release
|
||||||
|
|
||||||
|
build-nym-gateway:
|
||||||
|
cargo build -p nym-gateway --release
|
||||||
|
|
||||||
|
build-nym-mixnode:
|
||||||
|
cargo build -p nym-mixnode --release
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------
|
||||||
# Misc
|
# Misc
|
||||||
# -----------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------
|
||||||
@@ -168,12 +172,17 @@ generate-typescript:
|
|||||||
cd tools/ts-rs-cli && cargo run && cd ../..
|
cd tools/ts-rs-cli && cargo run && cd ../..
|
||||||
yarn types:lint:fix
|
yarn types:lint:fix
|
||||||
|
|
||||||
# Run the integration tests for public nym-api endpoints
|
|
||||||
run-api-tests:
|
run-api-tests:
|
||||||
dotenv -f envs/sandbox.env -- cargo test --test public-api-tests
|
cd nym-api/tests/functional_test && yarn test:qa
|
||||||
|
|
||||||
# Build debian package, and update PPA
|
# Build debian package, and update PPA
|
||||||
|
deb-mixnode: build-nym-mixnode
|
||||||
|
cargo deb -p nym-mixnode
|
||||||
|
|
||||||
|
deb-gateway: build-nym-gateway
|
||||||
|
cargo deb -p nym-gateway
|
||||||
|
|
||||||
deb-cli: build-nym-cli
|
deb-cli: build-nym-cli
|
||||||
cargo deb -p nym-cli
|
cargo deb -p nym-cli
|
||||||
|
|
||||||
deb: deb-cli
|
deb: deb-mixnode deb-gateway deb-cli
|
||||||
|
|||||||
@@ -13,8 +13,7 @@ The platform is composed of multiple Rust crates. Top-level executable binary cr
|
|||||||
* `nym-client` - an executable which you can build into your own applications. Use it for interacting with Nym nodes.
|
* `nym-client` - an executable which you can build into your own applications. Use it for interacting with Nym nodes.
|
||||||
* `nym-socks5-client` - a Socks5 proxy you can run on your machine and use with existing applications.
|
* `nym-socks5-client` - a Socks5 proxy you can run on your machine and use with existing applications.
|
||||||
* `nym-explorer` - a (projected) block explorer and (existing) mixnet viewer.
|
* `nym-explorer` - a (projected) block explorer and (existing) mixnet viewer.
|
||||||
* `nym-wallet` - a desktop wallet implemented using the [Tauri](https://tauri.app)) framework.
|
* `nym-wallet` - a desktop wallet implemented using the [Tauri](https://tauri.studio/en/docs/about/intro) framework.
|
||||||
* `nym-cli` - a tool for interacting with the network from the CLI.
|
|
||||||
<!-- coming soon
|
<!-- coming soon
|
||||||
* `nym-network-monitor` - sends packets through the full system to check that they are working as expected, and stores node uptime histories as the basis of a rewards system ("mixmining" or "proof-of-mixing").
|
* `nym-network-monitor` - sends packets through the full system to check that they are working as expected, and stores node uptime histories as the basis of a rewards system ("mixmining" or "proof-of-mixing").
|
||||||
-->
|
-->
|
||||||
@@ -36,20 +35,24 @@ client ───► Gateway ──┘ mix │ mix ┌─►mix ───►
|
|||||||
### Building
|
### Building
|
||||||
|
|
||||||
* Platform build instructions are available on Nym [Operators Guide documentation](https://nymtech.net/operators/binaries/building-nym.html).
|
* Platform build instructions are available on Nym [Operators Guide documentation](https://nymtech.net/operators/binaries/building-nym.html).
|
||||||
* Wallet build instructions are available [here](https://github.com/nymtech/nym/tree/master/nym-wallet#installation-prerequisites---linux--mac).
|
* Wallet build instructions are available on Nym [Technical docs](https://nymtech.net/docs/wallet/desktop-wallet.html).
|
||||||
|
|
||||||
### Developing
|
### Developing
|
||||||
|
|
||||||
|
There's a [`sandbox.env`](https://github.com/nymtech/nym/envs/sandbox.env) file provided which you can rename to `.env` if you want convenient testing environment. Read more about sandbox environment in our [Operators Guide page](https://nymtech.net/operators/sandbox.html).
|
||||||
|
|
||||||
References for developers:
|
References for developers:
|
||||||
|
|
||||||
* [Dev Docs](https://nym.com/docs/developers)
|
* [Developers Portal](https://nymtech.net/developers)
|
||||||
* [SDKs](https://nym.com/docs/developers/rust)
|
* [Typescript SDKs](https://sdk.nymtech.net/)
|
||||||
* [Network Docs](https://nym.com/docs/network)
|
* [Technical Documentation - Nym network overview](https://nymtech.net/docs/)
|
||||||
* [Release Cycle - git flow](https://nym.com/docs/operators/release-cycle)
|
* [Release Cycle - git flow](https://nymtech.net/operators/release-cycle.html)
|
||||||
|
|
||||||
### Developer chat
|
### Developer chat
|
||||||
|
|
||||||
You can chat to us in the #dev channel on [Matrix](https://matrix.to/#/#dev:nymtech.chat) or on the [Nym Forum](https://forum.nymtech.net).
|
You can chat to us in two places:
|
||||||
|
* The #dev channel on [Matrix](https://matrix.to/#/#dev:nymtech.chat)
|
||||||
|
* The various developer channels on [Discord](https://nymtech.net/go/discord)
|
||||||
|
|
||||||
### Tokenomics & Rewards
|
### Tokenomics & Rewards
|
||||||
|
|
||||||
@@ -66,14 +69,4 @@ As a general approach, licensing is as follows this pattern:
|
|||||||
- libraries and components are Apache 2.0 or MIT
|
- libraries and components are Apache 2.0 or MIT
|
||||||
- documentation is Apache 2.0 or CC0-1.0
|
- documentation is Apache 2.0 or CC0-1.0
|
||||||
|
|
||||||
Nym Node Operators and Validators Terms and Conditions can be found [here](https://nym.com/operators-validators-terms).
|
Nym Node Operators and Validators Temrs and Conditions can be found [here](https://nymtech.net/terms-and-conditions/operators/v1.0.0).
|
||||||
|
|
||||||
## Getting Started
|
|
||||||
|
|
||||||
```bash
|
|
||||||
yarn install
|
|
||||||
```
|
|
||||||
|
|
||||||
```bash
|
|
||||||
yarn build
|
|
||||||
```
|
|
||||||
|
|||||||
+56
-68
@@ -3,23 +3,37 @@ Critical bug or security issue 💥
|
|||||||
If you're here because you're trying to figure out how to notify us of a security issue, send us a PGP encrypted email to:
|
If you're here because you're trying to figure out how to notify us of a security issue, send us a PGP encrypted email to:
|
||||||
|
|
||||||
```
|
```
|
||||||
security@nym.com
|
security@nymte.ch
|
||||||
```
|
```
|
||||||
|
|
||||||
Encrypted with our public key which is available below in plain text and also on keyservers:
|
Encrypted with our public key which is available below in plain text and also on keyservers:
|
||||||
|
|
||||||
```
|
```
|
||||||
sec rsa4096/7C3C727F05090550 2023-10-30 [SC] [expire : 2026-10-29]
|
pub rsa4096 2023-10-30 [SC] [expire : 2026-10-29]
|
||||||
24B2592E801A5AAA8666C8BA7C3C727F05090550
|
24B2592E801A5AAA8666C8BA7C3C727F05090550
|
||||||
uid [ ultime ] Security Nym Technologies <security@nym.com>
|
uid [ ultime ] Security Nym Technologies <security@nymte.ch>
|
||||||
ssb rsa4096/ACD0FBD79DC70ACC 2023-10-30 [E] [expire : 2026-10-29]
|
sub rsa4096 2023-10-30 [E] [expire : 2026-10-29]
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
The fingerprint of the key is on the second line above.
|
The fingerprint of the key is on the second line above.
|
||||||
|
|
||||||
|
If you need to chat __urgently__ to our team for a __critical__ security issue:
|
||||||
|
|
||||||
|
go to Matrix, and alert the core engineers with a private direct message:
|
||||||
|
|
||||||
|
Jedrzej Stuczynski @jstuczyn:nymtech.chat
|
||||||
|
Mark Sinclair @mark:nymtech.chat
|
||||||
|
Raphaël Walther @raphael:nymtech.chat
|
||||||
|
|
||||||
Please avoid opening public issues on GitHub that contain information about a potential security vulnerability as this makes it difficult to reduce the impact and harm of valid security issues.
|
Please avoid opening public issues on GitHub that contain information about a potential security vulnerability as this makes it difficult to reduce the impact and harm of valid security issues.
|
||||||
|
|
||||||
|
If you don't know what Matrix is, you can follow this documentation to create an account on this federation of instant messaging servers:
|
||||||
|
|
||||||
|
[Matrix for Instant Messaging](https://matrix.org/docs/chat_basics/matrix-for-im/)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||||
|
|
||||||
@@ -34,69 +48,43 @@ vMFUIzBMHOPXH16036zGyFMC1esRd2qqil4b9KtLgCOkrD1VgpjcveoA0VyMJCN6
|
|||||||
LmKTrVjwjjDMxby+d49BolRWGnCofXozXwvNQx+CYv8M2WPErTpyYoofYFtpqr7A
|
LmKTrVjwjjDMxby+d49BolRWGnCofXozXwvNQx+CYv8M2WPErTpyYoofYFtpqr7A
|
||||||
fIufc/e0+um3zoGIbHejrhsbuH9Qf+MKsI+Ng93bdDtjeHz6MEgAlsTm0qeizYpj
|
fIufc/e0+um3zoGIbHejrhsbuH9Qf+MKsI+Ng93bdDtjeHz6MEgAlsTm0qeizYpj
|
||||||
IyKZIObPmfvrAm08hFZ8JnGk+XuooF36XWbJYjCCy0bOyMw1r7ZG99TcSwARAQAB
|
IyKZIObPmfvrAm08hFZ8JnGk+XuooF36XWbJYjCCy0bOyMw1r7ZG99TcSwARAQAB
|
||||||
tCxTZWN1cml0eSBOeW0gVGVjaG5vbG9naWVzIDxzZWN1cml0eUBueW0uY29tPokC
|
tC1TZWN1cml0eSBOeW0gVGVjaG5vbG9naWVzIDxzZWN1cml0eUBueW10ZS5jaD6J
|
||||||
VAQTAQoAPhYhBCSyWS6AGlqqhmbIunw8cn8FCQVQBQJnSd5VAhsDBQkFo5qABQsJ
|
AlQEEwEKAD4WIQQkslkugBpaqoZmyLp8PHJ/BQkFUAUCZT9elwIbAwUJBaOagAUL
|
||||||
CAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJEHw8cn8FCQVQPPIP/ipGz2zLAjE2dSE3
|
CQgHAwUVCgkICwUWAgMBAAIeAQIXgAAKCRB8PHJ/BQkFUL7dD/9zO73uI5VR+SWx
|
||||||
VcqOvras0DfqIL9HDm26Dg6QO2D/4YRntw0RqVyuy+zFnRUm+RZCKLPLUzbQ9Wjb
|
PFmJW+9QsPiQbVRvGwNZurctmQ2s2Pe0vHRELFeqD5oYvSx2Lequ3Ir+zn/C3kDM
|
||||||
G/Og5ttQVYQMu5eKu7OMvXkrbRo3teZFU+8IL08zIW6pyf9haxO6YMhLRy6cLYwW
|
kNs40obSL6jCBiLPkxEY0JqzPM9jZr7EjvlibWV3f6DxooRIqEyfN57I3OBGlqZE
|
||||||
0EYC6Qzn5gz3kI7VkI8fWfs2Dk4XEV3D+SVtBoF6KRxMXT6HZvpzoMSEJZBoNj8S
|
0Mx7sQuCcgau8C70DF952QhKUwXC2cmpmDKHVEEoio1xGSD4dQhGapCB32RQGtna
|
||||||
jw0TF8TFUQf49jUQbIHumukMswolrHi8a5ej8DSfNwSgz+Tt8oh5lu01kyUJiHn7
|
OGfAO9celNMvSq0Lp+aJxeACmWFY5T4/y79JPcT5vSs/yEIRmaH/fn2piwaFBsIq
|
||||||
nuHaY4Y9cHUVAOSwq/hovG52+ZE1r3aiswvle/B19o9pKeWWVvacSptGxDQagBtQ
|
gHJJMxO3740P1hF8j7KWUoUofuFaEALHBpEpjWTOj8ej1wmFlu+5F+jSVoc781Wb
|
||||||
igoNLdRvY0XN2TEyX9pOHR0AoVOxtIW11CpkKuDbQG9vPwovqJ2L6+Fh3pzHYzcI
|
ZZXu04cOBXnGTogzSxMpBe9TtLb28zd6WzFotC25KTI3pngMzXsQGLJLOwvoZKiS
|
||||||
2GIShNm/Z2SZBiUqbljJe9H4UAT/aHgMINkEG8qzUKwO42MA5HJT7YbHTR17/QSF
|
LFjPRjg1rwobmB3Q3J2W5GYSveia0CDsZGP+g87GVVf/oD2Djpa68xyVYwIYeA6T
|
||||||
Il5dhneRzmSbNcW2rdRwx/BmzrcsFJfqCt4JG/WDF293xSOjhFqQYvU4gCO+OB7o
|
3DNdS77qHiRuGiS4kWXyVjDqOICboR4uCvt09zlkBuLDdTWqWYARUvZjtjs4w/Ol
|
||||||
KXjX907XXDjS2KEJ71OGqVfk/P7BqEfQNfrLtb02TyXJAPQXHhybv23c4E7zUs9V
|
rdrBI3A88ti8fRldYaNpu17ME1ilpN44yKoJtqiWc3Tisk8eYLfx6c7FQF3PrRva
|
||||||
lMjNizzxYB96uwJb0LAB2ijzEwoP91uGT2tFjk6F08x2QiArmXUdgrv44b39Stia
|
mr7FZvhFsYML5CeNFHTEzN6Y3jjKN/60DvCfodWnWFK47Txkl8UAXGY2W9B0fWqQ
|
||||||
gJS0GYKqSzyr10xHhUuDA+GKYtcitC1TZWN1cml0eSBOeW0gVGVjaG5vbG9naWVz
|
wUVr8uLuMyyMiKbeoufi7rGOj6AMErkCDQRlP16XARAA8FGmD5J3tM1BOM1niJxZ
|
||||||
IDxzZWN1cml0eUBueW10ZS5jaD6JAjYEMAEKACAWIQQkslkugBpaqoZmyLp8PHJ/
|
JTdCauzEtxEoBL0RuqGBkR8U29sRM6DwuzjU7PwscFnBaGyU+eU73GwGkH3ozFfF
|
||||||
BQkFUAUCZ0nftQIdIAAKCRB8PHJ/BQkFUFHDEACtyNuUEjKCLAT5mSfow85PjFgo
|
tllYhQrhP/kkN+0rEO5Xi+nR+4JCFRqrf3nJXAAPfiksURMp8er1dUOY2/e1ZSoL
|
||||||
o8kHjQr/IIQ7ZbBOHeJJcrxDuypssiLh5XUjF3x5BiBfZ6vCxSb81RRwsDMp0mA1
|
tS+nzUivV8CfE+pgj/5YtGwPC+KYHLATkKkMELCrbW4UO06VWOqQsvr6kivXuJQQ
|
||||||
qzv9G8sgW0HTQUnZ9oH6CYut2NgzAnQpmuacrunm9Zy0FJ3ejbmwUY/NqK6gJkle
|
LdEAMpBlADmXFG45DmPKQzsBWUgvTwyGy3LX0nys8cgpex9BH8hhr01QmGyP469s
|
||||||
66duHKhAy7DWjj7amd0C8bPDR+PA44fI3MezDHkQNaauKZTRqd1TqH8Qk5PAl4cB
|
N3cNrtFuu8U6RAsiCD/8mlBuD3EQEU5SF0lc7kCICAZk+wElmXnimEi0TOYsbz6k
|
||||||
o5gVzeZh/U7/usvtGhazAIUF5BqK6bTmDnYopg+2x8jjwrG4+08GrttZkNjBLXeA
|
90lteicX70rA9GNeyI76H+VSOYvWpkRwaJAgUdzrAM1o9SHASq+cZ6nD85OZioQk
|
||||||
Y/2U064yMz12LPv01qqAFdZ+coRy/ps/gOQTz34/VeW0CFy7TMqs4t3vSBWTqU7w
|
DWM6+Q+sf2oen0qJnnGmUr93kJIC0PIdgrXRrtiNfeRa1Z/H0LmREyyEMoFiVivn
|
||||||
hnw/qj6cM33fdxctj6KDgJSCkZdx2fvwXgxiPqUa5+j9FlFBeD5RDAl6g6t8N1/K
|
z1vVk85Oq6Sf3ltUwvmDzuuJOtsp2Qp6+x6Snn/yKauI4uf4Cf/wKUch4r6Bwgg5
|
||||||
Xca+zNYuSZgc297q1D+mtSD1C7uJNPxoAl+Bv5KNKpsjfQ+m04++CIFtGyX22aCA
|
Dw49ky7lwlnALio4GIVoGLpLef93wWoDmp4Klyh3ZPf2nB0U91u3bHRUo7m+D7QJ
|
||||||
h2/tHwQZIXhOiMAKOoupidDVDhgxtCJ3Ps416xL0sTZfsPfg+j1Uv/Em9pzPClEl
|
98cyKtqLLzjg7szGf60pIWNWRsadYQT3bSncynqknAjOV3BCvx6/ivsnpj//QjYR
|
||||||
fX6+1O4DdSyZUQ4VsjMu/H5W/NQdbHgmqFrxQ6WX/0s5GMwO6GMDiPe8sOrwz9wD
|
HtviUAcQ1DBB6UC6q23FIs0AEQEAAYkCPAQYAQoAJhYhBCSyWS6AGlqqhmbIunw8
|
||||||
WYtyjafxXOHEZ1OjYX5gr7bGaG4oKc2btTJN0B3Phg4dStnHCNjEYccxuV3507fj
|
cn8FCQVQBQJlP16XAhsMBQkFo5qAAAoJEHw8cn8FCQVQzukP/iLxjOxT+UpPR//c
|
||||||
HnNotkpXF2nGLxy+PYkCVAQTAQoAPhYhBCSyWS6AGlqqhmbIunw8cn8FCQVQBQJl
|
prDVSLkP4pF5bmw36U07jvqpS+/KTXsxiiQleffRabOpNLcd+K1ueavyt9nnIwHH
|
||||||
P16XAhsDBQkFo5qABQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJEHw8cn8FCQVQ
|
tHS9kM9A7DBw3LnpEbXki46QDCCI6niGijlLOEeAWqnocwMNTT05wVVgCtO3DQP2
|
||||||
vt0P/3M7ve4jlVH5JbE8WYlb71Cw+JBtVG8bA1m6ty2ZDazY97S8dEQsV6oPmhi9
|
MoSCcqHpXDChvOyr5d5xjYLVJhlctIMSomcVzGryjknPu0Yj/TkC/4c+m86ZWQUD
|
||||||
LHYt6q7civ7Of8LeQMyQ2zjShtIvqMIGIs+TERjQmrM8z2NmvsSO+WJtZXd/oPGi
|
HqMHQIuiEenvb62/F4c5OJIRZPEn70wdddkgJuJU3eHdHrnuhCkjCC93GQGbGj03
|
||||||
hEioTJ83nsjc4EaWpkTQzHuxC4JyBq7wLvQMX3nZCEpTBcLZyamYModUQSiKjXEZ
|
Zqos6699y6hmPeD3U5IUv8ujwZYVCCuDm8gJfrp3R6WLfeZeK9WmTVBpCzsDg3fV
|
||||||
IPh1CEZqkIHfZFAa2do4Z8A71x6U0y9KrQun5onF4AKZYVjlPj/Lv0k9xPm9Kz/I
|
hSwmOk6pp8DAq1/Dev3yRkFggCEyGK6c9b+a0CRBncl8e5Q0QQIzNiS/uExQP3h+
|
||||||
QhGZof9+famLBoUGwiqAckkzE7fvjQ/WEXyPspZShSh+4VoQAscGkSmNZM6Px6PX
|
ELJs3P0MLP+6FWhNUry09n3lnWkr1hY+v1M0GAxbfdv/tsCN1Pq/VQEz+CTqXqya
|
||||||
CYWW77kX6NJWhzvzVZtlle7Thw4FecZOiDNLEykF71O0tvbzN3pbMWi0LbkpMjem
|
ftWldOHWw6Hh+gtwxcHjG4MBOrO5oICQ3lh2hGwQ58cDgZYSK/OGgJ9BggFl1CcM
|
||||||
eAzNexAYsks7C+hkqJIsWM9GODWvChuYHdDcnZbkZhK96JrQIOxkY/6DzsZVV/+g
|
0uGC0/TRCI1zt/4y+7efSZQMZkHo7VC/3MFbp2hcNejpW+BxVuwKTunFvWK3TLhq
|
||||||
PYOOlrrzHJVjAhh4DpPcM11LvuoeJG4aJLiRZfJWMOo4gJuhHi4K+3T3OWQG4sN1
|
sSlQ5yyhqchooepsFHq9bosKFjLJC01uprBv1rinoNduOy43FbyS7JPRRspANN0R
|
||||||
NapZgBFS9mO2OzjD86Wt2sEjcDzy2Lx9GV1ho2m7XswTWKWk3jjIqgm2qJZzdOKy
|
iC2pMbWdE0ZTQaFq6tPIg058pjqi
|
||||||
Tx5gt/HpzsVAXc+tG9qavsVm+EWxgwvkJ40UdMTM3pjeOMo3/rQO8J+h1adYUrjt
|
=nqgX
|
||||||
PGSXxQBcZjZb0HR9apDBRWvy4u4zLIyIpt6i5+LusY6PoAwSuQINBGU/XpcBEADw
|
|
||||||
UaYPkne0zUE4zWeInFklN0Jq7MS3ESgEvRG6oYGRHxTb2xEzoPC7ONTs/CxwWcFo
|
|
||||||
bJT55TvcbAaQfejMV8W2WViFCuE/+SQ37SsQ7leL6dH7gkIVGqt/eclcAA9+KSxR
|
|
||||||
Eynx6vV1Q5jb97VlKgu1L6fNSK9XwJ8T6mCP/li0bA8L4pgcsBOQqQwQsKttbhQ7
|
|
||||||
TpVY6pCy+vqSK9e4lBAt0QAykGUAOZcUbjkOY8pDOwFZSC9PDIbLctfSfKzxyCl7
|
|
||||||
H0EfyGGvTVCYbI/jr2w3dw2u0W67xTpECyIIP/yaUG4PcRARTlIXSVzuQIgIBmT7
|
|
||||||
ASWZeeKYSLRM5ixvPqT3SW16JxfvSsD0Y17Ijvof5VI5i9amRHBokCBR3OsAzWj1
|
|
||||||
IcBKr5xnqcPzk5mKhCQNYzr5D6x/ah6fSomecaZSv3eQkgLQ8h2CtdGu2I195FrV
|
|
||||||
n8fQuZETLIQygWJWK+fPW9WTzk6rpJ/eW1TC+YPO64k62ynZCnr7HpKef/Ipq4ji
|
|
||||||
5/gJ//ApRyHivoHCCDkPDj2TLuXCWcAuKjgYhWgYukt5/3fBagOangqXKHdk9/ac
|
|
||||||
HRT3W7dsdFSjub4PtAn3xzIq2osvOODuzMZ/rSkhY1ZGxp1hBPdtKdzKeqScCM5X
|
|
||||||
cEK/Hr+K+yemP/9CNhEe2+JQBxDUMEHpQLqrbcUizQARAQABiQI8BBgBCgAmFiEE
|
|
||||||
JLJZLoAaWqqGZsi6fDxyfwUJBVAFAmU/XpcCGwwFCQWjmoAACgkQfDxyfwUJBVDO
|
|
||||||
6Q/+IvGM7FP5Sk9H/9ymsNVIuQ/ikXlubDfpTTuO+qlL78pNezGKJCV599Fps6k0
|
|
||||||
tx34rW55q/K32ecjAce0dL2Qz0DsMHDcuekRteSLjpAMIIjqeIaKOUs4R4Baqehz
|
|
||||||
Aw1NPTnBVWAK07cNA/YyhIJyoelcMKG87Kvl3nGNgtUmGVy0gxKiZxXMavKOSc+7
|
|
||||||
RiP9OQL/hz6bzplZBQMeowdAi6IR6e9vrb8Xhzk4khFk8SfvTB112SAm4lTd4d0e
|
|
||||||
ue6EKSMIL3cZAZsaPTdmqizrr33LqGY94PdTkhS/y6PBlhUIK4ObyAl+undHpYt9
|
|
||||||
5l4r1aZNUGkLOwODd9WFLCY6TqmnwMCrX8N6/fJGQWCAITIYrpz1v5rQJEGdyXx7
|
|
||||||
lDRBAjM2JL+4TFA/eH4Qsmzc/Qws/7oVaE1SvLT2feWdaSvWFj6/UzQYDFt92/+2
|
|
||||||
wI3U+r9VATP4JOperJp+1aV04dbDoeH6C3DFweMbgwE6s7mggJDeWHaEbBDnxwOB
|
|
||||||
lhIr84aAn0GCAWXUJwzS4YLT9NEIjXO3/jL7t59JlAxmQejtUL/cwVunaFw16Olb
|
|
||||||
4HFW7ApO6cW9YrdMuGqxKVDnLKGpyGih6mwUer1uiwoWMskLTW6msG/WuKeg1247
|
|
||||||
LjcVvJLsk9FGykA03RGILakxtZ0TRlNBoWrq08iDTnymOqI=
|
|
||||||
=QPTf
|
|
||||||
-----END PGP PUBLIC KEY BLOCK-----
|
-----END PGP PUBLIC KEY BLOCK-----
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "nym-client"
|
name = "nym-client"
|
||||||
version = "1.1.57"
|
version = "1.1.42"
|
||||||
authors = ["Dave Hrycyszyn <futurechimp@users.noreply.github.com>", "Jędrzej Stuczyński <andrew@nymtech.net>"]
|
authors = ["Dave Hrycyszyn <futurechimp@users.noreply.github.com>", "Jędrzej Stuczyński <andrew@nymtech.net>"]
|
||||||
description = "Implementation of the Nym Client"
|
description = "Implementation of the Nym Client"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
@@ -46,7 +46,6 @@ nym-bandwidth-controller = { path = "../../common/bandwidth-controller" }
|
|||||||
nym-bin-common = { path = "../../common/bin-common", features = [
|
nym-bin-common = { path = "../../common/bin-common", features = [
|
||||||
"output_format",
|
"output_format",
|
||||||
"clap",
|
"clap",
|
||||||
"basic_tracing",
|
|
||||||
] }
|
] }
|
||||||
nym-client-core = { path = "../../common/client-core", features = [
|
nym-client-core = { path = "../../common/client-core", features = [
|
||||||
"fs-credentials-storage",
|
"fs-credentials-storage",
|
||||||
|
|||||||
@@ -2048,11 +2048,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/http-proxy-middleware": {
|
"node_modules/http-proxy-middleware": {
|
||||||
"version": "2.0.9",
|
"version": "2.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz",
|
"resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz",
|
||||||
"integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==",
|
"integrity": "sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/http-proxy": "^1.17.8",
|
"@types/http-proxy": "^1.17.8",
|
||||||
"http-proxy": "^1.18.1",
|
"http-proxy": "^1.18.1",
|
||||||
@@ -6096,9 +6095,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"http-proxy-middleware": {
|
"http-proxy-middleware": {
|
||||||
"version": "2.0.9",
|
"version": "2.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz",
|
"resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz",
|
||||||
"integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==",
|
"integrity": "sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@types/http-proxy": "^1.17.8",
|
"@types/http-proxy": "^1.17.8",
|
||||||
|
|||||||
@@ -25,7 +25,6 @@ pub mod old_config_v1_1_13;
|
|||||||
pub mod old_config_v1_1_20;
|
pub mod old_config_v1_1_20;
|
||||||
pub mod old_config_v1_1_20_2;
|
pub mod old_config_v1_1_20_2;
|
||||||
pub mod old_config_v1_1_33;
|
pub mod old_config_v1_1_33;
|
||||||
pub mod old_config_v1_1_54;
|
|
||||||
mod persistence;
|
mod persistence;
|
||||||
mod template;
|
mod template;
|
||||||
|
|
||||||
@@ -57,7 +56,7 @@ pub fn default_data_directory<P: AsRef<Path>>(id: P) -> PathBuf {
|
|||||||
.join(DEFAULT_DATA_DIR)
|
.join(DEFAULT_DATA_DIR)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Deserialize, PartialEq, Serialize, Clone)]
|
#[derive(Debug, Deserialize, PartialEq, Serialize)]
|
||||||
pub struct Config {
|
pub struct Config {
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
pub base: BaseClientConfig,
|
pub base: BaseClientConfig,
|
||||||
@@ -95,10 +94,6 @@ impl CliClientConfig for Config {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Config {
|
impl Config {
|
||||||
pub fn base(&self) -> BaseClientConfig {
|
|
||||||
self.base.clone()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn new<S: AsRef<str>>(id: S) -> Self {
|
pub fn new<S: AsRef<str>>(id: S) -> Self {
|
||||||
Config {
|
Config {
|
||||||
base: BaseClientConfig::new(id.as_ref(), env!("CARGO_PKG_VERSION")),
|
base: BaseClientConfig::new(id.as_ref(), env!("CARGO_PKG_VERSION")),
|
||||||
@@ -214,7 +209,7 @@ impl SocketType {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Deserialize, PartialEq, Eq, Serialize, Clone)]
|
#[derive(Debug, Deserialize, PartialEq, Eq, Serialize)]
|
||||||
#[serde(default, deny_unknown_fields)]
|
#[serde(default, deny_unknown_fields)]
|
||||||
pub struct Socket {
|
pub struct Socket {
|
||||||
pub socket_type: SocketType,
|
pub socket_type: SocketType,
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
use crate::client::config::persistence::ClientPaths;
|
use crate::client::config::persistence::ClientPaths;
|
||||||
use crate::client::config::{default_config_filepath, Socket, SocketType};
|
use crate::client::config::{default_config_filepath, Config, Socket, SocketType};
|
||||||
use crate::error::ClientError;
|
use crate::error::ClientError;
|
||||||
use nym_bin_common::logging::LoggingSettings;
|
use nym_bin_common::logging::LoggingSettings;
|
||||||
use nym_client_core::config::disk_persistence::old_v1_1_33::CommonClientPathsV1_1_33;
|
use nym_client_core::config::disk_persistence::old_v1_1_33::CommonClientPathsV1_1_33;
|
||||||
@@ -14,8 +14,6 @@ use std::io;
|
|||||||
use std::net::{IpAddr, Ipv4Addr};
|
use std::net::{IpAddr, Ipv4Addr};
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
|
||||||
use super::old_config_v1_1_54::ConfigV1_1_54;
|
|
||||||
|
|
||||||
#[derive(Debug, Deserialize, PartialEq, Eq, Serialize, Clone)]
|
#[derive(Debug, Deserialize, PartialEq, Eq, Serialize, Clone)]
|
||||||
pub struct ClientPathsV1_1_33 {
|
pub struct ClientPathsV1_1_33 {
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
@@ -35,21 +33,6 @@ pub struct ConfigV1_1_33 {
|
|||||||
pub logging: LoggingSettings,
|
pub logging: LoggingSettings,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TryFrom<ConfigV1_1_33> for ConfigV1_1_54 {
|
|
||||||
type Error = ClientError;
|
|
||||||
|
|
||||||
fn try_from(value: ConfigV1_1_33) -> Result<Self, Self::Error> {
|
|
||||||
Ok(ConfigV1_1_54 {
|
|
||||||
base: value.base.into(),
|
|
||||||
socket: value.socket.into(),
|
|
||||||
storage_paths: ClientPaths {
|
|
||||||
common_paths: value.storage_paths.common_paths.upgrade_default()?,
|
|
||||||
},
|
|
||||||
logging: value.logging,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ConfigV1_1_33 {
|
impl ConfigV1_1_33 {
|
||||||
pub fn read_from_toml_file<P: AsRef<Path>>(path: P) -> io::Result<Self> {
|
pub fn read_from_toml_file<P: AsRef<Path>>(path: P) -> io::Result<Self> {
|
||||||
read_config_from_toml_file(path)
|
read_config_from_toml_file(path)
|
||||||
@@ -58,6 +41,17 @@ impl ConfigV1_1_33 {
|
|||||||
pub fn read_from_default_path<P: AsRef<Path>>(id: P) -> io::Result<Self> {
|
pub fn read_from_default_path<P: AsRef<Path>>(id: P) -> io::Result<Self> {
|
||||||
Self::read_from_toml_file(default_config_filepath(id))
|
Self::read_from_toml_file(default_config_filepath(id))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn try_upgrade(self) -> Result<Config, ClientError> {
|
||||||
|
Ok(Config {
|
||||||
|
base: self.base.into(),
|
||||||
|
socket: self.socket.into(),
|
||||||
|
storage_paths: ClientPaths {
|
||||||
|
common_paths: self.storage_paths.common_paths.upgrade_default()?,
|
||||||
|
},
|
||||||
|
logging: self.logging,
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Deserialize, PartialEq, Eq, Serialize, Clone, Copy)]
|
#[derive(Debug, Deserialize, PartialEq, Eq, Serialize, Clone, Copy)]
|
||||||
|
|||||||
@@ -1,41 +0,0 @@
|
|||||||
use std::{io, path::Path};
|
|
||||||
|
|
||||||
use nym_bin_common::logging::LoggingSettings;
|
|
||||||
use nym_client_core::config::old_config_v1_1_54::ConfigV1_1_54 as BaseConfigV1_1_54;
|
|
||||||
use nym_config::read_config_from_toml_file;
|
|
||||||
use serde::{Deserialize, Serialize};
|
|
||||||
|
|
||||||
use crate::error::ClientError;
|
|
||||||
|
|
||||||
use super::{default_config_filepath, persistence::ClientPaths, Config, Socket};
|
|
||||||
|
|
||||||
#[derive(Debug, Deserialize, PartialEq, Serialize, Clone)]
|
|
||||||
pub struct ConfigV1_1_54 {
|
|
||||||
#[serde(flatten)]
|
|
||||||
pub base: BaseConfigV1_1_54,
|
|
||||||
|
|
||||||
pub socket: Socket,
|
|
||||||
|
|
||||||
pub storage_paths: ClientPaths,
|
|
||||||
|
|
||||||
pub logging: LoggingSettings,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ConfigV1_1_54 {
|
|
||||||
pub fn read_from_toml_file<P: AsRef<Path>>(path: P) -> io::Result<Self> {
|
|
||||||
read_config_from_toml_file(path)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn read_from_default_path<P: AsRef<Path>>(id: P) -> io::Result<Self> {
|
|
||||||
Self::read_from_toml_file(default_config_filepath(id))
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn try_upgrade(self) -> Result<Config, ClientError> {
|
|
||||||
Ok(Config {
|
|
||||||
base: self.base.into(),
|
|
||||||
socket: self.socket,
|
|
||||||
storage_paths: self.storage_paths,
|
|
||||||
logging: self.logging,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -92,19 +92,15 @@ host = '{{ socket.host }}'
|
|||||||
|
|
||||||
[debug]
|
[debug]
|
||||||
|
|
||||||
|
[debug.traffic]
|
||||||
|
average_packet_delay = '{{ debug.traffic.average_packet_delay }}'
|
||||||
|
message_sending_average_delay = '{{ debug.traffic.message_sending_average_delay }}'
|
||||||
|
|
||||||
[debug.acknowledgements]
|
[debug.acknowledgements]
|
||||||
average_ack_delay = '{{ debug.acknowledgements.average_ack_delay }}'
|
average_ack_delay = '{{ debug.acknowledgements.average_ack_delay }}'
|
||||||
|
|
||||||
[debug.cover_traffic]
|
[debug.cover_traffic]
|
||||||
loop_cover_traffic_average_delay = '{{ debug.cover_traffic.loop_cover_traffic_average_delay }}'
|
loop_cover_traffic_average_delay = '{{ debug.cover_traffic.loop_cover_traffic_average_delay }}'
|
||||||
|
|
||||||
[debug.stats_reporting]
|
|
||||||
enabled = {{ debug.stats_reporting.enabled }}
|
|
||||||
provider_address = '{{ debug.stats_reporting.provider_address }}'
|
|
||||||
reporting_interval = '{{ debug.stats_reporting.reporting_interval }}'
|
|
||||||
|
|
||||||
[debug.forget_me]
|
|
||||||
client = {{ debug.forget_me.client }}
|
|
||||||
stats = {{ debug.forget_me.stats }}
|
|
||||||
|
|
||||||
"#;
|
"#;
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ pub use nym_sphinx::addressing::clients::Recipient;
|
|||||||
|
|
||||||
pub mod config;
|
pub mod config;
|
||||||
|
|
||||||
type NativeClientBuilder = BaseClientBuilder<QueryHttpRpcNyxdClient, OnDiskPersistent>;
|
type NativeClientBuilder<'a> = BaseClientBuilder<'a, QueryHttpRpcNyxdClient, OnDiskPersistent>;
|
||||||
|
|
||||||
pub struct SocketClient {
|
pub struct SocketClient {
|
||||||
/// Client configuration options, including, among other things, packet sending rates,
|
/// Client configuration options, including, among other things, packet sending rates,
|
||||||
@@ -32,10 +32,6 @@ pub struct SocketClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl SocketClient {
|
impl SocketClient {
|
||||||
pub fn config(&self) -> Config {
|
|
||||||
self.config.clone()
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn new(config: Config, custom_mixnet: Option<PathBuf>) -> Self {
|
pub fn new(config: Config, custom_mixnet: Option<PathBuf>) -> Self {
|
||||||
SocketClient {
|
SocketClient {
|
||||||
config,
|
config,
|
||||||
@@ -49,7 +45,7 @@ impl SocketClient {
|
|||||||
client_output: ClientOutput,
|
client_output: ClientOutput,
|
||||||
client_state: ClientState,
|
client_state: ClientState,
|
||||||
self_address: &Recipient,
|
self_address: &Recipient,
|
||||||
task_client: nym_task::TaskClient,
|
shutdown: nym_task::TaskClient,
|
||||||
packet_type: PacketType,
|
packet_type: PacketType,
|
||||||
) {
|
) {
|
||||||
info!("Starting websocket listener...");
|
info!("Starting websocket listener...");
|
||||||
@@ -77,15 +73,10 @@ impl SocketClient {
|
|||||||
shared_lane_queue_lengths,
|
shared_lane_queue_lengths,
|
||||||
reply_controller_sender,
|
reply_controller_sender,
|
||||||
Some(packet_type),
|
Some(packet_type),
|
||||||
task_client.fork("websocket_handler"),
|
|
||||||
);
|
);
|
||||||
|
|
||||||
websocket::Listener::new(
|
websocket::Listener::new(config.socket.host, config.socket.listening_port)
|
||||||
config.socket.host,
|
.start(websocket_handler, shutdown);
|
||||||
config.socket.listening_port,
|
|
||||||
task_client.with_suffix("websocket_listener"),
|
|
||||||
)
|
|
||||||
.start(websocket_handler);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// blocking version of `start_socket` method. Will run forever (or until SIGINT is sent)
|
/// blocking version of `start_socket` method. Will run forever (or until SIGINT is sent)
|
||||||
@@ -117,9 +108,8 @@ impl SocketClient {
|
|||||||
let storage = self.initialise_storage().await?;
|
let storage = self.initialise_storage().await?;
|
||||||
let user_agent = nym_bin_common::bin_info!().into();
|
let user_agent = nym_bin_common::bin_info!().into();
|
||||||
|
|
||||||
let mut base_client =
|
let mut base_client = BaseClientBuilder::new(&self.config.base, storage, dkg_query_client)
|
||||||
BaseClientBuilder::new(self.config().base(), storage, dkg_query_client)
|
.with_user_agent(user_agent);
|
||||||
.with_user_agent(user_agent);
|
|
||||||
|
|
||||||
if let Some(custom_mixnet) = &self.custom_mixnet {
|
if let Some(custom_mixnet) = &self.custom_mixnet {
|
||||||
base_client = base_client.with_stored_topology(custom_mixnet)?;
|
base_client = base_client.with_stored_topology(custom_mixnet)?;
|
||||||
|
|||||||
@@ -81,8 +81,6 @@ impl From<Init> for OverrideConfig {
|
|||||||
|
|
||||||
nyxd_urls: init_config.common_args.nyxd_urls,
|
nyxd_urls: init_config.common_args.nyxd_urls,
|
||||||
enabled_credentials_mode: init_config.common_args.enabled_credentials_mode,
|
enabled_credentials_mode: init_config.common_args.enabled_credentials_mode,
|
||||||
stats_reporting_address: init_config.common_args.stats_reporting_address,
|
|
||||||
forget_me: init_config.common_args.forget_me.into(),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ use crate::client::config::old_config_v1_1_13::OldConfigV1_1_13;
|
|||||||
use crate::client::config::old_config_v1_1_20::ConfigV1_1_20;
|
use crate::client::config::old_config_v1_1_20::ConfigV1_1_20;
|
||||||
use crate::client::config::old_config_v1_1_20_2::ConfigV1_1_20_2;
|
use crate::client::config::old_config_v1_1_20_2::ConfigV1_1_20_2;
|
||||||
use crate::client::config::old_config_v1_1_33::ConfigV1_1_33;
|
use crate::client::config::old_config_v1_1_33::ConfigV1_1_33;
|
||||||
use crate::client::config::old_config_v1_1_54::ConfigV1_1_54;
|
|
||||||
use crate::client::config::{BaseClientConfig, Config};
|
use crate::client::config::{BaseClientConfig, Config};
|
||||||
use crate::commands::ecash::Ecash;
|
use crate::commands::ecash::Ecash;
|
||||||
use crate::error::ClientError;
|
use crate::error::ClientError;
|
||||||
@@ -14,10 +13,8 @@ use clap::{Parser, Subcommand};
|
|||||||
use log::{error, info};
|
use log::{error, info};
|
||||||
use nym_bin_common::bin_info;
|
use nym_bin_common::bin_info;
|
||||||
use nym_bin_common::completions::{fig_generate, ArgShell};
|
use nym_bin_common::completions::{fig_generate, ArgShell};
|
||||||
use nym_client::client::Recipient;
|
|
||||||
use nym_client_core::cli_helpers::CliClient;
|
use nym_client_core::cli_helpers::CliClient;
|
||||||
use nym_client_core::client::base_client::storage::migration_helpers::v1_1_33;
|
use nym_client_core::client::base_client::storage::migration_helpers::v1_1_33;
|
||||||
use nym_client_core::config::ForgetMe;
|
|
||||||
use nym_config::OptionalSet;
|
use nym_config::OptionalSet;
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::net::IpAddr;
|
use std::net::IpAddr;
|
||||||
@@ -107,8 +104,6 @@ pub(crate) struct OverrideConfig {
|
|||||||
no_cover: bool,
|
no_cover: bool,
|
||||||
nyxd_urls: Option<Vec<url::Url>>,
|
nyxd_urls: Option<Vec<url::Url>>,
|
||||||
enabled_credentials_mode: Option<bool>,
|
enabled_credentials_mode: Option<bool>,
|
||||||
stats_reporting_address: Option<Recipient>,
|
|
||||||
forget_me: ForgetMe,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) async fn execute(args: Cli) -> Result<(), Box<dyn Error + Send + Sync>> {
|
pub(crate) async fn execute(args: Cli) -> Result<(), Box<dyn Error + Send + Sync>> {
|
||||||
@@ -136,7 +131,6 @@ pub(crate) fn override_config(config: Config, args: OverrideConfig) -> Config {
|
|||||||
args.fastmode,
|
args.fastmode,
|
||||||
)
|
)
|
||||||
.with_base(BaseClientConfig::with_disabled_cover_traffic, args.no_cover)
|
.with_base(BaseClientConfig::with_disabled_cover_traffic, args.no_cover)
|
||||||
.with_base(BaseClientConfig::with_forget_me, args.forget_me)
|
|
||||||
.with_optional(Config::with_port, args.port)
|
.with_optional(Config::with_port, args.port)
|
||||||
.with_optional(Config::with_host, args.host)
|
.with_optional(Config::with_host, args.host)
|
||||||
.with_optional_custom_env_ext(
|
.with_optional_custom_env_ext(
|
||||||
@@ -155,11 +149,6 @@ pub(crate) fn override_config(config: Config, args: OverrideConfig) -> Config {
|
|||||||
BaseClientConfig::with_disabled_credentials,
|
BaseClientConfig::with_disabled_credentials,
|
||||||
args.enabled_credentials_mode.map(|b| !b),
|
args.enabled_credentials_mode.map(|b| !b),
|
||||||
)
|
)
|
||||||
.with_optional_env_ext(
|
|
||||||
BaseClientConfig::with_enabled_stats_reporting_address,
|
|
||||||
args.stats_reporting_address,
|
|
||||||
nym_network_defaults::var_names::CLIENT_STATS_COLLECTION_PROVIDER,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn try_upgrade_v1_1_13_config(id: &str) -> Result<bool, ClientError> {
|
async fn try_upgrade_v1_1_13_config(id: &str) -> Result<bool, ClientError> {
|
||||||
@@ -178,8 +167,7 @@ async fn try_upgrade_v1_1_13_config(id: &str) -> Result<bool, ClientError> {
|
|||||||
let updated_step2: ConfigV1_1_20_2 = updated_step1.into();
|
let updated_step2: ConfigV1_1_20_2 = updated_step1.into();
|
||||||
let (updated_step3, gateway_config) = updated_step2.upgrade()?;
|
let (updated_step3, gateway_config) = updated_step2.upgrade()?;
|
||||||
let old_paths = updated_step3.storage_paths.clone();
|
let old_paths = updated_step3.storage_paths.clone();
|
||||||
let updated_step4: ConfigV1_1_54 = updated_step3.try_into()?;
|
let updated = updated_step3.try_upgrade()?;
|
||||||
let updated = updated_step4.try_upgrade()?;
|
|
||||||
|
|
||||||
v1_1_33::migrate_gateway_details(
|
v1_1_33::migrate_gateway_details(
|
||||||
&old_paths.common_paths,
|
&old_paths.common_paths,
|
||||||
@@ -207,8 +195,7 @@ async fn try_upgrade_v1_1_20_config(id: &str) -> Result<bool, ClientError> {
|
|||||||
let updated_step1: ConfigV1_1_20_2 = old_config.into();
|
let updated_step1: ConfigV1_1_20_2 = old_config.into();
|
||||||
let (updated_step2, gateway_config) = updated_step1.upgrade()?;
|
let (updated_step2, gateway_config) = updated_step1.upgrade()?;
|
||||||
let old_paths = updated_step2.storage_paths.clone();
|
let old_paths = updated_step2.storage_paths.clone();
|
||||||
let updated_step3: ConfigV1_1_54 = updated_step2.try_into()?;
|
let updated = updated_step2.try_upgrade()?;
|
||||||
let updated = updated_step3.try_upgrade()?;
|
|
||||||
|
|
||||||
v1_1_33::migrate_gateway_details(
|
v1_1_33::migrate_gateway_details(
|
||||||
&old_paths.common_paths,
|
&old_paths.common_paths,
|
||||||
@@ -232,8 +219,7 @@ async fn try_upgrade_v1_1_20_2_config(id: &str) -> Result<bool, ClientError> {
|
|||||||
|
|
||||||
let (updated_step1, gateway_config) = old_config.upgrade()?;
|
let (updated_step1, gateway_config) = old_config.upgrade()?;
|
||||||
let old_paths = updated_step1.storage_paths.clone();
|
let old_paths = updated_step1.storage_paths.clone();
|
||||||
let updated_step2: ConfigV1_1_54 = updated_step1.try_into()?;
|
let updated = updated_step1.try_upgrade()?;
|
||||||
let updated = updated_step2.try_upgrade()?;
|
|
||||||
|
|
||||||
v1_1_33::migrate_gateway_details(
|
v1_1_33::migrate_gateway_details(
|
||||||
&old_paths.common_paths,
|
&old_paths.common_paths,
|
||||||
@@ -256,8 +242,7 @@ async fn try_upgrade_v1_1_33_config(id: &str) -> Result<bool, ClientError> {
|
|||||||
info!("It is going to get updated to the current specification.");
|
info!("It is going to get updated to the current specification.");
|
||||||
|
|
||||||
let old_paths = old_config.storage_paths.clone();
|
let old_paths = old_config.storage_paths.clone();
|
||||||
let updated_step1: ConfigV1_1_54 = old_config.try_into()?;
|
let updated = old_config.try_upgrade()?;
|
||||||
let updated = updated_step1.try_upgrade()?;
|
|
||||||
|
|
||||||
v1_1_33::migrate_gateway_details(
|
v1_1_33::migrate_gateway_details(
|
||||||
&old_paths.common_paths,
|
&old_paths.common_paths,
|
||||||
@@ -270,22 +255,6 @@ async fn try_upgrade_v1_1_33_config(id: &str) -> Result<bool, ClientError> {
|
|||||||
Ok(true)
|
Ok(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn try_upgrade_v1_1_54_config(id: &str) -> Result<bool, ClientError> {
|
|
||||||
// explicitly load it as v1.1.54 (which is incompatible with the current one, i.e. +1.1.55)
|
|
||||||
let Ok(old_config) = ConfigV1_1_54::read_from_default_path(id) else {
|
|
||||||
// if we failed to load it, there might have been nothing to upgrade
|
|
||||||
// or maybe it was an even older file. in either way. just ignore it and carry on with our day
|
|
||||||
return Ok(false);
|
|
||||||
};
|
|
||||||
info!("It seems the client is using <= v1.1.54 config template.");
|
|
||||||
info!("It is going to get updated to the current specification.");
|
|
||||||
|
|
||||||
let updated = old_config.try_upgrade()?;
|
|
||||||
|
|
||||||
updated.save_to_default_location()?;
|
|
||||||
Ok(true)
|
|
||||||
}
|
|
||||||
|
|
||||||
async fn try_upgrade_config(id: &str) -> Result<(), ClientError> {
|
async fn try_upgrade_config(id: &str) -> Result<(), ClientError> {
|
||||||
if try_upgrade_v1_1_13_config(id).await? {
|
if try_upgrade_v1_1_13_config(id).await? {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
@@ -299,9 +268,6 @@ async fn try_upgrade_config(id: &str) -> Result<(), ClientError> {
|
|||||||
if try_upgrade_v1_1_33_config(id).await? {
|
if try_upgrade_v1_1_33_config(id).await? {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
if try_upgrade_v1_1_54_config(id).await? {
|
|
||||||
return Ok(());
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,10 +3,13 @@
|
|||||||
|
|
||||||
use crate::commands::try_load_current_config;
|
use crate::commands::try_load_current_config;
|
||||||
use crate::{
|
use crate::{
|
||||||
client::SocketClient,
|
client::{config::Config, SocketClient},
|
||||||
commands::{override_config, OverrideConfig},
|
commands::{override_config, OverrideConfig},
|
||||||
|
error::ClientError,
|
||||||
};
|
};
|
||||||
use clap::Args;
|
use clap::Args;
|
||||||
|
use log::*;
|
||||||
|
use nym_bin_common::version_checker::is_minor_version_compatible;
|
||||||
use nym_client_core::cli_helpers::client_run::CommonClientRunArgs;
|
use nym_client_core::cli_helpers::client_run::CommonClientRunArgs;
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::net::IpAddr;
|
use std::net::IpAddr;
|
||||||
@@ -40,8 +43,25 @@ impl From<Run> for OverrideConfig {
|
|||||||
no_cover: run_config.common_args.no_cover,
|
no_cover: run_config.common_args.no_cover,
|
||||||
nyxd_urls: run_config.common_args.nyxd_urls,
|
nyxd_urls: run_config.common_args.nyxd_urls,
|
||||||
enabled_credentials_mode: run_config.common_args.enabled_credentials_mode,
|
enabled_credentials_mode: run_config.common_args.enabled_credentials_mode,
|
||||||
stats_reporting_address: run_config.common_args.stats_reporting_address,
|
}
|
||||||
forget_me: run_config.common_args.forget_me.into(),
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// this only checks compatibility between config the binary. It does not take into consideration
|
||||||
|
// network version. It might do so in the future.
|
||||||
|
fn version_check(cfg: &Config) -> bool {
|
||||||
|
let binary_version = env!("CARGO_PKG_VERSION");
|
||||||
|
let config_version = &cfg.base.client.version;
|
||||||
|
if binary_version == config_version {
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
warn!("The native-client binary has different version than what is specified in config file! {} and {}", binary_version, config_version);
|
||||||
|
if is_minor_version_compatible(binary_version, config_version) {
|
||||||
|
info!("but they are still semver compatible. However, consider running the `upgrade` command");
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
error!("and they are semver incompatible! - please run the `upgrade` command before attempting `run` again");
|
||||||
|
false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -52,6 +72,11 @@ pub(crate) async fn execute(args: Run) -> Result<(), Box<dyn Error + Send + Sync
|
|||||||
let mut config = try_load_current_config(&args.common_args.id).await?;
|
let mut config = try_load_current_config(&args.common_args.id).await?;
|
||||||
config = override_config(config, OverrideConfig::from(args.clone()));
|
config = override_config(config, OverrideConfig::from(args.clone()));
|
||||||
|
|
||||||
|
if !version_check(&config) {
|
||||||
|
error!("failed the local version check");
|
||||||
|
return Err(Box::new(ClientError::FailedLocalVersionCheck));
|
||||||
|
}
|
||||||
|
|
||||||
SocketClient::new(config, args.common_args.custom_mixnet)
|
SocketClient::new(config, args.common_args.custom_mixnet)
|
||||||
.run_socket_forever()
|
.run_socket_forever()
|
||||||
.await
|
.await
|
||||||
|
|||||||
@@ -17,6 +17,9 @@ pub enum ClientError {
|
|||||||
#[error("Failed to validate the loaded config")]
|
#[error("Failed to validate the loaded config")]
|
||||||
ConfigValidationFailure,
|
ConfigValidationFailure,
|
||||||
|
|
||||||
|
#[error("Failed local version check, client and config mismatch")]
|
||||||
|
FailedLocalVersionCheck,
|
||||||
|
|
||||||
#[error("Attempted to start the client in invalid socket mode")]
|
#[error("Attempted to start the client in invalid socket mode")]
|
||||||
InvalidSocketMode,
|
InvalidSocketMode,
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
|
|
||||||
use clap::{crate_name, crate_version, Parser};
|
use clap::{crate_name, crate_version, Parser};
|
||||||
use nym_bin_common::logging::{maybe_print_banner, setup_tracing_logger};
|
use nym_bin_common::logging::{maybe_print_banner, setup_logging};
|
||||||
use nym_network_defaults::setup_env;
|
use nym_network_defaults::setup_env;
|
||||||
|
|
||||||
pub mod client;
|
pub mod client;
|
||||||
@@ -20,7 +20,7 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
|
|||||||
if !args.no_banner {
|
if !args.no_banner {
|
||||||
maybe_print_banner(crate_name!(), crate_version!());
|
maybe_print_banner(crate_name!(), crate_version!());
|
||||||
}
|
}
|
||||||
setup_tracing_logger();
|
setup_logging();
|
||||||
|
|
||||||
if let Err(err) = commands::execute(args).await {
|
if let Err(err) = commands::execute(args).await {
|
||||||
log::error!("{err}");
|
log::error!("{err}");
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ use nym_sphinx::receiver::ReconstructedMessage;
|
|||||||
use nym_task::connections::{
|
use nym_task::connections::{
|
||||||
ConnectionCommand, ConnectionCommandSender, ConnectionId, LaneQueueLengths, TransmissionLane,
|
ConnectionCommand, ConnectionCommandSender, ConnectionId, LaneQueueLengths, TransmissionLane,
|
||||||
};
|
};
|
||||||
use nym_task::TaskClient;
|
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use tokio::net::TcpStream;
|
use tokio::net::TcpStream;
|
||||||
use tokio::time::Instant;
|
use tokio::time::Instant;
|
||||||
@@ -44,11 +43,9 @@ pub(crate) struct HandlerBuilder {
|
|||||||
lane_queue_lengths: LaneQueueLengths,
|
lane_queue_lengths: LaneQueueLengths,
|
||||||
reply_controller_sender: ReplyControllerSender,
|
reply_controller_sender: ReplyControllerSender,
|
||||||
packet_type: Option<PacketType>,
|
packet_type: Option<PacketType>,
|
||||||
task_client: TaskClient,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl HandlerBuilder {
|
impl HandlerBuilder {
|
||||||
#[allow(clippy::too_many_arguments)]
|
|
||||||
pub(crate) fn new(
|
pub(crate) fn new(
|
||||||
msg_input: InputMessageSender,
|
msg_input: InputMessageSender,
|
||||||
client_connection_tx: ConnectionCommandSender,
|
client_connection_tx: ConnectionCommandSender,
|
||||||
@@ -57,7 +54,6 @@ impl HandlerBuilder {
|
|||||||
lane_queue_lengths: LaneQueueLengths,
|
lane_queue_lengths: LaneQueueLengths,
|
||||||
reply_controller_sender: ReplyControllerSender,
|
reply_controller_sender: ReplyControllerSender,
|
||||||
packet_type: Option<PacketType>,
|
packet_type: Option<PacketType>,
|
||||||
task_client: TaskClient,
|
|
||||||
) -> Self {
|
) -> Self {
|
||||||
Self {
|
Self {
|
||||||
msg_input,
|
msg_input,
|
||||||
@@ -67,14 +63,11 @@ impl HandlerBuilder {
|
|||||||
lane_queue_lengths,
|
lane_queue_lengths,
|
||||||
reply_controller_sender,
|
reply_controller_sender,
|
||||||
packet_type,
|
packet_type,
|
||||||
task_client,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: make sure we only ever have one active handler
|
// TODO: make sure we only ever have one active handler
|
||||||
pub fn create_active_handler(&self) -> Handler {
|
pub fn create_active_handler(&self) -> Handler {
|
||||||
let mut task_client = self.task_client.fork("active_handler");
|
|
||||||
task_client.disarm();
|
|
||||||
Handler {
|
Handler {
|
||||||
msg_input: self.msg_input.clone(),
|
msg_input: self.msg_input.clone(),
|
||||||
client_connection_tx: self.client_connection_tx.clone(),
|
client_connection_tx: self.client_connection_tx.clone(),
|
||||||
@@ -85,7 +78,6 @@ impl HandlerBuilder {
|
|||||||
lane_queue_lengths: self.lane_queue_lengths.clone(),
|
lane_queue_lengths: self.lane_queue_lengths.clone(),
|
||||||
reply_controller_sender: self.reply_controller_sender.clone(),
|
reply_controller_sender: self.reply_controller_sender.clone(),
|
||||||
packet_type: self.packet_type,
|
packet_type: self.packet_type,
|
||||||
task_client,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -100,18 +92,16 @@ pub(crate) struct Handler {
|
|||||||
lane_queue_lengths: LaneQueueLengths,
|
lane_queue_lengths: LaneQueueLengths,
|
||||||
reply_controller_sender: ReplyControllerSender,
|
reply_controller_sender: ReplyControllerSender,
|
||||||
packet_type: Option<PacketType>,
|
packet_type: Option<PacketType>,
|
||||||
task_client: TaskClient,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Drop for Handler {
|
impl Drop for Handler {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
if let Err(err) = self
|
if self
|
||||||
.buffer_requester
|
.buffer_requester
|
||||||
.unbounded_send(ReceivedBufferMessage::ReceiverDisconnect)
|
.unbounded_send(ReceivedBufferMessage::ReceiverDisconnect)
|
||||||
|
.is_err()
|
||||||
{
|
{
|
||||||
if !self.task_client.is_shutdown_poll() {
|
error!("we failed to disconnect the receiver from the buffer! presumably the shutdown procedure has been initiated!")
|
||||||
error!("failed to disconnect the receiver from the buffer: {err}");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -135,23 +125,10 @@ impl Handler {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// get the number of pending replies waiting for reply surbs
|
// get the number of pending replies waiting for reply surbs
|
||||||
let reply_queue_length = match self
|
let reply_queue_length = self
|
||||||
.reply_controller_sender
|
.reply_controller_sender
|
||||||
.get_lane_queue_length(connection_id)
|
.get_lane_queue_length(connection_id)
|
||||||
.await
|
.await;
|
||||||
{
|
|
||||||
Ok(length) => length,
|
|
||||||
Err(err) => {
|
|
||||||
if !self.task_client.is_shutdown_poll() {
|
|
||||||
error!(
|
|
||||||
"Failed to get reply queue length for connection {connection_id}: {err}"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
// We're just going to assume that the queue is empty, and I think that's okay
|
|
||||||
// during shutdown.
|
|
||||||
0
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
let queue_length = base_length + reply_queue_length;
|
let queue_length = base_length + reply_queue_length;
|
||||||
|
|
||||||
@@ -191,11 +168,10 @@ impl Handler {
|
|||||||
|
|
||||||
// the ack control is now responsible for chunking, etc.
|
// the ack control is now responsible for chunking, etc.
|
||||||
let input_msg = InputMessage::new_regular(recipient, message, lane, self.packet_type);
|
let input_msg = InputMessage::new_regular(recipient, message, lane, self.packet_type);
|
||||||
if let Err(err) = self.msg_input.send(input_msg).await {
|
self.msg_input
|
||||||
if !self.task_client.is_shutdown_poll() {
|
.send(input_msg)
|
||||||
error!("Failed to send message to the input buffer: {err}");
|
.await
|
||||||
}
|
.expect("InputMessageReceiver has stopped receiving!");
|
||||||
}
|
|
||||||
|
|
||||||
// Only reply back with a `LaneQueueLength` if the sender providided a connection id
|
// Only reply back with a `LaneQueueLength` if the sender providided a connection id
|
||||||
let TransmissionLane::ConnectionId(connection_id) = lane else {
|
let TransmissionLane::ConnectionId(connection_id) = lane else {
|
||||||
@@ -224,11 +200,10 @@ impl Handler {
|
|||||||
|
|
||||||
let input_msg =
|
let input_msg =
|
||||||
InputMessage::new_anonymous(recipient, message, reply_surbs, lane, self.packet_type);
|
InputMessage::new_anonymous(recipient, message, reply_surbs, lane, self.packet_type);
|
||||||
if let Err(err) = self.msg_input.send(input_msg).await {
|
self.msg_input
|
||||||
if !self.task_client.is_shutdown_poll() {
|
.send(input_msg)
|
||||||
error!("Failed to send anonymous message to the input buffer: {err}");
|
.await
|
||||||
}
|
.expect("InputMessageReceiver has stopped receiving!");
|
||||||
}
|
|
||||||
|
|
||||||
// Only reply back with a `LaneQueueLength` if the sender providided a connection id
|
// Only reply back with a `LaneQueueLength` if the sender providided a connection id
|
||||||
let TransmissionLane::ConnectionId(connection_id) = lane else {
|
let TransmissionLane::ConnectionId(connection_id) = lane else {
|
||||||
@@ -252,11 +227,10 @@ impl Handler {
|
|||||||
});
|
});
|
||||||
|
|
||||||
let input_msg = InputMessage::new_reply(recipient_tag, message, lane, self.packet_type);
|
let input_msg = InputMessage::new_reply(recipient_tag, message, lane, self.packet_type);
|
||||||
if let Err(err) = self.msg_input.send(input_msg).await {
|
self.msg_input
|
||||||
if !self.task_client.is_shutdown_poll() {
|
.send(input_msg)
|
||||||
error!("Failed to send reply message to the input buffer: {err}");
|
.await
|
||||||
}
|
.expect("InputMessageReceiver has stopped receiving!");
|
||||||
}
|
|
||||||
|
|
||||||
// Only reply back with a `LaneQueueLength` if the sender providided a connection id
|
// Only reply back with a `LaneQueueLength` if the sender providided a connection id
|
||||||
let TransmissionLane::ConnectionId(connection_id) = lane else {
|
let TransmissionLane::ConnectionId(connection_id) = lane else {
|
||||||
@@ -271,14 +245,9 @@ impl Handler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn handle_closed_connection(&self, connection_id: u64) -> Option<ServerResponse> {
|
fn handle_closed_connection(&self, connection_id: u64) -> Option<ServerResponse> {
|
||||||
if let Err(err) = self
|
self.client_connection_tx
|
||||||
.client_connection_tx
|
|
||||||
.unbounded_send(ConnectionCommand::Close(connection_id))
|
.unbounded_send(ConnectionCommand::Close(connection_id))
|
||||||
{
|
.unwrap();
|
||||||
if !self.task_client.is_shutdown_poll() {
|
|
||||||
error!("Failed to send close connection command: {err}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -393,10 +362,11 @@ impl Handler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn listen_for_requests(&mut self, mut msg_receiver: ReconstructedMessagesReceiver) {
|
async fn listen_for_requests(
|
||||||
let mut task_client = self.task_client.fork("select");
|
&mut self,
|
||||||
task_client.disarm();
|
mut msg_receiver: ReconstructedMessagesReceiver,
|
||||||
|
mut task_client: nym_task::TaskClient,
|
||||||
|
) {
|
||||||
while !task_client.is_shutdown() {
|
while !task_client.is_shutdown() {
|
||||||
tokio::select! {
|
tokio::select! {
|
||||||
// we can either get a client request from the websocket
|
// we can either get a client request from the websocket
|
||||||
@@ -445,7 +415,15 @@ impl Handler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// consume self to make sure `drop` is called after this is done
|
// consume self to make sure `drop` is called after this is done
|
||||||
pub(crate) async fn handle_connection(mut self, socket: TcpStream) {
|
pub(crate) async fn handle_connection(
|
||||||
|
mut self,
|
||||||
|
socket: TcpStream,
|
||||||
|
mut task_client: nym_task::TaskClient,
|
||||||
|
) {
|
||||||
|
// We don't want a crash in the connection handler to trigger a shutdown of the whole
|
||||||
|
// process.
|
||||||
|
task_client.disarm();
|
||||||
|
|
||||||
let ws_stream = match accept_async(socket).await {
|
let ws_stream = match accept_async(socket).await {
|
||||||
Ok(ws_stream) => ws_stream,
|
Ok(ws_stream) => ws_stream,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
@@ -458,18 +436,14 @@ impl Handler {
|
|||||||
let (reconstructed_sender, reconstructed_receiver) = mpsc::unbounded();
|
let (reconstructed_sender, reconstructed_receiver) = mpsc::unbounded();
|
||||||
|
|
||||||
// tell the buffer to start sending stuff to us
|
// tell the buffer to start sending stuff to us
|
||||||
if let Err(err) =
|
self.buffer_requester
|
||||||
self.buffer_requester
|
.unbounded_send(ReceivedBufferMessage::ReceiverAnnounce(
|
||||||
.unbounded_send(ReceivedBufferMessage::ReceiverAnnounce(
|
reconstructed_sender,
|
||||||
reconstructed_sender,
|
))
|
||||||
))
|
.expect("the buffer request failed!");
|
||||||
{
|
|
||||||
if !self.task_client.is_shutdown_poll() {
|
|
||||||
error!("failed to announce the receiver to the buffer: {err}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
self.listen_for_requests(reconstructed_receiver).await;
|
self.listen_for_requests(reconstructed_receiver, task_client)
|
||||||
|
.await;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,6 @@
|
|||||||
|
|
||||||
use super::handler::HandlerBuilder;
|
use super::handler::HandlerBuilder;
|
||||||
use log::*;
|
use log::*;
|
||||||
use nym_task::TaskClient;
|
|
||||||
use std::net::IpAddr;
|
use std::net::IpAddr;
|
||||||
use std::{net::SocketAddr, process, sync::Arc};
|
use std::{net::SocketAddr, process, sync::Arc};
|
||||||
use tokio::io::AsyncWriteExt;
|
use tokio::io::AsyncWriteExt;
|
||||||
@@ -23,19 +22,21 @@ impl State {
|
|||||||
pub(crate) struct Listener {
|
pub(crate) struct Listener {
|
||||||
address: SocketAddr,
|
address: SocketAddr,
|
||||||
state: State,
|
state: State,
|
||||||
task_client: TaskClient,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Listener {
|
impl Listener {
|
||||||
pub(crate) fn new(host: IpAddr, port: u16, task_client: TaskClient) -> Self {
|
pub(crate) fn new(host: IpAddr, port: u16) -> Self {
|
||||||
Listener {
|
Listener {
|
||||||
address: SocketAddr::new(host, port),
|
address: SocketAddr::new(host, port),
|
||||||
state: State::AwaitingConnection,
|
state: State::AwaitingConnection,
|
||||||
task_client,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) async fn run(&mut self, handler: HandlerBuilder) {
|
pub(crate) async fn run(
|
||||||
|
&mut self,
|
||||||
|
handler: HandlerBuilder,
|
||||||
|
mut task_client: nym_task::TaskClient,
|
||||||
|
) {
|
||||||
let tcp_listener = match tokio::net::TcpListener::bind(self.address).await {
|
let tcp_listener = match tokio::net::TcpListener::bind(self.address).await {
|
||||||
Ok(listener) => listener,
|
Ok(listener) => listener,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
@@ -46,11 +47,11 @@ impl Listener {
|
|||||||
|
|
||||||
let notify = Arc::new(Notify::new());
|
let notify = Arc::new(Notify::new());
|
||||||
|
|
||||||
while !self.task_client.is_shutdown() {
|
loop {
|
||||||
tokio::select! {
|
tokio::select! {
|
||||||
// When the handler finishes we check if shutdown is signalled
|
// When the handler finishes we check if shutdown is signalled
|
||||||
_ = notify.notified() => {
|
_ = notify.notified() => {
|
||||||
if self.task_client.is_shutdown() {
|
if task_client.is_shutdown() {
|
||||||
log::trace!("Websocket listener: detected shutdown after connection closed");
|
log::trace!("Websocket listener: detected shutdown after connection closed");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -59,7 +60,7 @@ impl Listener {
|
|||||||
}
|
}
|
||||||
// ... but when there is no connected client at the time of shutdown being
|
// ... but when there is no connected client at the time of shutdown being
|
||||||
// signalled, we handle it here.
|
// signalled, we handle it here.
|
||||||
_ = self.task_client.recv() => {
|
_ = task_client.recv() => {
|
||||||
if !self.state.is_connected() {
|
if !self.state.is_connected() {
|
||||||
log::trace!("Not connected: shutting down");
|
log::trace!("Not connected: shutting down");
|
||||||
break;
|
break;
|
||||||
@@ -87,8 +88,9 @@ impl Listener {
|
|||||||
// hanging because the executor doesn't come back here
|
// hanging because the executor doesn't come back here
|
||||||
let notify_clone = Arc::clone(¬ify);
|
let notify_clone = Arc::clone(¬ify);
|
||||||
let fresh_handler = handler.create_active_handler();
|
let fresh_handler = handler.create_active_handler();
|
||||||
|
let task_client_handler = task_client.clone();
|
||||||
tokio::spawn(async move {
|
tokio::spawn(async move {
|
||||||
fresh_handler.handle_connection(socket).await;
|
fresh_handler.handle_connection(socket, task_client_handler).await;
|
||||||
notify_clone.notify_one();
|
notify_clone.notify_one();
|
||||||
});
|
});
|
||||||
self.state = State::Connected;
|
self.state = State::Connected;
|
||||||
@@ -102,9 +104,13 @@ impl Listener {
|
|||||||
log::debug!("Websocket listener: Exiting");
|
log::debug!("Websocket listener: Exiting");
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn start(mut self, handler: HandlerBuilder) -> JoinHandle<()> {
|
pub(crate) fn start(
|
||||||
|
mut self,
|
||||||
|
handler: HandlerBuilder,
|
||||||
|
shutdown: nym_task::TaskClient,
|
||||||
|
) -> JoinHandle<()> {
|
||||||
info!("Running websocket on {:?}", self.address.to_string());
|
info!("Running websocket on {:?}", self.address.to_string());
|
||||||
|
|
||||||
tokio::spawn(async move { self.run(handler).await })
|
tokio::spawn(async move { self.run(handler, shutdown).await })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "nym-socks5-client"
|
name = "nym-socks5-client"
|
||||||
version = "1.1.57"
|
version = "1.1.42"
|
||||||
authors = ["Dave Hrycyszyn <futurechimp@users.noreply.github.com>"]
|
authors = ["Dave Hrycyszyn <futurechimp@users.noreply.github.com>"]
|
||||||
description = "A SOCKS5 localhost proxy that converts incoming messages to Sphinx and sends them to a Nym address"
|
description = "A SOCKS5 localhost proxy that converts incoming messages to Sphinx and sends them to a Nym address"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
@@ -27,7 +27,6 @@ zeroize = { workspace = true }
|
|||||||
nym-bin-common = { path = "../../common/bin-common", features = [
|
nym-bin-common = { path = "../../common/bin-common", features = [
|
||||||
"output_format",
|
"output_format",
|
||||||
"clap",
|
"clap",
|
||||||
"basic_tracing",
|
|
||||||
] }
|
] }
|
||||||
nym-client-core = { path = "../../common/client-core", features = [
|
nym-client-core = { path = "../../common/client-core", features = [
|
||||||
"fs-credentials-storage",
|
"fs-credentials-storage",
|
||||||
|
|||||||
@@ -87,12 +87,11 @@ impl From<Init> for OverrideConfig {
|
|||||||
use_anonymous_replies: init_config.use_reply_surbs,
|
use_anonymous_replies: init_config.use_reply_surbs,
|
||||||
fastmode: init_config.common_args.fastmode,
|
fastmode: init_config.common_args.fastmode,
|
||||||
no_cover: init_config.common_args.no_cover,
|
no_cover: init_config.common_args.no_cover,
|
||||||
|
geo_routing: None,
|
||||||
medium_toggle: false,
|
medium_toggle: false,
|
||||||
nyxd_urls: init_config.common_args.nyxd_urls,
|
nyxd_urls: init_config.common_args.nyxd_urls,
|
||||||
enabled_credentials_mode: init_config.common_args.enabled_credentials_mode,
|
enabled_credentials_mode: init_config.common_args.enabled_credentials_mode,
|
||||||
outfox: false,
|
outfox: false,
|
||||||
stats_reporting_address: init_config.common_args.stats_reporting_address,
|
|
||||||
forget_me: init_config.common_args.forget_me.into(),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ use crate::config::old_config_v1_1_20::ConfigV1_1_20;
|
|||||||
use crate::config::old_config_v1_1_20_2::ConfigV1_1_20_2;
|
use crate::config::old_config_v1_1_20_2::ConfigV1_1_20_2;
|
||||||
use crate::config::old_config_v1_1_30::ConfigV1_1_30;
|
use crate::config::old_config_v1_1_30::ConfigV1_1_30;
|
||||||
use crate::config::old_config_v1_1_33::ConfigV1_1_33;
|
use crate::config::old_config_v1_1_33::ConfigV1_1_33;
|
||||||
use crate::config::old_config_v1_1_54::ConfigV1_1_54;
|
|
||||||
use crate::config::{BaseClientConfig, Config};
|
use crate::config::{BaseClientConfig, Config};
|
||||||
use crate::error::Socks5ClientError;
|
use crate::error::Socks5ClientError;
|
||||||
use clap::CommandFactory;
|
use clap::CommandFactory;
|
||||||
@@ -17,9 +16,9 @@ use nym_bin_common::bin_info;
|
|||||||
use nym_bin_common::completions::{fig_generate, ArgShell};
|
use nym_bin_common::completions::{fig_generate, ArgShell};
|
||||||
use nym_client_core::cli_helpers::CliClient;
|
use nym_client_core::cli_helpers::CliClient;
|
||||||
use nym_client_core::client::base_client::storage::migration_helpers::v1_1_33;
|
use nym_client_core::client::base_client::storage::migration_helpers::v1_1_33;
|
||||||
use nym_client_core::config::ForgetMe;
|
use nym_client_core::client::topology_control::geo_aware_provider::CountryGroup;
|
||||||
|
use nym_client_core::config::{GroupBy, TopologyStructure};
|
||||||
use nym_config::OptionalSet;
|
use nym_config::OptionalSet;
|
||||||
use nym_sphinx::addressing::Recipient;
|
|
||||||
use nym_sphinx::params::{PacketSize, PacketType};
|
use nym_sphinx::params::{PacketSize, PacketType};
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::net::IpAddr;
|
use std::net::IpAddr;
|
||||||
@@ -107,12 +106,11 @@ pub(crate) struct OverrideConfig {
|
|||||||
use_anonymous_replies: Option<bool>,
|
use_anonymous_replies: Option<bool>,
|
||||||
fastmode: bool,
|
fastmode: bool,
|
||||||
no_cover: bool,
|
no_cover: bool,
|
||||||
|
geo_routing: Option<CountryGroup>,
|
||||||
medium_toggle: bool,
|
medium_toggle: bool,
|
||||||
nyxd_urls: Option<Vec<url::Url>>,
|
nyxd_urls: Option<Vec<url::Url>>,
|
||||||
enabled_credentials_mode: Option<bool>,
|
enabled_credentials_mode: Option<bool>,
|
||||||
outfox: bool,
|
outfox: bool,
|
||||||
stats_reporting_address: Option<Recipient>,
|
|
||||||
forget_me: ForgetMe,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) async fn execute(args: Cli) -> Result<(), Box<dyn Error + Send + Sync>> {
|
pub(crate) async fn execute(args: Cli) -> Result<(), Box<dyn Error + Send + Sync>> {
|
||||||
@@ -137,6 +135,21 @@ pub(crate) fn override_config(config: Config, args: OverrideConfig) -> Config {
|
|||||||
let secondary_packet_size = args.medium_toggle.then_some(PacketSize::ExtendedPacket16);
|
let secondary_packet_size = args.medium_toggle.then_some(PacketSize::ExtendedPacket16);
|
||||||
let no_per_hop_delays = args.medium_toggle;
|
let no_per_hop_delays = args.medium_toggle;
|
||||||
|
|
||||||
|
let topology_structure = if args.medium_toggle {
|
||||||
|
// Use the location of the network-requester
|
||||||
|
let address = config
|
||||||
|
.core
|
||||||
|
.socks5
|
||||||
|
.provider_mix_address
|
||||||
|
.parse()
|
||||||
|
.expect("failed to parse provider mix address");
|
||||||
|
TopologyStructure::GeoAware(GroupBy::NymAddress(address))
|
||||||
|
} else if let Some(code) = args.geo_routing {
|
||||||
|
TopologyStructure::GeoAware(GroupBy::CountryGroup(code))
|
||||||
|
} else {
|
||||||
|
TopologyStructure::default()
|
||||||
|
};
|
||||||
|
|
||||||
let packet_type = if args.outfox {
|
let packet_type = if args.outfox {
|
||||||
PacketType::Outfox
|
PacketType::Outfox
|
||||||
} else {
|
} else {
|
||||||
@@ -160,7 +173,10 @@ pub(crate) fn override_config(config: Config, args: OverrideConfig) -> Config {
|
|||||||
// NOTE: see comment above about the order of the other disble cover traffic config
|
// NOTE: see comment above about the order of the other disble cover traffic config
|
||||||
.with_base(BaseClientConfig::with_disabled_cover_traffic, args.no_cover)
|
.with_base(BaseClientConfig::with_disabled_cover_traffic, args.no_cover)
|
||||||
.with_base(BaseClientConfig::with_packet_type, packet_type)
|
.with_base(BaseClientConfig::with_packet_type, packet_type)
|
||||||
.with_base(BaseClientConfig::with_forget_me, args.forget_me)
|
.with_base(
|
||||||
|
BaseClientConfig::with_topology_structure,
|
||||||
|
topology_structure,
|
||||||
|
)
|
||||||
.with_optional(Config::with_anonymous_replies, args.use_anonymous_replies)
|
.with_optional(Config::with_anonymous_replies, args.use_anonymous_replies)
|
||||||
.with_optional(Config::with_port, args.port)
|
.with_optional(Config::with_port, args.port)
|
||||||
.with_optional(Config::with_ip, args.ip)
|
.with_optional(Config::with_ip, args.ip)
|
||||||
@@ -180,11 +196,6 @@ pub(crate) fn override_config(config: Config, args: OverrideConfig) -> Config {
|
|||||||
BaseClientConfig::with_disabled_credentials,
|
BaseClientConfig::with_disabled_credentials,
|
||||||
args.enabled_credentials_mode.map(|b| !b),
|
args.enabled_credentials_mode.map(|b| !b),
|
||||||
)
|
)
|
||||||
.with_optional_base_env(
|
|
||||||
BaseClientConfig::with_enabled_stats_reporting_address,
|
|
||||||
args.stats_reporting_address,
|
|
||||||
nym_network_defaults::var_names::CLIENT_STATS_COLLECTION_PROVIDER,
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn try_upgrade_v1_1_13_config(id: &str) -> Result<bool, Socks5ClientError> {
|
async fn try_upgrade_v1_1_13_config(id: &str) -> Result<bool, Socks5ClientError> {
|
||||||
@@ -205,16 +216,15 @@ async fn try_upgrade_v1_1_13_config(id: &str) -> Result<bool, Socks5ClientError>
|
|||||||
let old_paths = updated_step3.storage_paths.clone();
|
let old_paths = updated_step3.storage_paths.clone();
|
||||||
|
|
||||||
let updated_step4: ConfigV1_1_33 = updated_step3.into();
|
let updated_step4: ConfigV1_1_33 = updated_step3.into();
|
||||||
let updated_step5: ConfigV1_1_54 = updated_step4.try_into()?;
|
let updated = updated_step4.try_upgrade()?;
|
||||||
|
|
||||||
v1_1_33::migrate_gateway_details(
|
v1_1_33::migrate_gateway_details(
|
||||||
&old_paths.common_paths,
|
&old_paths.common_paths,
|
||||||
&updated_step5.storage_paths.common_paths,
|
&updated.storage_paths.common_paths,
|
||||||
Some(gateway_config),
|
Some(gateway_config),
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
let updated = updated_step5.try_upgrade()?;
|
|
||||||
updated.save_to_default_location()?;
|
updated.save_to_default_location()?;
|
||||||
Ok(true)
|
Ok(true)
|
||||||
}
|
}
|
||||||
@@ -236,16 +246,15 @@ async fn try_upgrade_v1_1_20_config(id: &str) -> Result<bool, Socks5ClientError>
|
|||||||
let old_paths = updated_step2.storage_paths.clone();
|
let old_paths = updated_step2.storage_paths.clone();
|
||||||
|
|
||||||
let updated_step3: ConfigV1_1_33 = updated_step2.into();
|
let updated_step3: ConfigV1_1_33 = updated_step2.into();
|
||||||
let updated_step4: ConfigV1_1_54 = updated_step3.try_into()?;
|
let updated = updated_step3.try_upgrade()?;
|
||||||
|
|
||||||
v1_1_33::migrate_gateway_details(
|
v1_1_33::migrate_gateway_details(
|
||||||
&old_paths.common_paths,
|
&old_paths.common_paths,
|
||||||
&updated_step4.storage_paths.common_paths,
|
&updated.storage_paths.common_paths,
|
||||||
Some(gateway_config),
|
Some(gateway_config),
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
let updated = updated_step4.try_upgrade()?;
|
|
||||||
updated.save_to_default_location()?;
|
updated.save_to_default_location()?;
|
||||||
Ok(true)
|
Ok(true)
|
||||||
}
|
}
|
||||||
@@ -264,17 +273,15 @@ async fn try_upgrade_v1_1_20_2_config(id: &str) -> Result<bool, Socks5ClientErro
|
|||||||
let old_paths = updated_step1.storage_paths.clone();
|
let old_paths = updated_step1.storage_paths.clone();
|
||||||
|
|
||||||
let updated_step2: ConfigV1_1_33 = updated_step1.into();
|
let updated_step2: ConfigV1_1_33 = updated_step1.into();
|
||||||
let updated_step3: ConfigV1_1_54 = updated_step2.try_into()?;
|
let updated = updated_step2.try_upgrade()?;
|
||||||
|
|
||||||
v1_1_33::migrate_gateway_details(
|
v1_1_33::migrate_gateway_details(
|
||||||
&old_paths.common_paths,
|
&old_paths.common_paths,
|
||||||
&updated_step3.storage_paths.common_paths,
|
&updated.storage_paths.common_paths,
|
||||||
Some(gateway_config),
|
Some(gateway_config),
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
let updated = updated_step3.try_upgrade()?;
|
|
||||||
|
|
||||||
updated.save_to_default_location()?;
|
updated.save_to_default_location()?;
|
||||||
Ok(true)
|
Ok(true)
|
||||||
}
|
}
|
||||||
@@ -292,16 +299,15 @@ async fn try_upgrade_v1_1_30_config(id: &str) -> Result<bool, Socks5ClientError>
|
|||||||
let old_paths = old_config.storage_paths.clone();
|
let old_paths = old_config.storage_paths.clone();
|
||||||
|
|
||||||
let updated_step1: ConfigV1_1_33 = old_config.into();
|
let updated_step1: ConfigV1_1_33 = old_config.into();
|
||||||
let updated_step2: ConfigV1_1_54 = updated_step1.try_into()?;
|
let updated = updated_step1.try_upgrade()?;
|
||||||
|
|
||||||
v1_1_33::migrate_gateway_details(
|
v1_1_33::migrate_gateway_details(
|
||||||
&old_paths.common_paths,
|
&old_paths.common_paths,
|
||||||
&updated_step2.storage_paths.common_paths,
|
&updated.storage_paths.common_paths,
|
||||||
None,
|
None,
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
let updated = updated_step2.try_upgrade()?;
|
|
||||||
updated.save_to_default_location()?;
|
updated.save_to_default_location()?;
|
||||||
Ok(true)
|
Ok(true)
|
||||||
}
|
}
|
||||||
@@ -318,32 +324,15 @@ async fn try_upgrade_v1_1_33_config(id: &str) -> Result<bool, Socks5ClientError>
|
|||||||
|
|
||||||
let old_paths = old_config.storage_paths.clone();
|
let old_paths = old_config.storage_paths.clone();
|
||||||
|
|
||||||
let updated_step1: ConfigV1_1_54 = old_config.try_into()?;
|
let updated = old_config.try_upgrade()?;
|
||||||
|
|
||||||
v1_1_33::migrate_gateway_details(
|
v1_1_33::migrate_gateway_details(
|
||||||
&old_paths.common_paths,
|
&old_paths.common_paths,
|
||||||
&updated_step1.storage_paths.common_paths,
|
&updated.storage_paths.common_paths,
|
||||||
None,
|
None,
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
let updated = updated_step1.try_upgrade()?;
|
|
||||||
updated.save_to_default_location()?;
|
|
||||||
Ok(true)
|
|
||||||
}
|
|
||||||
|
|
||||||
async fn try_upgrade_v1_1_54_config(id: &str) -> Result<bool, Socks5ClientError> {
|
|
||||||
// explicitly load it as v1.1.54 (which is incompatible with the current one, i.e. +1.1.55)
|
|
||||||
let Ok(old_config) = ConfigV1_1_54::read_from_default_path(id) else {
|
|
||||||
// if we failed to load it, there might have been nothing to upgrade
|
|
||||||
// or maybe it was an even older file. in either way. just ignore it and carry on with our day
|
|
||||||
return Ok(false);
|
|
||||||
};
|
|
||||||
info!("It seems the client is using <= v1.1.54 config template.");
|
|
||||||
info!("It is going to get updated to the current specification.");
|
|
||||||
|
|
||||||
let updated = old_config.try_upgrade()?;
|
|
||||||
|
|
||||||
updated.save_to_default_location()?;
|
updated.save_to_default_location()?;
|
||||||
Ok(true)
|
Ok(true)
|
||||||
}
|
}
|
||||||
@@ -364,9 +353,6 @@ async fn try_upgrade_config(id: &str) -> Result<(), Socks5ClientError> {
|
|||||||
if try_upgrade_v1_1_33_config(id).await? {
|
if try_upgrade_v1_1_33_config(id).await? {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
if try_upgrade_v1_1_54_config(id).await? {
|
|
||||||
return Ok(());
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,10 +2,17 @@
|
|||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
use crate::commands::try_load_current_config;
|
use crate::commands::try_load_current_config;
|
||||||
use crate::commands::{override_config, OverrideConfig};
|
use crate::config::Config;
|
||||||
|
use crate::{
|
||||||
|
commands::{override_config, OverrideConfig},
|
||||||
|
error::Socks5ClientError,
|
||||||
|
};
|
||||||
use clap::Args;
|
use clap::Args;
|
||||||
|
use log::*;
|
||||||
|
use nym_bin_common::version_checker::is_minor_version_compatible;
|
||||||
use nym_client_core::cli_helpers::client_run::CommonClientRunArgs;
|
use nym_client_core::cli_helpers::client_run::CommonClientRunArgs;
|
||||||
use nym_client_core::client::base_client::storage::OnDiskPersistent;
|
use nym_client_core::client::base_client::storage::OnDiskPersistent;
|
||||||
|
use nym_client_core::client::topology_control::geo_aware_provider::CountryGroup;
|
||||||
use nym_socks5_client_core::NymClient;
|
use nym_socks5_client_core::NymClient;
|
||||||
use nym_sphinx::addressing::clients::Recipient;
|
use nym_sphinx::addressing::clients::Recipient;
|
||||||
use std::net::IpAddr;
|
use std::net::IpAddr;
|
||||||
@@ -36,6 +43,10 @@ pub(crate) struct Run {
|
|||||||
#[clap(long)]
|
#[clap(long)]
|
||||||
host: Option<IpAddr>,
|
host: Option<IpAddr>,
|
||||||
|
|
||||||
|
/// Set geo-aware mixnode selection when sending mixnet traffic, for experiments only.
|
||||||
|
#[clap(long, hide = true, value_parser = validate_country_group, group="routing")]
|
||||||
|
geo_routing: Option<CountryGroup>,
|
||||||
|
|
||||||
/// Enable medium mixnet traffic, for experiments only.
|
/// Enable medium mixnet traffic, for experiments only.
|
||||||
/// This includes things like disabling cover traffic, no per hop delays, etc.
|
/// This includes things like disabling cover traffic, no per hop delays, etc.
|
||||||
#[clap(long, hide = true)]
|
#[clap(long, hide = true)]
|
||||||
@@ -54,12 +65,39 @@ impl From<Run> for OverrideConfig {
|
|||||||
use_anonymous_replies: run_config.use_anonymous_replies,
|
use_anonymous_replies: run_config.use_anonymous_replies,
|
||||||
fastmode: run_config.common_args.fastmode,
|
fastmode: run_config.common_args.fastmode,
|
||||||
no_cover: run_config.common_args.no_cover,
|
no_cover: run_config.common_args.no_cover,
|
||||||
|
geo_routing: run_config.geo_routing,
|
||||||
medium_toggle: run_config.medium_toggle,
|
medium_toggle: run_config.medium_toggle,
|
||||||
nyxd_urls: run_config.common_args.nyxd_urls,
|
nyxd_urls: run_config.common_args.nyxd_urls,
|
||||||
enabled_credentials_mode: run_config.common_args.enabled_credentials_mode,
|
enabled_credentials_mode: run_config.common_args.enabled_credentials_mode,
|
||||||
outfox: run_config.outfox,
|
outfox: run_config.outfox,
|
||||||
stats_reporting_address: run_config.common_args.stats_reporting_address,
|
}
|
||||||
forget_me: run_config.common_args.forget_me.into(),
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn validate_country_group(s: &str) -> Result<CountryGroup, String> {
|
||||||
|
match s.parse() {
|
||||||
|
Ok(cg) => Ok(cg),
|
||||||
|
Err(_) => Err(format!("failed to parse country group: {}", s)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// this only checks compatibility between config the binary. It does not take into consideration
|
||||||
|
// network version. It might do so in the future.
|
||||||
|
fn version_check(cfg: &Config) -> bool {
|
||||||
|
let binary_version = env!("CARGO_PKG_VERSION");
|
||||||
|
let config_version = &cfg.core.base.client.version;
|
||||||
|
if binary_version == config_version {
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
warn!(
|
||||||
|
"The socks5-client binary has different version than what is specified in config file! {binary_version} and {config_version}",
|
||||||
|
);
|
||||||
|
if is_minor_version_compatible(binary_version, config_version) {
|
||||||
|
info!("but they are still semver compatible. However, consider running the `upgrade` command");
|
||||||
|
true
|
||||||
|
} else {
|
||||||
|
error!("and they are semver incompatible! - please run the `upgrade` command before attempting `run` again");
|
||||||
|
false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -70,6 +108,11 @@ pub(crate) async fn execute(args: Run) -> Result<(), Box<dyn std::error::Error +
|
|||||||
let mut config = try_load_current_config(&args.common_args.id).await?;
|
let mut config = try_load_current_config(&args.common_args.id).await?;
|
||||||
config = override_config(config, OverrideConfig::from(args.clone()));
|
config = override_config(config, OverrideConfig::from(args.clone()));
|
||||||
|
|
||||||
|
if !version_check(&config) {
|
||||||
|
error!("failed the local version check");
|
||||||
|
return Err(Box::new(Socks5ClientError::FailedLocalVersionCheck));
|
||||||
|
}
|
||||||
|
|
||||||
let storage =
|
let storage =
|
||||||
OnDiskPersistent::from_paths(config.storage_paths.common_paths, &config.core.base.debug)
|
OnDiskPersistent::from_paths(config.storage_paths.common_paths, &config.core.base.debug)
|
||||||
.await?;
|
.await?;
|
||||||
|
|||||||
@@ -25,7 +25,6 @@ pub mod old_config_v1_1_20;
|
|||||||
pub mod old_config_v1_1_20_2;
|
pub mod old_config_v1_1_20_2;
|
||||||
pub mod old_config_v1_1_30;
|
pub mod old_config_v1_1_30;
|
||||||
pub mod old_config_v1_1_33;
|
pub mod old_config_v1_1_33;
|
||||||
pub mod old_config_v1_1_54;
|
|
||||||
mod persistence;
|
mod persistence;
|
||||||
mod template;
|
mod template;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
use crate::config::{default_config_filepath, SocksClientPaths};
|
use crate::config::{default_config_filepath, Config, SocksClientPaths};
|
||||||
use crate::error::Socks5ClientError;
|
use crate::error::Socks5ClientError;
|
||||||
use nym_bin_common::logging::LoggingSettings;
|
use nym_bin_common::logging::LoggingSettings;
|
||||||
use nym_client_core::config::disk_persistence::old_v1_1_33::CommonClientPathsV1_1_33;
|
use nym_client_core::config::disk_persistence::old_v1_1_33::CommonClientPathsV1_1_33;
|
||||||
@@ -11,8 +11,6 @@ use serde::{Deserialize, Serialize};
|
|||||||
use std::io;
|
use std::io;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
|
||||||
use super::old_config_v1_1_54::ConfigV1_1_54;
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
|
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
|
||||||
pub struct SocksClientPathsV1_1_33 {
|
pub struct SocksClientPathsV1_1_33 {
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
@@ -30,20 +28,6 @@ pub struct ConfigV1_1_33 {
|
|||||||
pub logging: LoggingSettings,
|
pub logging: LoggingSettings,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TryFrom<ConfigV1_1_33> for ConfigV1_1_54 {
|
|
||||||
type Error = Socks5ClientError;
|
|
||||||
|
|
||||||
fn try_from(value: ConfigV1_1_33) -> Result<Self, Self::Error> {
|
|
||||||
Ok(ConfigV1_1_54 {
|
|
||||||
core: value.core.into(),
|
|
||||||
storage_paths: SocksClientPaths {
|
|
||||||
common_paths: value.storage_paths.common_paths.upgrade_default()?,
|
|
||||||
},
|
|
||||||
logging: value.logging,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ConfigV1_1_33 {
|
impl ConfigV1_1_33 {
|
||||||
pub fn read_from_toml_file<P: AsRef<Path>>(path: P) -> io::Result<Self> {
|
pub fn read_from_toml_file<P: AsRef<Path>>(path: P) -> io::Result<Self> {
|
||||||
read_config_from_toml_file(path)
|
read_config_from_toml_file(path)
|
||||||
@@ -52,4 +36,14 @@ impl ConfigV1_1_33 {
|
|||||||
pub fn read_from_default_path<P: AsRef<Path>>(id: P) -> io::Result<Self> {
|
pub fn read_from_default_path<P: AsRef<Path>>(id: P) -> io::Result<Self> {
|
||||||
Self::read_from_toml_file(default_config_filepath(id))
|
Self::read_from_toml_file(default_config_filepath(id))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn try_upgrade(self) -> Result<Config, Socks5ClientError> {
|
||||||
|
Ok(Config {
|
||||||
|
core: self.core.into(),
|
||||||
|
storage_paths: SocksClientPaths {
|
||||||
|
common_paths: self.storage_paths.common_paths.upgrade_default()?,
|
||||||
|
},
|
||||||
|
logging: self.logging,
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,39 +0,0 @@
|
|||||||
use std::{io, path::Path};
|
|
||||||
|
|
||||||
use nym_bin_common::logging::LoggingSettings;
|
|
||||||
use nym_config::read_config_from_toml_file;
|
|
||||||
use nym_socks5_client_core::config::old_config_v1_1_54::ConfigV1_1_54 as CoreConfigV1_1_54;
|
|
||||||
use serde::{Deserialize, Serialize};
|
|
||||||
|
|
||||||
use crate::config::Config;
|
|
||||||
use crate::error::Socks5ClientError;
|
|
||||||
|
|
||||||
use super::{default_config_filepath, SocksClientPaths};
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
|
|
||||||
#[serde(deny_unknown_fields)]
|
|
||||||
pub struct ConfigV1_1_54 {
|
|
||||||
pub core: CoreConfigV1_1_54,
|
|
||||||
|
|
||||||
pub storage_paths: SocksClientPaths,
|
|
||||||
|
|
||||||
pub logging: LoggingSettings,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ConfigV1_1_54 {
|
|
||||||
pub fn read_from_toml_file<P: AsRef<Path>>(path: P) -> io::Result<Self> {
|
|
||||||
read_config_from_toml_file(path)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn read_from_default_path<P: AsRef<Path>>(id: P) -> io::Result<Self> {
|
|
||||||
Self::read_from_toml_file(default_config_filepath(id))
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn try_upgrade(self) -> Result<Config, Socks5ClientError> {
|
|
||||||
Ok(Config {
|
|
||||||
core: self.core.into(),
|
|
||||||
storage_paths: self.storage_paths,
|
|
||||||
logging: self.logging,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -98,19 +98,14 @@ send_anonymously = {{ core.socks5.send_anonymously }}
|
|||||||
|
|
||||||
[core.debug]
|
[core.debug]
|
||||||
|
|
||||||
|
[core.debug.traffic]
|
||||||
|
average_packet_delay = '{{ core.debug.traffic.average_packet_delay }}'
|
||||||
|
message_sending_average_delay = '{{ core.debug.traffic.message_sending_average_delay }}'
|
||||||
|
|
||||||
[core.debug.acknowledgements]
|
[core.debug.acknowledgements]
|
||||||
average_ack_delay = '{{ core.debug.acknowledgements.average_ack_delay }}'
|
average_ack_delay = '{{ core.debug.acknowledgements.average_ack_delay }}'
|
||||||
|
|
||||||
[core.debug.cover_traffic]
|
[core.debug.cover_traffic]
|
||||||
loop_cover_traffic_average_delay = '{{ core.debug.cover_traffic.loop_cover_traffic_average_delay }}'
|
loop_cover_traffic_average_delay = '{{ core.debug.cover_traffic.loop_cover_traffic_average_delay }}'
|
||||||
|
|
||||||
[core.debug.stats_reporting]
|
|
||||||
enabled = {{ core.debug.stats_reporting.enabled }}
|
|
||||||
provider_address = '{{ core.debug.stats_reporting.provider_address }}'
|
|
||||||
reporting_interval = '{{ core.debug.stats_reporting.reporting_interval }}'
|
|
||||||
|
|
||||||
[core.debug.forget_me]
|
|
||||||
client = {{ core.debug.forget_me.client }}
|
|
||||||
stats = {{ core.debug.forget_me.stats }}
|
|
||||||
|
|
||||||
"#;
|
"#;
|
||||||
|
|||||||
@@ -14,6 +14,9 @@ pub enum Socks5ClientError {
|
|||||||
#[error("Failed to validate the loaded config")]
|
#[error("Failed to validate the loaded config")]
|
||||||
ConfigValidationFailure,
|
ConfigValidationFailure,
|
||||||
|
|
||||||
|
#[error("Failed local version check, client and config mismatch")]
|
||||||
|
FailedLocalVersionCheck,
|
||||||
|
|
||||||
#[error("Fail to bind address")]
|
#[error("Fail to bind address")]
|
||||||
FailToBindAddress,
|
FailToBindAddress,
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
|
|
||||||
use clap::{crate_name, crate_version, Parser};
|
use clap::{crate_name, crate_version, Parser};
|
||||||
use nym_bin_common::logging::{maybe_print_banner, setup_tracing_logger};
|
use nym_bin_common::logging::{maybe_print_banner, setup_logging};
|
||||||
use nym_network_defaults::setup_env;
|
use nym_network_defaults::setup_env;
|
||||||
|
|
||||||
mod commands;
|
mod commands;
|
||||||
@@ -19,7 +19,7 @@ async fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
|
|||||||
if !args.no_banner {
|
if !args.no_banner {
|
||||||
maybe_print_banner(crate_name!(), crate_version!());
|
maybe_print_banner(crate_name!(), crate_version!());
|
||||||
}
|
}
|
||||||
setup_tracing_logger();
|
setup_logging();
|
||||||
|
|
||||||
if let Err(err) = commands::execute(args).await {
|
if let Err(err) = commands::execute(args).await {
|
||||||
log::error!("{err}");
|
log::error!("{err}");
|
||||||
|
|||||||
@@ -1,3 +1,2 @@
|
|||||||
allow-unwrap-in-tests = true
|
allow-unwrap-in-tests = true
|
||||||
allow-expect-in-tests = true
|
allow-expect-in-tests = true
|
||||||
allow-panic-in-tests = true
|
|
||||||
@@ -17,7 +17,6 @@ thiserror = { workspace = true }
|
|||||||
|
|
||||||
nym-credentials-interface = { path = "../credentials-interface" }
|
nym-credentials-interface = { path = "../credentials-interface" }
|
||||||
nym-crypto = { path = "../crypto", features = ["asymmetric"] }
|
nym-crypto = { path = "../crypto", features = ["asymmetric"] }
|
||||||
nym-network-defaults = { path = "../network-defaults" }
|
|
||||||
nym-service-provider-requests-common = { path = "../service-provider-requests-common" }
|
nym-service-provider-requests-common = { path = "../service-provider-requests-common" }
|
||||||
nym-sphinx = { path = "../nymsphinx" }
|
nym-sphinx = { path = "../nymsphinx" }
|
||||||
nym-wireguard-types = { path = "../wireguard-types" }
|
nym-wireguard-types = { path = "../wireguard-types" }
|
||||||
|
|||||||
@@ -22,7 +22,4 @@ pub enum Error {
|
|||||||
|
|
||||||
#[error("conversion: {0}")]
|
#[error("conversion: {0}")]
|
||||||
Conversion(String),
|
Conversion(String),
|
||||||
|
|
||||||
#[error("failed to serialize response packet: {source}")]
|
|
||||||
FailedToSerializeResponsePacket { source: Box<bincode::ErrorKind> },
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,20 +1,16 @@
|
|||||||
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
pub mod traits;
|
|
||||||
pub mod v1;
|
pub mod v1;
|
||||||
pub mod v2;
|
pub mod v2;
|
||||||
pub mod v3;
|
pub mod v3;
|
||||||
pub mod v4;
|
|
||||||
pub mod v5;
|
|
||||||
|
|
||||||
mod error;
|
mod error;
|
||||||
mod util;
|
|
||||||
|
|
||||||
pub use error::Error;
|
pub use error::Error;
|
||||||
pub use v5 as latest;
|
pub use v3 as latest;
|
||||||
|
|
||||||
pub const CURRENT_VERSION: u8 = 5;
|
pub const CURRENT_VERSION: u8 = 3;
|
||||||
|
|
||||||
fn make_bincode_serializer() -> impl bincode::Options {
|
fn make_bincode_serializer() -> impl bincode::Options {
|
||||||
use bincode::Options;
|
use bincode::Options;
|
||||||
|
|||||||
@@ -1,415 +0,0 @@
|
|||||||
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
use nym_credentials_interface::CredentialSpendingData;
|
|
||||||
use nym_crypto::asymmetric::x25519::PrivateKey;
|
|
||||||
use nym_service_provider_requests_common::{Protocol, ServiceProviderType};
|
|
||||||
use nym_sphinx::addressing::clients::Recipient;
|
|
||||||
use nym_wireguard_types::PeerPublicKey;
|
|
||||||
|
|
||||||
use crate::{
|
|
||||||
v1, v2, v3, v4,
|
|
||||||
v5::{self, registration::IpPair},
|
|
||||||
Error,
|
|
||||||
};
|
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug)]
|
|
||||||
pub enum AuthenticatorVersion {
|
|
||||||
V1,
|
|
||||||
V2,
|
|
||||||
V3,
|
|
||||||
V4,
|
|
||||||
V5,
|
|
||||||
UNKNOWN,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<Protocol> for AuthenticatorVersion {
|
|
||||||
fn from(value: Protocol) -> Self {
|
|
||||||
if value.service_provider_type != ServiceProviderType::Authenticator {
|
|
||||||
AuthenticatorVersion::UNKNOWN
|
|
||||||
} else if value.version == v1::VERSION {
|
|
||||||
AuthenticatorVersion::V1
|
|
||||||
} else if value.version == v2::VERSION {
|
|
||||||
AuthenticatorVersion::V2
|
|
||||||
} else if value.version == v3::VERSION {
|
|
||||||
AuthenticatorVersion::V3
|
|
||||||
} else if value.version == v4::VERSION {
|
|
||||||
AuthenticatorVersion::V4
|
|
||||||
} else if value.version == v5::VERSION {
|
|
||||||
AuthenticatorVersion::V5
|
|
||||||
} else {
|
|
||||||
AuthenticatorVersion::UNKNOWN
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub trait InitMessage {
|
|
||||||
fn pub_key(&self) -> PeerPublicKey;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl InitMessage for v1::registration::InitMessage {
|
|
||||||
fn pub_key(&self) -> PeerPublicKey {
|
|
||||||
self.pub_key
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl InitMessage for v2::registration::InitMessage {
|
|
||||||
fn pub_key(&self) -> PeerPublicKey {
|
|
||||||
self.pub_key
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl InitMessage for v3::registration::InitMessage {
|
|
||||||
fn pub_key(&self) -> PeerPublicKey {
|
|
||||||
self.pub_key
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl InitMessage for v4::registration::InitMessage {
|
|
||||||
fn pub_key(&self) -> PeerPublicKey {
|
|
||||||
self.pub_key
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl InitMessage for v5::registration::InitMessage {
|
|
||||||
fn pub_key(&self) -> PeerPublicKey {
|
|
||||||
self.pub_key
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub trait FinalMessage {
|
|
||||||
fn pub_key(&self) -> PeerPublicKey;
|
|
||||||
fn verify(&self, private_key: &PrivateKey, nonce: u64) -> Result<(), Error>;
|
|
||||||
fn private_ips(&self) -> IpPair;
|
|
||||||
fn credential(&self) -> Option<CredentialSpendingData>;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl FinalMessage for v1::GatewayClient {
|
|
||||||
fn pub_key(&self) -> PeerPublicKey {
|
|
||||||
self.pub_key
|
|
||||||
}
|
|
||||||
|
|
||||||
fn verify(&self, private_key: &PrivateKey, nonce: u64) -> Result<(), Error> {
|
|
||||||
self.verify(private_key, nonce)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn private_ips(&self) -> IpPair {
|
|
||||||
self.private_ip.into()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn credential(&self) -> Option<CredentialSpendingData> {
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl FinalMessage for v2::registration::FinalMessage {
|
|
||||||
fn pub_key(&self) -> PeerPublicKey {
|
|
||||||
self.gateway_client.pub_key
|
|
||||||
}
|
|
||||||
|
|
||||||
fn verify(&self, private_key: &PrivateKey, nonce: u64) -> Result<(), Error> {
|
|
||||||
self.gateway_client.verify(private_key, nonce)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn private_ips(&self) -> IpPair {
|
|
||||||
self.gateway_client.private_ip.into()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn credential(&self) -> Option<CredentialSpendingData> {
|
|
||||||
self.credential.clone()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl FinalMessage for v3::registration::FinalMessage {
|
|
||||||
fn pub_key(&self) -> PeerPublicKey {
|
|
||||||
self.gateway_client.pub_key
|
|
||||||
}
|
|
||||||
|
|
||||||
fn verify(&self, private_key: &PrivateKey, nonce: u64) -> Result<(), Error> {
|
|
||||||
self.gateway_client.verify(private_key, nonce)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn private_ips(&self) -> IpPair {
|
|
||||||
self.gateway_client.private_ip.into()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn credential(&self) -> Option<CredentialSpendingData> {
|
|
||||||
self.credential.clone()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl FinalMessage for v4::registration::FinalMessage {
|
|
||||||
fn pub_key(&self) -> PeerPublicKey {
|
|
||||||
self.gateway_client.pub_key
|
|
||||||
}
|
|
||||||
|
|
||||||
fn verify(&self, private_key: &PrivateKey, nonce: u64) -> Result<(), Error> {
|
|
||||||
self.gateway_client.verify(private_key, nonce)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn private_ips(&self) -> IpPair {
|
|
||||||
self.gateway_client.private_ips.into()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn credential(&self) -> Option<CredentialSpendingData> {
|
|
||||||
self.credential.clone()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl FinalMessage for v5::registration::FinalMessage {
|
|
||||||
fn pub_key(&self) -> PeerPublicKey {
|
|
||||||
self.gateway_client.pub_key
|
|
||||||
}
|
|
||||||
|
|
||||||
fn verify(&self, private_key: &PrivateKey, nonce: u64) -> Result<(), Error> {
|
|
||||||
self.gateway_client.verify(private_key, nonce)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn private_ips(&self) -> IpPair {
|
|
||||||
self.gateway_client.private_ips
|
|
||||||
}
|
|
||||||
|
|
||||||
fn credential(&self) -> Option<CredentialSpendingData> {
|
|
||||||
self.credential.clone()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub trait QueryBandwidthMessage {
|
|
||||||
fn pub_key(&self) -> PeerPublicKey;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl QueryBandwidthMessage for PeerPublicKey {
|
|
||||||
fn pub_key(&self) -> PeerPublicKey {
|
|
||||||
*self
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub trait TopUpMessage {
|
|
||||||
fn pub_key(&self) -> PeerPublicKey;
|
|
||||||
fn credential(&self) -> CredentialSpendingData;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl TopUpMessage for v3::topup::TopUpMessage {
|
|
||||||
fn pub_key(&self) -> PeerPublicKey {
|
|
||||||
self.pub_key
|
|
||||||
}
|
|
||||||
|
|
||||||
fn credential(&self) -> CredentialSpendingData {
|
|
||||||
self.credential.clone()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl TopUpMessage for v4::topup::TopUpMessage {
|
|
||||||
fn pub_key(&self) -> PeerPublicKey {
|
|
||||||
self.pub_key
|
|
||||||
}
|
|
||||||
|
|
||||||
fn credential(&self) -> CredentialSpendingData {
|
|
||||||
self.credential.clone()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl TopUpMessage for v5::topup::TopUpMessage {
|
|
||||||
fn pub_key(&self) -> PeerPublicKey {
|
|
||||||
self.pub_key
|
|
||||||
}
|
|
||||||
|
|
||||||
fn credential(&self) -> CredentialSpendingData {
|
|
||||||
self.credential.clone()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub enum AuthenticatorRequest {
|
|
||||||
Initial {
|
|
||||||
msg: Box<dyn InitMessage + Send + Sync + 'static>,
|
|
||||||
protocol: Protocol,
|
|
||||||
reply_to: Option<Recipient>,
|
|
||||||
request_id: u64,
|
|
||||||
},
|
|
||||||
Final {
|
|
||||||
msg: Box<dyn FinalMessage + Send + Sync + 'static>,
|
|
||||||
protocol: Protocol,
|
|
||||||
reply_to: Option<Recipient>,
|
|
||||||
request_id: u64,
|
|
||||||
},
|
|
||||||
QueryBandwidth {
|
|
||||||
msg: Box<dyn QueryBandwidthMessage + Send + Sync + 'static>,
|
|
||||||
protocol: Protocol,
|
|
||||||
reply_to: Option<Recipient>,
|
|
||||||
request_id: u64,
|
|
||||||
},
|
|
||||||
TopUpBandwidth {
|
|
||||||
msg: Box<dyn TopUpMessage + Send + Sync + 'static>,
|
|
||||||
protocol: Protocol,
|
|
||||||
reply_to: Option<Recipient>,
|
|
||||||
request_id: u64,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v1::request::AuthenticatorRequest> for AuthenticatorRequest {
|
|
||||||
fn from(value: v1::request::AuthenticatorRequest) -> Self {
|
|
||||||
match value.data {
|
|
||||||
v1::request::AuthenticatorRequestData::Initial(init_message) => Self::Initial {
|
|
||||||
msg: Box::new(init_message),
|
|
||||||
protocol: Protocol {
|
|
||||||
version: value.version,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator,
|
|
||||||
},
|
|
||||||
reply_to: Some(value.reply_to),
|
|
||||||
request_id: value.request_id,
|
|
||||||
},
|
|
||||||
v1::request::AuthenticatorRequestData::Final(gateway_client) => Self::Final {
|
|
||||||
msg: Box::new(gateway_client),
|
|
||||||
protocol: Protocol {
|
|
||||||
version: value.version,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator,
|
|
||||||
},
|
|
||||||
reply_to: Some(value.reply_to),
|
|
||||||
request_id: value.request_id,
|
|
||||||
},
|
|
||||||
v1::request::AuthenticatorRequestData::QueryBandwidth(peer_public_key) => {
|
|
||||||
Self::QueryBandwidth {
|
|
||||||
msg: Box::new(peer_public_key),
|
|
||||||
protocol: Protocol {
|
|
||||||
version: value.version,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator,
|
|
||||||
},
|
|
||||||
reply_to: Some(value.reply_to),
|
|
||||||
request_id: value.request_id,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v2::request::AuthenticatorRequest> for AuthenticatorRequest {
|
|
||||||
fn from(value: v2::request::AuthenticatorRequest) -> Self {
|
|
||||||
match value.data {
|
|
||||||
v2::request::AuthenticatorRequestData::Initial(init_message) => Self::Initial {
|
|
||||||
msg: Box::new(init_message),
|
|
||||||
protocol: value.protocol,
|
|
||||||
reply_to: Some(value.reply_to),
|
|
||||||
request_id: value.request_id,
|
|
||||||
},
|
|
||||||
v2::request::AuthenticatorRequestData::Final(final_message) => Self::Final {
|
|
||||||
msg: final_message,
|
|
||||||
protocol: value.protocol,
|
|
||||||
reply_to: Some(value.reply_to),
|
|
||||||
request_id: value.request_id,
|
|
||||||
},
|
|
||||||
v2::request::AuthenticatorRequestData::QueryBandwidth(peer_public_key) => {
|
|
||||||
Self::QueryBandwidth {
|
|
||||||
msg: Box::new(peer_public_key),
|
|
||||||
protocol: value.protocol,
|
|
||||||
reply_to: Some(value.reply_to),
|
|
||||||
request_id: value.request_id,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v3::request::AuthenticatorRequest> for AuthenticatorRequest {
|
|
||||||
fn from(value: v3::request::AuthenticatorRequest) -> Self {
|
|
||||||
match value.data {
|
|
||||||
v3::request::AuthenticatorRequestData::Initial(init_message) => Self::Initial {
|
|
||||||
msg: Box::new(init_message),
|
|
||||||
protocol: value.protocol,
|
|
||||||
reply_to: Some(value.reply_to),
|
|
||||||
request_id: value.request_id,
|
|
||||||
},
|
|
||||||
v3::request::AuthenticatorRequestData::Final(final_message) => Self::Final {
|
|
||||||
msg: final_message,
|
|
||||||
protocol: value.protocol,
|
|
||||||
reply_to: Some(value.reply_to),
|
|
||||||
request_id: value.request_id,
|
|
||||||
},
|
|
||||||
v3::request::AuthenticatorRequestData::QueryBandwidth(peer_public_key) => {
|
|
||||||
Self::QueryBandwidth {
|
|
||||||
msg: Box::new(peer_public_key),
|
|
||||||
protocol: value.protocol,
|
|
||||||
reply_to: Some(value.reply_to),
|
|
||||||
request_id: value.request_id,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
v3::request::AuthenticatorRequestData::TopUpBandwidth(top_up_message) => {
|
|
||||||
Self::TopUpBandwidth {
|
|
||||||
msg: top_up_message,
|
|
||||||
protocol: value.protocol,
|
|
||||||
reply_to: Some(value.reply_to),
|
|
||||||
request_id: value.request_id,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v4::request::AuthenticatorRequest> for AuthenticatorRequest {
|
|
||||||
fn from(value: v4::request::AuthenticatorRequest) -> Self {
|
|
||||||
match value.data {
|
|
||||||
v4::request::AuthenticatorRequestData::Initial(init_message) => Self::Initial {
|
|
||||||
msg: Box::new(init_message),
|
|
||||||
protocol: value.protocol,
|
|
||||||
reply_to: Some(value.reply_to),
|
|
||||||
request_id: value.request_id,
|
|
||||||
},
|
|
||||||
v4::request::AuthenticatorRequestData::Final(final_message) => Self::Final {
|
|
||||||
msg: final_message,
|
|
||||||
protocol: value.protocol,
|
|
||||||
reply_to: Some(value.reply_to),
|
|
||||||
request_id: value.request_id,
|
|
||||||
},
|
|
||||||
v4::request::AuthenticatorRequestData::QueryBandwidth(peer_public_key) => {
|
|
||||||
Self::QueryBandwidth {
|
|
||||||
msg: Box::new(peer_public_key),
|
|
||||||
protocol: value.protocol,
|
|
||||||
reply_to: Some(value.reply_to),
|
|
||||||
request_id: value.request_id,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
v4::request::AuthenticatorRequestData::TopUpBandwidth(top_up_message) => {
|
|
||||||
Self::TopUpBandwidth {
|
|
||||||
msg: top_up_message,
|
|
||||||
protocol: value.protocol,
|
|
||||||
reply_to: Some(value.reply_to),
|
|
||||||
request_id: value.request_id,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v5::request::AuthenticatorRequest> for AuthenticatorRequest {
|
|
||||||
fn from(value: v5::request::AuthenticatorRequest) -> Self {
|
|
||||||
match value.data {
|
|
||||||
v5::request::AuthenticatorRequestData::Initial(init_message) => Self::Initial {
|
|
||||||
msg: Box::new(init_message),
|
|
||||||
protocol: value.protocol,
|
|
||||||
reply_to: None,
|
|
||||||
request_id: value.request_id,
|
|
||||||
},
|
|
||||||
v5::request::AuthenticatorRequestData::Final(final_message) => Self::Final {
|
|
||||||
msg: final_message,
|
|
||||||
protocol: value.protocol,
|
|
||||||
reply_to: None,
|
|
||||||
request_id: value.request_id,
|
|
||||||
},
|
|
||||||
v5::request::AuthenticatorRequestData::QueryBandwidth(peer_public_key) => {
|
|
||||||
Self::QueryBandwidth {
|
|
||||||
msg: Box::new(peer_public_key),
|
|
||||||
protocol: value.protocol,
|
|
||||||
reply_to: None,
|
|
||||||
request_id: value.request_id,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
v5::request::AuthenticatorRequestData::TopUpBandwidth(top_up_message) => {
|
|
||||||
Self::TopUpBandwidth {
|
|
||||||
msg: top_up_message,
|
|
||||||
protocol: value.protocol,
|
|
||||||
reply_to: None,
|
|
||||||
request_id: value.request_id,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
pub(crate) mod tests {
|
|
||||||
pub(crate) const CREDENTIAL_BYTES: [u8; 1245] = [
|
|
||||||
0, 0, 4, 133, 96, 179, 223, 185, 136, 23, 213, 166, 59, 203, 66, 69, 209, 181, 227, 254,
|
|
||||||
16, 102, 98, 237, 59, 119, 170, 111, 31, 194, 51, 59, 120, 17, 115, 229, 79, 91, 11, 139,
|
|
||||||
154, 2, 212, 23, 68, 70, 167, 3, 240, 54, 224, 171, 221, 1, 69, 48, 60, 118, 119, 249, 123,
|
|
||||||
35, 172, 227, 131, 96, 232, 209, 187, 123, 4, 197, 102, 90, 96, 45, 125, 135, 140, 99, 1,
|
|
||||||
151, 17, 131, 143, 157, 97, 107, 139, 232, 212, 87, 14, 115, 253, 255, 166, 167, 186, 43,
|
|
||||||
90, 96, 173, 105, 120, 40, 10, 163, 250, 224, 214, 200, 178, 4, 160, 16, 130, 59, 76, 193,
|
|
||||||
39, 240, 3, 101, 141, 209, 183, 226, 186, 207, 56, 210, 187, 7, 164, 240, 164, 205, 37, 81,
|
|
||||||
184, 214, 193, 195, 90, 205, 238, 225, 195, 104, 12, 123, 203, 57, 233, 243, 215, 145, 195,
|
|
||||||
196, 57, 38, 125, 172, 18, 47, 63, 165, 110, 219, 180, 40, 58, 116, 92, 254, 160, 98, 48,
|
|
||||||
92, 254, 232, 107, 184, 80, 234, 60, 160, 235, 249, 76, 41, 38, 165, 28, 40, 136, 74, 48,
|
|
||||||
166, 50, 245, 23, 201, 140, 101, 79, 93, 235, 128, 186, 146, 126, 180, 134, 43, 13, 186,
|
|
||||||
19, 195, 48, 168, 201, 29, 216, 95, 176, 198, 132, 188, 64, 39, 212, 150, 32, 52, 53, 38,
|
|
||||||
228, 199, 122, 226, 217, 75, 40, 191, 151, 48, 164, 242, 177, 79, 14, 122, 105, 151, 85,
|
|
||||||
88, 199, 162, 17, 96, 103, 83, 178, 128, 9, 24, 30, 74, 108, 241, 85, 240, 166, 97, 241,
|
|
||||||
85, 199, 11, 198, 226, 234, 70, 107, 145, 28, 208, 114, 51, 12, 234, 108, 101, 202, 112,
|
|
||||||
48, 185, 22, 159, 67, 109, 49, 27, 149, 90, 109, 32, 226, 112, 7, 201, 208, 209, 104, 31,
|
|
||||||
97, 134, 204, 145, 27, 181, 206, 181, 106, 32, 110, 136, 115, 249, 201, 111, 5, 245, 203,
|
|
||||||
71, 121, 169, 126, 151, 178, 236, 59, 221, 195, 48, 135, 115, 6, 50, 227, 74, 97, 107, 107,
|
|
||||||
213, 90, 2, 203, 154, 138, 47, 128, 52, 134, 128, 224, 51, 65, 240, 90, 8, 55, 175, 180,
|
|
||||||
178, 204, 206, 168, 110, 51, 57, 189, 169, 48, 169, 136, 121, 99, 51, 170, 178, 214, 74, 1,
|
|
||||||
96, 151, 167, 25, 173, 180, 171, 155, 10, 55, 142, 234, 190, 113, 90, 79, 80, 244, 71, 166,
|
|
||||||
30, 235, 113, 150, 133, 1, 218, 17, 109, 111, 223, 24, 216, 177, 41, 2, 204, 65, 221, 212,
|
|
||||||
207, 236, 144, 6, 65, 224, 55, 42, 1, 1, 161, 134, 118, 127, 111, 220, 110, 127, 240, 71,
|
|
||||||
223, 129, 12, 93, 20, 220, 60, 56, 71, 146, 184, 95, 132, 69, 28, 56, 53, 192, 213, 22,
|
|
||||||
119, 230, 152, 225, 182, 188, 163, 219, 37, 175, 247, 73, 14, 247, 38, 72, 243, 1, 48, 131,
|
|
||||||
59, 8, 13, 96, 143, 185, 127, 241, 161, 217, 24, 149, 193, 40, 16, 30, 202, 151, 28, 119,
|
|
||||||
240, 153, 101, 156, 61, 193, 72, 245, 199, 181, 12, 231, 65, 166, 67, 142, 121, 207, 202,
|
|
||||||
58, 197, 113, 188, 248, 42, 124, 105, 48, 161, 241, 55, 209, 36, 194, 27, 63, 233, 144,
|
|
||||||
189, 85, 117, 234, 9, 139, 46, 31, 206, 114, 95, 131, 29, 240, 13, 81, 142, 140, 133, 33,
|
|
||||||
30, 41, 141, 37, 80, 217, 95, 221, 76, 115, 86, 201, 165, 51, 252, 9, 28, 209, 1, 48, 150,
|
|
||||||
74, 248, 212, 187, 222, 66, 210, 3, 200, 19, 217, 171, 184, 42, 148, 53, 150, 57, 50, 6,
|
|
||||||
227, 227, 62, 49, 42, 148, 148, 157, 82, 191, 58, 24, 34, 56, 98, 120, 89, 105, 176, 85,
|
|
||||||
15, 253, 241, 41, 153, 195, 136, 1, 48, 142, 126, 213, 101, 223, 79, 133, 230, 105, 38,
|
|
||||||
161, 149, 2, 21, 136, 150, 42, 72, 218, 85, 146, 63, 223, 58, 108, 186, 183, 248, 62, 20,
|
|
||||||
47, 34, 113, 160, 177, 204, 181, 16, 24, 212, 224, 35, 84, 51, 168, 56, 136, 11, 1, 48,
|
|
||||||
135, 242, 62, 149, 230, 178, 32, 224, 119, 26, 234, 163, 237, 224, 114, 95, 112, 140, 170,
|
|
||||||
150, 96, 125, 136, 221, 180, 78, 18, 11, 12, 184, 2, 198, 217, 119, 43, 69, 4, 172, 109,
|
|
||||||
55, 183, 40, 131, 172, 161, 88, 183, 101, 1, 48, 173, 216, 22, 73, 42, 255, 211, 93, 249,
|
|
||||||
87, 159, 115, 61, 91, 55, 130, 17, 216, 60, 34, 122, 55, 8, 244, 244, 153, 151, 57, 5, 144,
|
|
||||||
178, 55, 249, 64, 211, 168, 34, 148, 56, 89, 92, 203, 70, 124, 219, 152, 253, 165, 0, 32,
|
|
||||||
203, 116, 63, 7, 240, 222, 82, 86, 11, 149, 167, 72, 224, 55, 190, 66, 201, 65, 168, 184,
|
|
||||||
96, 47, 194, 241, 168, 124, 7, 74, 214, 250, 37, 76, 32, 218, 69, 122, 103, 215, 145, 169,
|
|
||||||
24, 212, 229, 168, 106, 10, 144, 31, 13, 25, 178, 242, 250, 106, 159, 40, 48, 163, 165, 61,
|
|
||||||
130, 57, 146, 4, 73, 32, 254, 233, 125, 135, 212, 29, 111, 4, 177, 114, 15, 210, 170, 82,
|
|
||||||
108, 110, 62, 166, 81, 209, 106, 176, 156, 14, 133, 242, 60, 127, 120, 242, 28, 97, 0, 1,
|
|
||||||
32, 103, 93, 109, 89, 240, 91, 1, 84, 150, 50, 206, 157, 203, 49, 220, 120, 234, 175, 234,
|
|
||||||
150, 126, 225, 94, 163, 164, 199, 138, 114, 62, 99, 106, 112, 1, 32, 171, 40, 220, 82, 241,
|
|
||||||
203, 76, 146, 111, 139, 182, 179, 237, 182, 115, 75, 128, 201, 107, 43, 214, 0, 135, 217,
|
|
||||||
160, 68, 150, 232, 144, 114, 237, 98, 32, 30, 134, 232, 59, 93, 163, 253, 244, 13, 202, 52,
|
|
||||||
147, 168, 83, 121, 123, 95, 21, 210, 209, 225, 223, 143, 49, 10, 205, 238, 1, 22, 83, 81,
|
|
||||||
70, 1, 32, 26, 76, 6, 234, 160, 50, 139, 102, 161, 232, 155, 106, 130, 171, 226, 210, 233,
|
|
||||||
178, 85, 247, 71, 123, 55, 53, 46, 67, 148, 137, 156, 207, 208, 107, 1, 32, 102, 31, 4, 98,
|
|
||||||
110, 156, 144, 61, 229, 140, 198, 84, 196, 238, 128, 35, 131, 182, 137, 125, 241, 95, 69,
|
|
||||||
131, 170, 27, 2, 144, 75, 72, 242, 102, 3, 32, 121, 80, 45, 173, 56, 65, 218, 27, 40, 251,
|
|
||||||
197, 32, 169, 104, 123, 110, 90, 78, 153, 166, 38, 9, 129, 228, 99, 8, 1, 116, 142, 233,
|
|
||||||
162, 69, 32, 216, 169, 159, 116, 95, 12, 63, 176, 195, 6, 183, 123, 135, 75, 61, 112, 106,
|
|
||||||
83, 235, 176, 41, 27, 248, 48, 71, 165, 170, 12, 92, 103, 103, 81, 32, 58, 74, 75, 145,
|
|
||||||
192, 94, 153, 69, 80, 128, 241, 3, 16, 117, 192, 86, 161, 103, 44, 174, 211, 196, 182, 124,
|
|
||||||
55, 11, 107, 142, 49, 88, 6, 41, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
|
||||||
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
|
||||||
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 0, 37, 139, 240, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 1,
|
|
||||||
];
|
|
||||||
pub(crate) const RECIPIENT: &str = "CytBseW6yFXUMzz4SGAKdNLGR7q3sJLLYxyBGvutNEQV.4QXYyEVc5fUDjmmi8PrHN9tdUFV4PCvSJE1278cHyvoe@4sBbL1ngf1vtNqykydQKTFh26sQCw888GpUqvPvyNB4f";
|
|
||||||
}
|
|
||||||
@@ -13,7 +13,7 @@ use std::{fmt, ops::Deref, str::FromStr};
|
|||||||
#[cfg(feature = "verify")]
|
#[cfg(feature = "verify")]
|
||||||
use hmac::{Hmac, Mac};
|
use hmac::{Hmac, Mac};
|
||||||
#[cfg(feature = "verify")]
|
#[cfg(feature = "verify")]
|
||||||
use nym_crypto::asymmetric::x25519::{PrivateKey, PublicKey};
|
use nym_crypto::asymmetric::encryption::PrivateKey;
|
||||||
#[cfg(feature = "verify")]
|
#[cfg(feature = "verify")]
|
||||||
use sha2::Sha256;
|
use sha2::Sha256;
|
||||||
|
|
||||||
@@ -82,14 +82,16 @@ impl GatewayClient {
|
|||||||
private_ip: IpAddr,
|
private_ip: IpAddr,
|
||||||
nonce: u64,
|
nonce: u64,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
let local_public = PublicKey::from(local_secret);
|
// convert from 1.0 x25519-dalek private key into 2.0 x25519-dalek
|
||||||
let remote_public = PublicKey::from(remote_public);
|
#[allow(clippy::expect_used)]
|
||||||
|
let static_secret = x25519_dalek::StaticSecret::from(local_secret.to_bytes());
|
||||||
|
let local_public: x25519_dalek::PublicKey = (&static_secret).into();
|
||||||
|
|
||||||
let dh = local_secret.diffie_hellman(&remote_public);
|
let dh = static_secret.diffie_hellman(&remote_public);
|
||||||
|
|
||||||
// TODO: change that to use our nym_crypto::hmac module instead
|
// TODO: change that to use our nym_crypto::hmac module instead
|
||||||
#[allow(clippy::expect_used)]
|
#[allow(clippy::expect_used)]
|
||||||
let mut mac = HmacSha256::new_from_slice(&dh[..])
|
let mut mac = HmacSha256::new_from_slice(dh.as_bytes())
|
||||||
.expect("x25519 shared secret is always 32 bytes long");
|
.expect("x25519 shared secret is always 32 bytes long");
|
||||||
|
|
||||||
mac.update(local_public.as_bytes());
|
mac.update(local_public.as_bytes());
|
||||||
@@ -97,7 +99,7 @@ impl GatewayClient {
|
|||||||
mac.update(&nonce.to_le_bytes());
|
mac.update(&nonce.to_le_bytes());
|
||||||
|
|
||||||
GatewayClient {
|
GatewayClient {
|
||||||
pub_key: PeerPublicKey::new(local_public.into()),
|
pub_key: PeerPublicKey::new(local_public),
|
||||||
private_ip,
|
private_ip,
|
||||||
mac: ClientMac(mac.finalize().into_bytes().to_vec()),
|
mac: ClientMac(mac.finalize().into_bytes().to_vec()),
|
||||||
}
|
}
|
||||||
@@ -107,8 +109,11 @@ impl GatewayClient {
|
|||||||
// Client should perform this step when generating its payload, using its own WG PK
|
// Client should perform this step when generating its payload, using its own WG PK
|
||||||
#[cfg(feature = "verify")]
|
#[cfg(feature = "verify")]
|
||||||
pub fn verify(&self, gateway_key: &PrivateKey, nonce: u64) -> Result<(), Error> {
|
pub fn verify(&self, gateway_key: &PrivateKey, nonce: u64) -> Result<(), Error> {
|
||||||
// use gateways key as a ref to an x25519_dalek key
|
// convert from 1.0 x25519-dalek private key into 2.0 x25519-dalek
|
||||||
let dh = gateway_key.inner().diffie_hellman(&self.pub_key);
|
#[allow(clippy::expect_used)]
|
||||||
|
let static_secret = x25519_dalek::StaticSecret::from(gateway_key.to_bytes());
|
||||||
|
|
||||||
|
let dh = static_secret.diffie_hellman(&self.pub_key);
|
||||||
|
|
||||||
// TODO: change that to use our nym_crypto::hmac module instead
|
// TODO: change that to use our nym_crypto::hmac module instead
|
||||||
#[allow(clippy::expect_used)]
|
#[allow(clippy::expect_used)]
|
||||||
@@ -190,15 +195,15 @@ impl<'de> Deserialize<'de> for ClientMac {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use nym_crypto::asymmetric::x25519;
|
use nym_crypto::asymmetric::encryption;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg(feature = "verify")]
|
#[cfg(feature = "verify")]
|
||||||
fn client_request_roundtrip() {
|
fn client_request_roundtrip() {
|
||||||
let mut rng = rand::thread_rng();
|
let mut rng = rand::thread_rng();
|
||||||
|
|
||||||
let gateway_key_pair = x25519::KeyPair::new(&mut rng);
|
let gateway_key_pair = encryption::KeyPair::new(&mut rng);
|
||||||
let client_key_pair = x25519::KeyPair::new(&mut rng);
|
let client_key_pair = encryption::KeyPair::new(&mut rng);
|
||||||
|
|
||||||
let nonce = 1234567890;
|
let nonce = 1234567890;
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ use std::{fmt, ops::Deref, str::FromStr};
|
|||||||
#[cfg(feature = "verify")]
|
#[cfg(feature = "verify")]
|
||||||
use hmac::{Hmac, Mac};
|
use hmac::{Hmac, Mac};
|
||||||
#[cfg(feature = "verify")]
|
#[cfg(feature = "verify")]
|
||||||
use nym_crypto::asymmetric::x25519::{PrivateKey, PublicKey};
|
use nym_crypto::asymmetric::encryption::PrivateKey;
|
||||||
#[cfg(feature = "verify")]
|
#[cfg(feature = "verify")]
|
||||||
use sha2::Sha256;
|
use sha2::Sha256;
|
||||||
|
|
||||||
@@ -29,7 +29,7 @@ pub type Taken = Option<SystemTime>;
|
|||||||
|
|
||||||
pub const BANDWIDTH_CAP_PER_DAY: u64 = 1024 * 1024 * 1024; // 1 GB
|
pub const BANDWIDTH_CAP_PER_DAY: u64 = 1024 * 1024 * 1024; // 1 GB
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||||
pub struct InitMessage {
|
pub struct InitMessage {
|
||||||
/// Base64 encoded x25519 public key
|
/// Base64 encoded x25519 public key
|
||||||
pub pub_key: PeerPublicKey,
|
pub pub_key: PeerPublicKey,
|
||||||
@@ -41,7 +41,7 @@ impl InitMessage {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||||
pub struct FinalMessage {
|
pub struct FinalMessage {
|
||||||
/// Gateway client data
|
/// Gateway client data
|
||||||
pub gateway_client: GatewayClient,
|
pub gateway_client: GatewayClient,
|
||||||
@@ -50,28 +50,28 @@ pub struct FinalMessage {
|
|||||||
pub credential: Option<CredentialSpendingData>,
|
pub credential: Option<CredentialSpendingData>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||||
pub struct RegistrationData {
|
pub struct RegistrationData {
|
||||||
pub nonce: u64,
|
pub nonce: u64,
|
||||||
pub gateway_data: GatewayClient,
|
pub gateway_data: GatewayClient,
|
||||||
pub wg_port: u16,
|
pub wg_port: u16,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||||
pub struct RegistredData {
|
pub struct RegistredData {
|
||||||
pub pub_key: PeerPublicKey,
|
pub pub_key: PeerPublicKey,
|
||||||
pub private_ip: IpAddr,
|
pub private_ip: IpAddr,
|
||||||
pub wg_port: u16,
|
pub wg_port: u16,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||||
pub struct RemainingBandwidthData {
|
pub struct RemainingBandwidthData {
|
||||||
pub available_bandwidth: i64,
|
pub available_bandwidth: i64,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Client that wants to register sends its PublicKey bytes mac digest encrypted with a DH shared secret.
|
/// Client that wants to register sends its PublicKey bytes mac digest encrypted with a DH shared secret.
|
||||||
/// Gateway/Nym node can then verify pub_key payload using the same process
|
/// Gateway/Nym node can then verify pub_key payload using the same process
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||||
pub struct GatewayClient {
|
pub struct GatewayClient {
|
||||||
/// Base64 encoded x25519 public key
|
/// Base64 encoded x25519 public key
|
||||||
pub pub_key: PeerPublicKey,
|
pub pub_key: PeerPublicKey,
|
||||||
@@ -91,14 +91,16 @@ impl GatewayClient {
|
|||||||
private_ip: IpAddr,
|
private_ip: IpAddr,
|
||||||
nonce: u64,
|
nonce: u64,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
let local_public = PublicKey::from(local_secret);
|
// convert from 1.0 x25519-dalek private key into 2.0 x25519-dalek
|
||||||
let remote_public = PublicKey::from(remote_public);
|
#[allow(clippy::expect_used)]
|
||||||
|
let static_secret = x25519_dalek::StaticSecret::from(local_secret.to_bytes());
|
||||||
|
let local_public: x25519_dalek::PublicKey = (&static_secret).into();
|
||||||
|
|
||||||
let dh = local_secret.diffie_hellman(&remote_public);
|
let dh = static_secret.diffie_hellman(&remote_public);
|
||||||
|
|
||||||
// TODO: change that to use our nym_crypto::hmac module instead
|
// TODO: change that to use our nym_crypto::hmac module instead
|
||||||
#[allow(clippy::expect_used)]
|
#[allow(clippy::expect_used)]
|
||||||
let mut mac = HmacSha256::new_from_slice(&dh[..])
|
let mut mac = HmacSha256::new_from_slice(dh.as_bytes())
|
||||||
.expect("x25519 shared secret is always 32 bytes long");
|
.expect("x25519 shared secret is always 32 bytes long");
|
||||||
|
|
||||||
mac.update(local_public.as_bytes());
|
mac.update(local_public.as_bytes());
|
||||||
@@ -106,7 +108,7 @@ impl GatewayClient {
|
|||||||
mac.update(&nonce.to_le_bytes());
|
mac.update(&nonce.to_le_bytes());
|
||||||
|
|
||||||
GatewayClient {
|
GatewayClient {
|
||||||
pub_key: PeerPublicKey::new(local_public.into()),
|
pub_key: PeerPublicKey::new(local_public),
|
||||||
private_ip,
|
private_ip,
|
||||||
mac: ClientMac(mac.finalize().into_bytes().to_vec()),
|
mac: ClientMac(mac.finalize().into_bytes().to_vec()),
|
||||||
}
|
}
|
||||||
@@ -116,8 +118,11 @@ impl GatewayClient {
|
|||||||
// Client should perform this step when generating its payload, using its own WG PK
|
// Client should perform this step when generating its payload, using its own WG PK
|
||||||
#[cfg(feature = "verify")]
|
#[cfg(feature = "verify")]
|
||||||
pub fn verify(&self, gateway_key: &PrivateKey, nonce: u64) -> Result<(), Error> {
|
pub fn verify(&self, gateway_key: &PrivateKey, nonce: u64) -> Result<(), Error> {
|
||||||
// use gateways key as a ref to an x25519_dalek key
|
// convert from 1.0 x25519-dalek private key into 2.0 x25519-dalek
|
||||||
let dh = gateway_key.inner().diffie_hellman(&self.pub_key);
|
#[allow(clippy::expect_used)]
|
||||||
|
let static_secret = x25519_dalek::StaticSecret::from(gateway_key.to_bytes());
|
||||||
|
|
||||||
|
let dh = static_secret.diffie_hellman(&self.pub_key);
|
||||||
|
|
||||||
// TODO: change that to use our nym_crypto::hmac module instead
|
// TODO: change that to use our nym_crypto::hmac module instead
|
||||||
#[allow(clippy::expect_used)]
|
#[allow(clippy::expect_used)]
|
||||||
@@ -142,7 +147,7 @@ impl GatewayClient {
|
|||||||
|
|
||||||
// TODO: change the inner type into generic array of size HmacSha256::OutputSize
|
// TODO: change the inner type into generic array of size HmacSha256::OutputSize
|
||||||
// TODO2: rely on our internal crypto/hmac
|
// TODO2: rely on our internal crypto/hmac
|
||||||
#[derive(Debug, Clone, PartialEq)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct ClientMac(Vec<u8>);
|
pub struct ClientMac(Vec<u8>);
|
||||||
|
|
||||||
impl fmt::Display for ClientMac {
|
impl fmt::Display for ClientMac {
|
||||||
@@ -199,15 +204,15 @@ impl<'de> Deserialize<'de> for ClientMac {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use nym_crypto::asymmetric::x25519;
|
use nym_crypto::asymmetric::encryption;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg(feature = "verify")]
|
#[cfg(feature = "verify")]
|
||||||
fn client_request_roundtrip() {
|
fn client_request_roundtrip() {
|
||||||
let mut rng = rand::thread_rng();
|
let mut rng = rand::thread_rng();
|
||||||
|
|
||||||
let gateway_key_pair = x25519::KeyPair::new(&mut rng);
|
let gateway_key_pair = encryption::KeyPair::new(&mut rng);
|
||||||
let client_key_pair = x25519::KeyPair::new(&mut rng);
|
let client_key_pair = encryption::KeyPair::new(&mut rng);
|
||||||
|
|
||||||
let nonce = 1234567890;
|
let nonce = 1234567890;
|
||||||
|
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ impl AuthenticatorRequest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
pub enum AuthenticatorRequestData {
|
pub enum AuthenticatorRequestData {
|
||||||
Initial(InitMessage),
|
Initial(InitMessage),
|
||||||
Final(Box<FinalMessage>),
|
Final(Box<FinalMessage>),
|
||||||
|
|||||||
@@ -100,28 +100,28 @@ impl AuthenticatorResponse {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
pub enum AuthenticatorResponseData {
|
pub enum AuthenticatorResponseData {
|
||||||
PendingRegistration(PendingRegistrationResponse),
|
PendingRegistration(PendingRegistrationResponse),
|
||||||
Registered(RegisteredResponse),
|
Registered(RegisteredResponse),
|
||||||
RemainingBandwidth(RemainingBandwidthResponse),
|
RemainingBandwidth(RemainingBandwidthResponse),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
pub struct PendingRegistrationResponse {
|
pub struct PendingRegistrationResponse {
|
||||||
pub request_id: u64,
|
pub request_id: u64,
|
||||||
pub reply_to: Recipient,
|
pub reply_to: Recipient,
|
||||||
pub reply: RegistrationData,
|
pub reply: RegistrationData,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
pub struct RegisteredResponse {
|
pub struct RegisteredResponse {
|
||||||
pub request_id: u64,
|
pub request_id: u64,
|
||||||
pub reply_to: Recipient,
|
pub reply_to: Recipient,
|
||||||
pub reply: RegistredData,
|
pub reply: RegistredData,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
pub struct RemainingBandwidthResponse {
|
pub struct RemainingBandwidthResponse {
|
||||||
pub request_id: u64,
|
pub request_id: u64,
|
||||||
pub reply_to: Recipient,
|
pub reply_to: Recipient,
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ impl From<v2::request::AuthenticatorRequest> for v3::request::AuthenticatorReque
|
|||||||
fn from(authenticator_request: v2::request::AuthenticatorRequest) -> Self {
|
fn from(authenticator_request: v2::request::AuthenticatorRequest) -> Self {
|
||||||
Self {
|
Self {
|
||||||
protocol: Protocol {
|
protocol: Protocol {
|
||||||
version: 3,
|
version: 2,
|
||||||
service_provider_type: ServiceProviderType::Authenticator,
|
service_provider_type: ServiceProviderType::Authenticator,
|
||||||
},
|
},
|
||||||
data: authenticator_request.data.into(),
|
data: authenticator_request.data.into(),
|
||||||
@@ -19,24 +19,6 @@ impl From<v2::request::AuthenticatorRequest> for v3::request::AuthenticatorReque
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TryFrom<v3::request::AuthenticatorRequest> for v2::request::AuthenticatorRequest {
|
|
||||||
type Error = crate::Error;
|
|
||||||
|
|
||||||
fn try_from(
|
|
||||||
authenticator_request: v3::request::AuthenticatorRequest,
|
|
||||||
) -> Result<Self, Self::Error> {
|
|
||||||
Ok(Self {
|
|
||||||
protocol: Protocol {
|
|
||||||
version: 2,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator,
|
|
||||||
},
|
|
||||||
data: authenticator_request.data.try_into()?,
|
|
||||||
reply_to: authenticator_request.reply_to,
|
|
||||||
request_id: authenticator_request.request_id,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v2::request::AuthenticatorRequestData> for v3::request::AuthenticatorRequestData {
|
impl From<v2::request::AuthenticatorRequestData> for v3::request::AuthenticatorRequestData {
|
||||||
fn from(authenticator_request_data: v2::request::AuthenticatorRequestData) -> Self {
|
fn from(authenticator_request_data: v2::request::AuthenticatorRequestData) -> Self {
|
||||||
match authenticator_request_data {
|
match authenticator_request_data {
|
||||||
@@ -53,29 +35,6 @@ impl From<v2::request::AuthenticatorRequestData> for v3::request::AuthenticatorR
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TryFrom<v3::request::AuthenticatorRequestData> for v2::request::AuthenticatorRequestData {
|
|
||||||
type Error = crate::Error;
|
|
||||||
|
|
||||||
fn try_from(
|
|
||||||
authenticator_request_data: v3::request::AuthenticatorRequestData,
|
|
||||||
) -> Result<Self, Self::Error> {
|
|
||||||
match authenticator_request_data {
|
|
||||||
v3::request::AuthenticatorRequestData::Initial(init_msg) => Ok(
|
|
||||||
v2::request::AuthenticatorRequestData::Initial(init_msg.into()),
|
|
||||||
),
|
|
||||||
v3::request::AuthenticatorRequestData::Final(gw_client) => Ok(
|
|
||||||
v2::request::AuthenticatorRequestData::Final(gw_client.into()),
|
|
||||||
),
|
|
||||||
v3::request::AuthenticatorRequestData::QueryBandwidth(pub_key) => Ok(
|
|
||||||
v2::request::AuthenticatorRequestData::QueryBandwidth(pub_key),
|
|
||||||
),
|
|
||||||
v3::request::AuthenticatorRequestData::TopUpBandwidth(_) => Err(
|
|
||||||
Self::Error::Conversion("no top up bandwidth variant in v2".to_string()),
|
|
||||||
),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v2::registration::InitMessage> for v3::registration::InitMessage {
|
impl From<v2::registration::InitMessage> for v3::registration::InitMessage {
|
||||||
fn from(init_msg: v2::registration::InitMessage) -> Self {
|
fn from(init_msg: v2::registration::InitMessage) -> Self {
|
||||||
Self {
|
Self {
|
||||||
@@ -84,14 +43,6 @@ impl From<v2::registration::InitMessage> for v3::registration::InitMessage {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<v3::registration::InitMessage> for v2::registration::InitMessage {
|
|
||||||
fn from(init_msg: v3::registration::InitMessage) -> Self {
|
|
||||||
Self {
|
|
||||||
pub_key: init_msg.pub_key,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<Box<v2::registration::FinalMessage>> for Box<v3::registration::FinalMessage> {
|
impl From<Box<v2::registration::FinalMessage>> for Box<v3::registration::FinalMessage> {
|
||||||
fn from(gw_client: Box<v2::registration::FinalMessage>) -> Self {
|
fn from(gw_client: Box<v2::registration::FinalMessage>) -> Self {
|
||||||
Box::new(v3::registration::FinalMessage {
|
Box::new(v3::registration::FinalMessage {
|
||||||
@@ -101,15 +52,6 @@ impl From<Box<v2::registration::FinalMessage>> for Box<v3::registration::FinalMe
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<Box<v3::registration::FinalMessage>> for Box<v2::registration::FinalMessage> {
|
|
||||||
fn from(gw_client: Box<v3::registration::FinalMessage>) -> Self {
|
|
||||||
Box::new(v2::registration::FinalMessage {
|
|
||||||
gateway_client: gw_client.gateway_client.into(),
|
|
||||||
credential: gw_client.credential,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v2::registration::GatewayClient> for v3::registration::GatewayClient {
|
impl From<v2::registration::GatewayClient> for v3::registration::GatewayClient {
|
||||||
fn from(gw_client: v2::registration::GatewayClient) -> Self {
|
fn from(gw_client: v2::registration::GatewayClient) -> Self {
|
||||||
Self {
|
Self {
|
||||||
@@ -151,27 +93,11 @@ impl TryFrom<v3::response::AuthenticatorResponse> for v2::response::Authenticato
|
|||||||
Ok(Self {
|
Ok(Self {
|
||||||
data: authenticator_response.data.try_into()?,
|
data: authenticator_response.data.try_into()?,
|
||||||
reply_to: authenticator_response.reply_to,
|
reply_to: authenticator_response.reply_to,
|
||||||
protocol: Protocol {
|
protocol: authenticator_response.protocol,
|
||||||
version: 2,
|
|
||||||
service_provider_type: authenticator_response.protocol.service_provider_type,
|
|
||||||
},
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<v2::response::AuthenticatorResponse> for v3::response::AuthenticatorResponse {
|
|
||||||
fn from(value: v2::response::AuthenticatorResponse) -> Self {
|
|
||||||
Self {
|
|
||||||
protocol: Protocol {
|
|
||||||
version: 3,
|
|
||||||
service_provider_type: value.protocol.service_provider_type,
|
|
||||||
},
|
|
||||||
data: value.data.into(),
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl TryFrom<v3::response::AuthenticatorResponseData> for v2::response::AuthenticatorResponseData {
|
impl TryFrom<v3::response::AuthenticatorResponseData> for v2::response::AuthenticatorResponseData {
|
||||||
type Error = crate::Error;
|
type Error = crate::Error;
|
||||||
|
|
||||||
@@ -203,22 +129,6 @@ impl TryFrom<v3::response::AuthenticatorResponseData> for v2::response::Authenti
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<v2::response::AuthenticatorResponseData> for v3::response::AuthenticatorResponseData {
|
|
||||||
fn from(value: v2::response::AuthenticatorResponseData) -> Self {
|
|
||||||
match value {
|
|
||||||
v2::response::AuthenticatorResponseData::PendingRegistration(
|
|
||||||
pending_registration_response,
|
|
||||||
) => Self::PendingRegistration(pending_registration_response.into()),
|
|
||||||
v2::response::AuthenticatorResponseData::Registered(registered_response) => {
|
|
||||||
Self::Registered(registered_response.into())
|
|
||||||
}
|
|
||||||
v2::response::AuthenticatorResponseData::RemainingBandwidth(
|
|
||||||
remaining_bandwidth_response,
|
|
||||||
) => Self::RemainingBandwidth(remaining_bandwidth_response.into()),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v3::response::PendingRegistrationResponse> for v2::response::PendingRegistrationResponse {
|
impl From<v3::response::PendingRegistrationResponse> for v2::response::PendingRegistrationResponse {
|
||||||
fn from(value: v3::response::PendingRegistrationResponse) -> Self {
|
fn from(value: v3::response::PendingRegistrationResponse) -> Self {
|
||||||
Self {
|
Self {
|
||||||
@@ -229,16 +139,6 @@ impl From<v3::response::PendingRegistrationResponse> for v2::response::PendingRe
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<v2::response::PendingRegistrationResponse> for v3::response::PendingRegistrationResponse {
|
|
||||||
fn from(value: v2::response::PendingRegistrationResponse) -> Self {
|
|
||||||
Self {
|
|
||||||
request_id: value.request_id,
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
reply: value.reply.into(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v3::response::RegisteredResponse> for v2::response::RegisteredResponse {
|
impl From<v3::response::RegisteredResponse> for v2::response::RegisteredResponse {
|
||||||
fn from(value: v3::response::RegisteredResponse) -> Self {
|
fn from(value: v3::response::RegisteredResponse) -> Self {
|
||||||
Self {
|
Self {
|
||||||
@@ -249,16 +149,6 @@ impl From<v3::response::RegisteredResponse> for v2::response::RegisteredResponse
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<v2::response::RegisteredResponse> for v3::response::RegisteredResponse {
|
|
||||||
fn from(value: v2::response::RegisteredResponse) -> Self {
|
|
||||||
Self {
|
|
||||||
request_id: value.request_id,
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
reply: value.reply.into(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v3::response::RemainingBandwidthResponse> for v2::response::RemainingBandwidthResponse {
|
impl From<v3::response::RemainingBandwidthResponse> for v2::response::RemainingBandwidthResponse {
|
||||||
fn from(value: v3::response::RemainingBandwidthResponse) -> Self {
|
fn from(value: v3::response::RemainingBandwidthResponse) -> Self {
|
||||||
Self {
|
Self {
|
||||||
@@ -269,16 +159,6 @@ impl From<v3::response::RemainingBandwidthResponse> for v2::response::RemainingB
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<v2::response::RemainingBandwidthResponse> for v3::response::RemainingBandwidthResponse {
|
|
||||||
fn from(value: v2::response::RemainingBandwidthResponse) -> Self {
|
|
||||||
Self {
|
|
||||||
request_id: value.request_id,
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
reply: value.reply.map(Into::into),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v3::registration::RegistrationData> for v2::registration::RegistrationData {
|
impl From<v3::registration::RegistrationData> for v2::registration::RegistrationData {
|
||||||
fn from(value: v3::registration::RegistrationData) -> Self {
|
fn from(value: v3::registration::RegistrationData) -> Self {
|
||||||
Self {
|
Self {
|
||||||
@@ -289,16 +169,6 @@ impl From<v3::registration::RegistrationData> for v2::registration::Registration
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<v2::registration::RegistrationData> for v3::registration::RegistrationData {
|
|
||||||
fn from(value: v2::registration::RegistrationData) -> Self {
|
|
||||||
Self {
|
|
||||||
nonce: value.nonce,
|
|
||||||
gateway_data: value.gateway_data.into(),
|
|
||||||
wg_port: value.wg_port,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v3::registration::RegistredData> for v2::registration::RegistredData {
|
impl From<v3::registration::RegistredData> for v2::registration::RegistredData {
|
||||||
fn from(value: v3::registration::RegistredData) -> Self {
|
fn from(value: v3::registration::RegistredData) -> Self {
|
||||||
Self {
|
Self {
|
||||||
@@ -309,16 +179,6 @@ impl From<v3::registration::RegistredData> for v2::registration::RegistredData {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<v2::registration::RegistredData> for v3::registration::RegistredData {
|
|
||||||
fn from(value: v2::registration::RegistredData) -> Self {
|
|
||||||
Self {
|
|
||||||
pub_key: value.pub_key,
|
|
||||||
private_ip: value.private_ip,
|
|
||||||
wg_port: value.wg_port,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v3::registration::RemainingBandwidthData> for v2::registration::RemainingBandwidthData {
|
impl From<v3::registration::RemainingBandwidthData> for v2::registration::RemainingBandwidthData {
|
||||||
fn from(value: v3::registration::RemainingBandwidthData) -> Self {
|
fn from(value: v3::registration::RemainingBandwidthData) -> Self {
|
||||||
Self {
|
Self {
|
||||||
@@ -326,519 +186,3 @@ impl From<v3::registration::RemainingBandwidthData> for v2::registration::Remain
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<v2::registration::RemainingBandwidthData> for v3::registration::RemainingBandwidthData {
|
|
||||||
fn from(value: v2::registration::RemainingBandwidthData) -> Self {
|
|
||||||
Self {
|
|
||||||
available_bandwidth: value.available_bandwidth,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
use std::{net::IpAddr, str::FromStr};
|
|
||||||
|
|
||||||
use nym_credentials_interface::CredentialSpendingData;
|
|
||||||
use nym_crypto::asymmetric::x25519::PrivateKey;
|
|
||||||
use nym_sphinx::addressing::Recipient;
|
|
||||||
use nym_wireguard_types::PeerPublicKey;
|
|
||||||
use x25519_dalek::PublicKey;
|
|
||||||
|
|
||||||
use super::*;
|
|
||||||
use crate::util::tests::{CREDENTIAL_BYTES, RECIPIENT};
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn upgrade_initial_req() {
|
|
||||||
let pub_key = PeerPublicKey::new(PublicKey::from([0; 32]));
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let (msg, _) = v2::request::AuthenticatorRequest::new_initial_request(
|
|
||||||
v2::registration::InitMessage::new(pub_key),
|
|
||||||
reply_to,
|
|
||||||
);
|
|
||||||
let upgraded_msg = v3::request::AuthenticatorRequest::from(msg);
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.protocol,
|
|
||||||
Protocol {
|
|
||||||
version: 3,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.data,
|
|
||||||
v3::request::AuthenticatorRequestData::Initial(v3::registration::InitMessage {
|
|
||||||
pub_key
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn downgrade_initial_req() {
|
|
||||||
let pub_key = PeerPublicKey::new(PublicKey::from([0; 32]));
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let (msg, _) = v3::request::AuthenticatorRequest::new_initial_request(
|
|
||||||
v3::registration::InitMessage::new(pub_key),
|
|
||||||
reply_to,
|
|
||||||
);
|
|
||||||
let downgraded_msg = v2::request::AuthenticatorRequest::try_from(msg).unwrap();
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
downgraded_msg.protocol,
|
|
||||||
Protocol {
|
|
||||||
version: 2,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
downgraded_msg.data,
|
|
||||||
v2::request::AuthenticatorRequestData::Initial(v2::registration::InitMessage {
|
|
||||||
pub_key
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn upgrade_final_req() {
|
|
||||||
let mut rng = rand::thread_rng();
|
|
||||||
|
|
||||||
let local_secret = PrivateKey::new(&mut rng);
|
|
||||||
let remote_secret = x25519_dalek::StaticSecret::random_from_rng(&mut rng);
|
|
||||||
let private_ip = IpAddr::from_str("10.10.10.10").unwrap();
|
|
||||||
let nonce = 42;
|
|
||||||
let gateway_client = v2::registration::GatewayClient::new(
|
|
||||||
&local_secret,
|
|
||||||
(&remote_secret).into(),
|
|
||||||
private_ip,
|
|
||||||
nonce,
|
|
||||||
);
|
|
||||||
let credential = Some(CredentialSpendingData::try_from_bytes(&CREDENTIAL_BYTES).unwrap());
|
|
||||||
let final_message = v2::registration::FinalMessage {
|
|
||||||
gateway_client,
|
|
||||||
credential: credential.clone(),
|
|
||||||
};
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let (msg, _) =
|
|
||||||
v2::request::AuthenticatorRequest::new_final_request(final_message, reply_to);
|
|
||||||
let upgraded_msg = v3::request::AuthenticatorRequest::from(msg);
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.protocol,
|
|
||||||
Protocol {
|
|
||||||
version: 3,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.data,
|
|
||||||
v3::request::AuthenticatorRequestData::Final(Box::new(
|
|
||||||
v3::registration::FinalMessage {
|
|
||||||
gateway_client: v3::registration::GatewayClient::new(
|
|
||||||
&local_secret,
|
|
||||||
(&remote_secret).into(),
|
|
||||||
private_ip,
|
|
||||||
nonce,
|
|
||||||
),
|
|
||||||
credential
|
|
||||||
}
|
|
||||||
))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn downgrade_final_req() {
|
|
||||||
let mut rng = rand::thread_rng();
|
|
||||||
|
|
||||||
let local_secret = PrivateKey::new(&mut rng);
|
|
||||||
let remote_secret = x25519_dalek::StaticSecret::random_from_rng(&mut rng);
|
|
||||||
let private_ip = IpAddr::from_str("10.10.10.10").unwrap();
|
|
||||||
let nonce = 42;
|
|
||||||
let gateway_client = v3::registration::GatewayClient::new(
|
|
||||||
&local_secret,
|
|
||||||
(&remote_secret).into(),
|
|
||||||
private_ip,
|
|
||||||
nonce,
|
|
||||||
);
|
|
||||||
let credential = Some(CredentialSpendingData::try_from_bytes(&CREDENTIAL_BYTES).unwrap());
|
|
||||||
let final_message = v3::registration::FinalMessage {
|
|
||||||
gateway_client,
|
|
||||||
credential: credential.clone(),
|
|
||||||
};
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let (msg, _) =
|
|
||||||
v3::request::AuthenticatorRequest::new_final_request(final_message, reply_to);
|
|
||||||
let upgraded_msg = v2::request::AuthenticatorRequest::try_from(msg).unwrap();
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.protocol,
|
|
||||||
Protocol {
|
|
||||||
version: 2,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.data,
|
|
||||||
v2::request::AuthenticatorRequestData::Final(Box::new(
|
|
||||||
v2::registration::FinalMessage {
|
|
||||||
gateway_client: v2::registration::GatewayClient::new(
|
|
||||||
&local_secret,
|
|
||||||
(&remote_secret).into(),
|
|
||||||
private_ip,
|
|
||||||
nonce,
|
|
||||||
),
|
|
||||||
credential
|
|
||||||
}
|
|
||||||
))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn upgrade_query_req() {
|
|
||||||
let pub_key = PeerPublicKey::new(PublicKey::from([0; 32]));
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let (msg, _) = v2::request::AuthenticatorRequest::new_query_request(pub_key, reply_to);
|
|
||||||
let upgraded_msg = v3::request::AuthenticatorRequest::from(msg);
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.protocol,
|
|
||||||
Protocol {
|
|
||||||
version: 3,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.data,
|
|
||||||
v3::request::AuthenticatorRequestData::QueryBandwidth(pub_key)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn downgrade_query_req() {
|
|
||||||
let pub_key = PeerPublicKey::new(PublicKey::from([0; 32]));
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let (msg, _) = v3::request::AuthenticatorRequest::new_query_request(pub_key, reply_to);
|
|
||||||
let downgraded_msg = v2::request::AuthenticatorRequest::try_from(msg).unwrap();
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
downgraded_msg.protocol,
|
|
||||||
Protocol {
|
|
||||||
version: 2,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
downgraded_msg.data,
|
|
||||||
v2::request::AuthenticatorRequestData::QueryBandwidth(pub_key)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn downgrade_topup_req() {
|
|
||||||
let pub_key = PeerPublicKey::new(PublicKey::from([0; 32]));
|
|
||||||
let credential = CredentialSpendingData::try_from_bytes(&CREDENTIAL_BYTES).unwrap();
|
|
||||||
let top_up_message = v3::topup::TopUpMessage {
|
|
||||||
pub_key,
|
|
||||||
credential,
|
|
||||||
};
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let (msg, _) =
|
|
||||||
v3::request::AuthenticatorRequest::new_topup_request(top_up_message, reply_to);
|
|
||||||
assert!(v2::request::AuthenticatorRequest::try_from(msg).is_err());
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn upgrade_pending_reg_resp() {
|
|
||||||
let mut rng = rand::thread_rng();
|
|
||||||
|
|
||||||
let local_secret = PrivateKey::new(&mut rng);
|
|
||||||
let remote_secret = x25519_dalek::StaticSecret::random_from_rng(&mut rng);
|
|
||||||
let private_ip = IpAddr::from_str("10.10.10.10").unwrap();
|
|
||||||
let nonce = 42;
|
|
||||||
let wg_port = 51822;
|
|
||||||
let gateway_data = v2::registration::GatewayClient::new(
|
|
||||||
&local_secret,
|
|
||||||
(&remote_secret).into(),
|
|
||||||
private_ip,
|
|
||||||
nonce,
|
|
||||||
);
|
|
||||||
let registration_data = v2::registration::RegistrationData {
|
|
||||||
nonce,
|
|
||||||
gateway_data,
|
|
||||||
wg_port,
|
|
||||||
};
|
|
||||||
let request_id = 123;
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let msg = v2::response::AuthenticatorResponse::new_pending_registration_success(
|
|
||||||
registration_data,
|
|
||||||
request_id,
|
|
||||||
reply_to,
|
|
||||||
);
|
|
||||||
let upgraded_msg = v3::response::AuthenticatorResponse::from(msg);
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.protocol,
|
|
||||||
Protocol {
|
|
||||||
version: 3,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.data,
|
|
||||||
v3::response::AuthenticatorResponseData::PendingRegistration(
|
|
||||||
v3::response::PendingRegistrationResponse {
|
|
||||||
request_id,
|
|
||||||
reply_to,
|
|
||||||
reply: v3::registration::RegistrationData {
|
|
||||||
nonce,
|
|
||||||
gateway_data: v3::registration::GatewayClient::new(
|
|
||||||
&local_secret,
|
|
||||||
(&remote_secret).into(),
|
|
||||||
private_ip,
|
|
||||||
nonce,
|
|
||||||
),
|
|
||||||
wg_port,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn downgrade_pending_reg_resp() {
|
|
||||||
let mut rng = rand::thread_rng();
|
|
||||||
|
|
||||||
let local_secret = PrivateKey::new(&mut rng);
|
|
||||||
let remote_secret = x25519_dalek::StaticSecret::random_from_rng(&mut rng);
|
|
||||||
let private_ip = IpAddr::from_str("10.10.10.10").unwrap();
|
|
||||||
let nonce = 42;
|
|
||||||
let wg_port = 51822;
|
|
||||||
let gateway_data = v3::registration::GatewayClient::new(
|
|
||||||
&local_secret,
|
|
||||||
(&remote_secret).into(),
|
|
||||||
private_ip,
|
|
||||||
nonce,
|
|
||||||
);
|
|
||||||
let registration_data = v3::registration::RegistrationData {
|
|
||||||
nonce,
|
|
||||||
gateway_data,
|
|
||||||
wg_port,
|
|
||||||
};
|
|
||||||
let request_id = 123;
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let msg = v3::response::AuthenticatorResponse::new_pending_registration_success(
|
|
||||||
registration_data,
|
|
||||||
request_id,
|
|
||||||
reply_to,
|
|
||||||
);
|
|
||||||
let downgraded_msg = v2::response::AuthenticatorResponse::try_from(msg).unwrap();
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
downgraded_msg.protocol,
|
|
||||||
Protocol {
|
|
||||||
version: 2,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
downgraded_msg.data,
|
|
||||||
v2::response::AuthenticatorResponseData::PendingRegistration(
|
|
||||||
v2::response::PendingRegistrationResponse {
|
|
||||||
request_id,
|
|
||||||
reply_to,
|
|
||||||
reply: v2::registration::RegistrationData {
|
|
||||||
nonce,
|
|
||||||
gateway_data: v2::registration::GatewayClient::new(
|
|
||||||
&local_secret,
|
|
||||||
(&remote_secret).into(),
|
|
||||||
private_ip,
|
|
||||||
nonce,
|
|
||||||
),
|
|
||||||
wg_port,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn upgrade_registered_resp() {
|
|
||||||
let pub_key = PeerPublicKey::new(PublicKey::from([0; 32]));
|
|
||||||
let private_ip = IpAddr::from_str("10.10.10.10").unwrap();
|
|
||||||
let wg_port = 51822;
|
|
||||||
let registred_data = v2::registration::RegistredData {
|
|
||||||
pub_key,
|
|
||||||
private_ip,
|
|
||||||
wg_port,
|
|
||||||
};
|
|
||||||
let request_id = 123;
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let msg = v2::response::AuthenticatorResponse::new_registered(
|
|
||||||
registred_data,
|
|
||||||
reply_to,
|
|
||||||
request_id,
|
|
||||||
);
|
|
||||||
let upgraded_msg = v3::response::AuthenticatorResponse::from(msg);
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.protocol,
|
|
||||||
Protocol {
|
|
||||||
version: 3,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.data,
|
|
||||||
v3::response::AuthenticatorResponseData::Registered(v3::response::RegisteredResponse {
|
|
||||||
request_id,
|
|
||||||
reply_to,
|
|
||||||
reply: v3::registration::RegistredData {
|
|
||||||
wg_port,
|
|
||||||
pub_key,
|
|
||||||
private_ip
|
|
||||||
}
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn downgrade_registered_resp() {
|
|
||||||
let pub_key = PeerPublicKey::new(PublicKey::from([0; 32]));
|
|
||||||
let private_ip = IpAddr::from_str("10.10.10.10").unwrap();
|
|
||||||
let wg_port = 51822;
|
|
||||||
let registred_data = v3::registration::RegistredData {
|
|
||||||
pub_key,
|
|
||||||
private_ip,
|
|
||||||
wg_port,
|
|
||||||
};
|
|
||||||
let request_id = 123;
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let msg = v3::response::AuthenticatorResponse::new_registered(
|
|
||||||
registred_data,
|
|
||||||
reply_to,
|
|
||||||
request_id,
|
|
||||||
);
|
|
||||||
let downgraded_msg = v2::response::AuthenticatorResponse::try_from(msg).unwrap();
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
downgraded_msg.protocol,
|
|
||||||
Protocol {
|
|
||||||
version: 2,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
downgraded_msg.data,
|
|
||||||
v2::response::AuthenticatorResponseData::Registered(v2::response::RegisteredResponse {
|
|
||||||
request_id,
|
|
||||||
reply_to,
|
|
||||||
reply: v2::registration::RegistredData {
|
|
||||||
wg_port,
|
|
||||||
pub_key,
|
|
||||||
private_ip
|
|
||||||
}
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn upgrade_remaining_bandwidth_resp() {
|
|
||||||
let available_bandwidth = 42;
|
|
||||||
let remaining_bandwidth_data = Some(v2::registration::RemainingBandwidthData {
|
|
||||||
available_bandwidth,
|
|
||||||
});
|
|
||||||
let request_id = 123;
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let msg = v2::response::AuthenticatorResponse::new_remaining_bandwidth(
|
|
||||||
remaining_bandwidth_data,
|
|
||||||
reply_to,
|
|
||||||
request_id,
|
|
||||||
);
|
|
||||||
let upgraded_msg = v3::response::AuthenticatorResponse::from(msg);
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.protocol,
|
|
||||||
Protocol {
|
|
||||||
version: 3,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.data,
|
|
||||||
v3::response::AuthenticatorResponseData::RemainingBandwidth(
|
|
||||||
v3::response::RemainingBandwidthResponse {
|
|
||||||
request_id,
|
|
||||||
reply_to,
|
|
||||||
reply: Some(v3::registration::RemainingBandwidthData {
|
|
||||||
available_bandwidth,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn downgrade_remaining_bandwidth_resp() {
|
|
||||||
let available_bandwidth = 42;
|
|
||||||
let remaining_bandwidth_data = Some(v3::registration::RemainingBandwidthData {
|
|
||||||
available_bandwidth,
|
|
||||||
});
|
|
||||||
let request_id = 123;
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let msg = v3::response::AuthenticatorResponse::new_remaining_bandwidth(
|
|
||||||
remaining_bandwidth_data,
|
|
||||||
reply_to,
|
|
||||||
request_id,
|
|
||||||
);
|
|
||||||
let downgraded_msg = v2::response::AuthenticatorResponse::try_from(msg).unwrap();
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
downgraded_msg.protocol,
|
|
||||||
Protocol {
|
|
||||||
version: 2,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
downgraded_msg.data,
|
|
||||||
v2::response::AuthenticatorResponseData::RemainingBandwidth(
|
|
||||||
v2::response::RemainingBandwidthResponse {
|
|
||||||
request_id,
|
|
||||||
reply_to,
|
|
||||||
reply: Some(v2::registration::RemainingBandwidthData {
|
|
||||||
available_bandwidth,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn downgrade_topup_resp() {
|
|
||||||
let available_bandwidth = 42;
|
|
||||||
let remaining_bandwidth_data = v3::registration::RemainingBandwidthData {
|
|
||||||
available_bandwidth,
|
|
||||||
};
|
|
||||||
let request_id = 123;
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let msg = v3::response::AuthenticatorResponse::new_topup_bandwidth(
|
|
||||||
remaining_bandwidth_data,
|
|
||||||
reply_to,
|
|
||||||
request_id,
|
|
||||||
);
|
|
||||||
assert!(v2::response::AuthenticatorResponse::try_from(msg).is_err());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ use std::{fmt, ops::Deref, str::FromStr};
|
|||||||
#[cfg(feature = "verify")]
|
#[cfg(feature = "verify")]
|
||||||
use hmac::{Hmac, Mac};
|
use hmac::{Hmac, Mac};
|
||||||
#[cfg(feature = "verify")]
|
#[cfg(feature = "verify")]
|
||||||
use nym_crypto::asymmetric::x25519::{PrivateKey, PublicKey};
|
use nym_crypto::asymmetric::encryption::PrivateKey;
|
||||||
#[cfg(feature = "verify")]
|
#[cfg(feature = "verify")]
|
||||||
use sha2::Sha256;
|
use sha2::Sha256;
|
||||||
|
|
||||||
@@ -27,9 +27,9 @@ pub type HmacSha256 = Hmac<Sha256>;
|
|||||||
pub type Nonce = u64;
|
pub type Nonce = u64;
|
||||||
pub type Taken = Option<SystemTime>;
|
pub type Taken = Option<SystemTime>;
|
||||||
|
|
||||||
pub const BANDWIDTH_CAP_PER_DAY: u64 = 250 * 1024 * 1024 * 1024; // 250 GB
|
pub const BANDWIDTH_CAP_PER_DAY: u64 = 1024 * 1024 * 1024; // 1 GB
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||||
pub struct InitMessage {
|
pub struct InitMessage {
|
||||||
/// Base64 encoded x25519 public key
|
/// Base64 encoded x25519 public key
|
||||||
pub pub_key: PeerPublicKey,
|
pub pub_key: PeerPublicKey,
|
||||||
@@ -41,7 +41,7 @@ impl InitMessage {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||||
pub struct FinalMessage {
|
pub struct FinalMessage {
|
||||||
/// Gateway client data
|
/// Gateway client data
|
||||||
pub gateway_client: GatewayClient,
|
pub gateway_client: GatewayClient,
|
||||||
@@ -50,28 +50,28 @@ pub struct FinalMessage {
|
|||||||
pub credential: Option<CredentialSpendingData>,
|
pub credential: Option<CredentialSpendingData>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||||
pub struct RegistrationData {
|
pub struct RegistrationData {
|
||||||
pub nonce: u64,
|
pub nonce: u64,
|
||||||
pub gateway_data: GatewayClient,
|
pub gateway_data: GatewayClient,
|
||||||
pub wg_port: u16,
|
pub wg_port: u16,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||||
pub struct RegistredData {
|
pub struct RegistredData {
|
||||||
pub pub_key: PeerPublicKey,
|
pub pub_key: PeerPublicKey,
|
||||||
pub private_ip: IpAddr,
|
pub private_ip: IpAddr,
|
||||||
pub wg_port: u16,
|
pub wg_port: u16,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||||
pub struct RemainingBandwidthData {
|
pub struct RemainingBandwidthData {
|
||||||
pub available_bandwidth: i64,
|
pub available_bandwidth: i64,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Client that wants to register sends its PublicKey bytes mac digest encrypted with a DH shared secret.
|
/// Client that wants to register sends its PublicKey bytes mac digest encrypted with a DH shared secret.
|
||||||
/// Gateway/Nym node can then verify pub_key payload using the same process
|
/// Gateway/Nym node can then verify pub_key payload using the same process
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||||
pub struct GatewayClient {
|
pub struct GatewayClient {
|
||||||
/// Base64 encoded x25519 public key
|
/// Base64 encoded x25519 public key
|
||||||
pub pub_key: PeerPublicKey,
|
pub pub_key: PeerPublicKey,
|
||||||
@@ -91,14 +91,16 @@ impl GatewayClient {
|
|||||||
private_ip: IpAddr,
|
private_ip: IpAddr,
|
||||||
nonce: u64,
|
nonce: u64,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
let local_public = PublicKey::from(local_secret);
|
// convert from 1.0 x25519-dalek private key into 2.0 x25519-dalek
|
||||||
let remote_public = PublicKey::from(remote_public);
|
#[allow(clippy::expect_used)]
|
||||||
|
let static_secret = x25519_dalek::StaticSecret::from(local_secret.to_bytes());
|
||||||
|
let local_public: x25519_dalek::PublicKey = (&static_secret).into();
|
||||||
|
|
||||||
let dh = local_secret.diffie_hellman(&remote_public);
|
let dh = static_secret.diffie_hellman(&remote_public);
|
||||||
|
|
||||||
// TODO: change that to use our nym_crypto::hmac module instead
|
// TODO: change that to use our nym_crypto::hmac module instead
|
||||||
#[allow(clippy::expect_used)]
|
#[allow(clippy::expect_used)]
|
||||||
let mut mac = HmacSha256::new_from_slice(&dh[..])
|
let mut mac = HmacSha256::new_from_slice(dh.as_bytes())
|
||||||
.expect("x25519 shared secret is always 32 bytes long");
|
.expect("x25519 shared secret is always 32 bytes long");
|
||||||
|
|
||||||
mac.update(local_public.as_bytes());
|
mac.update(local_public.as_bytes());
|
||||||
@@ -106,7 +108,7 @@ impl GatewayClient {
|
|||||||
mac.update(&nonce.to_le_bytes());
|
mac.update(&nonce.to_le_bytes());
|
||||||
|
|
||||||
GatewayClient {
|
GatewayClient {
|
||||||
pub_key: PeerPublicKey::new(local_public.into()),
|
pub_key: PeerPublicKey::new(local_public),
|
||||||
private_ip,
|
private_ip,
|
||||||
mac: ClientMac(mac.finalize().into_bytes().to_vec()),
|
mac: ClientMac(mac.finalize().into_bytes().to_vec()),
|
||||||
}
|
}
|
||||||
@@ -116,8 +118,11 @@ impl GatewayClient {
|
|||||||
// Client should perform this step when generating its payload, using its own WG PK
|
// Client should perform this step when generating its payload, using its own WG PK
|
||||||
#[cfg(feature = "verify")]
|
#[cfg(feature = "verify")]
|
||||||
pub fn verify(&self, gateway_key: &PrivateKey, nonce: u64) -> Result<(), Error> {
|
pub fn verify(&self, gateway_key: &PrivateKey, nonce: u64) -> Result<(), Error> {
|
||||||
// use gateways key as a ref to an x25519_dalek key
|
// convert from 1.0 x25519-dalek private key into 2.0 x25519-dalek
|
||||||
let dh = gateway_key.inner().diffie_hellman(&self.pub_key);
|
#[allow(clippy::expect_used)]
|
||||||
|
let static_secret = x25519_dalek::StaticSecret::from(gateway_key.to_bytes());
|
||||||
|
|
||||||
|
let dh = static_secret.diffie_hellman(&self.pub_key);
|
||||||
|
|
||||||
// TODO: change that to use our nym_crypto::hmac module instead
|
// TODO: change that to use our nym_crypto::hmac module instead
|
||||||
#[allow(clippy::expect_used)]
|
#[allow(clippy::expect_used)]
|
||||||
@@ -142,7 +147,7 @@ impl GatewayClient {
|
|||||||
|
|
||||||
// TODO: change the inner type into generic array of size HmacSha256::OutputSize
|
// TODO: change the inner type into generic array of size HmacSha256::OutputSize
|
||||||
// TODO2: rely on our internal crypto/hmac
|
// TODO2: rely on our internal crypto/hmac
|
||||||
#[derive(Debug, Clone, PartialEq)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct ClientMac(Vec<u8>);
|
pub struct ClientMac(Vec<u8>);
|
||||||
|
|
||||||
impl fmt::Display for ClientMac {
|
impl fmt::Display for ClientMac {
|
||||||
@@ -199,15 +204,15 @@ impl<'de> Deserialize<'de> for ClientMac {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use nym_crypto::asymmetric::x25519;
|
use nym_crypto::asymmetric::encryption;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
#[cfg(feature = "verify")]
|
#[cfg(feature = "verify")]
|
||||||
fn client_request_roundtrip() {
|
fn client_request_roundtrip() {
|
||||||
let mut rng = rand::thread_rng();
|
let mut rng = rand::thread_rng();
|
||||||
|
|
||||||
let gateway_key_pair = x25519::KeyPair::new(&mut rng);
|
let gateway_key_pair = encryption::KeyPair::new(&mut rng);
|
||||||
let client_key_pair = x25519::KeyPair::new(&mut rng);
|
let client_key_pair = encryption::KeyPair::new(&mut rng);
|
||||||
|
|
||||||
let nonce = 1234567890;
|
let nonce = 1234567890;
|
||||||
|
|
||||||
|
|||||||
@@ -106,7 +106,7 @@ impl AuthenticatorRequest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
pub enum AuthenticatorRequestData {
|
pub enum AuthenticatorRequestData {
|
||||||
Initial(InitMessage),
|
Initial(InitMessage),
|
||||||
Final(Box<FinalMessage>),
|
Final(Box<FinalMessage>),
|
||||||
|
|||||||
@@ -120,7 +120,7 @@ impl AuthenticatorResponse {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
pub enum AuthenticatorResponseData {
|
pub enum AuthenticatorResponseData {
|
||||||
PendingRegistration(PendingRegistrationResponse),
|
PendingRegistration(PendingRegistrationResponse),
|
||||||
Registered(RegisteredResponse),
|
Registered(RegisteredResponse),
|
||||||
@@ -128,28 +128,28 @@ pub enum AuthenticatorResponseData {
|
|||||||
TopUpBandwidth(TopUpBandwidthResponse),
|
TopUpBandwidth(TopUpBandwidthResponse),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
pub struct PendingRegistrationResponse {
|
pub struct PendingRegistrationResponse {
|
||||||
pub request_id: u64,
|
pub request_id: u64,
|
||||||
pub reply_to: Recipient,
|
pub reply_to: Recipient,
|
||||||
pub reply: RegistrationData,
|
pub reply: RegistrationData,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
pub struct RegisteredResponse {
|
pub struct RegisteredResponse {
|
||||||
pub request_id: u64,
|
pub request_id: u64,
|
||||||
pub reply_to: Recipient,
|
pub reply_to: Recipient,
|
||||||
pub reply: RegistredData,
|
pub reply: RegistredData,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
pub struct RemainingBandwidthResponse {
|
pub struct RemainingBandwidthResponse {
|
||||||
pub request_id: u64,
|
pub request_id: u64,
|
||||||
pub reply_to: Recipient,
|
pub reply_to: Recipient,
|
||||||
pub reply: Option<RemainingBandwidthData>,
|
pub reply: Option<RemainingBandwidthData>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
pub struct TopUpBandwidthResponse {
|
pub struct TopUpBandwidthResponse {
|
||||||
pub request_id: u64,
|
pub request_id: u64,
|
||||||
pub reply_to: Recipient,
|
pub reply_to: Recipient,
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ use nym_credentials_interface::CredentialSpendingData;
|
|||||||
use nym_wireguard_types::PeerPublicKey;
|
use nym_wireguard_types::PeerPublicKey;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
#[derive(Serialize, Deserialize, Debug, Clone)]
|
||||||
pub struct TopUpMessage {
|
pub struct TopUpMessage {
|
||||||
/// Base64 encoded x25519 public key
|
/// Base64 encoded x25519 public key
|
||||||
pub pub_key: PeerPublicKey,
|
pub pub_key: PeerPublicKey,
|
||||||
|
|||||||
@@ -1,737 +0,0 @@
|
|||||||
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
use nym_service_provider_requests_common::{Protocol, ServiceProviderType};
|
|
||||||
|
|
||||||
use crate::{v3, v4};
|
|
||||||
|
|
||||||
impl TryFrom<v3::request::AuthenticatorRequest> for v4::request::AuthenticatorRequest {
|
|
||||||
type Error = crate::Error;
|
|
||||||
fn try_from(
|
|
||||||
authenticator_request: v3::request::AuthenticatorRequest,
|
|
||||||
) -> Result<Self, Self::Error> {
|
|
||||||
Ok(Self {
|
|
||||||
protocol: Protocol {
|
|
||||||
version: 4,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator,
|
|
||||||
},
|
|
||||||
data: authenticator_request.data.try_into()?,
|
|
||||||
reply_to: authenticator_request.reply_to,
|
|
||||||
request_id: authenticator_request.request_id,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl TryFrom<v4::request::AuthenticatorRequest> for v3::request::AuthenticatorRequest {
|
|
||||||
type Error = crate::Error;
|
|
||||||
fn try_from(
|
|
||||||
authenticator_request: v4::request::AuthenticatorRequest,
|
|
||||||
) -> Result<Self, Self::Error> {
|
|
||||||
Ok(Self {
|
|
||||||
protocol: Protocol {
|
|
||||||
version: 3,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator,
|
|
||||||
},
|
|
||||||
data: authenticator_request.data.try_into()?,
|
|
||||||
reply_to: authenticator_request.reply_to,
|
|
||||||
request_id: authenticator_request.request_id,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl TryFrom<v3::request::AuthenticatorRequestData> for v4::request::AuthenticatorRequestData {
|
|
||||||
type Error = crate::Error;
|
|
||||||
fn try_from(
|
|
||||||
authenticator_request_data: v3::request::AuthenticatorRequestData,
|
|
||||||
) -> Result<Self, Self::Error> {
|
|
||||||
match authenticator_request_data {
|
|
||||||
v3::request::AuthenticatorRequestData::Initial(init_msg) => Ok(
|
|
||||||
v4::request::AuthenticatorRequestData::Initial(init_msg.into()),
|
|
||||||
),
|
|
||||||
v3::request::AuthenticatorRequestData::Final(_) => Err(Self::Error::Conversion(
|
|
||||||
"mac hash breaking change".to_string(),
|
|
||||||
)),
|
|
||||||
v3::request::AuthenticatorRequestData::QueryBandwidth(pub_key) => Ok(
|
|
||||||
v4::request::AuthenticatorRequestData::QueryBandwidth(pub_key),
|
|
||||||
),
|
|
||||||
v3::request::AuthenticatorRequestData::TopUpBandwidth(top_up_message) => Ok(
|
|
||||||
v4::request::AuthenticatorRequestData::TopUpBandwidth(top_up_message.into()),
|
|
||||||
),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl TryFrom<v4::request::AuthenticatorRequestData> for v3::request::AuthenticatorRequestData {
|
|
||||||
type Error = crate::Error;
|
|
||||||
fn try_from(
|
|
||||||
authenticator_request_data: v4::request::AuthenticatorRequestData,
|
|
||||||
) -> Result<Self, Self::Error> {
|
|
||||||
match authenticator_request_data {
|
|
||||||
v4::request::AuthenticatorRequestData::Initial(init_msg) => Ok(
|
|
||||||
v3::request::AuthenticatorRequestData::Initial(init_msg.into()),
|
|
||||||
),
|
|
||||||
v4::request::AuthenticatorRequestData::Final(_) => Err(Self::Error::Conversion(
|
|
||||||
"mac hash breaking change".to_string(),
|
|
||||||
)),
|
|
||||||
v4::request::AuthenticatorRequestData::QueryBandwidth(pub_key) => Ok(
|
|
||||||
v3::request::AuthenticatorRequestData::QueryBandwidth(pub_key),
|
|
||||||
),
|
|
||||||
v4::request::AuthenticatorRequestData::TopUpBandwidth(top_up_message) => Ok(
|
|
||||||
v3::request::AuthenticatorRequestData::TopUpBandwidth(top_up_message.into()),
|
|
||||||
),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v3::registration::InitMessage> for v4::registration::InitMessage {
|
|
||||||
fn from(init_msg: v3::registration::InitMessage) -> Self {
|
|
||||||
Self {
|
|
||||||
pub_key: init_msg.pub_key,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v4::registration::InitMessage> for v3::registration::InitMessage {
|
|
||||||
fn from(init_msg: v4::registration::InitMessage) -> Self {
|
|
||||||
Self {
|
|
||||||
pub_key: init_msg.pub_key,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<Box<v3::topup::TopUpMessage>> for Box<v4::topup::TopUpMessage> {
|
|
||||||
fn from(top_up_message: Box<v3::topup::TopUpMessage>) -> Self {
|
|
||||||
Box::new(v4::topup::TopUpMessage {
|
|
||||||
pub_key: top_up_message.pub_key,
|
|
||||||
credential: top_up_message.credential,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<Box<v4::topup::TopUpMessage>> for Box<v3::topup::TopUpMessage> {
|
|
||||||
fn from(top_up_message: Box<v4::topup::TopUpMessage>) -> Self {
|
|
||||||
Box::new(v3::topup::TopUpMessage {
|
|
||||||
pub_key: top_up_message.pub_key,
|
|
||||||
credential: top_up_message.credential,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl TryFrom<v3::response::AuthenticatorResponse> for v4::response::AuthenticatorResponse {
|
|
||||||
type Error = crate::Error;
|
|
||||||
fn try_from(value: v3::response::AuthenticatorResponse) -> Result<Self, Self::Error> {
|
|
||||||
Ok(Self {
|
|
||||||
protocol: Protocol {
|
|
||||||
version: 4,
|
|
||||||
service_provider_type: value.protocol.service_provider_type,
|
|
||||||
},
|
|
||||||
data: value.data.try_into()?,
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl TryFrom<v4::response::AuthenticatorResponse> for v3::response::AuthenticatorResponse {
|
|
||||||
type Error = crate::Error;
|
|
||||||
|
|
||||||
fn try_from(
|
|
||||||
authenticator_response: v4::response::AuthenticatorResponse,
|
|
||||||
) -> Result<Self, Self::Error> {
|
|
||||||
Ok(Self {
|
|
||||||
data: authenticator_response.data.try_into()?,
|
|
||||||
reply_to: authenticator_response.reply_to,
|
|
||||||
protocol: Protocol {
|
|
||||||
version: 3,
|
|
||||||
service_provider_type: authenticator_response.protocol.service_provider_type,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl TryFrom<v3::response::AuthenticatorResponseData> for v4::response::AuthenticatorResponseData {
|
|
||||||
type Error = crate::Error;
|
|
||||||
fn try_from(
|
|
||||||
authenticator_response_data: v3::response::AuthenticatorResponseData,
|
|
||||||
) -> Result<Self, Self::Error> {
|
|
||||||
match authenticator_response_data {
|
|
||||||
v3::response::AuthenticatorResponseData::PendingRegistration(_) => Err(
|
|
||||||
Self::Error::Conversion("mac hash breaking change".to_string()),
|
|
||||||
),
|
|
||||||
|
|
||||||
v3::response::AuthenticatorResponseData::Registered(registered_response) => Ok(
|
|
||||||
v4::response::AuthenticatorResponseData::Registered(registered_response.into()),
|
|
||||||
),
|
|
||||||
|
|
||||||
v3::response::AuthenticatorResponseData::RemainingBandwidth(
|
|
||||||
remaining_bandwidth_response,
|
|
||||||
) => Ok(v4::response::AuthenticatorResponseData::RemainingBandwidth(
|
|
||||||
remaining_bandwidth_response.into(),
|
|
||||||
)),
|
|
||||||
v3::response::AuthenticatorResponseData::TopUpBandwidth(top_up_response) => Ok(
|
|
||||||
v4::response::AuthenticatorResponseData::TopUpBandwidth(top_up_response.into()),
|
|
||||||
),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl TryFrom<v4::response::AuthenticatorResponseData> for v3::response::AuthenticatorResponseData {
|
|
||||||
type Error = crate::Error;
|
|
||||||
|
|
||||||
fn try_from(
|
|
||||||
authenticator_response_data: v4::response::AuthenticatorResponseData,
|
|
||||||
) -> Result<Self, Self::Error> {
|
|
||||||
match authenticator_response_data {
|
|
||||||
v4::response::AuthenticatorResponseData::PendingRegistration(_) => Err(
|
|
||||||
Self::Error::Conversion("mac hash breaking change".to_string()),
|
|
||||||
),
|
|
||||||
|
|
||||||
v4::response::AuthenticatorResponseData::Registered(registered_response) => Ok(
|
|
||||||
v3::response::AuthenticatorResponseData::Registered(registered_response.into()),
|
|
||||||
),
|
|
||||||
v4::response::AuthenticatorResponseData::RemainingBandwidth(
|
|
||||||
remaining_bandwidth_response,
|
|
||||||
) => Ok(v3::response::AuthenticatorResponseData::RemainingBandwidth(
|
|
||||||
remaining_bandwidth_response.into(),
|
|
||||||
)),
|
|
||||||
v4::response::AuthenticatorResponseData::TopUpBandwidth(_) => {
|
|
||||||
Err(Self::Error::Conversion(
|
|
||||||
"a v3 request couldn't produce a v4 only type of response".to_string(),
|
|
||||||
))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v4::response::RegisteredResponse> for v3::response::RegisteredResponse {
|
|
||||||
fn from(value: v4::response::RegisteredResponse) -> Self {
|
|
||||||
Self {
|
|
||||||
request_id: value.request_id,
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
reply: value.reply.into(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v3::response::RegisteredResponse> for v4::response::RegisteredResponse {
|
|
||||||
fn from(value: v3::response::RegisteredResponse) -> Self {
|
|
||||||
Self {
|
|
||||||
request_id: value.request_id,
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
reply: value.reply.into(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v3::response::RemainingBandwidthResponse> for v4::response::RemainingBandwidthResponse {
|
|
||||||
fn from(value: v3::response::RemainingBandwidthResponse) -> Self {
|
|
||||||
Self {
|
|
||||||
request_id: value.request_id,
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
reply: value.reply.map(Into::into),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v4::response::RemainingBandwidthResponse> for v3::response::RemainingBandwidthResponse {
|
|
||||||
fn from(value: v4::response::RemainingBandwidthResponse) -> Self {
|
|
||||||
Self {
|
|
||||||
request_id: value.request_id,
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
reply: value.reply.map(Into::into),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v3::response::TopUpBandwidthResponse> for v4::response::TopUpBandwidthResponse {
|
|
||||||
fn from(value: v3::response::TopUpBandwidthResponse) -> Self {
|
|
||||||
Self {
|
|
||||||
request_id: value.request_id,
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
reply: value.reply.into(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v4::response::TopUpBandwidthResponse> for v3::response::TopUpBandwidthResponse {
|
|
||||||
fn from(value: v4::response::TopUpBandwidthResponse) -> Self {
|
|
||||||
Self {
|
|
||||||
request_id: value.request_id,
|
|
||||||
reply_to: value.reply_to,
|
|
||||||
reply: value.reply.into(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v3::registration::RegistredData> for v4::registration::RegistredData {
|
|
||||||
fn from(value: v3::registration::RegistredData) -> Self {
|
|
||||||
Self {
|
|
||||||
pub_key: value.pub_key,
|
|
||||||
private_ips: value.private_ip.into(),
|
|
||||||
wg_port: value.wg_port,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v4::registration::RegistredData> for v3::registration::RegistredData {
|
|
||||||
fn from(value: v4::registration::RegistredData) -> Self {
|
|
||||||
Self {
|
|
||||||
pub_key: value.pub_key,
|
|
||||||
private_ip: value.private_ips.ipv4.into(),
|
|
||||||
wg_port: value.wg_port,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v3::registration::RemainingBandwidthData> for v4::registration::RemainingBandwidthData {
|
|
||||||
fn from(value: v3::registration::RemainingBandwidthData) -> Self {
|
|
||||||
Self {
|
|
||||||
available_bandwidth: value.available_bandwidth,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<v4::registration::RemainingBandwidthData> for v3::registration::RemainingBandwidthData {
|
|
||||||
fn from(value: v4::registration::RemainingBandwidthData) -> Self {
|
|
||||||
Self {
|
|
||||||
available_bandwidth: value.available_bandwidth,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
use std::{
|
|
||||||
net::{Ipv4Addr, Ipv6Addr},
|
|
||||||
str::FromStr,
|
|
||||||
};
|
|
||||||
|
|
||||||
use nym_credentials_interface::CredentialSpendingData;
|
|
||||||
use nym_crypto::asymmetric::x25519::PrivateKey;
|
|
||||||
use nym_sphinx::addressing::Recipient;
|
|
||||||
use nym_wireguard_types::PeerPublicKey;
|
|
||||||
use x25519_dalek::PublicKey;
|
|
||||||
|
|
||||||
use super::*;
|
|
||||||
use crate::util::tests::{CREDENTIAL_BYTES, RECIPIENT};
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn upgrade_initial_req() {
|
|
||||||
let pub_key = PeerPublicKey::new(PublicKey::from([0; 32]));
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let (msg, _) = v3::request::AuthenticatorRequest::new_initial_request(
|
|
||||||
v3::registration::InitMessage::new(pub_key),
|
|
||||||
reply_to,
|
|
||||||
);
|
|
||||||
let upgraded_msg = v4::request::AuthenticatorRequest::try_from(msg).unwrap();
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.protocol,
|
|
||||||
Protocol {
|
|
||||||
version: 4,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.data,
|
|
||||||
v4::request::AuthenticatorRequestData::Initial(v4::registration::InitMessage {
|
|
||||||
pub_key
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn downgrade_initial_req() {
|
|
||||||
let pub_key = PeerPublicKey::new(PublicKey::from([0; 32]));
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let (msg, _) = v4::request::AuthenticatorRequest::new_initial_request(
|
|
||||||
v4::registration::InitMessage::new(pub_key),
|
|
||||||
reply_to,
|
|
||||||
);
|
|
||||||
let downgraded_msg = v3::request::AuthenticatorRequest::try_from(msg).unwrap();
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
downgraded_msg.protocol,
|
|
||||||
Protocol {
|
|
||||||
version: 3,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
downgraded_msg.data,
|
|
||||||
v3::request::AuthenticatorRequestData::Initial(v3::registration::InitMessage {
|
|
||||||
pub_key
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn upgrade_final_req() {
|
|
||||||
let mut rng = rand::thread_rng();
|
|
||||||
|
|
||||||
let local_secret = PrivateKey::new(&mut rng);
|
|
||||||
let remote_secret = x25519_dalek::StaticSecret::random_from_rng(&mut rng);
|
|
||||||
let ipv4 = Ipv4Addr::from_str("10.10.10.10").unwrap();
|
|
||||||
let nonce = 42;
|
|
||||||
let gateway_client = v3::registration::GatewayClient::new(
|
|
||||||
&local_secret,
|
|
||||||
(&remote_secret).into(),
|
|
||||||
ipv4.into(),
|
|
||||||
nonce,
|
|
||||||
);
|
|
||||||
let credential = Some(CredentialSpendingData::try_from_bytes(&CREDENTIAL_BYTES).unwrap());
|
|
||||||
let final_message = v3::registration::FinalMessage {
|
|
||||||
gateway_client,
|
|
||||||
credential: credential.clone(),
|
|
||||||
};
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let (msg, _) =
|
|
||||||
v3::request::AuthenticatorRequest::new_final_request(final_message, reply_to);
|
|
||||||
assert!(v4::request::AuthenticatorRequest::try_from(msg).is_err());
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn downgrade_final_req() {
|
|
||||||
let mut rng = rand::thread_rng();
|
|
||||||
|
|
||||||
let local_secret = PrivateKey::new(&mut rng);
|
|
||||||
let remote_secret = x25519_dalek::StaticSecret::random_from_rng(&mut rng);
|
|
||||||
let ipv4 = Ipv4Addr::from_str("10.10.10.10").unwrap();
|
|
||||||
let private_ips =
|
|
||||||
v4::registration::IpPair::new(ipv4, Ipv6Addr::from_str("fc01::10").unwrap());
|
|
||||||
let nonce = 42;
|
|
||||||
let gateway_client = v4::registration::GatewayClient::new(
|
|
||||||
&local_secret,
|
|
||||||
(&remote_secret).into(),
|
|
||||||
private_ips,
|
|
||||||
nonce,
|
|
||||||
);
|
|
||||||
let credential = Some(CredentialSpendingData::try_from_bytes(&CREDENTIAL_BYTES).unwrap());
|
|
||||||
let final_message = v4::registration::FinalMessage {
|
|
||||||
gateway_client,
|
|
||||||
credential: credential.clone(),
|
|
||||||
};
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let (msg, _) =
|
|
||||||
v4::request::AuthenticatorRequest::new_final_request(final_message, reply_to);
|
|
||||||
assert!(v3::request::AuthenticatorRequest::try_from(msg).is_err());
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn upgrade_query_req() {
|
|
||||||
let pub_key = PeerPublicKey::new(PublicKey::from([0; 32]));
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let (msg, _) = v3::request::AuthenticatorRequest::new_query_request(pub_key, reply_to);
|
|
||||||
let upgraded_msg = v4::request::AuthenticatorRequest::try_from(msg).unwrap();
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.protocol,
|
|
||||||
Protocol {
|
|
||||||
version: 4,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.data,
|
|
||||||
v4::request::AuthenticatorRequestData::QueryBandwidth(pub_key)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn downgrade_query_req() {
|
|
||||||
let pub_key = PeerPublicKey::new(PublicKey::from([0; 32]));
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let (msg, _) = v4::request::AuthenticatorRequest::new_query_request(pub_key, reply_to);
|
|
||||||
let downgraded_msg = v3::request::AuthenticatorRequest::try_from(msg).unwrap();
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
downgraded_msg.protocol,
|
|
||||||
Protocol {
|
|
||||||
version: 3,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
downgraded_msg.data,
|
|
||||||
v3::request::AuthenticatorRequestData::QueryBandwidth(pub_key)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn downgrade_topup_req() {
|
|
||||||
let pub_key = PeerPublicKey::new(PublicKey::from([0; 32]));
|
|
||||||
let credential = CredentialSpendingData::try_from_bytes(&CREDENTIAL_BYTES).unwrap();
|
|
||||||
let top_up_message = v4::topup::TopUpMessage {
|
|
||||||
pub_key,
|
|
||||||
credential: credential.clone(),
|
|
||||||
};
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let (msg, _) =
|
|
||||||
v4::request::AuthenticatorRequest::new_topup_request(top_up_message, reply_to);
|
|
||||||
let downgraded_msg = v3::request::AuthenticatorRequest::try_from(msg).unwrap();
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
downgraded_msg.protocol,
|
|
||||||
Protocol {
|
|
||||||
version: 3,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
downgraded_msg.data,
|
|
||||||
v3::request::AuthenticatorRequestData::TopUpBandwidth(Box::new(
|
|
||||||
v3::topup::TopUpMessage {
|
|
||||||
pub_key,
|
|
||||||
credential
|
|
||||||
}
|
|
||||||
))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn upgrade_pending_reg_resp() {
|
|
||||||
let mut rng = rand::thread_rng();
|
|
||||||
|
|
||||||
let local_secret = PrivateKey::new(&mut rng);
|
|
||||||
let remote_secret = x25519_dalek::StaticSecret::random_from_rng(&mut rng);
|
|
||||||
let ipv4 = Ipv4Addr::from_str("10.10.10.10").unwrap();
|
|
||||||
let nonce = 42;
|
|
||||||
let wg_port = 51822;
|
|
||||||
let gateway_data = v3::registration::GatewayClient::new(
|
|
||||||
&local_secret,
|
|
||||||
(&remote_secret).into(),
|
|
||||||
ipv4.into(),
|
|
||||||
nonce,
|
|
||||||
);
|
|
||||||
let registration_data = v3::registration::RegistrationData {
|
|
||||||
nonce,
|
|
||||||
gateway_data,
|
|
||||||
wg_port,
|
|
||||||
};
|
|
||||||
let request_id = 123;
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let msg = v3::response::AuthenticatorResponse::new_pending_registration_success(
|
|
||||||
registration_data,
|
|
||||||
request_id,
|
|
||||||
reply_to,
|
|
||||||
);
|
|
||||||
assert!(v4::response::AuthenticatorResponse::try_from(msg).is_err());
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn downgrade_pending_reg_resp() {
|
|
||||||
let mut rng = rand::thread_rng();
|
|
||||||
|
|
||||||
let local_secret = PrivateKey::new(&mut rng);
|
|
||||||
let remote_secret = x25519_dalek::StaticSecret::random_from_rng(&mut rng);
|
|
||||||
let ipv4 = Ipv4Addr::from_str("10.10.10.10").unwrap();
|
|
||||||
let private_ips =
|
|
||||||
v4::registration::IpPair::new(ipv4, Ipv6Addr::from_str("fc01::10").unwrap());
|
|
||||||
let nonce = 42;
|
|
||||||
let wg_port = 51822;
|
|
||||||
let gateway_data = v4::registration::GatewayClient::new(
|
|
||||||
&local_secret,
|
|
||||||
(&remote_secret).into(),
|
|
||||||
private_ips,
|
|
||||||
nonce,
|
|
||||||
);
|
|
||||||
let registration_data = v4::registration::RegistrationData {
|
|
||||||
nonce,
|
|
||||||
gateway_data,
|
|
||||||
wg_port,
|
|
||||||
};
|
|
||||||
let request_id = 123;
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let msg = v4::response::AuthenticatorResponse::new_pending_registration_success(
|
|
||||||
registration_data,
|
|
||||||
request_id,
|
|
||||||
reply_to,
|
|
||||||
);
|
|
||||||
assert!(v3::response::AuthenticatorResponse::try_from(msg).is_err());
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn upgrade_registered_resp() {
|
|
||||||
let pub_key = PeerPublicKey::new(PublicKey::from([0; 32]));
|
|
||||||
let ipv4 = Ipv4Addr::from_str("10.1.10.10").unwrap();
|
|
||||||
let private_ips =
|
|
||||||
v4::registration::IpPair::new(ipv4, Ipv6Addr::from_str("fc01::a0a").unwrap());
|
|
||||||
let wg_port = 51822;
|
|
||||||
let registred_data = v3::registration::RegistredData {
|
|
||||||
pub_key,
|
|
||||||
private_ip: ipv4.into(),
|
|
||||||
wg_port,
|
|
||||||
};
|
|
||||||
let request_id = 123;
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let msg = v3::response::AuthenticatorResponse::new_registered(
|
|
||||||
registred_data,
|
|
||||||
reply_to,
|
|
||||||
request_id,
|
|
||||||
);
|
|
||||||
let upgraded_msg = v4::response::AuthenticatorResponse::try_from(msg).unwrap();
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.protocol,
|
|
||||||
Protocol {
|
|
||||||
version: 4,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.data,
|
|
||||||
v4::response::AuthenticatorResponseData::Registered(v4::response::RegisteredResponse {
|
|
||||||
request_id,
|
|
||||||
reply_to,
|
|
||||||
reply: v4::registration::RegistredData {
|
|
||||||
wg_port,
|
|
||||||
pub_key,
|
|
||||||
private_ips
|
|
||||||
}
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn downgrade_registered_resp() {
|
|
||||||
let pub_key = PeerPublicKey::new(PublicKey::from([0; 32]));
|
|
||||||
let ipv4 = Ipv4Addr::from_str("10.10.10.10").unwrap();
|
|
||||||
let private_ips =
|
|
||||||
v4::registration::IpPair::new(ipv4, Ipv6Addr::from_str("fc01::10").unwrap());
|
|
||||||
let wg_port = 51822;
|
|
||||||
let registred_data = v4::registration::RegistredData {
|
|
||||||
pub_key,
|
|
||||||
private_ips,
|
|
||||||
wg_port,
|
|
||||||
};
|
|
||||||
let request_id = 123;
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let msg = v4::response::AuthenticatorResponse::new_registered(
|
|
||||||
registred_data,
|
|
||||||
reply_to,
|
|
||||||
request_id,
|
|
||||||
);
|
|
||||||
let downgraded_msg = v3::response::AuthenticatorResponse::try_from(msg).unwrap();
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
downgraded_msg.protocol,
|
|
||||||
Protocol {
|
|
||||||
version: 3,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
downgraded_msg.data,
|
|
||||||
v3::response::AuthenticatorResponseData::Registered(v3::response::RegisteredResponse {
|
|
||||||
request_id,
|
|
||||||
reply_to,
|
|
||||||
reply: v3::registration::RegistredData {
|
|
||||||
wg_port,
|
|
||||||
pub_key,
|
|
||||||
private_ip: ipv4.into()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn upgrade_remaining_bandwidth_resp() {
|
|
||||||
let available_bandwidth = 42;
|
|
||||||
let remaining_bandwidth_data = Some(v3::registration::RemainingBandwidthData {
|
|
||||||
available_bandwidth,
|
|
||||||
});
|
|
||||||
let request_id = 123;
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let msg = v3::response::AuthenticatorResponse::new_remaining_bandwidth(
|
|
||||||
remaining_bandwidth_data,
|
|
||||||
reply_to,
|
|
||||||
request_id,
|
|
||||||
);
|
|
||||||
let upgraded_msg = v4::response::AuthenticatorResponse::try_from(msg).unwrap();
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.protocol,
|
|
||||||
Protocol {
|
|
||||||
version: 4,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
upgraded_msg.data,
|
|
||||||
v4::response::AuthenticatorResponseData::RemainingBandwidth(
|
|
||||||
v4::response::RemainingBandwidthResponse {
|
|
||||||
request_id,
|
|
||||||
reply_to,
|
|
||||||
reply: Some(v4::registration::RemainingBandwidthData {
|
|
||||||
available_bandwidth,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn downgrade_remaining_bandwidth_resp() {
|
|
||||||
let available_bandwidth = 42;
|
|
||||||
let remaining_bandwidth_data = Some(v4::registration::RemainingBandwidthData {
|
|
||||||
available_bandwidth,
|
|
||||||
});
|
|
||||||
let request_id = 123;
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let msg = v4::response::AuthenticatorResponse::new_remaining_bandwidth(
|
|
||||||
remaining_bandwidth_data,
|
|
||||||
reply_to,
|
|
||||||
request_id,
|
|
||||||
);
|
|
||||||
let downgraded_msg = v3::response::AuthenticatorResponse::try_from(msg).unwrap();
|
|
||||||
|
|
||||||
assert_eq!(
|
|
||||||
downgraded_msg.protocol,
|
|
||||||
Protocol {
|
|
||||||
version: 3,
|
|
||||||
service_provider_type: ServiceProviderType::Authenticator
|
|
||||||
}
|
|
||||||
);
|
|
||||||
assert_eq!(
|
|
||||||
downgraded_msg.data,
|
|
||||||
v3::response::AuthenticatorResponseData::RemainingBandwidth(
|
|
||||||
v3::response::RemainingBandwidthResponse {
|
|
||||||
request_id,
|
|
||||||
reply_to,
|
|
||||||
reply: Some(v3::registration::RemainingBandwidthData {
|
|
||||||
available_bandwidth,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn downgrade_topup_resp() {
|
|
||||||
let available_bandwidth = 42;
|
|
||||||
let remaining_bandwidth_data = v4::registration::RemainingBandwidthData {
|
|
||||||
available_bandwidth,
|
|
||||||
};
|
|
||||||
let request_id = 123;
|
|
||||||
let reply_to = Recipient::try_from_base58_string(RECIPIENT).unwrap();
|
|
||||||
|
|
||||||
let msg = v4::response::AuthenticatorResponse::new_topup_bandwidth(
|
|
||||||
remaining_bandwidth_data,
|
|
||||||
reply_to,
|
|
||||||
request_id,
|
|
||||||
);
|
|
||||||
assert!(v3::response::AuthenticatorResponse::try_from(msg).is_err());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
// Copyright 2024 - Nym Technologies SA <contact@nymtech.net>
|
|
||||||
// SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
pub mod conversion;
|
|
||||||
pub mod registration;
|
|
||||||
pub mod request;
|
|
||||||
pub mod response;
|
|
||||||
pub mod topup;
|
|
||||||
|
|
||||||
pub const VERSION: u8 = 4;
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user