NAME

CGI::Session::ID::sha - CGI::Session ID driver for generating SHA-1 based IDs

SYNOPSIS

    use CGI::Session;
    $session = new CGI::Session('id:sha', undef);

DESCRIPTION

Use this module to generate SHA-1 encoded hexadecimal IDs for CGI::Session objects. This library does not require any arguments. To use it, add id:sha to the DSN string when creating CGI::Session objects.

Keep in mind

Keep in mind that a SHA-1 encoded hexadecimal string will have 40 characters. Don't forget to take this into account when using a database to store your session. For example, when using the default table layout with MySQL you'd want to create a table like:

    CREATE TABLE sessions (
        id CHAR(40) NOT NULL PRIMARY KEY,
        a_session NOT NULL,
    );

CAVEATS

There are no caveats with this module, but rather with the way CGI::Session loads this module:

DSN string converted to lower case

I suppose I'm nitpicking -- this isn't a big deal -- but I am the captious sort. I did spend the better part of of an afternoon trying to figure out what was going on.

When calling the CGI::Session constructor new, one has the option of passing a DSN string that should look something like this:

    'driver:file;serializer:default;id:md5'

Notice how the string is all lowercase. However the following is equally valid:

    'DRIVER:FILE;SERIALIZER:DEFAULT;ID:MD5'

Most of us are more inclined to use the former rather than the later. The point is it doesn't matter. The string is converted to lowercase before CGI::Session attempts to load each part:

    # driver:file loads
    CGI::Session::Driver::file
    
    # serializer:default loads
    CGI::Session::Serialize::default
    
    # id:md5 loads
    CGI::Session::ID::md5

The problem comes when you want to load a module that uses upper and lowercase letters in its name. Now this isn't a big problem because there aren't a lot of modules written to plug into this part of CGI::Session. However, when researching I found three on CPAN that do:

Since I find consistent style aesthetically pleasing I prefer mixed case module names. Especially since the underlying module (Digest::MD5) is mixed case. So keeping this in mind, I originally named my module CGI::Session::ID::SHA. SHA is an acronym for Secure Hash Algorithm and the underlying module is Digest::SHA, and so it just makes sense to name it that way.

No dice.

It took me a while to realize that mixed case just wont work. Despite those other modules on CPAN using mixed case, CGI::Session just isn't able to load them. I don't know if it's always been this way, or if this is a recent development. I didn't really do any research on it.

On one hand, I can't imagine Daniel Peder (who wrote the three above) would release to CPAN modules that can't be used by the code they're meant to plug into. On the other hand, I can't imagine Mark Stosberg (who wrote CGI::Session) would change how modules are loaded into CGI::Session.

None of this is is included in the CGI::Session documentation. I don't know that it should be. This behavior isn't wrong, it's just curious. Now, I should have prefaced this by saying that I didn't really research too deeply beyond the documentation on CPAN. For all I know there exists reams of documentation or discussions on this very matter.

SEE ALSO

CGI::Session, Digest::SHA, and our Web site: http://code.google.com/p/perl-cgi-session-id-sha/.

AUTHOR

Michael De Soto, <desoto@cpan.org>

COPYRIGHT AND LICENSE

Copyright (C) 2008 Michael De Soto. All rights reserved.

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.