KeeFox technical introduction

This article will give an overview of the requirements and technologies used at this early stage of KeeFox development.

System requirements

  • KeePass 2
  • .NET 2
  • Firefox 3
  • Windows XP

All above could potentially be expanded in the future but this will depend on available time and demand (e.g. will anyone even be using Firefox 2 by the time the version for Firefox 3 is stable?). I’m particularly keen to get KeeFox working on Linux and Mac systems but until KeePass 2 is stable on those platforms or we can find a way to make KeePass version 1 play along, it won’t really be that practical – all offers of help are gratefully received.

Key technologies used

  • C#
  • C++
  • ICE
  • Javascript
  • XUL

Rough chain of events for an “average” use case

  1. XUL interface elements in firefox manipulated by user
  2. javascript event handlers call appropriate XPCOM functions in the C++ firefox add-on DLL
  3. which in turn calls proxy methods on shared data objects (defined in ICE’s IDL language)
  4. ICE DLL processes the function calls, does its magic and ends up calling the real methods (implemented in C#)
  5. these functions manipulate the active KP plugin instance (to read/write, prompt user for master password, etc.)

Background to KeeFox implementation technologies

If anyone has ever done anything like this before, they’ve either not put it online or managed to keep it beyond the eye of Google so I hope that as the project progresses I can expand on some of the technical challenges for the sake of anyone else that wants/needs to implement other software that uses these technologies. To start with, your best bet is to take a look at the source code which I will be posting online soon (e-mail me if you’re in a hurry) because the key issues have been largely solved in there already and it’s now “just” a matter of fleshing out all the detail (which would be mostly irrelevant to a different project anyway). Keep an eye out here for any new content I tag with keywords you’re interested in. RSS is your friend (although not your best friend – I’ve currently got no way to subscribe to individual tag updates).

I also toyed with .NET IPC channels and a mixture of managed and unmanaged C++ code in a rather complex configuration before settling on using ICE for the IPC. Part of the problem with the first approach was that Firefox won’t play along with any DLLs that make calls into the managed .NET application space. This meant I had to write a couple of extra layers and play with some rather complex managed/unmaged C++ wrappers in order to make it all work. I had it working for a while but the development (and performance?) overhead of multiple Marshalling steps was just too big so I scrapped that idea and went looking for some third party library to help (ICE).