Conversion Issue from Keeper to 1Password - Shared Folders Don't get converted to tags

gholcomb
gholcomb
Community Member

@MrC I was checking the data as you suggested and found that shared folders do not get
converted to tags like normal folders do.

I've put a screenshot of what the JSON file looks like for a shared folder.


1Password Version: Not Provided
Extension Version: Not Provided
OS Version: Not Provided
Browser: Not Provided

Comments

  • MrC
    MrC
    Volunteer Moderator

    @gholcomb

    I'll take a look at this in the morning and get back to you. Thanks for reporting this.

  • MrC
    MrC
    Volunteer Moderator
    edited December 15

    @gholcomb

    I've reviewed my test export files and find that some records have a shared_folder attribute, but its value is "1". They look like this:

          "folders": [
            {
              "shared_folder": "1",
              "can_edit": "1",
              "can_share": "1",
              "folder": "A Shared Folder"
            },
            {
              "shared_folder": "1",
              "can_edit": "1",
              "can_share": "1",
              "folder": "B Shared Folder"
            }
          ]
    

    Notice these also have a folder attribute, which is the folder name. It appears your data's shared_folder attribute (and perhaps the new export format) contains the actual folder name now, but there is no folder attribute. Can you confirm this is the case?

    Also, there is a top level shared_folders list, which for me with my free accounts is always empty:

      "shared_folders": [],
    

    Is your list empty too? If not, what does it look like?

  • gholcomb
    gholcomb
    Community Member

    This is the top of the JSON, I have 3 shared folders.

    {
      "shared_folders": [
        {
          "uid": "LxuHiRnyTMkkPt1Za-sn9g",
          "path": "MMIT Share Items",
          "manage_users": false,
          "manage_records": false,
          "can_edit": false,
          "can_share": false,
          "permissions": [
            {
              "name": "gholcomb@domain.com",
              "manage_users": true,
              "manage_records": true
            },
            {
              "name": "glenn@domain.com",
              "manage_users": false,
              "manage_records": false
            },
            {
              "uid": "GwyFvvzCHm7TNWyBYwMvIQ",
              "name": "Sales",
              "manage_users": false,
              "manage_records": false
            }
          ]
        },
        {
          "uid": "mPmEabnykaZMOmiHwzMXYw",
          "path": "TEST Shared Folder 1",
          "manage_users": false,
          "manage_records": false,
          "can_edit": false,
          "can_share": false,
          "permissions": [
            {
              "name": "gholcomb@domain.com",
              "manage_users": true,
              "manage_records": true
            }
          ]
        },
        {
          "uid": "q93G76MSaFQtMQkD8S1Kqg",
          "path": "TEST Shared Folder 2",
          "manage_users": false,
          "manage_records": true,
          "can_edit": true,
          "can_share": false,
          "permissions": [
            {
              "name": "gholcomb@domain.com",
              "manage_users": true,
              "manage_records": true
            }
          ]
        }
      ],
    
  • MrC
    MrC
    Volunteer Moderator
    edited December 15

    @gholcomb

    Oh, that's good data. Odd that their folder attribute only refers to a folder by name (vs. uid).

    If there no data you need from the shared_folders list, I'll just add the value of the folder attribute as a tag. Is that sufficient?

    If so, I've posted an updated version in Custom for you.

  • gholcomb
    gholcomb
    Community Member

    Folder name as tag would be great. That way after the import into 1Password I'd just move anything with that tag into a new shared vault.

  • MrC
    MrC
    Volunteer Moderator

    @gholcomb

    I had already posted in advance of your reply. Grab the updated Keeper.pm from Custom and re-run your conversion.

  • gholcomb
    gholcomb
    Community Member

    @MrC
    That worked great, thanks for the quick update.

  • MrC
    MrC
    Volunteer Moderator

    @gholcomb

    You're welcome.

    I'll update the converter release perhaps tomorrow, assuming you don't find any more gremlins!

  • gholcomb
    gholcomb
    Community Member

    This is what is at the top of the JSON file, I do have these 3 shared folders in my Keeper Vault

      "shared_folders": [
        {
          "uid": "uid",
          "path": "MMIT Share Items",
          "manage_users": false,
          "manage_records": false,
          "can_edit": false,
          "can_share": false,
          "permissions": [
            {
              "name": "gholcomb@domain.com",
              "manage_users": true,
              "manage_records": true
            },
            {
              "name": "glenn@domain.com",
              "manage_users": false,
              "manage_records": false
            },
            {
              "uid": "uid",
              "name": "Sales",
              "manage_users": false,
              "manage_records": false
            }
          ]
        },
        {
          "uid": "uid",
          "path": "TEST Shared Folder 1",
          "manage_users": false,
          "manage_records": false,
          "can_edit": false,
          "can_share": false,
          "permissions": [
            {
              "name": "gholcomb@domain.com",
              "manage_users": true,
              "manage_records": true
            }
          ]
        },
        {
          "uid": "uid",
          "path": "TEST Shared Folder 2",
          "manage_users": false,
          "manage_records": true,
          "can_edit": true,
          "can_share": false,
          "permissions": [
            {
              "name": "gholcomb@domain.com",
              "manage_users": true,
              "manage_records": true
            }
          ]
        }
      ],
    

    Then the entries in those folders look like this.

     {
          "uid": 918,
          "title": "Test Login 1",
          "$type": "login",
          "login": "test@test.com",
          "password": "password",
          "login_url": "https://www.dummysite.com",
          "folders": [
            {
              "shared_folder": "TEST Shared Folder 1",
              "can_edit": false,
              "can_share": false
            }
          ]
        },
        {
          "uid": 919,
          "title": "Test Login 2",
          "$type": "login",
          "login": "test@test.com",
          "password": "password",
          "login_url": "https://www.dummysite.com",
          "folders": [
            {
              "shared_folder": "TEST Shared Folder 2",
              "can_edit": true,
              "can_share": false
            }
          ]
        },
    
  • MrC
    MrC
    Volunteer Moderator

    @gholcomb

    So it seems like we have the important data. The shared_folders section is just Keeper's folder metadata so that you could import the data into a fresh vault.

  • gholcomb
    gholcomb
    Community Member

    @MrC So in a perfect world, the converter would make a separate vault for each shared folder, that would streamline the process. When creating the export the default is only the folders that user has shared out, not ones that have been shared by them.

  • MrC
    MrC
    Volunteer Moderator

    @gholcomb

    I get it.

    There are several reasons why the perfect world isn't here yet.

    • Creating a single vault was a design decision I made when I created the 1PUX generator. It is (correctly) painful to remove vaults (yet obviously this is something I frequently). Imagine a generator creating a dozen vaults, and then having to manually delete each one:

      • right click the correct vault
      • select Delete Vault...
      • type in the vault name to the confirmation dialog
      • press OK
      • select the next vault
      • rinse, lather, repeat
    • The 1Password 1PUX importer has no user-facing diagnostics, and it is very finicky. It was a lot of reverse engineering to be able to reliably generate importable 1PUX files. When things go wrong, the importer just aborts. So I quit while I was ahead.

    • I didn't want to pollute a user's list of vaults (I realize most converter users would have none).

    • It is much harder to review, edit, purge imported content in multiple vaults (and that's rather important, as you've discovered; and it's critical for me as I review conversions). Its easy to rifle through a list of items (at least for me).

    • I thought it prudent not to muscle-memory train users to delete vaults.

    • I don't have access to the more feature-rich business or memberships of other password managers, and without my ability to construct comprehensive export data, I'd be programming blind. The keeper converter is just one examle (you're the first person to provide me with the format of the shared_folders list and inform me about the "shared_folder" attribute in a record).

    All that said, the converter framework can create multiple 1PUX (or 1PIF) files; the onepux and onepif converters do this with the ```--percategory option. I suppose for the keeper converter, there could be an similar per-shared-folder option to do likewise, one 1PUX per shared folder, and I suppose one more for any items not in a shared folder. That could end up being a lot of 1PUX!

  • gholcomb
    gholcomb
    Community Member

    @MrC I understand completely and what you've provided and tweaked works perfectly for my use case. I'm moving my clients from Keeper over to 1Password, but all my clients are smaller and generally only have a single shared folder. As you were helping me I was talking to a number of other MSPs making the same move from Keeper to 1Password, but they have a few larger installations, with more shared folders.

    My opinion is what you've provided works and saves a ton of time vs. importing CSV files and massaging the data ourselves.

    So thanks again for the great tool and those tweaks to make it even better.

  • MrC
    MrC
    Volunteer Moderator

    @gholcomb

    If you have a lot of shared_folders and need separation like this, and are willing to test out the work, I can look tomorrow into adding this option. When there is someone like yourself sufficiently motivated and has the technical background, its much easier to me to fly without a net.

  • gholcomb
    gholcomb
    Community Member

    @MrC
    Let me check with the other MSPs to see if this would be helpful to them before you commit time to this. If its useful I'm happy to help to make it better for everyone.

  • gholcomb
    gholcomb
    Community Member

    @MrC
    The consensus was this would be useful as an option. Let me know what you need from me.

  • MrC
    MrC
    Volunteer Moderator

    @gholcomb

    1PUX file per shared_folder, each containing one vault ?

    Or do you need 1PUX file with multiple vaults, one per shared_folder ?

    I believe the first option should be simpler to implement, the second might take some time. I'll investigate based upon your reply.

  • gholcomb
    gholcomb
    Community Member

    I would go with which ever one is easier to implement.

  • MrC
    MrC
    Volunteer Moderator

    @gholcomb

    I've implemented the changes, and just pushed a development version (in the folder: mrc-converter-suite - development version).

    The new option is --persharedfolder (keeper only currently).

    Compare the two runs below. The shared folder name I used for two records in my test data is "Shared 1".

    The shared folder name is added to the --outfile vault name (default "M_C_S'). Records not tagged as belonging to a shared folder are added to the non-suffixed output file.

  • gholcomb
    gholcomb
    Community Member

    @MrC
    Just tried it and worked like a champ. Thank you.

  • MrC
    MrC
    Volunteer Moderator

    Great, thanks for the confirmation and your guidance, @gholcomb .