mirror of
https://github.com/idanoo/psono-to-bitwarden-converter.git
synced 2024-12-04 14:23:09 +00:00
Initial Commit
This commit is contained in:
parent
06bc75b454
commit
dbf8436e21
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
.vscode
|
||||||
|
export.json
|
||||||
|
export.csv
|
@ -1,3 +1,8 @@
|
|||||||
# psono-json-to-bitwarden-csv
|
# psono-json-to-bitwarden-csv
|
||||||
|
|
||||||
Script to convert psono exports (JSON) to bitwarden import compatible CSV
|
Script to convert psono exports (JSON) to bitwarden import compatible CSV
|
||||||
|
|
||||||
|
usage:
|
||||||
|
convert.php export.json
|
||||||
|
|
||||||
|
This will export a file called export.csv that you can import into Bitwarden as a generic CSV.
|
81
convert.php
Normal file
81
convert.php
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
if (!isset($argv[1])) {
|
||||||
|
echo 'Usage: php convert.php <psono-json-file.json>' . PHP_EOL;
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Recursively get all items into a single array.
|
||||||
|
*
|
||||||
|
* @param array $data - parent data
|
||||||
|
* @param array $items - List of items
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
function recursivelyGetItems(array $data, array &$items = []): array
|
||||||
|
{
|
||||||
|
if (array_key_exists('items', $data)) {
|
||||||
|
$items = array_merge($items, $data['items']);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If sub folder.. call again!
|
||||||
|
if (array_key_exists('folders', $data)) {
|
||||||
|
foreach ($data['folders'] as $folder) {
|
||||||
|
if (array_key_exists('items', $folder)) {
|
||||||
|
foreach ($folder['items'] as $subItem) {
|
||||||
|
$items[] = array_merge(['folder' => $folder['name']], $subItem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $items;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Open source JSON and decode into array
|
||||||
|
$rawData = file_get_contents($argv[1]);
|
||||||
|
$data = json_decode($rawData, true);
|
||||||
|
unset($rawData);
|
||||||
|
if (!is_array($data)) {
|
||||||
|
echo 'Error decoding JSON.' . PHP_EOL;
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
$bitwardenHeaders = [
|
||||||
|
'folder',
|
||||||
|
'favorite',
|
||||||
|
'type',
|
||||||
|
'name',
|
||||||
|
'notes',
|
||||||
|
'fields',
|
||||||
|
'login_uri',
|
||||||
|
'login_username',
|
||||||
|
'login_password',
|
||||||
|
'login_totp'
|
||||||
|
];
|
||||||
|
|
||||||
|
// Open new file for writing
|
||||||
|
$fp = fopen('export.csv', 'w');
|
||||||
|
fputcsv($fp, $bitwardenHeaders);
|
||||||
|
|
||||||
|
// Get items from nested JSON array
|
||||||
|
$items = recursivelyGetItems($data);
|
||||||
|
|
||||||
|
foreach ($items as $item) {
|
||||||
|
$mapper = [
|
||||||
|
$item['folder'] ?? '',
|
||||||
|
'',
|
||||||
|
'login',
|
||||||
|
$item['name'],
|
||||||
|
($item['note_notes'] ?? ($item['website_password_notes'] ?? '')),
|
||||||
|
'',
|
||||||
|
$item['website_password_url'] ?? '',
|
||||||
|
$item['website_password_username'] ?? '',
|
||||||
|
$item['login_password_password'] ?? '',
|
||||||
|
''
|
||||||
|
];
|
||||||
|
|
||||||
|
fputcsv($fp, $mapper);
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose($fp);
|
Loading…
Reference in New Issue
Block a user