Making KeePass Play Nice-nice with Ubuntu, Mono, and FTP

KeePass is a free and utterly genius password management tool that has allowed me to leave the days of reusing passwords way in the past. Now all of my passwords are different, securely managed, and look something like “út8¥Äbë¬eqö«ûëU^Èm­¯”. (Go ahead — try to guess it!) It was written in Microsoft .Net, and supposedly works just fine under Mono in Linux. Mono is a .Net compatibility layer and it’s already included in Ubuntu installations. Well, most of it is.

The problem is that it didn’t quite work out of the box on our Ubuntu 10.10 machine. In particular, I wasn’t able to connect to my password database via FTP like I usually do, but I solved a couple other common problems along the way as well.

First, download the portable version KeePass from the site’s download page, and move all the files onto your linux box. I put them in my home directory under a new hidden directory called “.KeePass”. The first thing I did was add an application launcher to Ubuntu’s top panel, and lo and behold it would not launch.In console, I saw this error message:

The assembly mscorlib.dll was not found or could not be loaded. It should have been installed in the `/usr/lib/mono/1.0/mscorlib.dll’ directory.

The problem was simple; there was a typo in the path. So be sure to type the path carefully, like this: “mono /home/myname/.KeePass/KeePass.exe”. When Mono can’t find the file, it decides it wants to try to run an older version of itself, and that older version it’s included in Ubuntu by default.

Next there were a couple of errors that I wouldn’t have gotten if I had read the instructions carefully. They were both the standard “assembly not found” errors with the text “The following assembly referenced from /home/myname/.KeePass/KeePass.exe could not be loaded” and “The assembly was not found in the Global Assembly Cache, a path listed in the MONO_PATH environment variable, or in the location of the executing assembly.” The first referred to “System.Windows.Forms” and the next to “System.Runtime.Remoting”.

These assemblies were simply not installed in Ubuntu 10.10 by default, but they’re available in the Ubuntu Software Center. Here’s what they look like when you’re adding them.

Adding Mono System.Windows.Forms Support
Adding Mono System.Windows.Forms Support

Sorry about the overlaid screen shot window in this one, but you can still see how to filter and what to click.

Adding Mono System.Runtime Support
Adding Mono System.Runtime Support

Finally it would run, but I was still unable to from open the database from the URL of the FTP site. When I tried either by opening it directly or tweaking the config file, I got a polite error from KeePass that said, “The requested feature is not implemented.” I recognize this as a System.NotImplementedException that’s trapped (but probably not expected) in the code. What it probably means is that KeePass uses some features of .Net that are not yet implemented in Mono; it’s not KeePass’s fault.

I saw two ways around this error: First I could mount the FTP site to a local path using curlftpfs, but that would mean installing something new. Instead I wrote a short shell script to download the database, launch KeePass, and then upload the database back to the FTP site. Here’s the content of the script:

  Server="ftp://my_ftp_site.com"
  User="my_ftp_username"
  Password="my_password"
  DBFile="database.kdbx"
  LocalPath="$HOME/.KeePass/"

  lftp -u $User,$Password $Server <<EOF
    set ftp:ssl-allow no
    get $DBFile -o $LocalPath$DBFile
  quit
  EOF

  mono ${LocalPath}KeePass.exe

  lftp -u $User,$Password $Server <<EOF
    set ftp:ssl-allow no
    put $LocalPath/$DBFile
  quit
  EOF

Finally, I made the script executable, remapped the launcher to the script, picked a better icon, and I was in business again. I hope someone else out there finds this helpful. I know I will the next time I forget what I did. 🙂

6 Comments

  1. Thanks for the script, I had the same irritating problem with mono not supporting url handlers or something like that.

    It works, but probably like we would have wanted to see that it could load the file directly from the ftp site. Don’t like putting passwords like that in scripts, even if its on a local computer.

    • I actually set up an FTP account with a quota just for KeePass, so the FTP security isn’t as big of a deal for me, so long as the database security is solid. But the bigger annoyance for me is that the file is downloaded and uploaded every time, regardless of whether or not it’s necessary. I suppose the script could compare file attributes… Maybe I’ll try that out later.

Leave a Reply to AlanCancel Reply

Your email address will not be published. Required fields are marked *