+ my $user=$params{-user};
+ my %users;
+ my %sessions;
+ dbmopen %users,$config{-userbase},0644;
+ my $session={-cgi=>$params{-cgi},-name=>$params{-user}};
+ if (!exists($users{$user})) {
+ # New user come.
+ require VJournal::Avatar;
+ my @avatar;
+ if (exists $params{-avatar}) {
+ @avatar = VJournal::Avatar::cache($params{-avatar});
+ } else {
+ @avatar = VJournal::Avatar::by_openid($user);
+ }
+ if (!@avatar && exists $params{-email}) {
+ @avatar = VJournal::Avatar::by_email($params{-email});
+ }
+ my %a = @avatar;
+ $users{$user}=join(":",$params{-email},$a{-src},$a{-width},$a{-height});
+ }
+ my ($email,$avatarsrc,$avatarwidth,$avatarheight)=split(":",$users{$user});
+ $session->{-email} = $email if $email;
+ if ($avatarsrc) {
+ $session->{-avatar} = $avatarsrc;
+ $session->{-avwidth} = $avatarwidth;
+ $session->{-avheight} = $avatarheight;
+ }
+ my $expire = time()+$config{-sessiontime};
+ require Digest::MD5;
+ my
+ $sessioninfo=join(":",$user,$avatarsrc,$email,$avatarwidth,$avatarheight,
+ ($params{-bind_to_ip}?$session->{-cgi}->remote_addr():""),$expire);
+ $session->{-id} = Digest::MD5::md5_base64($sessioninfo);
+ $sessions{$session->{-id}} = $sessioninfo;
+ bless $session,$pkg;
+ $session->{-cookie}=
+ [$session->cookie(-name=>COOKIE_NAME,-value=>$session->{-id},-expires=>
+ $expire)];
+ return $session
+}