SoC Application

(this page contains a copy of my original Summer of Code application for this project)

Jabber HTTP-Auth Suite

TOC

Hmm… (Introduction)

Do you remember your last time working on a new machine, typing thousands of passwords on every website you wanted to visit? it’s me again, I said it a moment ago…. Wouldn’t it be wonderful if you could authenticate once and then just say yes, it’s me again, I’d like to talk with you now…?

Talk…? Talking is one of the most popular ways of using the Internet. But - for some reason - you don’t need to provide your password every time you want to talk with another person. Somehow they know that it’s you. So why HTTP servers do not know? And why not to teach them how to do this?

There already exists a protocol (JEP-0070) which enables HTTP server to verify HTTP requests via XMPP. It describes how HTTP server can take advantage on strong authentication provided by XMPP and just simply associate unknown (until now) user clicking a link in browser with a well-known and “well-authenticated” XMPP user.

Vision

And now, imagine that your browser acts like an (invisible) XMPP client. Sure, it will need to know your password, but this is just one password (and it’s not same-password-everywhere solution!). In exchange for this one password, your XMPP-enabled HTTP browser could automatically confirm all your HTTP requests in background! You don’t need to send any password to HTTP server - just tell the server: yes, I’m a happy Jabber user! and everything else will happen automatically.

How? (Project modules)

Full suite consists of four components, which can be divided into groups by their location (client/server) and protocol which they use (HTTP/XMPP). Of course, it wouldn’t make much sense to write full HTTP or XMPP server, nor Internet browser just to have easier HTTP authentication. This is why the result of this project will be a set of plugins/addons/patches to already existing software. Since it is really motivating to work on something that I could really use, this solution will work with My Favorite Software™ ;)

HTTP Client

HTTP Client needs to understand requests of XMPP authorization and send appropriate information to HTTP server. This module will be implemented as Mozilla Firefox extension, written probably in JavaScript.

HTTP Server

HTTP Server sends XMPP authorization requests to HTTP client and authenticates user via XMPP server. This component will be implemented as Apache HTTP Server module(s), written probably in C.

XMPP Server

XMPP Server verifies (by exchanging stanzas with XMPP Client) if really that user made the request.Luckily, this module is planned to be a Jabber server component, and the nice thing about them is that they can be easily plugged to different Jabber server software. Language planned for this module is Python.

XMPP Client

XMPP Client confirms that the request was really made by the user. (Of course, sometimes it will have to deny to stop cruel coworkers trying to click “log in” button just before you). To make my dream come true, I’ll have to integrate this module with Firefox, either by including simple XMPP client in already mentioned extension, or reusing (a bit modified) Jabberzilla - this is still to be determined.

However, I cannot fail the trust of My Favorite Jabber Client’s developers, so I’m also planning to write a small patch for Psi, adding JEP-0070 support (C++).

Variety of languages

Someone could say that using so many different programming languages (C, C++, JavaScript and Python) in one project may only help me to fail. However, different modules of this project will run in different environments, and each of them has its preferred coding ways. Moreover, this variety will provide a better stimulation for my brain and help to overcome “I’m getting bored with this”problem - taking a look at another module will be like a journey to another exciting world.

Jobble project, which I spend much of my free time on, requires me to use JavaScript, PHP, Smarty templates and Perl at the same time and I admit that I enjoy working with this mix.

Why? (Benefits)

How the idea was born

The idea of this project came to my mind while planning how to simplify logging into Jobble site I’m working on with my friend. I remembered about JEP-0070, and happily noticed that JIDs used as user identifiers perfectly fit this protocol.

In global view

There are many popular services right now which use email address as user id. As IM becomes more and more popular and begins to successfully replace email, we may expect JID to take over the place of most suitable user identifier. This is already true for Jabber-related services, like Jabber users maps. Since JID is the only piece of information needed to perform HTTP authentication as defined in JEP-0070, transition from conventional authentication methods becomes trivial.

Why would users like this?

As already mentioned in the introduction, any way to reduce the number of passwords needed to be remembered is a blessing for a user. There are many methods to achieve this, but only solution described here has this unique combination of features:

same info everywhere
simply provide the same JID for every site: this can compete even with so widely used, so unsecure same-password-everywhere technique
same power everywhere
your XMPP account becomes a universal key, which is always with you
no passwords on the wire
there are no passwords at all
one click to authenticate
just send your JID to HTTP server (your XMPP-enabled browser will confirm your requests)

When? (Schedule)

Since the beginning of Summer of Code overlaps with end of semester on my university, I am not going to hide that first two weeks may bring a little progress. However, just after the semester is finished, the best way to forget about school will be to devote entirely to this project.

May 23 - May 24
setting up project website, repository, etc
May 25 - June 11
research
design (with more-or-less dummy prototypes)
preparing for exams at school
June 12 - June 18
Psi support
writing exams
June 19 - June 25
basic XMPP Server component
June 26 - July 2
Firefox “HTTP Client” part
July 3 - July 9
Apache module
July 10 - July 16
finishing XMPP Server component, connecting with Apache module
July 17 - July 30
Firefox “XMPP Client” part, merging with “HTTP Client” part
July 31 - August 6
time slot reserved for unexpected time-consuming problems
August 7 - August 20
final testing, finishing documentation, packaging
August 21
end of project

Who? (About me)

I’m a 4th year student of Warsaw University of Technology, Faculty of Electronics and Information Technology.

I became interested in Jabber about 3 years ago and I was instantly hit by it’s flexibility and extensibility. Open and powerful protocol enabled anyone to create (unseen, or - at least - not so popular in other networks) useful bots and agents, providing access to dictionaries, weather info, etc, etc. Jabber is more than IM - I thought.

Soon after I started using Jabber, I became interested in modifying Psi client (which is one of the most popular in Poland, both among users and programmers wishing to modify something). I published about 20 - smaller or bigger - patches since then. Then came summer of 2004, and I set myself two targets: learn Python and write a Jabber bot. Soon I noticed that the best idea is to do both at once: this is how Suuga - my math bot - was born. Summer seems to be the most productive development time for me: in summer 2005 I started working on Jobble Jabber Users Map, together with my friend. This project is still being actively developed, and working on it pushed me towards Jabber HTTP-Auth.