My week @ Javapolis

Atlassian stall at Javapolis What a week! Javapolis was my first "real" conference and it was certainly an experience. Four days, 3300 attendees and 250 Atlassian t-shirts given away. The days were long and usually started with us setting up around 8 in the morning and on a few nights, we were still giving demos at 8 at night! We were armed with two gorgeous 30 inch Apple Cinema Displays which was coveted by all and sundry.

The week started ominously with Matt sending his bag (and laptop and presentation) for a relaxing trip to Amsterdam while he was running chasing James Gosling out of the train. Mike & Co. then decided to drive half way to Rotterdam, rather than taking the direct route to the Javapolis hall 10 minutes away.

Towards the tail end of the first day, I gave a presentation on Bamboo. I thought it was going to be in a small room with a projector (it's only a university day right?), so was a little shocked when I rocked into a giant full size THX cinema with two massive screens, one camera on me, the other on my slides, lights blaring into my eyes. After getting over the initial rabbits in the headlights feeling, I managed to get through the talk to a hundred or so people unscathed (apart from some photos of me looking a little stunned). Matt then give a talk on Crucible directly afterwards but I missed it due to a spying mission on the competition.

The rest of the week was spent doing demos, demos and more demos. We were swamped every single break between sessions, with all laptops firing away. Even during the sessions we generally had one or two demos going.

Most people (~80%) I talked to had JIRA or at least have dealt with JIRA and wanted to know more about our other products. The most interest seems to be with Bamboo and FishEye. For people doing code reviews / doing some remote development, they were dead keen on Crucible. The vast majority of people who were using Continuous Integration mainly used CruiseControl, (which is no real surprise) and were keen to check out what's out there.

The work on JIRA Studio and all the plugins for JIRA was a definite hit. When people saw that you could see commits, builds and reviews for a particular issue that were pretty excited. It also gave us a pretty natural flow when demoing, I normally started with Bamboo (naturally) and clicked through to our FishEye links, which then leads to Crucible, which then links to a JIRA issue that can come back to a Bamboo build. We also had a Clover 2 report setup so you can view it through Bamboo.

Interestingly, I didn't get a lot of people asking for a Confluence demo. Mike mentioned that it's not really the right conference for it and that people here were more interested in development tools.

The posse drinking Atlassian Beers!For Bamboo, people were keen to see tighter Maven 2 integration. Bootstrapping a project / plan from the pom is a big boon for people using Continuum. People were pretty impressed about what's there but improving the JIRA integration is something that we will definitely work on post 2.0.

I tried to collect business cards and write notes on them so I can follow up with them after the conference. This was pretty tricky to do during the busy times and I collected a few cards where I had NFI what I was talking to them about I ended up following up on around 30 odd people, so hopefully they found that fairly useful.

We were pretty chockers all week so I didn't get to many sessions. We did get to the Java Posse session give out some good ol' Atlassian beers (well it was Belgian beers with Atlassian stickers on it)! After the stalls closed on Thursday, Mike & the good folks at Google put some cash behind the bar. It was a big night after a solid week and everyone had a top time (as much as I can remember of it). Somewhat frightening photos can be found thanks to Dan Hardiker of Adaptavist.

Overall it was a great fun talking to lots of people who were really excited about Atlassian as well as getting personal feedback on our products. Thanks to all the folks who came along and said hi!

  • Comments Off

Trusted communication between JIRA and Confluence

As part of the upcoming 3.12 release of JIRA and 2.7 release of Confluence, a neat little feature will be added that allows the two applications to communicate in a trusted way, such that it is possible for Confluence to request information from JIRA on behalf of the currently logged-in user, but without having to re-authenticate the user on the JIRA end. Sounds intriguing? Read on!

The Problem

Confluence has a nifty macro called the JIRA Issues Macro that allows users to embed issues into a page straight from JIRA. While the macro works well, it is not entirely secure as you have to store JIRA user credentials right there in the macro. The reasons we require the user credentials are clear. Firstly, your JIRA instance might not be public, and enabling an anonymous account to access your issues is not an option. Secondly, you might have security restrictions on your issues, and so you don't want to allow someone to leak issue data from your "Top Secret" project by using the JIRA Issues Macro.

The Solution

(click for more...)

In order to satisfy these requirements, but keep our credentials safe, we decided to "look up" to establishing trust on the application level, and in doing so, we get trust on the user level for free (or close to it). Our functional requirement now becomes: "If I (JIRA) can trust that you (Confluence) are who you say you are, then I'll authenticate the user you give me without their password". The benefit of taking this approach is that trust only has to be established once between the two applications, and must be approved by a JIRA system administrator. Once trust has been established, it is entirely transparent to the users of Confluence - they no longer have to provide their credentials to the macro, as we simply send the user name of the currently logged in user.

The Implementation

The problem of application trust is not a new one, and there are several established protocols which help solve these problems. When designing our solution, we examined a few of these protocols to see if we could simply implement them, or at least borrow ideas from them.

OpenID was one of the protocols examined. In a nutshell, OpenID is about sharing identities in a decentralised fashion, so that users can just refer an application to a single existing identity rather than having to manage an identity per application.

While OpenID is cool and helps us generally with the problem of identity management between Confluence and JIRA, it unfortunately doesn't give us any benefit when trying to conduct trusted communications between the two applications, as it is a identity/user-centric solution, not an application-centric one. It would also introduce additional dependencies on OpenID servers, which is something we can't assume when devising a solution for the general user base.

OAuth is a younger protocol which was designed to grant consumer applications access to a user's protected resources held by a service provider, without having to give away the user's service provider credentials to the consumer application. This is achieved by redirecting the user between the applications and requiring them to authenticate themselves on both ends. Once authentication has been set up, the applications communicate with a shared token that encapsulates all the details of the request for resources.

At first glance, this protocol looks like a pretty good fit for our problem:

  • consumer application == Confluence
  • service provider == JIRA
  • protected resources == issues.

OAuth also does not require any additional infrastructure to work; the applications simply talk to each other, periodically requiring some user input. This however highlights one of the downsides of the protocol for our situation. It is very well suited to one-time requests for protected resources, where you want user supervision of the authentication for peace of mind. But in the context of Confluence and the JIRA issues macro, you wouldn't want the user to be redirected to JIRA to authenticate themselves every time they viewed a Confluence page that contained the JIRA issues macro.

One way to counter this is to again "look up", and treat the entire consumer application as a single user, so that the one-time request for resources sets up the trust between Confluence and JIRA indefinitely, and then all requests made by the JIRA issues macro will just include the currently logged in user. This could work, but the effort required to make OAuth work didn't seem worth it when we could roll our own solution. There was also a problem that, at the time when we were discussing implementation details, no Java libraries for OAuth were available to utilise (but this appears to have been remedied).

Details of the Trusted Applications Authentication (TAA) protocol

So after checking out what was already on offer and not finding anything suitable, we decided to roll our own protocol. In order to minimise engineering effort, it's design is fairly straight forward:

Setting up trust between JIRA and Confluence

  1. JIRA sysadmin requests a trusted application authentication certificate from a Confluence instance by providing the base URL of the instance. The certificate contains Confluence's Trusted Application ID and Public Key (generated specifically for use with the TAA protocol).
  2. JIRA validates the certificate and asks the sysadmin for a few extra details about the trust relationship, such as Name, Timeout, Allowed IP Addresses and Allowed Request URLs.
  3. JIRA stores all this information in the database.

Making a trusted request from Confluence to JIRA

  1. Confluence sends a web request to JIRA, appending additional headers to the request, including:
    • Timestamp (nonce) of the request + user name of the currently logged in Confluence user, encrypted with a symmetric key (generated on the fly)
    • The symmetric key, encrypted with Confluence's private key
    • Confluence's application id (as stated when trusted was established)
  2. JIRA attempts to decode the encrypted headers, using the stored information about the relationship. A couple of checks are conducted to validate the request:
    • The trusted application id refers to a valid trusted application
    • The user name specified exists in the JIRA user base
    • The agreed timeout length has not expired
    • The request originated from a trusted IP address
    • The resource being requested matches those specified in the URL Match list
  3. If any of these checks fail, a response is sent to Confluence, indicating the reason for failure. Otherwise, JIRA will authenticate the specified user for the duration of the single request, and respond with the resources (i.e. the JIRA issues)

Limitations and Risks

As the protocol has a simple design, there are inherent limitations and risks to be considered. Firstly, this protocol can only work if the Confluence and JIRA user bases are the same. Because Confluence automatically appends the currently logged in user to the request header, JIRA will always return an error for that request if the same user does not exist in JIRA. There is also a more subtle issue whereby the user does exist in JIRA, but they do not have the correct level of permissions that you would expect (and hence do not get the correct set of issues returned by the macro). Of course, if you are using a single user base solution, such as Crowd, you wouldn't have this problem.

Secondly, the protocol is not immune to certain security attacks such as man-in-the-middle and replay attacks, though it is considerably hard to pull these off successfully. For the man-in-the-middle scenario, the attacker needs to be present during the trust relationship establishment, so that their public key is registered with JIRA instead of the intended client's. But since the JIRA sysadmin manually enters in the base URL of the client application, this means that the attacker needs to have poisoned the JIRA instance's DNS so that the domain specified (e.g. confluence.atlassian.com) points to the attacker's domain (evilconfluence.attacker.com). If this is the case, then I'm afraid you have slightly more pressing concerns than unauthorised access to your JIRA instance. To successfully pull off a replay attack, the attacker would have to be able to spoof the original client's IP address, and they would also have to be able to forward their spoofed requests before the timeout window on requests closes. Security risks such as these will not likely be an issue for most Confluence and JIRA customers however, as we expect the common scenario to be that both instances are running inside a trusted network.

"Trust no one unless you have eaten much salt with him" — Cicero

Finally, remember that the protocol is all about trusted relationships. I'm sure if Cicero was still around today (probably died of heart failure from eating too much salt), he would tell you that while this feature will allow you to do some cool things between Confluence and JIRA, as a JIRA admin, it's your responsibility to ensure that you really can trust the Confluence instance you're talking to.

  • Comments Off

Developing JIRA Studio Part 1

For the last few months, we've been hard at work creating the newest member of the Atlassian family, JIRA Studio. Since this product is targeted squarely at developers, we decided it would be useful to engage the developer community to talk about what we are working on, both the good and the bad.

board.jpg

Our team uses a modified XP process that splits work into one or two week iterations, recording tasks using both JIRA and the more traditional note cards. In this last iteration, numbered 114, our primary focus was to create a "FireBall"&#153 (our product manager makes us call it that), which is basically a tarball containing:

  • Confluence, JIRA, Fisheye/Crucible, and Crowd WARs
  • Tokenized backups of each application.
  • An installation script that reads a properties file and modifies the backups for the specific instance to be installed (changing the hostname, mail server, etc)
  • README.txt detailing the steps to install the FireBall&#153

Our plan is to deliver this FireBall&#153 to Contegix, our hosting provider, for every new version. The system that creates this FireBall&#153 is our integration test system, since it needs to deploy the whole JIRA Studio set of applications and run our integration tests against it. Granted, we use different backups for the tests, but the process is fundamentally the same. This means that every time Bamboo runs our integration tests, usually after every commit, we not only get a full integration testing of JIRA Studio, but create the deployable FireBall&#153. Using the same system for release artifacts and testing helps ensure our release process is maintained and regularly exercised.

Speaking of functional tests, in Iteration 114, we went on a testing spree, writing heaps of tests for our project creation feature. In JIRA Studio, when you create a JIRA project, we create a:

  • Confluence space with the same key and name
  • Subversion directory tree (trunk/tags/branches)
  • Fisheye repository for the new Subversion directory
  • Crucible project with the same key

Obviously, there is a lot that can go wrong here, so we spent a week writing function tests to cover all the error conditions we could think of. Writing functional tests that cover so many products is tricky (and the performance of Maven 2 doesn't help), but the benefit far outweighs the cost.

Screenshot_1.png

Finally, another core feature of JIRA Studio is the navigation bar that sits above each application. The static images and Javascript currently comes from a directory, served by Apache, mounted at "/static". To remove that step from installation, we wanted to bundle the static resources into each application. JIRA and Confluence have a plugin type called a "web resource", that allows you to define static resources to be made available to the page. It exposes the resource using a special unique URI that enables the use of the HTTP caching headers that encourage the browser to cache the resource for a year. This dramatically speeds up the application for the user.

Anyways, we moved the static resources into a new plugin that can run unmodified on JIRA and Confluence, which just leaves Fisheye. The latest release of Fisheye/Crucible supports plugins, but didn't have that plugin type available. Taking advantage of the Fisheye/Crucible guys a few desks down, we bribed them to add the web resource plugin type, so we now have a plugin that can run on JIRA, Confluence, and Fisheye/Crucible, simplifying our deployment and speeding up JIRA Studio in the process.

Well, that's enough for now. I hope to keep the blog updated with our progress, and of course, feel free to let us know what you'd like to see in JIRA Studio by commenting to this post or emailing our feedback address: studio-feedback@atlassian.com.

  • Comments Off

The first thing you do when you get a new Mac is…

ubuntuapplelogo.png
...to install Ubuntu on it! Well, not true actually, but I thought it would still make a good title for a blog ;). The standard machine upgrade at Atlassian these days seems to be a shiny new MacPro. They're some of the sexiest machines I've had the pleasure to develop on. 4 cores and 4GB of memory really don't bog down all that often.

There was one problem however: OS X. Now don't get me wrong. I think OS X is a beautiful operating system, and in my opinion it is probably the best operating system out there (Note: I'm not trying to start a flame war here. This is entirely my opinion). However, I've been using Ubuntu (and Windows previously) for a long time now to develop software. As such I found the key-bindings on the mac quite painful and there were various other aspects of the Mac, that made me feel I wasn't being as efficient as I could be.

A few people had installed Ubuntu on their Mac's before me and didn't seem to have any problems with it, so I thought I'd give it a go.

Requirements

  • Bootcamp
  • rEFIt
  • Bootable Ubuntu CD

Installation

I'd been using my Mac for about 2 months and had quite a bit of information (sources, firefox & thunderbird profiles...) that I needed to move over to Linux if this was meant to be successful. The first step was to free up some disk space. Somehow I managed to consume about 150 Gb of hard disk space which I managed to cut down to about 30 Gb. The next step was to install Bootcamp in order to resize my OS X partition to create some space for Ubuntu. This was surprisingly easy to do, except for the fact that it failed a couple of times with an error that 'Some files could not be moved'. After shutting down all applications and a restart everything worked fine though. I split my disk into 70 Gb for OS X and 170 Gb for Ubuntu.

Once the partitioning was done I installed rEFIt, a nice little bootloader that allows you to select different operating systems on startup. Once this was done, I inserted the Ubuntu CD restarted and selected to boot from the CD with rEFIt. I decided to start the installer in safe-mode, as I'd heard of some display issues with running the installation in normal mode. The remaining part was simply a standard Ubuntu installation and upgrade. I decided to keep my home directory on a separate partition from the main Linux installation. This turned out useful later. Once everything was installed, I could access my Mac partition in read-only mode from Ubuntu and copy all my files over. Firefox and Thunderbird were especially easy, as all you have to do is start them up with the --ProfileManager option and map a profile to your old profile directory. The next time Firefox/Thunderbird startup they will have remembered all your settings and plugins (Firefox even started with the same tabs open that I closed it with in OSX the last time!).

Result

I've been running Ubuntu without problems for a couple of months now. I can still boot into OSX should something go horribly wrong with my Linux installation. The total time taken for this little endeavour was surprisingly little. I spent about 2 hours without any major hassles or problems running through the entire installation. Sound works too.

I recently installed a 64bit version of ubuntu to take advantage of the full 4Gb of memory. I didn't do this originally, because a couple of people mentioned a lot of problems with 64bit ubuntu. Because I had my home directory on a second partition, this upgrade was really simple. I simply deleted the partition with the 32 bit installation, and when ubuntu started up, it picked up my home directory right away. I've since not had any problems whatsoever with the 64bit version.

Feedback

Now, of course an OS change as radical as this attracted some interesting comments from our local population of MacHeads (the Confluence team):

Jens Schumacher:

Blasphemy!!!

Matt Quail:
The easiest way to solve the driver problem is to shut down the Mac, insert OS X disk one (it came with the Mac) and reboot while holding down the C key.

James Dumay:
Enjoy your key bindings and bastardised UNIX.

Steve Smith (our Sys-Admin):
Are you sure I can't convince you over to the sysadmin side? It seems a shame to let such talent go to waste.

I advise backing away slowly; Mac-heads get scary.

  • Comments Off

An Insiders Look: Part 1 of 2 on how we (Atlassian) collaborate

Before working at Atlassian, I had worked at a 60-person company with offices in Boston and San Francisco. Communication was terrible. Talk about being dysfunctional! (1) People on both coasts had no idea what the others were doing. (2) Email was a terrible way to collaborate on anything, but it's what we relied on. That, and "Track Changes" in Word.

Those communication challenges pale in comparison with the challenge of working in a global company like Atlassian. Our offices are in Sydney and San Francisco, a 17-hour and 7,400 mile gulf. And, we're opening not one, but (possibly) two offices in Europe in 2008.

And yet, in my humble opinion, communication at Atlassian is 10-times better than the last company.

This is the first in a 2-part series to talk about why I think that is. In this first part, I'll talk about the tools we use — wikis, issue and task tracking, IM, blogging, etc. In part 2, I talk more about the company culture.

  • Comments Off

GreenHopper 1.6 and 1.7

Since I last blogged about it GreenHopper, the agile planning tool for JIRA, has seen two big news releases.

GreenHopper helps integrate more tightly integrate with the various Agile methodologies out there, by giving you a card-like view of issues and allowing your to re-order and reschedule them easily. It also has a set of charts and statistics that are specifically tailored to agile teams, like burndown charts and velocity metrics.

Here are some highlights from the new releases:

  • GreenHopper Portlet - There's now an awesome portlet that you can use on your dashboard showing the project status, including a burndown chart, at a glance. (See screenshot above for an example.)
  • Use Custom Fields - many charts and features now work with custom fields, in addition to the standard time tracking fields.
  • Chart Snapshots - Each time your release a new version, GreenHopper can save a snapshot of each chart, so you can go back and compare your progress through each release.
  • Savable context - Once you've set up a set of charts or a planning board for your tasks, you can save that context and come back to it with a single click.
  • Default Configuration options - you can now set up default options for all new projects in JIRA, or specifically define which JIRA projects will use GreenHopper.

Take a look at the release notes for more detail and more screenshots:

And go download GreenHopper today.

  • Comments Off

Using a wiki for online help

Can you use a wiki for online help? And what are the tricky bits that you might need to work around?

Atlassian's technical documentation is online, alive, and version-specific. Most of it is written, managed and hosted on our Confluence site. Being a wiki, this site is a hive of activity – we are constantly updating and enhancing the pages, and visitors to the site add useful comments day and night.

Can this possibly be the right environment for context-sensitive help links – can we point a link from the screen in one of our shipped software products directly into a living and thriving wiki page?

We've done it already

The latest FishEye and Crucible releases have help links on the application screens, pointing directly to the corresponding documentation page on our Confluence site.

OnlineHelpLinks_Annotated.png

Help is just one click away. Look at the above screen as an example. When a FishEye administrator clicks the '?' icon next to 'Mail Server', a new browser window or tab opens showing the guidelines on configuring an SMTP server:

OnlineHelpLinkedPage_Annotated.png

The instructions, illustrated above, come directly from the wiki pages – the information is up to date, to the minute.

How did we make it happen?

When we are designing the documentation and the application itself, the technical writers and the developers work closely together. We decide where the help links are needed on the application screens, and structure the documentation pages carefully so that there is a good 'landing place' for each help link.

The job doesn't end there. On an ongoing basis, the technical writers make sure that the documentation is updated and enhanced with the latest information. We also manage the documentation's release dependencies, so that there is a separate and complete set of documents for each major release of the application (FishEye 1.3, 1.4, etc).

The tricky bits

But what if we need to change the name of a page – does this break the online help link, because the page name is embedded into the wiki URL?

The FishEye and Crucible help links do not contain hard-coded URLs. Instead, we use a file called 'help-paths.properties', which maps each help link to the corresponding page name. The technical writers do take care not to change page names unless absolutely necessary, and we make sure that any changes coincide with a new release of the product.

Here's a snippet from the 'help-paths.properties' file, including the bit that maps the above 'Mail Server' help link to its corresponding 'SMTP' documentation page:

## Documentation roots fisheye.help.url.prefix = http://docs.atlassian.com/fisheye/docs-014
crucible.help.url.prefix = http://docs.atlassian.com/crucible/docs-012
## Default help pages
fisheye.default.help.key = FishEye+Documentation+Home
crucible.default.help.key = Crucible+Documentation+Home
## ...
## FishEye Administrator's Guide
# 4. Setting up your Web Server
fisheye.web.server.settting.up = 4.+Setting+up+your+Web+Server
fisheye.web.server.config = Configuring+the+FishEye+Web+Server
# 5. Configuring SMTP
fisheye.smtp.config = 5.+Configuring+SMTP
## ...

OK, now what happens when the documentation has moved on to a later release? For example, you may be using FishEye 1.4 when the documentation has already been upgraded to suit a later version some time in the future. You don't want to see instructions for the wrong FishEye version.

The technical writers make sure that there's a discrete set of documentation for each major release. For FishEye, at time of writing this blog post, there's a Confluence space for FishEye 1.3 and another for FishEye 1.4. We call the FishEye 1.3 space an 'archive' space, because it relates to a previous version of the software. And we call the FishEye 1.4 space the 'main' space, because it always relates to the most recently-released version of the software.

At some time in the future, we'll release a new version of FishEye. Then the main FishEye space will be updated for the new release, and we'll move the FishEye 1.4 documents to a new archive space.

How does the help link find its way to the right space? From FishEye 1.4 and Crucible 1.2 onwards, the applications are clever enough to find the correct release-specific documentation on the Confluence wiki. The developers have created a '.htaccess' file to redirect the incoming requests to the relevant Confluence space.

A '.htaccess' file is a directory-level configuration file which you can put onto an Apache web server. You can do various things with such a file – read the Apache documentation for more information. We use ours to rewrite the URL:

Here's the content of our FishEye .htaccess file:

RewriteEngine on # eg docs.atlassian.com/fisheye/docs-014/FishEye+Documentation+Home
RewriteRule ^/?docs-014/(.*)$ http://confluence.atlassian.com/display/FISHEYE/$1 [L]
RewriteRule ^/?docs-(\d+)/(.*)$ http://confluence.atlassian.com/display/FISHEYE$1/$2 [L]

It works and we like it

We're planning to implement something similar for more of the Atlassian products soon. Wiki while you wait ;)

  • Comments Off

Interview: Atlassian Support Diva Commits Code

 
You know our products and maybe our culture. But what about the people behind the scenes?
 
Today I'm happy to kick-off Inside Atlassian Minds, an interview series that will shed a little light into the work and lives of individual staff members.
 
The first Atlassian staff interview is with Donna, our Support Diva. She has been solving support issues for 84 dog years. Here's a teaser:
 
Q: Do you contribute code to Atlassian products?
 
A: Contributed code twice. Broke the build [code] once. Instant messages from co-workers telling me that I did so, priceless.
 
Read the entire interview and expect more to come.
 
P.S. Wondering what spurred this interview series? As you may have heard, at Atlassian we have periodic FedEx days. This means the development teams get to spend 1-1/2 days every so often on pet projects. This past quarter us marketers decided to participate too. (Thanks Jon!)
 
  • Comments Off

“cache-control: no-store” considered harmful

If your browsing habits are anything like mine you may have realised, when using Confluence 2.7 (release candidate currently deployed on confluence.atlassian.com), that the back and forward controls on your browser seem to be much faster when traversing wiki pages. You may have also noticed that the annoying The page you are trying to view contains POSTDATA that has expired from cache. Yada yada... popup that you may have to contend with when clicking back to Confluence search results is also pleasantly absent.

What could bring about such a magnitude of performance improvement? you ask. Four new CPUs on the confluence.atlassian.com server? Nay. Hundreds of hours of performance R&D and poring over yourkit dumps? I wish I had the time. Some strange and ancient ritual performed on the precise second of the Spring equinox which by necessity violates some eight tenths of modern law? Not even.

That last guess may actually be closer to the mark than you would think as it did involve an exorcism – of the HTTP Cache-Control: no-store directive. How did the banishment of this lesser demon affect your experience so? It's quite simple: no-store really does mean "do not store this response for any longer than necessary to display it". When you navigate away from a page served as no-store your browser will expunge all traces of it (at least Mozilla based browsers do). This means when you attempt to return to the page via the browser navigation buttons, the browser must repeat the original request to the server to get the page again. This has a few ramifications apart from the extra latency for the end user when using session history controls:

  • Extra load on the server. Every time someone uses the back and forward buttons to pages on a Confluence server we have to process the request all over again. A kitten probably dies as well.
  • It breaks browser session history. When I click on the back button I expect to see the previous page as it was when I navigated away from it. I often do this because there was text or a link on the previous page that I was interested in using before I left the page. If the page is re-fetched from the server when I click back, on a dynamic site such as a Confluence wiki, it is likely that the content will have changed. That link I was interested in on the recently updated section of the dashboard could well have been pushed off the front page. This violates the rule of least surprise for me and degrades the utility of my browser's session history functions. Another frustrating side effect of this is that all form state is also reset. I've already had a few Atlassians thank me for this improvement after they've accidently navigated away from a form that they were filling in, to find that their text entries were preserved when they click back. With no-store this state would have been lost.
  • For pages requested via HTTP POST such as form submissions, the browser must check with the user before repeating the request. This occurs because POST requests may be non-idempotent, meaning they may perform some action that changes state on the server. To prevent undesired side effects, such as repeating an action which deletes data, user agents ask users whether they really want the action performed again. This is of course the source of the much maligned re-post confirmation dialogue. While the Confluence search form should arguably use a HTTP GET to perform its action, the removal of no-store kills the appearance of the pop up while we work at the slightly more trickier problem of changing it to use GET.

It looks like older versions of Confluence and present versions of JIRA (the JIRA developers are looking to address this) serve pages with this directive as part of a carpet bombing approach to ensure that a page is not cached by browsers, preventing users from ever seeing stale views of data on the server. no-store is inappropriate for this; no-cache is all that is necessary. I would urge developers to review their use of this directive and remove it if appropriate.

Since the caching features of HTTP 1.0 and 1.1 are often not or only vaguely understood, I recommend that all developers working on web based applications have a solid understanding of the important concepts detailed in section 13 of RFC 2616 which deals with the caching features of HTTP. More attention to details like the ones described above can lead to a much enhanced user experience with a better behaving and performing web application.

  • Comments Off

What did we do to celebrate the launch of JIRA 3.12?

n826130421_1779550_4845.jpg

Because "we've got issues", too :)

  • Comments Off
Next Page »