Fix timing with README generation
The async websocket output was happening outide of the code blocks so it rendered wrong.
This commit is contained in:
parent
4f074b181c
commit
a82a4e7290
2 changed files with 62 additions and 56 deletions
|
@ -26,7 +26,7 @@ Generating keys...
|
||||||
Done generating keys
|
Done generating keys
|
||||||
Registered
|
Registered
|
||||||
>>> c1.salt_seed
|
>>> c1.salt_seed
|
||||||
'09f355b525ad440c9fdd0e95e5ac2c49708f84112772ea322c28311c53d55410'
|
'8a77dcb8b2854c2fecabbde74a721fde5e326164f2cf1a7f6810d0e1f340d043'
|
||||||
```
|
```
|
||||||
|
|
||||||
Set up the other client. See that it got the same salt seed from the server in the process, which it needs to make sure we have the correct encryption key and login password.
|
Set up the other client. See that it got the same salt seed from the server in the process, which it needs to make sure we have the correct encryption key and login password.
|
||||||
|
@ -36,16 +36,16 @@ Set up the other client. See that it got the same salt seed from the server in t
|
||||||
Generating keys...
|
Generating keys...
|
||||||
Done generating keys
|
Done generating keys
|
||||||
>>> c2.salt_seed
|
>>> c2.salt_seed
|
||||||
'09f355b525ad440c9fdd0e95e5ac2c49708f84112772ea322c28311c53d55410'
|
'8a77dcb8b2854c2fecabbde74a721fde5e326164f2cf1a7f6810d0e1f340d043'
|
||||||
```
|
```
|
||||||
|
|
||||||
Now that the account exists, grab an auth token with both clients.
|
Now that the account exists, grab an auth token with both clients.
|
||||||
|
|
||||||
```
|
```
|
||||||
>>> c1.get_auth_token()
|
>>> c1.get_auth_token()
|
||||||
Got auth token: be540cea8c18d9de40255ab8da4cbc6d561512731f38e36e808903234453ba4d
|
Got auth token: 9cfbed8d587440b899beb0ea534caaff96981d1f212d83d606642a900deddd1c
|
||||||
>>> c2.get_auth_token()
|
>>> c2.get_auth_token()
|
||||||
Got auth token: 4cde9acc071e25a4fdebcd5a019d84d4f38c7093e4d15ddda5282d0ce136278d
|
Got auth token: 99725c84039e323a880e936d14789d8a79b2fc7efdcae08ed4282e05160f5204
|
||||||
```
|
```
|
||||||
|
|
||||||
## Syncing
|
## Syncing
|
||||||
|
@ -57,7 +57,7 @@ Create a new wallet + metadata (we'll wrap it in a struct we'll call `WalletStat
|
||||||
>>> c1.update_remote_wallet()
|
>>> c1.update_remote_wallet()
|
||||||
Successfully updated wallet state on server
|
Successfully updated wallet state on server
|
||||||
Synced walletState:
|
Synced walletState:
|
||||||
WalletState(sequence=1, encrypted_wallet='czo4MTkyOjE2OjE6FkHI5eVQvbw7vEouMyn766uHhWJBskmh7ZWNttSHh6Ro0ETPZXXuIuPMM+9/1e6Maq+CFBToS2mI/7Z6fuGdVRAGLXVNZKXY9g48J9R7TikFas/XE1Vs/bKLKGKAgvlhJCYvzg582z7JrMzaAQ26VJwFL0gbx+ey+wo7ukb5Yz4=')
|
WalletState(sequence=1, encrypted_wallet='czo4MTkyOjE2OjE6MArKm6fT20MSDlsRPAxl5gk49wHPwBxjNnouMGsTEi2uQaMwVOyDRETIRLBTPHFHn6Uz5j+9a5o6RfAbChvToaFRpe4FWZGtlSBiRqdnatxnYzwTRK9OxAttPJdO6BJ0tO1pmn5ipSHfkQdbTT/POTSnElsrnfDU+4AtdoO9kNA=')
|
||||||
'Success'
|
'Success'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -69,7 +69,7 @@ Now, call `init_wallet_state` with the other client. Then, we call `get_remote_w
|
||||||
>>> c2.init_wallet_state()
|
>>> c2.init_wallet_state()
|
||||||
>>> c2.get_remote_wallet()
|
>>> c2.get_remote_wallet()
|
||||||
Got latest walletState:
|
Got latest walletState:
|
||||||
WalletState(sequence=1, encrypted_wallet='czo4MTkyOjE2OjE6FkHI5eVQvbw7vEouMyn766uHhWJBskmh7ZWNttSHh6Ro0ETPZXXuIuPMM+9/1e6Maq+CFBToS2mI/7Z6fuGdVRAGLXVNZKXY9g48J9R7TikFas/XE1Vs/bKLKGKAgvlhJCYvzg582z7JrMzaAQ26VJwFL0gbx+ey+wo7ukb5Yz4=')
|
WalletState(sequence=1, encrypted_wallet='czo4MTkyOjE2OjE6MArKm6fT20MSDlsRPAxl5gk49wHPwBxjNnouMGsTEi2uQaMwVOyDRETIRLBTPHFHn6Uz5j+9a5o6RfAbChvToaFRpe4FWZGtlSBiRqdnatxnYzwTRK9OxAttPJdO6BJ0tO1pmn5ipSHfkQdbTT/POTSnElsrnfDU+4AtdoO9kNA=')
|
||||||
'Success'
|
'Success'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -81,12 +81,12 @@ Push a new version, GET it with the other client. Even though we haven't edited
|
||||||
>>> c2.update_remote_wallet()
|
>>> c2.update_remote_wallet()
|
||||||
Successfully updated wallet state on server
|
Successfully updated wallet state on server
|
||||||
Synced walletState:
|
Synced walletState:
|
||||||
WalletState(sequence=2, encrypted_wallet='czo4MTkyOjE2OjE6c1dN5L/ywTpgtRIs35zwdPubo+rkXiuk6yoQdw63c/pW+X2NWuFhLo0sfITnRvjiyK20fIwGmBK2nnp2BllEV41HUHETitLL+HS5KK8+/ReNaqE/bZQs1pDn7K+RBl14heAPQQXLeFNFp9fNZxPGs1N+uLl0sRnhij+8kjS5p0Q=')
|
WalletState(sequence=2, encrypted_wallet='czo4MTkyOjE2OjE6RbDcGPPGipR3f++iY2IV4TseRvEuZ18HX/SWzzGrw0qbAlChXgSRUTvAlCV1sGyKJEHhBIlGfC+KOCKEGPaK9fx7BmhhcHvCDmwIlcpJ3VwMtwTjxTJZE9+Q8YLOXjZM1RZhPPiCDqxUzNVPaJm2F1MLSn3tDtX5Duz15ll998Y=')
|
||||||
'Success'
|
'Success'
|
||||||
>>> c1.get_remote_wallet()
|
>>> c1.get_remote_wallet()
|
||||||
Nothing to merge. Taking remote walletState as latest walletState.
|
Nothing to merge. Taking remote walletState as latest walletState.
|
||||||
Got latest walletState:
|
Got latest walletState:
|
||||||
WalletState(sequence=2, encrypted_wallet='czo4MTkyOjE2OjE6c1dN5L/ywTpgtRIs35zwdPubo+rkXiuk6yoQdw63c/pW+X2NWuFhLo0sfITnRvjiyK20fIwGmBK2nnp2BllEV41HUHETitLL+HS5KK8+/ReNaqE/bZQs1pDn7K+RBl14heAPQQXLeFNFp9fNZxPGs1N+uLl0sRnhij+8kjS5p0Q=')
|
WalletState(sequence=2, encrypted_wallet='czo4MTkyOjE2OjE6RbDcGPPGipR3f++iY2IV4TseRvEuZ18HX/SWzzGrw0qbAlChXgSRUTvAlCV1sGyKJEHhBIlGfC+KOCKEGPaK9fx7BmhhcHvCDmwIlcpJ3VwMtwTjxTJZE9+Q8YLOXjZM1RZhPPiCDqxUzNVPaJm2F1MLSn3tDtX5Duz15ll998Y=')
|
||||||
'Success'
|
'Success'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -112,12 +112,12 @@ The wallet is synced between the clients. The client with the changed preference
|
||||||
>>> c1.update_remote_wallet()
|
>>> c1.update_remote_wallet()
|
||||||
Successfully updated wallet state on server
|
Successfully updated wallet state on server
|
||||||
Synced walletState:
|
Synced walletState:
|
||||||
WalletState(sequence=3, encrypted_wallet='czo4MTkyOjE2OjE6utvO9D4f/H8EAcRi1RrsxwnF556Mb/nE77yD98i2Ml75Y0FynfjJYho05n2l4RZDirV5Bm4KrXLH3D+qZh3hqW+ejTvMTUYJ2pLv9jNx7ZuNtPCF6tn+LaRur9sfy+jyuxmeHR9Wd7rqimg5pIBed2DLUTA5R5QaG7TEiMYTrUN+RrkYFdANEvh8LOgRDpce')
|
WalletState(sequence=3, encrypted_wallet='czo4MTkyOjE2OjE6H0sr9zU/SYL2/0abnfmb4y1WqSnRFuylbket0kahuBi42l3RzZunVY5qp7DHFheQ5RNI/KvaEMV6efC9a7EZc/J5nqZOolgdv0dCSPpgwDS0TxUtsCSH6DGZ3htLxqU2r3ZqKX5XCP4f93lTc8loPGvB+e8k6+CYAeXnkS57ske5U6ZYvJtlMMQpYPSVU3xN')
|
||||||
'Success'
|
'Success'
|
||||||
>>> c2.get_remote_wallet()
|
>>> c2.get_remote_wallet()
|
||||||
Nothing to merge. Taking remote walletState as latest walletState.
|
Nothing to merge. Taking remote walletState as latest walletState.
|
||||||
Got latest walletState:
|
Got latest walletState:
|
||||||
WalletState(sequence=3, encrypted_wallet='czo4MTkyOjE2OjE6utvO9D4f/H8EAcRi1RrsxwnF556Mb/nE77yD98i2Ml75Y0FynfjJYho05n2l4RZDirV5Bm4KrXLH3D+qZh3hqW+ejTvMTUYJ2pLv9jNx7ZuNtPCF6tn+LaRur9sfy+jyuxmeHR9Wd7rqimg5pIBed2DLUTA5R5QaG7TEiMYTrUN+RrkYFdANEvh8LOgRDpce')
|
WalletState(sequence=3, encrypted_wallet='czo4MTkyOjE2OjE6H0sr9zU/SYL2/0abnfmb4y1WqSnRFuylbket0kahuBi42l3RzZunVY5qp7DHFheQ5RNI/KvaEMV6efC9a7EZc/J5nqZOolgdv0dCSPpgwDS0TxUtsCSH6DGZ3htLxqU2r3ZqKX5XCP4f93lTc8loPGvB+e8k6+CYAeXnkS57ske5U6ZYvJtlMMQpYPSVU3xN')
|
||||||
'Success'
|
'Success'
|
||||||
>>> c2.get_preferences()
|
>>> c2.get_preferences()
|
||||||
{'animal': 'cow', 'car': ''}
|
{'animal': 'cow', 'car': ''}
|
||||||
|
@ -144,7 +144,7 @@ One client POSTs its change first.
|
||||||
>>> c1.update_remote_wallet()
|
>>> c1.update_remote_wallet()
|
||||||
Successfully updated wallet state on server
|
Successfully updated wallet state on server
|
||||||
Synced walletState:
|
Synced walletState:
|
||||||
WalletState(sequence=4, encrypted_wallet='czo4MTkyOjE2OjE65B/Ia0+1qF1fKqsAfTcf4tx6tJK95yCGcuCVRNk83URaksesq+qI/pqtPX2NOwX6y3KJhO75McHI1Wg5AJx3NkA/jV6VeFVHnAJu0UpkzqI1RtTMEn3w63VXQzLmmj+8PeEEdbY5f5/59fuUhTKfrPLTbr8dSvKIsKQC36d17oGhI/Ox8eQqS5QdjeoARENT')
|
WalletState(sequence=4, encrypted_wallet='czo4MTkyOjE2OjE6W9I5lyVJgKYlT10doJs9NOGHygtBMXyyXVtDI3doUx/eoPwX+qPxHl/Cz3mjDCEWojZgFZqS70ZPBjbRITWQ9iizPWyUG+FtddUVgadW+nCGiSeKHqVmu5n0MihrvNrtKgEka10dmdtj3U4JJsF/0CwlsyzRKLhPgjlJvzn3miW5DOKrNNtJaFmWFJXIJke5')
|
||||||
'Success'
|
'Success'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -156,7 +156,7 @@ Eventually, the client will be responsible (or at least more responsible) for me
|
||||||
>>> c2.get_remote_wallet()
|
>>> c2.get_remote_wallet()
|
||||||
Merging local changes with remote changes to create latest walletState.
|
Merging local changes with remote changes to create latest walletState.
|
||||||
Got latest walletState:
|
Got latest walletState:
|
||||||
WalletState(sequence=4, encrypted_wallet='czo4MTkyOjE2OjE65B/Ia0+1qF1fKqsAfTcf4tx6tJK95yCGcuCVRNk83URaksesq+qI/pqtPX2NOwX6y3KJhO75McHI1Wg5AJx3NkA/jV6VeFVHnAJu0UpkzqI1RtTMEn3w63VXQzLmmj+8PeEEdbY5f5/59fuUhTKfrPLTbr8dSvKIsKQC36d17oGhI/Ox8eQqS5QdjeoARENT')
|
WalletState(sequence=4, encrypted_wallet='czo4MTkyOjE2OjE6W9I5lyVJgKYlT10doJs9NOGHygtBMXyyXVtDI3doUx/eoPwX+qPxHl/Cz3mjDCEWojZgFZqS70ZPBjbRITWQ9iizPWyUG+FtddUVgadW+nCGiSeKHqVmu5n0MihrvNrtKgEka10dmdtj3U4JJsF/0CwlsyzRKLhPgjlJvzn3miW5DOKrNNtJaFmWFJXIJke5')
|
||||||
'Success'
|
'Success'
|
||||||
>>> c2.get_preferences()
|
>>> c2.get_preferences()
|
||||||
{'animal': 'horse', 'car': 'Audi'}
|
{'animal': 'horse', 'car': 'Audi'}
|
||||||
|
@ -168,12 +168,12 @@ Finally, the client with the merged wallet pushes it to the server, and the othe
|
||||||
>>> c2.update_remote_wallet()
|
>>> c2.update_remote_wallet()
|
||||||
Successfully updated wallet state on server
|
Successfully updated wallet state on server
|
||||||
Synced walletState:
|
Synced walletState:
|
||||||
WalletState(sequence=5, encrypted_wallet='czo4MTkyOjE2OjE6p7gs7r4Q6ky7/93vf/1e3HPXTKSAPP6c+0oxYl7010WKqkT0m9uVzU/YZW2QdCrPO4M99XiuxjpnbKwl42BnrvIkpfO1JHaDQHYTVZjp5W7UZHeevR8zQiyXWpEIDdTt1dwwKvpP7RHN1RqJzbyTCfJ6YqA7/GDiAojfDyz/5CvsIxcMCI+vTgYDwcy4rP36')
|
WalletState(sequence=5, encrypted_wallet='czo4MTkyOjE2OjE60UtNFnnuzYfjdEV2VH/QWO6WTqfSlu0KpUxOm2CuEij9erCmNkiuAQCzihsAZPVSFvt3N9UJRGQdeDRwjN9P2yKr89ED/qBhNHSZzEI8dwR7qrPyqPE5vchiw0UclZPeUdrQiAyyCvZSkThiQNEnwvQyeoucxCZ8P3Gi48Vht48MQ8W07zloMXmndiF81h7G')
|
||||||
'Success'
|
'Success'
|
||||||
>>> c1.get_remote_wallet()
|
>>> c1.get_remote_wallet()
|
||||||
Nothing to merge. Taking remote walletState as latest walletState.
|
Nothing to merge. Taking remote walletState as latest walletState.
|
||||||
Got latest walletState:
|
Got latest walletState:
|
||||||
WalletState(sequence=5, encrypted_wallet='czo4MTkyOjE2OjE6p7gs7r4Q6ky7/93vf/1e3HPXTKSAPP6c+0oxYl7010WKqkT0m9uVzU/YZW2QdCrPO4M99XiuxjpnbKwl42BnrvIkpfO1JHaDQHYTVZjp5W7UZHeevR8zQiyXWpEIDdTt1dwwKvpP7RHN1RqJzbyTCfJ6YqA7/GDiAojfDyz/5CvsIxcMCI+vTgYDwcy4rP36')
|
WalletState(sequence=5, encrypted_wallet='czo4MTkyOjE2OjE60UtNFnnuzYfjdEV2VH/QWO6WTqfSlu0KpUxOm2CuEij9erCmNkiuAQCzihsAZPVSFvt3N9UJRGQdeDRwjN9P2yKr89ED/qBhNHSZzEI8dwR7qrPyqPE5vchiw0UclZPeUdrQiAyyCvZSkThiQNEnwvQyeoucxCZ8P3Gi48Vht48MQ8W07zloMXmndiF81h7G')
|
||||||
'Success'
|
'Success'
|
||||||
>>> c1.get_preferences()
|
>>> c1.get_preferences()
|
||||||
{'animal': 'horse', 'car': 'Audi'}
|
{'animal': 'horse', 'car': 'Audi'}
|
||||||
|
@ -204,7 +204,7 @@ We try to POST both of them to the server. The second one fails because of the c
|
||||||
>>> c2.update_remote_wallet()
|
>>> c2.update_remote_wallet()
|
||||||
Successfully updated wallet state on server
|
Successfully updated wallet state on server
|
||||||
Synced walletState:
|
Synced walletState:
|
||||||
WalletState(sequence=6, encrypted_wallet='czo4MTkyOjE2OjE6JFuPERZ3SB2CiSzPISB5/KteOvn1348Xk1o+sgFQMO8l1woKG7pRFUH89L4cm9q/521lQsXgujwEW30X8XQnoTEC0VzaM7IWI7yug7uRQ1XhpXd5W97L3tTlAnZ+V+/lg76Auk9COkJYrbQ8raon3qNl0np9A8pQLvbxVTYAvoA8AMzMEUBFeuZoADZX6bJI')
|
WalletState(sequence=6, encrypted_wallet='czo4MTkyOjE2OjE6e2cIHgNvUiveemLTBYx1BDyueh5JNh4ojvIMnSaass14+Li5eKjVCZaU1LQ1gT4zB6ibqoSu3P60MuOc6/A8GUAwh4KVzQfBBJHjmHWN5ZYoBlJY7AdflrFo0mkUwD1pzTYA0+9iexnI+s0v7ya/rFvw77GtErotgLCnlvOoZiJs3EUyRkltjukz2UCy5LKc')
|
||||||
'Success'
|
'Success'
|
||||||
>>> c1.update_remote_wallet()
|
>>> c1.update_remote_wallet()
|
||||||
Submitted wallet is out of date.
|
Submitted wallet is out of date.
|
||||||
|
@ -220,14 +220,14 @@ The client that is out of date will then call `get_remote_wallet`, which GETs an
|
||||||
>>> c1.get_remote_wallet()
|
>>> c1.get_remote_wallet()
|
||||||
Merging local changes with remote changes to create latest walletState.
|
Merging local changes with remote changes to create latest walletState.
|
||||||
Got latest walletState:
|
Got latest walletState:
|
||||||
WalletState(sequence=6, encrypted_wallet='czo4MTkyOjE2OjE6JFuPERZ3SB2CiSzPISB5/KteOvn1348Xk1o+sgFQMO8l1woKG7pRFUH89L4cm9q/521lQsXgujwEW30X8XQnoTEC0VzaM7IWI7yug7uRQ1XhpXd5W97L3tTlAnZ+V+/lg76Auk9COkJYrbQ8raon3qNl0np9A8pQLvbxVTYAvoA8AMzMEUBFeuZoADZX6bJI')
|
WalletState(sequence=6, encrypted_wallet='czo4MTkyOjE2OjE6e2cIHgNvUiveemLTBYx1BDyueh5JNh4ojvIMnSaass14+Li5eKjVCZaU1LQ1gT4zB6ibqoSu3P60MuOc6/A8GUAwh4KVzQfBBJHjmHWN5ZYoBlJY7AdflrFo0mkUwD1pzTYA0+9iexnI+s0v7ya/rFvw77GtErotgLCnlvOoZiJs3EUyRkltjukz2UCy5LKc')
|
||||||
'Success'
|
'Success'
|
||||||
>>> c1.get_preferences()
|
>>> c1.get_preferences()
|
||||||
{'animal': 'beaver', 'car': 'Toyota'}
|
{'animal': 'beaver', 'car': 'Toyota'}
|
||||||
>>> c1.update_remote_wallet()
|
>>> c1.update_remote_wallet()
|
||||||
Successfully updated wallet state on server
|
Successfully updated wallet state on server
|
||||||
Synced walletState:
|
Synced walletState:
|
||||||
WalletState(sequence=7, encrypted_wallet='czo4MTkyOjE2OjE6ZnqsMEkm/XFvZzRQ1RL6WKw4CeGJeLFp49gnE2SlZYaMjtnels+Cl6EDE1vlGF42bju0lUFLEEVwa1JSweu11Q0IIZDKbjqDLChMCLLItf7aEAxJsZ4/3nu/N2BVCK8Hxz81p0UJiExUImI84Q4FWRqMPgnal8A/OeW7Qor9IyuqkuP054Lt3GnYeJYd3mfN')
|
WalletState(sequence=7, encrypted_wallet='czo4MTkyOjE2OjE6mAo3n7J3aNpyiOLHPaHvOypgop4C2Re+fGzMXrdbSLnrMPxVZxlGS3KRzN58jrQ8gkMUqg3aPviXXyII/W8I8MB3lvRoZPRvD1Mkw48sMhPZ5/QsLvNlJT/29ZzqCo4PQAM3PSVo/ho6i7Bilh7Z6pcm7b8u/fuegbsR5NNdTkQ2nbnZl2sDKH6G3idHGc11')
|
||||||
'Success'
|
'Success'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -245,7 +245,7 @@ Generating keys...
|
||||||
Done generating keys
|
Done generating keys
|
||||||
Successfully updated password and wallet state on server
|
Successfully updated password and wallet state on server
|
||||||
Synced walletState:
|
Synced walletState:
|
||||||
WalletState(sequence=8, encrypted_wallet='czo4MTkyOjE2OjE6bk6pmqtNnjBYgHvwo2wAVYDwD/Un0hTdbjSJBoRAJBAo6ZYk9VCjlEpPtrOo7UZiP7KgZpDI3KjI00dqG019krTalmuVKp3gXgojlK99Z9ZGSXQRK5baehq4cRmkuAaqDGysajRsVaWbPtNUgLM6Dw4FfoveUCmuATDrO+kv9Mg1tvs3a+IpMwdVXdxU2FEd')
|
WalletState(sequence=8, encrypted_wallet='czo4MTkyOjE2OjE6BuNkOY60NKVP4vIjXKfiy4qV75pDzf3YKzBQwU02yhlUR/Jh6ZZTdpEKrKnScwYTVFrSCO+0V7TyPTEVZrh4eLIHJoLgPgDPGl7BNP1aXH4VH+eroqwPQPMLeMJztInWFJt4U2gM+TqExfjG4pNTm5CbD5qiTkv9RMPLBvapcLbD3xeVQkpAYhTi0I458Hsn')
|
||||||
'Success'
|
'Success'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -253,7 +253,7 @@ We generate a new salt seed when we change the password
|
||||||
|
|
||||||
```
|
```
|
||||||
>>> c1.salt_seed
|
>>> c1.salt_seed
|
||||||
'e081028900b64dffeb43b44c6e4beacce59510eeb78eea5df420297c77057586'
|
'e128e66be3c433b30ba40c72d2a42dac8ee84d37a182d4fa2022d4b857d156b0'
|
||||||
```
|
```
|
||||||
|
|
||||||
This operation invalidates all of the user's auth tokens. This prevents other clients from accidentally pushing a wallet encrypted with the old password.
|
This operation invalidates all of the user's auth tokens. This prevents other clients from accidentally pushing a wallet encrypted with the old password.
|
||||||
|
@ -273,7 +273,7 @@ The client that changed its password can easily get a new token because it has t
|
||||||
|
|
||||||
```
|
```
|
||||||
>>> c1.get_auth_token()
|
>>> c1.get_auth_token()
|
||||||
Got auth token: ddbcbfb622b0b3653909f28f0b2df81e2f4c61b5f5316cf85a67e09e5e96b90c
|
Got auth token: 10c06893d0f6b5c6506d75c55f6bdea361df1514ad8e9d04b19e7cf6852f6352
|
||||||
>>> c2.get_auth_token()
|
>>> c2.get_auth_token()
|
||||||
Error 401
|
Error 401
|
||||||
b'{"error":"Unauthorized: No match for email and/or password"}\n'
|
b'{"error":"Unauthorized: No match for email and/or password"}\n'
|
||||||
|
@ -283,9 +283,9 @@ Or, in the off-chance the user changed their password back and forth, try updati
|
||||||
Generating keys...
|
Generating keys...
|
||||||
Done generating keys
|
Done generating keys
|
||||||
>>> c2.salt_seed
|
>>> c2.salt_seed
|
||||||
'e081028900b64dffeb43b44c6e4beacce59510eeb78eea5df420297c77057586'
|
'e128e66be3c433b30ba40c72d2a42dac8ee84d37a182d4fa2022d4b857d156b0'
|
||||||
>>> c2.get_auth_token()
|
>>> c2.get_auth_token()
|
||||||
Got auth token: f85b645bcd5d8bddd266cd95f6127dafec5f958ceab193bde0caf4767daafb71
|
Got auth token: 90689d10cda131747d9dcaddbd474806c16e3d218b54cff4a4ea8fc9d2888e23
|
||||||
```
|
```
|
||||||
|
|
||||||
We don't allow password changes if we have pending wallet changes to push. This is to prevent a situation where the user has to merge local and remote changes in the middle of a password change.
|
We don't allow password changes if we have pending wallet changes to push. This is to prevent a situation where the user has to merge local and remote changes in the middle of a password change.
|
||||||
|
@ -306,22 +306,22 @@ If we update the wallet first, we can do it.
|
||||||
>>> c1.update_remote_wallet()
|
>>> c1.update_remote_wallet()
|
||||||
Successfully updated wallet state on server
|
Successfully updated wallet state on server
|
||||||
Synced walletState:
|
Synced walletState:
|
||||||
WalletState(sequence=9, encrypted_wallet='czo4MTkyOjE2OjE6BggwBmly+7071Vb6oEQSjviE3a3o/o0W34ikaRwggJv37p1D3SAFEBBtPNpc0FSTIltg5f0sxd55tSwcYGUWt3uPsZSqPOuMiFYPtUtMpzg2dAi9g42wSM+m9EdlYGpKxypijqzGZD/Ck7t7PE5eDKLAUxF/voJoOg3uJMGhyzq0+j68KuSofgvCGBTwJOro')
|
WalletState(sequence=9, encrypted_wallet='czo4MTkyOjE2OjE6JB6y6xDMds4pp4eDh8TDfXvpENnfaQztvwua+ipXE7XSlkOJDjQ7GEv7NtnSPP+Whsny1p6GIWgf22WJ76KGMg16oMTxXWVwK0yTzSiQVhQhc5lNHGMSQDu6wOlHhQAfwta3xwMKbFnklq0GlTRYayeUNspFmFRxKulC5dsdU72V6bPnk3lE5K15JKpNGSQ5')
|
||||||
'Success'
|
'Success'
|
||||||
>>> c1.change_password("starboard")
|
>>> c1.change_password("starboard")
|
||||||
Generating keys...
|
Generating keys...
|
||||||
Done generating keys
|
Done generating keys
|
||||||
Successfully updated password and wallet state on server
|
Successfully updated password and wallet state on server
|
||||||
Synced walletState:
|
Synced walletState:
|
||||||
WalletState(sequence=10, encrypted_wallet='czo4MTkyOjE2OjE66qYzTZ+M37RQUfSRTKfVv9RvbqewMaQd6ZBsjZD+dvvjtXqcB6ZZ4q5K7Gd09VMkHRCP8tCYZ/48b/Yvt5sDiTcWSh/Ou08aaiUChPERKWNLpqOCTuF2B/DbsQPgCjwUiXNan+tW6rMbFM6QHxJ/FIzkJUsmab3nwYPon2xkRY8pnwj02R7J62Y7lMd7RiYV')
|
WalletState(sequence=10, encrypted_wallet='czo4MTkyOjE2OjE64YLYwQx95KgCS+kqWhVm3pHBV18bFANe+Kb3Fi3+m9k73p78l/4RF82pxxsYgJeZPrAcpV3pz21dQPVgBDuWszDqk8LkvSQXK/OAmrL3gPFmvuXEV4E504UPcxWeBqiFHNxV1cbWs7UJf31ofVJTEDwqhd0jVitJr/U8+0YU1enEnQd6UavKBxhiaIcy4+xd')
|
||||||
'Success'
|
'Success'
|
||||||
>>> c1.get_auth_token()
|
>>> c1.get_auth_token()
|
||||||
Got auth token: deb6a1a77ca601d01a75c6f150a767b6038e68cfb6cfd806333e5f5b6f03870f
|
Got auth token: ab5820fa0f92ca11698b88ca11c7a38e778e4760b85e2fdaedd761561d87951e
|
||||||
>>> c2.set_local_password("starboard")
|
>>> c2.set_local_password("starboard")
|
||||||
Generating keys...
|
Generating keys...
|
||||||
Done generating keys
|
Done generating keys
|
||||||
>>> c2.get_auth_token()
|
>>> c2.get_auth_token()
|
||||||
Got auth token: d7fb866d4e77426a9c9c32f99a71bd73de53370ec4cc836e734461b4910ab66f
|
Got auth token: 4c32f3348d51662519b7d8675b69571a1ce4d76de88a7b495a4848c5dbb4da7f
|
||||||
```
|
```
|
||||||
|
|
||||||
# Websockets
|
# Websockets
|
||||||
|
@ -332,33 +332,33 @@ This test client will have a thread listening to the websocket which just prints
|
||||||
|
|
||||||
```
|
```
|
||||||
>>> c1.start_websocket()
|
>>> c1.start_websocket()
|
||||||
>>> c2.start_websocket()
|
|
||||||
```
|
|
||||||
c1 connected for now
|
c1 connected for now
|
||||||
|
>>> c2.start_websocket()
|
||||||
c2 connected for now
|
c2 connected for now
|
||||||
|
```
|
||||||
|
|
||||||
Now make an update and see:
|
Now make an update and see:
|
||||||
|
|
||||||
```
|
```
|
||||||
>>> c1.update_remote_wallet()
|
>>> c1.update_remote_wallet()
|
||||||
c1 got notified of a wallet update, sequence=11. If your client is behind this sequence, you should get the latest from the server.
|
|
||||||
Successfully updated wallet state on server
|
|
||||||
c2 got notified of a wallet update, sequence=11. If your client is behind this sequence, you should get the latest from the server.
|
c2 got notified of a wallet update, sequence=11. If your client is behind this sequence, you should get the latest from the server.
|
||||||
|
Successfully updated wallet state on server
|
||||||
Synced walletState:
|
Synced walletState:
|
||||||
WalletState(sequence=11, encrypted_wallet='czo4MTkyOjE2OjE6unyTAofXJh02g0GNXHYjNseaZVxmsRy8zVMBrgzLRKpw1gjmhEB+tsqFl+j1Boy0aqoKGoXFM/q0LZrrDx52elZZPTciTQ5w52IVbeWKe7eYPp2R6ZDsjxNTDfCuVz/CaE/k2uC1f/AW/d6BahTjUYH37EQ3RXEYpucpqnSFKye1PkhloVEu8w5AcnwWm8s/')
|
WalletState(sequence=11, encrypted_wallet='czo4MTkyOjE2OjE6h5sx/erPDmRUd7lUwhW9xDkWHmWOvooebx99Je6WMvG+XXd98MjOuBYTIFHbtr0XzR2ARzvNCmnvxSUBGfRoCiF9Um6OqimJTuc636E2pCgLzvEq8W39qYb3enlu6zd+NiGUXEo85j9WY1FvxrSPBxvV21cM4HLWijDGBob/adYTx33sT8o6tZ/18axxNdNK')
|
||||||
'Success'
|
'Success'
|
||||||
|
c1 got notified of a wallet update, sequence=11. If your client is behind this sequence, you should get the latest from the server.
|
||||||
```
|
```
|
||||||
|
|
||||||
Update again and we'll see the new sequence number:
|
Update again and we'll see the new sequence number:
|
||||||
|
|
||||||
```
|
```
|
||||||
>>> c1.update_remote_wallet()
|
>>> c1.update_remote_wallet()
|
||||||
c1 got notified of a wallet update, sequence=12. If your client is behind this sequence, you should get the latest from the server.
|
|
||||||
c2 got notified of a wallet update, sequence=12. If your client is behind this sequence, you should get the latest from the server.
|
c2 got notified of a wallet update, sequence=12. If your client is behind this sequence, you should get the latest from the server.
|
||||||
Successfully updated wallet state on server
|
Successfully updated wallet state on server
|
||||||
Synced walletState:
|
Synced walletState:
|
||||||
WalletState(sequence=12, encrypted_wallet='czo4MTkyOjE2OjE66PTstwDb8W2Zjz/UkhzypUN8lKAZ3zSW43I3Got4+XjHQnSd+ssJ2s+6OTlAcQxoC3ngtvpV445Hcs/IEDoX00BeYtR0y5Wh0PD2507UkYhaI58R8Ie4Bw/9z/9+DBTsMmfZ1qogV9n8bbMZNjpRYGlQMFMjWbIr58uflMoD81sKI6NUiz6dBnic2QAj6Ueu')
|
WalletState(sequence=12, encrypted_wallet='czo4MTkyOjE2OjE6WvomdZhbeg1ypEkHVR07Z4yI2uj1thLkzolgIcvPfE2i+vexeTfG6WE+bsVlhMwn7wXzQ3tIeW7P8IGpAS+HtcySxXyAyZXJxX/2N6fzqd9Dai8pNO1Ed2RyxGGjMf4spMDT3wJOQ93Plsc96y36iPIzNXQ8gtL15IjAfbiImR+KPmIG8E0IDyYVuOoaTF+A')
|
||||||
'Success'
|
'Success'
|
||||||
|
c1 got notified of a wallet update, sequence=12. If your client is behind this sequence, you should get the latest from the server.
|
||||||
```
|
```
|
||||||
|
|
||||||
When we change a password, just as all auth tokens are invalidated, all sockets are also disconnected.
|
When we change a password, just as all auth tokens are invalidated, all sockets are also disconnected.
|
||||||
|
@ -367,10 +367,10 @@ When we change a password, just as all auth tokens are invalidated, all sockets
|
||||||
>>> c1.change_password("ihatesockets")
|
>>> c1.change_password("ihatesockets")
|
||||||
Generating keys...
|
Generating keys...
|
||||||
Done generating keys
|
Done generating keys
|
||||||
|
c2 disconnected for now: code = 1005 (no status code [internal]), no reason
|
||||||
|
c1 disconnected for now: code = 1005 (no status code [internal]), no reason
|
||||||
Successfully updated password and wallet state on server
|
Successfully updated password and wallet state on server
|
||||||
Synced walletState:
|
Synced walletState:
|
||||||
WalletState(sequence=13, encrypted_wallet='czo4MTkyOjE2OjE62yuQuJXS1yKOu3Bk/IKDwyMw0l5lZyVuYmmMzlIV+fzdGUy3pcY0pJYaz9mH664tknjqTTCIuKO1lCd+OXCByHNl6+FlE2pTNTTm0yDJoBbGzw0mKlABi1ERZAuBy3Q0GqAneKtlkikcbjgQV2KB+pHdN9bD/b0Qey0/Zf6TMCXpVEGeAPrtJiBUpgN2Nmeb')
|
WalletState(sequence=13, encrypted_wallet='czo4MTkyOjE2OjE6GGAs7vW0bt+fzo0xNwQQLd0nY9CM9r1flMtwXNNktXuEA0TkaWVSpP1r/pyN3qLkY8it+OAD2dm44usxzEtNnq1hH40vDPgAYpMtSXRVV1aPTZK6Zv2W1MQN88N4qI592tqpGEm8q2FtqrvA61Rf/CIUGbVKmf5jiPx9aiON6t3etENkZD9t+DEMJo6TOlO9')
|
||||||
'Success'
|
'Success'
|
||||||
```
|
```
|
||||||
c1 disconnected for now: code = 1005 (no status code [internal]), no reason
|
|
||||||
c2 disconnected for now: code = 1005 (no status code [internal]), no reason
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ for wallet in ['test_wallet_1', 'test_wallet_2']:
|
||||||
# Make sure the next preference changes have a later timestamp!
|
# Make sure the next preference changes have a later timestamp!
|
||||||
time.sleep(1.1)
|
time.sleep(1.1)
|
||||||
|
|
||||||
def code_block(code):
|
def code_block(code, stall=0):
|
||||||
print ("```")
|
print ("```")
|
||||||
for line in code.strip().split('\n'):
|
for line in code.strip().split('\n'):
|
||||||
print(">>> " + line)
|
print(">>> " + line)
|
||||||
|
@ -24,9 +24,7 @@ def code_block(code):
|
||||||
result = eval(line)
|
result = eval(line)
|
||||||
if result is not None:
|
if result is not None:
|
||||||
print(repr(result))
|
print(repr(result))
|
||||||
if 'set_preference' in line:
|
time.sleep(stall) # Some commands we want to give some async aspect to finish before continuing
|
||||||
# Make sure the next preference changes have a later timestamp!
|
|
||||||
time.sleep(1.1)
|
|
||||||
print ("```")
|
print ("```")
|
||||||
|
|
||||||
print("""# Test Client
|
print("""# Test Client
|
||||||
|
@ -121,7 +119,9 @@ c1.get_preferences()
|
||||||
c2.get_preferences()
|
c2.get_preferences()
|
||||||
c1.set_preference('animal', 'cow')
|
c1.set_preference('animal', 'cow')
|
||||||
c1.get_preferences()
|
c1.get_preferences()
|
||||||
""")
|
""",
|
||||||
|
stall=1.1, # Make sure the next preference changes have a later timestamp!
|
||||||
|
)
|
||||||
|
|
||||||
print("""
|
print("""
|
||||||
The wallet is synced between the clients. The client with the changed preference sends its wallet to the server, and the other one GETs it locally.
|
The wallet is synced between the clients. The client with the changed preference sends its wallet to the server, and the other one GETs it locally.
|
||||||
|
@ -144,7 +144,9 @@ c1.set_preference('car', 'Audi')
|
||||||
c2.set_preference('animal', 'horse')
|
c2.set_preference('animal', 'horse')
|
||||||
c1.get_preferences()
|
c1.get_preferences()
|
||||||
c2.get_preferences()
|
c2.get_preferences()
|
||||||
""")
|
""",
|
||||||
|
stall=1.1, # Make sure the next preference changes have a later timestamp!
|
||||||
|
)
|
||||||
|
|
||||||
print("""
|
print("""
|
||||||
One client POSTs its change first.
|
One client POSTs its change first.
|
||||||
|
@ -192,7 +194,9 @@ _ = c2.set_preference('animal', 'beaver')
|
||||||
_ = c1.set_preference('car', 'Toyota')
|
_ = c1.set_preference('car', 'Toyota')
|
||||||
c2.get_preferences()
|
c2.get_preferences()
|
||||||
c1.get_preferences()
|
c1.get_preferences()
|
||||||
""")
|
""",
|
||||||
|
stall=1.1, # Make sure the next preference changes have a later timestamp!
|
||||||
|
)
|
||||||
|
|
||||||
print("""
|
print("""
|
||||||
We try to POST both of them to the server. The second one fails because of the conflict, and we see that its preferences don't change yet.
|
We try to POST both of them to the server. The second one fails because of the conflict, and we see that its preferences don't change yet.
|
||||||
|
@ -264,7 +268,9 @@ We don't allow password changes if we have pending wallet changes to push. This
|
||||||
code_block("""
|
code_block("""
|
||||||
c1.set_preference('animal', 'leemur')
|
c1.set_preference('animal', 'leemur')
|
||||||
c1.change_password("starboard")
|
c1.change_password("starboard")
|
||||||
""")
|
""",
|
||||||
|
stall=1.1, # Make sure the next preference changes have a later timestamp!
|
||||||
|
)
|
||||||
|
|
||||||
print("""
|
print("""
|
||||||
If we update the wallet first, we can do it.
|
If we update the wallet first, we can do it.
|
||||||
|
@ -289,9 +295,9 @@ This test client will have a thread listening to the websocket which just prints
|
||||||
code_block("""
|
code_block("""
|
||||||
c1.start_websocket()
|
c1.start_websocket()
|
||||||
c2.start_websocket()
|
c2.start_websocket()
|
||||||
""")
|
""",
|
||||||
|
stall=0.1, # Make sure the messages in the other thread have time to print
|
||||||
time.sleep(.1) # make sure the messages in the other thread have time to print
|
)
|
||||||
|
|
||||||
print("""
|
print("""
|
||||||
Now make an update and see:
|
Now make an update and see:
|
||||||
|
@ -299,9 +305,9 @@ Now make an update and see:
|
||||||
|
|
||||||
code_block("""
|
code_block("""
|
||||||
c1.update_remote_wallet()
|
c1.update_remote_wallet()
|
||||||
""")
|
""",
|
||||||
|
stall=0.1, # Make sure the messages in the other thread have time to print
|
||||||
time.sleep(.1) # make sure the messages in the other thread have time to print
|
)
|
||||||
|
|
||||||
print("""
|
print("""
|
||||||
Update again and we'll see the new sequence number:
|
Update again and we'll see the new sequence number:
|
||||||
|
@ -309,9 +315,9 @@ Update again and we'll see the new sequence number:
|
||||||
|
|
||||||
code_block("""
|
code_block("""
|
||||||
c1.update_remote_wallet()
|
c1.update_remote_wallet()
|
||||||
""")
|
""",
|
||||||
|
stall=0.1, # Make sure the messages in the other thread have time to print
|
||||||
time.sleep(.1) # make sure the messages in the other thread have time to print
|
)
|
||||||
|
|
||||||
print("""
|
print("""
|
||||||
When we change a password, just as all auth tokens are invalidated, all sockets are also disconnected.
|
When we change a password, just as all auth tokens are invalidated, all sockets are also disconnected.
|
||||||
|
@ -319,6 +325,6 @@ When we change a password, just as all auth tokens are invalidated, all sockets
|
||||||
|
|
||||||
code_block("""
|
code_block("""
|
||||||
c1.change_password("ihatesockets")
|
c1.change_password("ihatesockets")
|
||||||
""")
|
""",
|
||||||
|
stall=0.1, # Make sure the messages in the other thread have time to print
|
||||||
time.sleep(.1) # make sure the messages in the other thread have time to print
|
)
|
||||||
|
|
Loading…
Reference in a new issue