backup: Clean up tests

Move tests data to external files
This commit is contained in:
Bilal Elmoussaoui 2023-04-09 16:58:15 +02:00 committed by Bilal Elmoussaoui
parent 16c16cd222
commit e212e32f26
11 changed files with 303 additions and 383 deletions

View file

@ -611,278 +611,83 @@ mod tests {
use super::*;
#[test]
fn generate_issuer_from_name() {
let aegis_data = r#"{
"version": 1,
"header": {
"slots": null,
"params": null
},
"db": {
"version": 2,
"entries": [
{
"type": "totp",
"uuid": "01234567-89ab-cdef-0123-456789abcdef",
"name": "missing-issuer@issuer",
"issuer": null,
"icon": null,
"info": {
"secret": "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",
"algo": "SHA1",
"digits": 6,
"period": 30
}
},
{
"type": "totp",
"uuid": "01234567-89ab-cdef-0123-456789abcdef",
"name": "missing-issuer@domain.com@issuer",
"issuer": null,
"icon": null,
"info": {
"secret": "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",
"algo": "SHA1",
"digits": 6,
"period": 30
}
}
]
}
}"#;
fn issuer_from_name() {
let data =
std::fs::read_to_string("./src/backup/tests/aegis_issuer_from_name.json").unwrap();
let items = Aegis::restore_from_data(data.as_bytes(), None).unwrap();
let aegis_items = Aegis::restore_from_data(aegis_data.as_bytes(), None)
.expect("Restoring from json should work");
assert_eq!(aegis_items[0].issuer(), "issuer");
assert_eq!(aegis_items[0].account(), "missing-issuer");
assert_eq!(aegis_items[1].issuer(), "issuer");
assert_eq!(aegis_items[1].account(), "missing-issuer@domain.com");
assert_eq!(items[0].issuer(), "issuer");
assert_eq!(items[0].account(), "missing-issuer");
assert_eq!(items[1].issuer(), "issuer");
assert_eq!(items[1].account(), "missing-issuer@domain.com");
}
#[test]
fn empty_issuer_failure() {
let aegis_data = r#"{
"version": 1,
"header": {
"slots": null,
"params": null
},
"db": {
"version": 2,
"entries": [
{
"type": "totp",
"uuid": "01234567-89ab-cdef-0123-456789abcdef",
"name": "cannot-derive-issuer-value",
"issuer": null,
"icon": null,
"info": {
"secret": "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",
"algo": "SHA1",
"digits": 6,
"period": 30
}
}
]
}
}"#;
fn parse_plain() {
let data = std::fs::read_to_string("./src/backup/tests/aegis_plain.json").unwrap();
let items = Aegis::restore_from_data(data.as_bytes(), None).unwrap();
let result = Aegis::restore_from_data(aegis_data.as_bytes(), None).unwrap_err();
assert_eq!(items[0].account(), "Bob");
assert_eq!(items[0].issuer(), "Google");
assert_eq!(items[0].secret(), "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567");
assert_eq!(items[0].period(), Some(30));
assert_eq!(items[0].algorithm(), Algorithm::SHA1);
assert_eq!(items[0].digits(), Some(6));
assert_eq!(items[0].counter(), None);
assert_eq!(items[0].method(), Method::TOTP);
assert_eq!(
format!("{result}"),
"Entry cannot-derive-issuer-value has an empty issuer"
);
assert_eq!(items[1].account(), "Benjamin");
assert_eq!(items[1].issuer(), "Air Canada");
assert_eq!(items[1].secret(), "KUVJJOM753IHTNDSZVCNKL7GII");
assert_eq!(items[1].period(), None);
assert_eq!(items[1].algorithm(), Algorithm::SHA256);
assert_eq!(items[1].digits(), Some(7));
assert_eq!(items[1].counter(), Some(50));
assert_eq!(items[1].method(), Method::HOTP);
assert_eq!(items[2].account(), "Sophia");
assert_eq!(items[2].issuer(), "Boeing");
assert_eq!(items[2].secret(), "JRZCL47CMXVOQMNPZR2F7J4RGI");
assert_eq!(items[2].period(), Some(30));
assert_eq!(items[2].algorithm(), Algorithm::SHA1);
assert_eq!(items[2].digits(), Some(5));
assert_eq!(items[2].counter(), None);
assert_eq!(items[2].method(), Method::Steam);
}
#[test]
fn restore_unencrypted_file() {
let aegis_data = r#"{
"version": 1,
"header": {
"slots": null,
"params": null
},
"db": {
"version": 2,
"entries": [
{
"type": "totp",
"uuid": "01234567-89ab-cdef-0123-456789abcdef",
"name": "Bob",
"issuer": "Google",
"icon": null,
"info": {
"secret": "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",
"algo": "SHA1",
"digits": 6,
"period": 30
}
},
{
"type": "hotp",
"uuid": "03e572f2-8ebd-44b0-a57e-e958af74815d",
"name": "Benjamin",
"issuer": "Air Canada",
"icon": null,
"info": {
"secret": "KUVJJOM753IHTNDSZVCNKL7GII",
"algo": "SHA256",
"digits": 7,
"counter": 50
}
},
{
"type": "steam",
"uuid": "5b11ae3b-6fc3-4d46-8ca7-cf0aea7de920",
"name": "Sophia",
"issuer": "Boeing",
"icon": null,
"info": {
"secret": "JRZCL47CMXVOQMNPZR2F7J4RGI",
"algo": "SHA1",
"digits": 5,
"period": 30
}
}
]
}
}"#;
let aegis_items = Aegis::restore_from_data(aegis_data.as_bytes(), None)
.expect("Restoring from json should work");
assert_eq!(aegis_items[0].account(), "Bob");
assert_eq!(aegis_items[0].issuer(), "Google");
assert_eq!(aegis_items[0].secret(), "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567");
assert_eq!(aegis_items[0].period(), Some(30));
assert_eq!(aegis_items[0].algorithm(), Algorithm::SHA1);
assert_eq!(aegis_items[0].digits(), Some(6));
assert_eq!(aegis_items[0].counter(), None);
assert_eq!(aegis_items[0].method(), Method::TOTP);
assert_eq!(aegis_items[1].account(), "Benjamin");
assert_eq!(aegis_items[1].issuer(), "Air Canada");
assert_eq!(aegis_items[1].secret(), "KUVJJOM753IHTNDSZVCNKL7GII");
assert_eq!(aegis_items[1].period(), None);
assert_eq!(aegis_items[1].algorithm(), Algorithm::SHA256);
assert_eq!(aegis_items[1].digits(), Some(7));
assert_eq!(aegis_items[1].counter(), Some(50));
assert_eq!(aegis_items[1].method(), Method::HOTP);
assert_eq!(aegis_items[2].account(), "Sophia");
assert_eq!(aegis_items[2].issuer(), "Boeing");
assert_eq!(aegis_items[2].secret(), "JRZCL47CMXVOQMNPZR2F7J4RGI");
assert_eq!(aegis_items[2].period(), Some(30));
assert_eq!(aegis_items[2].algorithm(), Algorithm::SHA1);
assert_eq!(aegis_items[2].digits(), Some(5));
assert_eq!(aegis_items[2].counter(), None);
assert_eq!(aegis_items[2].method(), Method::Steam);
}
#[test]
fn deserialize_encrypted() {
let aegis_data = r#"{
"version": 1,
"header": {
"slots": [
{
"type": 1,
"uuid": "an-uuid",
"key": "491d44550430ba248986b904b8cffd3a6c5755d176ac877bd11b82c934225017",
"key_params": {
"nonce": "095fd13dee336fa56b4634ff",
"tag": "5db2470edf2d12f82a89ae7f48ccd50c"
},
"n": 64604640,
"r": 10,
"p": 12,
"salt": "27ea9ae53fa2f08a8dcd201615a8229422647b3058f9f36b08f9457e62888be1",
"repaired": true
},
{
"type": 2,
"uuid": "some-uuid",
"key": "491d44550430ba248986b904b8cffd3a6c5755d176ac877bd11b82c934225017",
"key_params": {
"nonce": "095fd13dee336fa56b4634ff",
"tag": "5db2470edf2d12f82a89ae7f48ccd50c"
}
}
],
"params": {
"nonce": "095fd13dee336fa56b4634ff",
"tag": "5db2470edf2d12f82a89ae7f48ccd50c"
}
},
"db": "the encrypted DB"
}"#;
let data: Result<Aegis, _> = serde_json::de::from_slice(&aegis_data.as_bytes());
assert!(data.is_ok());
}
#[test]
fn restore_encrypted_file() {
fn parse_encrypted() {
// See <https://github.com/beemdevelopment/Aegis/blob/master/app/src/test/resources/com/beemdevelopment/aegis/importers/aegis_encrypted.json>
// for this example file.
let aegis_data = r#"{
"version": 1,
"header": {
"slots": [
{
"type": 1,
"uuid": "a8325752-c1be-458a-9b3e-5e0a8154d9ec",
"key": "491d44550430ba248986b904b8cffd3a6c5755d176ac877bd11b82c934225017",
"key_params": {
"nonce": "e9705513ba4951fa7a0608d2",
"tag": "931237af257b83c693ddb8f9a7eddaf0"
},
"n": 32768,
"r": 8,
"p": 1,
"salt": "27ea9ae53fa2f08a8dcd201615a8229422647b3058f9f36b08f9457e62888be1",
"repaired": true
}
],
"params": {
"nonce": "095fd13dee336fa56b4634ff",
"tag": "5db2470edf2d12f82a89ae7f48ccd50c"
}
},
"db": "RtGfUrZ01nzRnvHjPJGyWjfa6shQ7NYwa491CgAWNBM8OeGZVIHhnDAVlVWNlSoq2V097p5Yq5m+SFl5g9nBBBQBNePQnj6CCvu1NfNtoA6R3hyp77gd+e+O2MRnOGH1Z1laV2Tl6p3q8IUHWgAJ36LbUxiCXmfh7bWm198uA4bgLwrEmo04MrqeYXggLuXrJrp6dUJQFD72dgoPbHijlSycY5GLel3ZbAXRsUHszd+xdywpj7\/TYa4OYFel0M0QcCpsKA1LRQz365X9OXPJdTsmVyR4dJ6x5RIVeh39lAYKUf7T4w7BLC8taST5m4J\/VXDueKbvg8R13bNWF0aRHUgeuI9BNzMZINJlzKFKNRknTaJ\/1kEUU0sLkgcaVkX\/DVTGG+pWi5MHijicrK0i4LHN3CUwV2\/\/ZNJCGXM5ErsKMOnJfma52gMdifPiXU317Klvc5oOZFYGnhbhJ2WtPIuqjdvnfuLat2JxA7Xx3LqquRWGL2113yjzVzGBDCVY6iIdedBEgH8CGD826\/3R3m6dR5sfSggQ2SbtQA\/DZNhLSNSU+bfNScVQvUWfR2Lf7Q\/4FR\/xATAQJ9IIBeL+w2ErLUPjURocFXup5YOBHxFdDjZ2FqhbAq4h3Zn\/BJ57xUcYEA+YtP5uOP2lQwUh\/0vFWizDVotzraO8tZiBZBsODyb69eJrXNwFbIjeUczY6wrJs1+676IilbCsmtoYvWEpUZF4hIi7TYAD+nyXX\/olrkog9omWZk8R7hJ9KRDfckXEc\/XSzWhk3Kmfa7pRNh9wYZsaR7VPZGZebQMuUKfRRci2qMsZOJvQsDBJvVze0xW9SqiySDgGyRX\/DwzuaZEGZZriaLf6ox7LwY2Qi6QpYOYbAaEaXAesCR1DPxFfGKsUHVjF8hKA6ZBXDXdqM3Y+14naIOH9S7UzYn32botoVLOykSjnW6z6M0ZPkz3dwowMJiVQcyD7p+9p4J6f1S81pFS7DP+jF+PTyC3c3q\/dwFhNdoG6iV9eQEAxjUi6MpzvFRsk9RsLcQqYgzJGmRjYeXlKH8k8tTu1A4puo6w3Daz8hZz9NafMgMsuqY0oKVLgdNqFz8yVMsxYfBW\/oW56SuQyyVWyxXjXmbk1vpYCTL5kXvIZWoTmBRRDb0ay5S\/dlD6z\/WR45\/C4AwcCE9m4Yf3zisRNa7AqWLVgkmJxFdfJxjiuPtUIK79s+lIJkyRENEqkvm809qIxDhkQzY8zcCt4oXCEbJUfSG4awBs1VvilJIwe6qi0bNtqXtAb5TctgxTh29A9oGlsRG4o8sHqA1mtjp5QiLWp5Hh6rOH95W6+fnBiOW+Iw0evBTduroWvx37HBTktJz79zGe0l3c0Y6VmiFvB7knmT2CrgP7woRkxGbXxdE9zMPQJM9ursD538MVDdD\/0tdkxHxilt47f1DPo2CKUWU8Q1KMm1zLXfVO8BbGUWIv4YeDKHfMUL\/HcStv5VJY+LbnOEjzGT4e1\/avSQmqBL4G9XNkYmyMhC8tlLQcmMMH4bNfPOO3vi5Pb5E7XveSgxlOHs4F0+nqxnFOAu8494MEtx6u5+B7d8LI\/DhEO5zTDwE+THiKej6vCsFxTZ519rm67HycOwRR4LKrwfDeUEK3X1PzryOD5zcv3PMcSBgZ8EWvTfZ9ygKP8BmRQRpydTbSt8Hj5fTUuajADCP0Ggw+6G7n+5FhExJNd+o9D8d4KgLPOe08M8InW7pLB389TWtSo4v3VNjcmmJNQ26wlPkhO\/xBU1URFR0fXU3eCO+w++IMt\/fOSqSpNF9bWElfWHIQ23ntxVke\/hR9j\/GG3tHGxYS5pL42sJF\/Re\/UlUJTGSQP6up2xVYs6gncQ0zACDOPjLQmQzYhz\/hr8S6EjYfK++yLZmRTjEI7xT9u\/B5YLyOQCYVTaF\/pDEegjsehXM3qJBfsA+XY7F9TRsmM\/MSVaPDkdIJ7zvL9xtaF6bXdZoZ6po3ml8uu41pSkNmMKgyEy5E0UQUTWMPLC8drUoQ\/KWQnVIN6HUXGBjYy6aax\/LYZaBcbZi97FHK0h+wsx3WN\/uQozNkQjwGYE8fwYxRYh1RaFi5PkiCM505ib7e82Yuts0l+cBb6nG1IruDplg9BD\/G9w4vVDePEikhcPyY\/p7AZ4i7u\/bL2YKlbE3HyJa+7dkbWJgGidtRZgu+Fdl2T\/rrRJ4+lVaKPVKGKT7ItZdIeitIYUdRxCzrOf1ItZCC8BWa4PElDAjj2yDNmMYRpXJBe3gQHWs\/H5SZgFuwsfCu23uzNRQYib8SuwIJQDvPiXo7m4oIySO8VyvemcExlbXSlbZbvwVxYavTVfcUpAXI6qlsg2jjk+JZahfKrWNC5COZPdVjdAXCoiKU+HBPmEFCwQv\/7zlSBEiI2piyqd+MPwnP63RdGO+oXYid6hn4Nm8kcOhtRyvYm95p66jzGlEugsfxJCED7MTh3XShqa2tt4lFG25icllzTvIJboRkz5oIB4dZVS9+q2TgGUoX7UCpobD8WkHo\/y0cpTuZr8vzXqx2fObxzPNoVgxJmp9E06G2bhMVHPpT17xbfq\/KhJJn7k1S0sfXPG+SmYlX4U7zNSe1M7JXtLf3uVOLz7Ccjp3yvcdq8nRmVym3Zwsz+vv57FA2A0dy3Db97ypJa9HGaxnnYIZHHzep0gJCeeIKE9L32zGCoUg+cPu9B2lPEgIr64iGiuvKSRwNQpOBktM6qqjQntE0Me6mh426irFQ\/3tcfH9a4lZEwwuU1X+lUBUWQp3n5Ej4BSJEs8E6H0EjBvyk69q3qjy5yi7ROVRis6y6S1v4er77RHQUf3phK5354VJHrp9pR926t5qngH5RVF4eljwtXDs3MkejADJ6stBHa\/w7FcbUClO8U+S4Bidxb3mZCiZkUVTpbzvBfYAiQvAfdkMa49o3a5DXKsbXyUPrmr6fWRfM1fS0Ehp0lUv6BDj0yR13CLMpKDU4GfDrl8UEvwh7gwtBRkuaBFzyMtd3NeE7kIGf9vFs6MEl2dmMDFSDid7MdVSDVTlhaAtp+zsRejKW3OQr5n051FzkUsIFGty9AWOkwjZCbstHYCOtyJnsnXP1i9lRDFBgPpFgmDD+bzzg0g9AOAxzqTiLF7bb1jejfe5qVr5V9+7zLpwRLiYaLkNOmpsqvNMuYVwdqTp6nyoougdgBlvve3EG0k09sFKi2Ep9lq+QkS7zGre2jJDrqgdC08+V4PXHYkP3V3Zjgn1x6RfQ2PE+2zvk1GGEgzcNww3byoYw0Ra5qS5yftMy\/2WahbA8fjUYvtmksFH8VjN3yasZt3sdQLWtv8qXxZscy+pCyjTdyxW+ddFnrWuqMIV3jbGMvngq6dL\/n5+DumjbA1gmBJVOpmyEsc1iwHDS36cNnyi1htGFO\/6\/Va4YPYK7dG6LY387UoBUU9Q9ijrBrSGpzPWYmXBLZ8e1MMPfHIN1WsaTgYO9leg3MAJTjQFTFrQ5dguYpWhlm2sWJT45jrda4uWqduB+aQLzYRWhEDBFzPV3ZgIe0SB+7h04Vm0Pu\/LDRvqaolpZ86CEm+zgjBOKeEGFwzTXxH\/5pBoca1bZ6wvsbVZxJNBeH8\/w=="
}"#;
let data = std::fs::read_to_string("./src/backup/tests/aegis_encrypted.json").unwrap();
let items = Aegis::restore_from_data(data.as_bytes(), Some("test")).unwrap();
let aegis_items = Aegis::restore_from_data(aegis_data.as_bytes(), Some("test"))
.expect("Restoring from encrypted json should work");
assert_eq!(items[0].account(), "Mason");
assert_eq!(items[0].issuer(), "Deno");
assert_eq!(items[0].secret(), "4SJHB4GSD43FZBAI7C2HLRJGPQ");
assert_eq!(items[0].period(), Some(30));
assert_eq!(items[0].algorithm(), Algorithm::SHA1);
assert_eq!(items[0].digits(), Some(6));
assert_eq!(items[0].counter(), None);
assert_eq!(items[0].method(), Method::TOTP);
assert_eq!(aegis_items[0].account(), "Mason");
assert_eq!(aegis_items[0].issuer(), "Deno");
assert_eq!(aegis_items[0].secret(), "4SJHB4GSD43FZBAI7C2HLRJGPQ");
assert_eq!(aegis_items[0].period(), Some(30));
assert_eq!(aegis_items[0].algorithm(), Algorithm::SHA1);
assert_eq!(aegis_items[0].digits(), Some(6));
assert_eq!(aegis_items[0].counter(), None);
assert_eq!(aegis_items[0].method(), Method::TOTP);
assert_eq!(items[3].account(), "James");
assert_eq!(items[3].issuer(), "Issuu");
assert_eq!(items[3].secret(), "YOOMIXWS5GN6RTBPUFFWKTW5M4");
assert_eq!(items[3].period(), None);
assert_eq!(items[3].algorithm(), Algorithm::SHA1);
assert_eq!(items[3].digits(), Some(6));
assert_eq!(items[3].counter(), Some(1));
assert_eq!(items[3].method(), Method::HOTP);
assert_eq!(aegis_items[3].account(), "James");
assert_eq!(aegis_items[3].issuer(), "Issuu");
assert_eq!(aegis_items[3].secret(), "YOOMIXWS5GN6RTBPUFFWKTW5M4");
assert_eq!(aegis_items[3].period(), None);
assert_eq!(aegis_items[3].algorithm(), Algorithm::SHA1);
assert_eq!(aegis_items[3].digits(), Some(6));
assert_eq!(aegis_items[3].counter(), Some(1));
assert_eq!(aegis_items[3].method(), Method::HOTP);
assert_eq!(aegis_items[6].account(), "Sophia");
assert_eq!(aegis_items[6].issuer(), "Boeing");
assert_eq!(aegis_items[6].secret(), "JRZCL47CMXVOQMNPZR2F7J4RGI");
assert_eq!(aegis_items[6].period(), Some(30));
assert_eq!(aegis_items[6].algorithm(), Algorithm::SHA1);
assert_eq!(aegis_items[6].digits(), Some(5));
assert_eq!(aegis_items[6].counter(), None);
assert_eq!(aegis_items[6].method(), Method::Steam);
assert_eq!(items[6].account(), "Sophia");
assert_eq!(items[6].issuer(), "Boeing");
assert_eq!(items[6].secret(), "JRZCL47CMXVOQMNPZR2F7J4RGI");
assert_eq!(items[6].period(), Some(30));
assert_eq!(items[6].algorithm(), Algorithm::SHA1);
assert_eq!(items[6].digits(), Some(5));
assert_eq!(items[6].counter(), None);
assert_eq!(items[6].method(), Method::Steam);
}
// TODO: add tests for importing

View file

@ -147,88 +147,24 @@ impl Restorable for Bitwarden {
mod tests {
use super::*;
#[test]
fn test_bitwarden_restore_otpauth() {
let bitwarden_data = r#"{
"items": [
{
"id": "6095e880-06e0-4073-b38e-aade00f849d2",
"organizationId": null,
"folderId": null,
"type": 1,
"name": "test.com",
"notes": null,
"favorite": false,
"login": {
"uris": [
{
"match": null,
"uri": "https://test.com"
}
],
"username": "test@testmail.com",
"password": "äö^ 4234",
"totp": "otpauth://totp/test.com:source.test_test%40testmail.com?secret=S22VG5VDNIUK2YIOMPNJ2ADNM3FNZSR2&issuer=test.com"
},
"collectionIds": null
}
]
}"#;
fn parse() {
let data = std::fs::read_to_string("./src/backup/tests/bitwarden.json").unwrap();
let items = Bitwarden::restore_from_data(data.as_bytes(), None).unwrap();
let bitwarden_items = Bitwarden::restore_from_data(bitwarden_data.as_bytes(), None)
.expect("Restoring from json should work");
assert_eq!(items[0].account(), "test@testmail.com");
assert_eq!(items[0].issuer(), "test.com");
assert_eq!(items[0].secret(), "S22VG5VDNIUK2YIOMPNJ2ADNM3FNZSR2");
assert_eq!(items[0].period(), None);
assert_eq!(items[0].algorithm(), Algorithm::default());
assert_eq!(items[0].digits(), None);
assert_eq!(items[0].counter(), None);
assert_eq!(bitwarden_items[0].account(), "test@testmail.com");
assert_eq!(bitwarden_items[0].issuer(), "test.com");
assert_eq!(
bitwarden_items[0].secret(),
"S22VG5VDNIUK2YIOMPNJ2ADNM3FNZSR2"
);
assert_eq!(bitwarden_items[0].period(), None);
assert_eq!(bitwarden_items[0].algorithm(), Algorithm::default());
assert_eq!(bitwarden_items[0].digits(), None);
assert_eq!(bitwarden_items[0].counter(), None);
}
#[test]
fn test_bitwarden_restore_totp_number() {
let bitwarden_data = r#"{
"items": [
{
"id": "6095e880-06e0-4073-b38e-aade00f849d2",
"organizationId": null,
"folderId": null,
"type": 1,
"name": "test.com",
"notes": null,
"favorite": false,
"login": {
"uris": [
{
"match": null,
"uri": "https://test.com"
}
],
"username": "test@testmail.com",
"password": "27ß4357ß2345%",
"totp": "xkbu m5fw xxaa jqml 64qh yhi2 xdyf wjz2"
},
"collectionIds": null
}
]
}"#;
let bitwarden_items = Bitwarden::restore_from_data(bitwarden_data.as_bytes(), None)
.expect("Restoring from json should work");
assert_eq!(bitwarden_items[0].account(), "test@testmail.com");
assert_eq!(bitwarden_items[0].issuer(), "test.com");
assert_eq!(
bitwarden_items[0].secret(),
"xkbu m5fw xxaa jqml 64qh yhi2 xdyf wjz2"
);
assert_eq!(bitwarden_items[0].period(), None);
assert_eq!(bitwarden_items[0].algorithm(), Algorithm::default());
assert_eq!(bitwarden_items[0].digits(), None);
assert_eq!(bitwarden_items[0].counter(), None);
assert_eq!(items[1].account(), "test@testmail.com");
assert_eq!(items[1].issuer(), "test.com");
assert_eq!(items[1].secret(), "xkbu m5fw xxaa jqml 64qh yhi2 xdyf wjz2");
assert_eq!(items[1].period(), None);
assert_eq!(items[1].algorithm(), Algorithm::default());
assert_eq!(items[1].digits(), None);
assert_eq!(items[1].counter(), None);
}
}

View file

@ -89,34 +89,8 @@ mod tests {
#[test]
fn parse() {
let data = r#"{
"tokenOrder": [
"foo1",
"foo2"
],
"tokens": [
{
"algo": "SHA1",
"counter": 0,
"digits": 6,
"issuerExt": "foo1",
"label": "bar1",
"period": 30,
"secret": [0,0,13,111,-99],
"type": "TOTP"
},
{
"algo": "SHA1",
"issuerExt": "foo2",
"label": "bar2",
"secret": [8,66,29,111,-99],
"type": "TOTP"
}
]
}"#;
let items = FreeOTPJSON::restore_from_data(data.as_bytes(), None)
.expect("Restoring from json should work");
let data = std::fs::read_to_string("./src/backup/tests/freeotp_json.json").unwrap();
let items = FreeOTPJSON::restore_from_data(data.as_bytes(), None).unwrap();
assert_eq!(items[0].account(), "bar1");
assert_eq!(items[0].issuer(), "foo1");

View file

@ -168,18 +168,16 @@ mod tests {
use super::{super::RestorableItem, *};
#[test]
fn test_google_restore_otpauth() {
let google_data = b"otpauth-migration://offline?data=CjYKEExyJfPiZeroMa/MdF%2BnkTISE2pvaG5kb2VAZXhhbXBsZS5jb20aB0Rpc2NvcmQgASgBMAIQARgBIAA%3D";
fn parse() {
let data = b"otpauth-migration://offline?data=CjYKEExyJfPiZeroMa/MdF%2BnkTISE2pvaG5kb2VAZXhhbXBsZS5jb20aB0Rpc2NvcmQgASgBMAIQARgBIAA%3D";
let items = Google::restore_from_data(data, None).unwrap();
let google_items = Google::restore_from_data(google_data, None)
.expect("Restoring from otpauth-migration uri should work");
assert_eq!(google_items[0].account(), "johndoe@example.com");
assert_eq!(google_items[0].issuer(), "Discord");
assert_eq!(google_items[0].secret(), "JRZCL47CMXVOQMNPZR2F7J4RGI");
assert_eq!(google_items[0].period(), None);
assert_eq!(google_items[0].algorithm(), Algorithm::SHA1);
assert_eq!(google_items[0].digits(), None);
assert_eq!(google_items[0].counter(), Some(0));
assert_eq!(items[0].account(), "johndoe@example.com");
assert_eq!(items[0].issuer(), "Discord");
assert_eq!(items[0].secret(), "JRZCL47CMXVOQMNPZR2F7J4RGI");
assert_eq!(items[0].period(), None);
assert_eq!(items[0].algorithm(), Algorithm::SHA1);
assert_eq!(items[0].digits(), None);
assert_eq!(items[0].counter(), Some(0));
}
}

View file

@ -0,0 +1,35 @@
{
"version": 1,
"header": {
"slots": [
{
"type": 1,
"uuid": "a8325752-c1be-458a-9b3e-5e0a8154d9ec",
"key": "491d44550430ba248986b904b8cffd3a6c5755d176ac877bd11b82c934225017",
"key_params": {
"nonce": "e9705513ba4951fa7a0608d2",
"tag": "931237af257b83c693ddb8f9a7eddaf0"
},
"n": 32768,
"r": 8,
"p": 1,
"salt": "27ea9ae53fa2f08a8dcd201615a8229422647b3058f9f36b08f9457e62888be1",
"repaired": true
},
{
"type": 2,
"uuid": "some-uuid",
"key": "491d44550430ba248986b904b8cffd3a6c5755d176ac877bd11b82c934225017",
"key_params": {
"nonce": "095fd13dee336fa56b4634ff",
"tag": "5db2470edf2d12f82a89ae7f48ccd50c"
}
}
],
"params": {
"nonce": "095fd13dee336fa56b4634ff",
"tag": "5db2470edf2d12f82a89ae7f48ccd50c"
}
},
"db": "RtGfUrZ01nzRnvHjPJGyWjfa6shQ7NYwa491CgAWNBM8OeGZVIHhnDAVlVWNlSoq2V097p5Yq5m+SFl5g9nBBBQBNePQnj6CCvu1NfNtoA6R3hyp77gd+e+O2MRnOGH1Z1laV2Tl6p3q8IUHWgAJ36LbUxiCXmfh7bWm198uA4bgLwrEmo04MrqeYXggLuXrJrp6dUJQFD72dgoPbHijlSycY5GLel3ZbAXRsUHszd+xdywpj7\/TYa4OYFel0M0QcCpsKA1LRQz365X9OXPJdTsmVyR4dJ6x5RIVeh39lAYKUf7T4w7BLC8taST5m4J\/VXDueKbvg8R13bNWF0aRHUgeuI9BNzMZINJlzKFKNRknTaJ\/1kEUU0sLkgcaVkX\/DVTGG+pWi5MHijicrK0i4LHN3CUwV2\/\/ZNJCGXM5ErsKMOnJfma52gMdifPiXU317Klvc5oOZFYGnhbhJ2WtPIuqjdvnfuLat2JxA7Xx3LqquRWGL2113yjzVzGBDCVY6iIdedBEgH8CGD826\/3R3m6dR5sfSggQ2SbtQA\/DZNhLSNSU+bfNScVQvUWfR2Lf7Q\/4FR\/xATAQJ9IIBeL+w2ErLUPjURocFXup5YOBHxFdDjZ2FqhbAq4h3Zn\/BJ57xUcYEA+YtP5uOP2lQwUh\/0vFWizDVotzraO8tZiBZBsODyb69eJrXNwFbIjeUczY6wrJs1+676IilbCsmtoYvWEpUZF4hIi7TYAD+nyXX\/olrkog9omWZk8R7hJ9KRDfckXEc\/XSzWhk3Kmfa7pRNh9wYZsaR7VPZGZebQMuUKfRRci2qMsZOJvQsDBJvVze0xW9SqiySDgGyRX\/DwzuaZEGZZriaLf6ox7LwY2Qi6QpYOYbAaEaXAesCR1DPxFfGKsUHVjF8hKA6ZBXDXdqM3Y+14naIOH9S7UzYn32botoVLOykSjnW6z6M0ZPkz3dwowMJiVQcyD7p+9p4J6f1S81pFS7DP+jF+PTyC3c3q\/dwFhNdoG6iV9eQEAxjUi6MpzvFRsk9RsLcQqYgzJGmRjYeXlKH8k8tTu1A4puo6w3Daz8hZz9NafMgMsuqY0oKVLgdNqFz8yVMsxYfBW\/oW56SuQyyVWyxXjXmbk1vpYCTL5kXvIZWoTmBRRDb0ay5S\/dlD6z\/WR45\/C4AwcCE9m4Yf3zisRNa7AqWLVgkmJxFdfJxjiuPtUIK79s+lIJkyRENEqkvm809qIxDhkQzY8zcCt4oXCEbJUfSG4awBs1VvilJIwe6qi0bNtqXtAb5TctgxTh29A9oGlsRG4o8sHqA1mtjp5QiLWp5Hh6rOH95W6+fnBiOW+Iw0evBTduroWvx37HBTktJz79zGe0l3c0Y6VmiFvB7knmT2CrgP7woRkxGbXxdE9zMPQJM9ursD538MVDdD\/0tdkxHxilt47f1DPo2CKUWU8Q1KMm1zLXfVO8BbGUWIv4YeDKHfMUL\/HcStv5VJY+LbnOEjzGT4e1\/avSQmqBL4G9XNkYmyMhC8tlLQcmMMH4bNfPOO3vi5Pb5E7XveSgxlOHs4F0+nqxnFOAu8494MEtx6u5+B7d8LI\/DhEO5zTDwE+THiKej6vCsFxTZ519rm67HycOwRR4LKrwfDeUEK3X1PzryOD5zcv3PMcSBgZ8EWvTfZ9ygKP8BmRQRpydTbSt8Hj5fTUuajADCP0Ggw+6G7n+5FhExJNd+o9D8d4KgLPOe08M8InW7pLB389TWtSo4v3VNjcmmJNQ26wlPkhO\/xBU1URFR0fXU3eCO+w++IMt\/fOSqSpNF9bWElfWHIQ23ntxVke\/hR9j\/GG3tHGxYS5pL42sJF\/Re\/UlUJTGSQP6up2xVYs6gncQ0zACDOPjLQmQzYhz\/hr8S6EjYfK++yLZmRTjEI7xT9u\/B5YLyOQCYVTaF\/pDEegjsehXM3qJBfsA+XY7F9TRsmM\/MSVaPDkdIJ7zvL9xtaF6bXdZoZ6po3ml8uu41pSkNmMKgyEy5E0UQUTWMPLC8drUoQ\/KWQnVIN6HUXGBjYy6aax\/LYZaBcbZi97FHK0h+wsx3WN\/uQozNkQjwGYE8fwYxRYh1RaFi5PkiCM505ib7e82Yuts0l+cBb6nG1IruDplg9BD\/G9w4vVDePEikhcPyY\/p7AZ4i7u\/bL2YKlbE3HyJa+7dkbWJgGidtRZgu+Fdl2T\/rrRJ4+lVaKPVKGKT7ItZdIeitIYUdRxCzrOf1ItZCC8BWa4PElDAjj2yDNmMYRpXJBe3gQHWs\/H5SZgFuwsfCu23uzNRQYib8SuwIJQDvPiXo7m4oIySO8VyvemcExlbXSlbZbvwVxYavTVfcUpAXI6qlsg2jjk+JZahfKrWNC5COZPdVjdAXCoiKU+HBPmEFCwQv\/7zlSBEiI2piyqd+MPwnP63RdGO+oXYid6hn4Nm8kcOhtRyvYm95p66jzGlEugsfxJCED7MTh3XShqa2tt4lFG25icllzTvIJboRkz5oIB4dZVS9+q2TgGUoX7UCpobD8WkHo\/y0cpTuZr8vzXqx2fObxzPNoVgxJmp9E06G2bhMVHPpT17xbfq\/KhJJn7k1S0sfXPG+SmYlX4U7zNSe1M7JXtLf3uVOLz7Ccjp3yvcdq8nRmVym3Zwsz+vv57FA2A0dy3Db97ypJa9HGaxnnYIZHHzep0gJCeeIKE9L32zGCoUg+cPu9B2lPEgIr64iGiuvKSRwNQpOBktM6qqjQntE0Me6mh426irFQ\/3tcfH9a4lZEwwuU1X+lUBUWQp3n5Ej4BSJEs8E6H0EjBvyk69q3qjy5yi7ROVRis6y6S1v4er77RHQUf3phK5354VJHrp9pR926t5qngH5RVF4eljwtXDs3MkejADJ6stBHa\/w7FcbUClO8U+S4Bidxb3mZCiZkUVTpbzvBfYAiQvAfdkMa49o3a5DXKsbXyUPrmr6fWRfM1fS0Ehp0lUv6BDj0yR13CLMpKDU4GfDrl8UEvwh7gwtBRkuaBFzyMtd3NeE7kIGf9vFs6MEl2dmMDFSDid7MdVSDVTlhaAtp+zsRejKW3OQr5n051FzkUsIFGty9AWOkwjZCbstHYCOtyJnsnXP1i9lRDFBgPpFgmDD+bzzg0g9AOAxzqTiLF7bb1jejfe5qVr5V9+7zLpwRLiYaLkNOmpsqvNMuYVwdqTp6nyoougdgBlvve3EG0k09sFKi2Ep9lq+QkS7zGre2jJDrqgdC08+V4PXHYkP3V3Zjgn1x6RfQ2PE+2zvk1GGEgzcNww3byoYw0Ra5qS5yftMy\/2WahbA8fjUYvtmksFH8VjN3yasZt3sdQLWtv8qXxZscy+pCyjTdyxW+ddFnrWuqMIV3jbGMvngq6dL\/n5+DumjbA1gmBJVOpmyEsc1iwHDS36cNnyi1htGFO\/6\/Va4YPYK7dG6LY387UoBUU9Q9ijrBrSGpzPWYmXBLZ8e1MMPfHIN1WsaTgYO9leg3MAJTjQFTFrQ5dguYpWhlm2sWJT45jrda4uWqduB+aQLzYRWhEDBFzPV3ZgIe0SB+7h04Vm0Pu\/LDRvqaolpZ86CEm+zgjBOKeEGFwzTXxH\/5pBoca1bZ6wvsbVZxJNBeH8\/w=="
}

View file

@ -0,0 +1,38 @@
{
"version": 1,
"header": {
"slots": null,
"params": null
},
"db": {
"version": 2,
"entries": [
{
"type": "totp",
"uuid": "01234567-89ab-cdef-0123-456789abcdef",
"name": "missing-issuer@issuer",
"issuer": null,
"icon": null,
"info": {
"secret": "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",
"algo": "SHA1",
"digits": 6,
"period": 30
}
},
{
"type": "totp",
"uuid": "01234567-89ab-cdef-0123-456789abcdef",
"name": "missing-issuer@domain.com@issuer",
"issuer": null,
"icon": null,
"info": {
"secret": "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",
"algo": "SHA1",
"digits": 6,
"period": 30
}
}
]
}
}

View file

@ -0,0 +1,51 @@
{
"version": 1,
"header": {
"slots": null,
"params": null
},
"db": {
"version": 2,
"entries": [
{
"type": "totp",
"uuid": "01234567-89ab-cdef-0123-456789abcdef",
"name": "Bob",
"issuer": "Google",
"icon": null,
"info": {
"secret": "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",
"algo": "SHA1",
"digits": 6,
"period": 30
}
},
{
"type": "hotp",
"uuid": "03e572f2-8ebd-44b0-a57e-e958af74815d",
"name": "Benjamin",
"issuer": "Air Canada",
"icon": null,
"info": {
"secret": "KUVJJOM753IHTNDSZVCNKL7GII",
"algo": "SHA256",
"digits": 7,
"counter": 50
}
},
{
"type": "steam",
"uuid": "5b11ae3b-6fc3-4d46-8ca7-cf0aea7de920",
"name": "Sophia",
"issuer": "Boeing",
"icon": null,
"info": {
"secret": "JRZCL47CMXVOQMNPZR2F7J4RGI",
"algo": "SHA1",
"digits": 5,
"period": 30
}
}
]
}
}

View file

@ -0,0 +1,46 @@
{
"items": [
{
"id": "6095e880-06e0-4073-b38e-aade00f849d2",
"organizationId": null,
"folderId": null,
"type": 1,
"name": "test.com",
"notes": null,
"favorite": false,
"login": {
"uris": [
{
"match": null,
"uri": "https://test.com"
}
],
"username": "test@testmail.com",
"password": "äö^ 4234",
"totp": "otpauth://totp/test.com:source.test_test%40testmail.com?secret=S22VG5VDNIUK2YIOMPNJ2ADNM3FNZSR2&issuer=test.com"
},
"collectionIds": null
},
{
"id": "6095e880-06e0-4073-b38e-aade00f849d2",
"organizationId": null,
"folderId": null,
"type": 1,
"name": "test.com",
"notes": null,
"favorite": false,
"login": {
"uris": [
{
"match": null,
"uri": "https://test.com"
}
],
"username": "test@testmail.com",
"password": "27ß4357ß2345%",
"totp": "xkbu m5fw xxaa jqml 64qh yhi2 xdyf wjz2"
},
"collectionIds": null
}
]
}

View file

@ -0,0 +1,37 @@
{
"tokenOrder": [
"foo1",
"foo2"
],
"tokens": [
{
"algo": "SHA1",
"counter": 0,
"digits": 6,
"issuerExt": "foo1",
"label": "bar1",
"period": 30,
"secret": [
0,
0,
13,
111,
-99
],
"type": "TOTP"
},
{
"algo": "SHA1",
"issuerExt": "foo2",
"label": "bar2",
"secret": [
8,
66,
29,
111,
-99
],
"type": "TOTP"
}
]
}

View file

@ -258,13 +258,13 @@ mod tests {
}
#[test]
fn test_steam_totp() {
fn test_steam() {
assert_eq!(steam("BASE32SECRET3232", 0).ok(), Some("2TC8B".into()));
assert_eq!(steam("BASE32SECRET3232", 1).ok(), Some("YKKK4".into()));
}
#[test]
fn test_otp_format() {
fn otp_format() {
assert_eq!(format(1234, 5), "01 234");
assert_eq!(format(1234, 6), "001 234");
assert_eq!(format(123456, 6), "123 456");

View file

@ -201,7 +201,7 @@ mod tests {
};
#[test]
fn uri_decode() {
fn decode() {
let uri = OTPUri::from_str(
"otpauth://totp/Example:alice@google.com?secret=JBSWY3DPEHPK3PXP&issuer=Example",
)
@ -222,7 +222,7 @@ mod tests {
}
#[test]
fn uri_encode() {
fn encode() {
let uri = OTPUri {
algorithm: Algorithm::SHA1,
label: "account test".to_owned(),