epistery 1.0.3 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLI.md +40 -64
- package/README.md +40 -20
- package/dist/epistery.js +1 -1
- package/dist/epistery.js.map +1 -1
- package/docs/EpisteryModuleConfig.md +1 -1
- package/index.mjs +4 -4
- package/package.json +1 -1
- package/src/epistery.ts +1 -1
package/CLI.md
CHANGED
|
@@ -11,7 +11,7 @@ epistery initialize localhost
|
|
|
11
11
|
# Set as default
|
|
12
12
|
epistery set-default localhost
|
|
13
13
|
|
|
14
|
-
# Make authenticated requests
|
|
14
|
+
# Make authenticated requests
|
|
15
15
|
epistery curl https://wiki.rootz.global/wiki/Home
|
|
16
16
|
```
|
|
17
17
|
|
|
@@ -30,14 +30,13 @@ epistery initialize wiki.rootz.global
|
|
|
30
30
|
|
|
31
31
|
### `epistery curl [options] <url>`
|
|
32
32
|
|
|
33
|
-
Make authenticated HTTP
|
|
33
|
+
Make authenticated HTTP requests using bot authentication (signs each request with wallet).
|
|
34
34
|
|
|
35
35
|
**Options:**
|
|
36
|
-
- `-w, --wallet <domain>` - Use specific domain (overrides default)
|
|
36
|
+
- `-w, --wallet <domain>` - Use specific domain wallet (overrides default)
|
|
37
37
|
- `-X, --request <method>` - HTTP method (default: GET)
|
|
38
|
-
- `-d, --data <data>` - Request body data
|
|
38
|
+
- `-d, --data <data>` - Request body data (must be quoted JSON string)
|
|
39
39
|
- `-H, --header <header>` - Additional headers
|
|
40
|
-
- `-b, --bot` - Use bot auth header (default: session cookie)
|
|
41
40
|
- `-v, --verbose` - Show detailed output
|
|
42
41
|
|
|
43
42
|
**Examples:**
|
|
@@ -45,16 +44,24 @@ Make authenticated HTTP request. Automatically performs key exchange on first us
|
|
|
45
44
|
# GET request (uses default domain)
|
|
46
45
|
epistery curl https://wiki.rootz.global/wiki/Home
|
|
47
46
|
|
|
48
|
-
# Use specific domain
|
|
49
|
-
epistery curl -w localhost https://localhost:4080/
|
|
47
|
+
# Use specific domain wallet
|
|
48
|
+
epistery curl -w localhost https://localhost:4080/wiki/Home
|
|
49
|
+
|
|
50
|
+
# PUT request with JSON data (note single quotes around JSON)
|
|
51
|
+
epistery curl -X PUT -d '{"title":"Test","body":"# Test"}' https://wiki.rootz.global/wiki/Test
|
|
50
52
|
|
|
51
53
|
# POST request
|
|
52
|
-
epistery curl -X POST -d '{"
|
|
54
|
+
epistery curl -X POST -d '{"name":"value"}' https://api.example.com/endpoint
|
|
53
55
|
|
|
54
|
-
#
|
|
55
|
-
epistery curl
|
|
56
|
+
# Verbose output for debugging
|
|
57
|
+
epistery curl -v https://wiki.rootz.global/wiki/Home
|
|
56
58
|
```
|
|
57
59
|
|
|
60
|
+
**Important Notes:**
|
|
61
|
+
- Always use **single quotes** around JSON data to prevent shell interpretation
|
|
62
|
+
- The CLI uses bot authentication mode (signs each request individually)
|
|
63
|
+
- No session management - each request is independently authenticated
|
|
64
|
+
|
|
58
65
|
### `epistery info [domain]`
|
|
59
66
|
|
|
60
67
|
Show domain information (wallet address, provider, session status).
|
|
@@ -84,35 +91,26 @@ Epistery CLI uses the same domain configuration system as the server:
|
|
|
84
91
|
│ └── [cli]
|
|
85
92
|
│ └── default_domain=localhost
|
|
86
93
|
├── localhost/
|
|
87
|
-
│
|
|
88
|
-
│ └── session.json # Session cookie (auto-created)
|
|
94
|
+
│ └── config.ini # Domain config with wallet & provider
|
|
89
95
|
└── wiki.rootz.global/
|
|
90
|
-
|
|
91
|
-
└── session.json
|
|
96
|
+
└── config.ini
|
|
92
97
|
```
|
|
93
98
|
|
|
94
|
-
### Authentication
|
|
95
|
-
|
|
96
|
-
**Session Cookie (Default):**
|
|
97
|
-
- Performs key exchange once, saves session cookie
|
|
98
|
-
- Subsequent requests use cookie
|
|
99
|
-
- Best for multiple requests to same server
|
|
100
|
-
|
|
101
|
-
**Bot Auth Header (`--bot`):**
|
|
102
|
-
- Signs each request individually
|
|
103
|
-
- No session management
|
|
104
|
-
- Best for distributed systems or one-off requests
|
|
99
|
+
### Authentication
|
|
105
100
|
|
|
106
|
-
|
|
101
|
+
The CLI uses **bot authentication mode**, which signs each request individually with the domain wallet's private key:
|
|
107
102
|
|
|
108
|
-
|
|
103
|
+
1. Load domain wallet from `~/.epistery/{domain}/config.ini`
|
|
104
|
+
2. Create authentication message with current timestamp
|
|
105
|
+
3. Sign message with wallet's private key
|
|
106
|
+
4. Send signature in `Authorization: Bot <base64-encoded-json>` header
|
|
107
|
+
5. Server verifies signature and authenticates request
|
|
109
108
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
No manual "connect" step required!
|
|
109
|
+
**Benefits:**
|
|
110
|
+
- Stateless - no session management needed
|
|
111
|
+
- Secure - private keys never leave your machine
|
|
112
|
+
- Simple - works immediately after initialization
|
|
113
|
+
- Reliable - each request is independently authenticated
|
|
116
114
|
|
|
117
115
|
## Usage Patterns
|
|
118
116
|
|
|
@@ -202,32 +200,19 @@ name=polkadot-hub-testnet
|
|
|
202
200
|
rpc=https://testnet-passet-hub-eth-rpc.polkadot.io
|
|
203
201
|
```
|
|
204
202
|
|
|
205
|
-
### Session File (`~/.epistery/{domain}/session.json`)
|
|
206
|
-
|
|
207
|
-
Auto-created by `epistery curl`:
|
|
208
|
-
|
|
209
|
-
```json
|
|
210
|
-
{
|
|
211
|
-
"domain": "https://wiki.rootz.global",
|
|
212
|
-
"cookie": "session_token_here",
|
|
213
|
-
"authenticated": true,
|
|
214
|
-
"timestamp": "2025-01-10T12:00:00.000Z"
|
|
215
|
-
}
|
|
216
|
-
```
|
|
217
|
-
|
|
218
203
|
## Security
|
|
219
204
|
|
|
220
205
|
- Domain configs stored with 0600 permissions (user only)
|
|
221
206
|
- Private keys never transmitted (only signatures)
|
|
222
207
|
- Each domain has its own isolated wallet
|
|
223
|
-
-
|
|
208
|
+
- Each request is signed with fresh timestamp to prevent replay attacks
|
|
224
209
|
|
|
225
210
|
## Design Philosophy
|
|
226
211
|
|
|
227
212
|
The Epistery CLI uses a unified command structure with subcommands:
|
|
228
213
|
- ✅ Uses existing Epistery domain config system
|
|
229
214
|
- ✅ Consistent with server-side architecture
|
|
230
|
-
- ✅
|
|
215
|
+
- ✅ Bot authentication (stateless, no session management)
|
|
231
216
|
- ✅ Default domain support (less typing)
|
|
232
217
|
- ✅ Simpler mental model (domain = wallet)
|
|
233
218
|
|
|
@@ -259,28 +244,19 @@ epistery curl -w staging.example.com https://staging.example.com/api/status
|
|
|
259
244
|
epistery curl -w prod.example.com https://prod.example.com/api/status
|
|
260
245
|
```
|
|
261
246
|
|
|
262
|
-
### Bot Mode
|
|
263
|
-
|
|
264
|
-
```bash
|
|
265
|
-
# Bot mode doesn't need session, signs each request
|
|
266
|
-
epistery curl --bot https://wiki.rootz.global/session/context
|
|
267
|
-
epistery curl --bot -X POST -d '{"title":"Log","body":"# Entry"}' https://wiki.rootz.global/wiki/Log
|
|
268
|
-
```
|
|
269
|
-
|
|
270
247
|
## Troubleshooting
|
|
271
248
|
|
|
272
249
|
**"Domain not found or has no wallet"**
|
|
273
250
|
- Run `epistery initialize <domain>` first
|
|
274
251
|
|
|
275
|
-
**
|
|
276
|
-
-
|
|
277
|
-
-
|
|
278
|
-
- Use `-v` flag for detailed output
|
|
252
|
+
**401 Unauthorized errors**
|
|
253
|
+
- Server may not recognize your wallet address
|
|
254
|
+
- Check that your address is authorized on the server
|
|
255
|
+
- Use `-v` flag for detailed debugging output
|
|
279
256
|
|
|
280
|
-
**
|
|
281
|
-
-
|
|
282
|
-
-
|
|
283
|
-
- Check server configuration
|
|
257
|
+
**JSON parsing errors**
|
|
258
|
+
- Ensure JSON data is wrapped in **single quotes**: `'{"key":"value"}'`
|
|
259
|
+
- Check that JSON is valid (use a JSON validator if needed)
|
|
284
260
|
|
|
285
261
|
## Integration
|
|
286
262
|
|
package/README.md
CHANGED
|
@@ -6,13 +6,17 @@ _Epistemology is the study of knowledge. An Epistery, it follows, is a place to
|
|
|
6
6
|
|
|
7
7
|
## What Does Epistery Do?
|
|
8
8
|
|
|
9
|
-
Epistery
|
|
9
|
+
Epistery establishes a transactional wallet for both browser and server along with the session handshake. This provides:
|
|
10
10
|
|
|
11
|
-
- **Decentralized Authentication**: Wallet-based user authentication
|
|
12
|
-
- **Data Wallets**: Blockchain
|
|
11
|
+
- **Decentralized Authentication**: Wallet-based user authentication using cryptographic signatures
|
|
12
|
+
- **Data Wallets**: Blockchain smart contracts for data ownership, encryption, sharing, and transfer
|
|
13
13
|
- **Whitelist Management**: On-chain access control for domains and users
|
|
14
|
-
- **CLI Tools**: Command-line interface for authenticated API requests
|
|
14
|
+
- **CLI Tools**: Command-line interface for authenticated API requests using bot mode
|
|
15
15
|
- **Client Libraries**: Browser-based wallet and authentication tools
|
|
16
|
+
- **Configuration Management**: Path-based filesystem-like API for secure configuration storage
|
|
17
|
+
|
|
18
|
+
>*NOTE:* The client wallet (signing key) is held in localStorage under strict domain rules unless the user presents
|
|
19
|
+
> a selected wallet from a web3 plugin
|
|
16
20
|
|
|
17
21
|
## Quick Start
|
|
18
22
|
|
|
@@ -100,7 +104,7 @@ app.get('/profile', (req, res) => {
|
|
|
100
104
|
|
|
101
105
|
### 2. Data Wallets
|
|
102
106
|
|
|
103
|
-
Data wallets
|
|
107
|
+
Data wallets are blockchain smart contracts that provide ownership, encryption, sharing, and transfer capabilities for any data. They combine on-chain ownership records with off-chain storage:
|
|
104
108
|
|
|
105
109
|
```javascript
|
|
106
110
|
// Client creates data wallet
|
|
@@ -113,11 +117,17 @@ const dataWallet = await client.write({
|
|
|
113
117
|
// Read data wallet
|
|
114
118
|
const data = await client.read();
|
|
115
119
|
|
|
116
|
-
// Transfer ownership
|
|
120
|
+
// Transfer ownership to another address
|
|
117
121
|
await client.transferOwnership(newOwnerAddress);
|
|
118
122
|
```
|
|
119
123
|
|
|
120
|
-
Data
|
|
124
|
+
**Data Wallet Features:**
|
|
125
|
+
- **Blockchain Contracts**: Each data wallet is a smart contract on-chain
|
|
126
|
+
- **Encryption**: Data can be encrypted before storage
|
|
127
|
+
- **Sharing**: Grant read/write access to specific addresses
|
|
128
|
+
- **Transferable**: Ownership can be transferred to other wallets
|
|
129
|
+
- **IPFS Storage**: Content stored on IPFS by default, with hashes on-chain
|
|
130
|
+
- **Provenance Tracking**: Full ownership and modification history on-chain
|
|
121
131
|
|
|
122
132
|
### 3. Whitelist Management
|
|
123
133
|
|
|
@@ -135,7 +145,7 @@ Whitelist data is stored on the blockchain and managed through your domain's wal
|
|
|
135
145
|
|
|
136
146
|
### 4. CLI Tools
|
|
137
147
|
|
|
138
|
-
The Epistery CLI enables authenticated API requests from the command line
|
|
148
|
+
The Epistery CLI enables authenticated API requests from the command line using bot authentication (stateless, signs each request):
|
|
139
149
|
|
|
140
150
|
```bash
|
|
141
151
|
# Initialize a CLI wallet
|
|
@@ -145,11 +155,14 @@ epistery set-default localhost
|
|
|
145
155
|
# Make authenticated GET request
|
|
146
156
|
epistery curl https://api.example.com/data
|
|
147
157
|
|
|
148
|
-
#
|
|
149
|
-
epistery curl -X
|
|
158
|
+
# PUT request with JSON data (note single quotes)
|
|
159
|
+
epistery curl -X PUT -d '{"title":"Test","body":"Content"}' https://api.example.com/wiki/Test
|
|
150
160
|
|
|
151
161
|
# Use specific wallet
|
|
152
162
|
epistery curl -w production.example.com https://api.example.com/data
|
|
163
|
+
|
|
164
|
+
# Verbose output for debugging
|
|
165
|
+
epistery curl -v https://api.example.com/data
|
|
153
166
|
```
|
|
154
167
|
|
|
155
168
|
Perfect for:
|
|
@@ -158,20 +171,21 @@ Perfect for:
|
|
|
158
171
|
- Creating bots and agents
|
|
159
172
|
- CI/CD integration
|
|
160
173
|
|
|
174
|
+
**CLI uses bot authentication** - each request is independently signed with the wallet's private key, no session management required.
|
|
175
|
+
|
|
161
176
|
See [CLI.md](CLI.md) for complete CLI documentation.
|
|
162
177
|
|
|
163
178
|
## Configuration
|
|
164
179
|
|
|
165
|
-
Epistery uses a
|
|
180
|
+
Epistery uses a path-based configuration system stored in `~/.epistery/` with a filesystem-like API:
|
|
166
181
|
|
|
167
182
|
```
|
|
168
183
|
~/.epistery/
|
|
169
|
-
├── config.ini #
|
|
184
|
+
├── config.ini # Root config (profile, IPFS, defaults)
|
|
170
185
|
├── mydomain.com/
|
|
171
|
-
│
|
|
172
|
-
│ └── sessions/ # Session data
|
|
186
|
+
│ └── config.ini # Domain config (wallet, provider)
|
|
173
187
|
└── .ssl/
|
|
174
|
-
└── mydomain.com/ # SSL certificates
|
|
188
|
+
└── mydomain.com/ # SSL certificates (optional)
|
|
175
189
|
```
|
|
176
190
|
|
|
177
191
|
### Root Config (`~/.epistery/config.ini`)
|
|
@@ -188,6 +202,9 @@ url=https://rootz.digital/api/v0
|
|
|
188
202
|
chainId=420420422
|
|
189
203
|
name=polkadot-hub-testnet
|
|
190
204
|
rpc=https://testnet-passet-hub-eth-rpc.polkadot.io
|
|
205
|
+
|
|
206
|
+
[cli]
|
|
207
|
+
default_domain=localhost
|
|
191
208
|
```
|
|
192
209
|
|
|
193
210
|
### Domain Config (`~/.epistery/mydomain.com/config.ini`)
|
|
@@ -208,6 +225,8 @@ name=polkadot-hub-testnet
|
|
|
208
225
|
rpc=https://testnet-passet-hub-eth-rpc.polkadot.io
|
|
209
226
|
```
|
|
210
227
|
|
|
228
|
+
The Config class provides a path-based API that works like navigating a filesystem - set a path, load data, modify it, and save. This makes configuration management simple and predictable across all Epistery applications.
|
|
229
|
+
|
|
211
230
|
## Advanced Usage
|
|
212
231
|
|
|
213
232
|
### Custom Authentication
|
|
@@ -294,11 +313,12 @@ See [Architecture.md](Architecture.md) for detailed architecture documentation.
|
|
|
294
313
|
|
|
295
314
|
## Security
|
|
296
315
|
|
|
297
|
-
- Domain configs stored with 0600 permissions (user-only access)
|
|
298
|
-
- Private keys never transmitted
|
|
299
|
-
- Each domain has isolated wallet
|
|
300
|
-
-
|
|
301
|
-
- Key
|
|
316
|
+
- **Private Key Protection**: Domain configs stored with 0600 permissions (user-only access)
|
|
317
|
+
- **Signature-Only Transmission**: Private keys never transmitted, only cryptographic signatures
|
|
318
|
+
- **Wallet Isolation**: Each domain has its own isolated wallet
|
|
319
|
+
- **Bot Authentication**: Stateless authentication with per-request signing and timestamp-based replay protection
|
|
320
|
+
- **Encrypted Key Exchange**: Browser clients use ECDH for secure shared secret establishment
|
|
321
|
+
- **On-Chain Verification**: Whitelist and ownership data stored immutably on blockchain
|
|
302
322
|
|
|
303
323
|
## License
|
|
304
324
|
|
package/dist/epistery.js
CHANGED
|
@@ -33,7 +33,7 @@ class Epistery {
|
|
|
33
33
|
nativeCurrency = {
|
|
34
34
|
symbol: server.provider.nativeCurrencySymbol,
|
|
35
35
|
name: server.provider.nativeCurrencyName || server.provider.nativeCurrencySymbol,
|
|
36
|
-
decimals: server.provider.nativeCurrencyDecimals || 18
|
|
36
|
+
decimals: Number(server.provider.nativeCurrencyDecimals) || 18
|
|
37
37
|
};
|
|
38
38
|
}
|
|
39
39
|
const status = {
|
package/dist/epistery.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"epistery.js","sourceRoot":"","sources":["../src/epistery.ts"],"names":[],"mappings":";;;AAAA,+CAA+J;AAC/J,mCAAwC;AAExC,6CAAyC;AAGzC,MAAa,QAAQ;IAKnB,gBAAgB,CAAC;IAEV,MAAM,CAAC,KAAK,CAAC,UAAU;QAC5B,IAAI,QAAQ,CAAC,aAAa;YACxB,OAAO;QAET,MAAM,MAAM,GAAG,gBAAK,CAAC,SAAS,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpC,QAAQ,CAAC,UAAU,GAAG,UAAU,CAAC,IAAI,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,QAAkB,IAAI,8BAA8B,CAAC;QAC/G,QAAQ,CAAC,cAAc,GAAG,UAAU,CAAC,IAAI,EAAE,OAAO,IAAI,uBAAuB,CAAC;QAC9E,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAE1B,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC;IAChC,CAAC;IAEM,MAAM,CAAC,YAAY;QACxB,MAAM,MAAM,GAAG,eAAM,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QAC5C,MAAM,gBAAgB,GAAqB;YACzC,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE;YACvC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;SAC9B,CAAC;QAEF,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAEM,MAAM,CAAC,SAAS,CAAC,MAAwB,EAAE,MAAoB;QACpE,sEAAsE;QACtE,IAAI,cAAc,GAAG,SAAS,CAAC;QAC/B,IAAI,MAAM,EAAE,QAAQ,EAAE,oBAAoB,EAAE,CAAC;YAC3C,cAAc,GAAG;gBACf,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,oBAAoB;gBAC5C,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,kBAAkB,IAAI,MAAM,CAAC,QAAQ,CAAC,oBAAoB;gBAChF,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,sBAAsB,IAAI,EAAE;
|
|
1
|
+
{"version":3,"file":"epistery.js","sourceRoot":"","sources":["../src/epistery.ts"],"names":[],"mappings":"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"}
|
package/index.mjs
CHANGED
|
@@ -203,7 +203,7 @@ class EpisteryAttach {
|
|
|
203
203
|
return res.status(401).json({ error: 'Key exchange failed - invalid client credentials' });
|
|
204
204
|
}
|
|
205
205
|
const clientInfo = {
|
|
206
|
-
address: req.body.clientAddress
|
|
206
|
+
address: req.body.clientAddress,
|
|
207
207
|
publicKey:req.body.clientPublicKey
|
|
208
208
|
}
|
|
209
209
|
if (this.options.authentication) {
|
|
@@ -312,8 +312,8 @@ class EpisteryAttach {
|
|
|
312
312
|
console.log(`[debug] Provider payload:`, JSON.stringify(provider, null, 2));
|
|
313
313
|
console.log(`[debug] Full request body:`, JSON.stringify(req.body, null, 2));
|
|
314
314
|
|
|
315
|
-
if (!provider || !provider.name || !provider.chainId || !provider.
|
|
316
|
-
console.log(`[debug] Validation failed: provider=${!!provider}, name=${!!provider?.name}, chainId=${!!provider?.chainId},
|
|
315
|
+
if (!provider || !provider.name || !provider.chainId || !provider.rpc) {
|
|
316
|
+
console.log(`[debug] Validation failed: provider=${!!provider}, name=${!!provider?.name}, chainId=${!!provider?.chainId}, rpc=${!!provider?.rpc}`);
|
|
317
317
|
return res.status(400).json({ error: 'Invalid provider configuration' });
|
|
318
318
|
}
|
|
319
319
|
|
|
@@ -327,7 +327,7 @@ class EpisteryAttach {
|
|
|
327
327
|
if (!domainConfig.provider) domainConfig.provider = {
|
|
328
328
|
chainId: provider.chainId,
|
|
329
329
|
name: provider.name,
|
|
330
|
-
rpc: provider.
|
|
330
|
+
rpc: provider.rpc
|
|
331
331
|
}
|
|
332
332
|
|
|
333
333
|
// Save domain config with custom provider (marked as pending)
|
package/package.json
CHANGED
package/src/epistery.ts
CHANGED
|
@@ -43,7 +43,7 @@ export class Epistery {
|
|
|
43
43
|
nativeCurrency = {
|
|
44
44
|
symbol: server.provider.nativeCurrencySymbol,
|
|
45
45
|
name: server.provider.nativeCurrencyName || server.provider.nativeCurrencySymbol,
|
|
46
|
-
decimals: server.provider.nativeCurrencyDecimals || 18
|
|
46
|
+
decimals: Number(server.provider.nativeCurrencyDecimals) || 18
|
|
47
47
|
};
|
|
48
48
|
}
|
|
49
49
|
|