]> ruin.nu Git - ndwebbie.git/blob - lib/NDWeb/Auth/User.pm
Login/Logout and session support with roles + convert to html 4.01.
[ndwebbie.git] / lib / NDWeb / Auth / User.pm
1 package NDWeb::Auth::User;
2
3 use strict;
4 use warnings;
5 use Data::Dumper;
6 use base qw/Catalyst::Authentication::User/;
7 use base qw/Class::Accessor::Fast/;
8
9 BEGIN {
10         __PACKAGE__->mk_accessors(qw//);
11         __PACKAGE__->mk_ro_accessors(qw/username id css planet _roles/);
12 };
13
14 sub new {
15         my ( $class ) = @_;
16         my $self = {
17                 _roles => undef,
18                 username => undef,
19                 id => undef,
20                 c => undef,
21         };
22         bless $self, $class;
23         return $self;
24 }
25
26
27
28 sub load {
29         my ($self, $authinfo, $c) = @_;
30         $self->{c} = $c;
31         my $dbh = $c->model;
32
33         if (exists $authinfo->{id}){
34                 $self->{id} = $dbh->selectrow_array(q{
35                         SELECT uid FROM users WHERE lower(username) = lower(?)
36                 },undef,$authinfo->{id});
37         }elsif (exists $authinfo->{uid}){
38                 $self->{id} = $authinfo->{uid};
39         }
40         unless($self->{id}){
41                 $c->logout;
42                 return $self
43         }
44
45         ($self->{planet},$self->{username},$self->{css}) = $dbh->selectrow_array(q{
46                 SELECT planet,username,css FROM users WHERE uid = ?
47                 },undef,$self->{id}) or die $dbh->errstr;
48
49         return $self;
50 }
51
52 sub supported_features {
53         my $self = shift;
54
55         return {
56                 password => {
57                         self_check => 1,
58                 },
59                 session         => 1,
60                 roles           => 1,
61         };
62 }
63
64
65 sub roles {
66         my ( $self ) = shift;
67
68     ## shortcut if we have already retrieved them
69         if (ref $self->_roles eq 'ARRAY') {
70                 return(@{$self->_roles});
71         }
72         my $dbh = $self->{c}->model;
73
74         my $query = $dbh->prepare(q{SELECT role FROM group_roles
75                 WHERE gid IN (SELECT gid FROM groupmembers WHERE uid = $1)
76                 }) or die $dbh->errstr;
77
78         my @roles = ();
79         $query->execute($self->id);
80         while (my $group = $query->fetchrow_hashref){
81                 push @roles,$group->{role};
82         }
83         $self->{_roles} = \@roles;
84
85         return @{$self->_roles};
86 }
87
88 sub for_session {
89         my $self = shift;
90
91         my $userdata = {
92                 uid => $self->id
93         };
94         return $userdata;
95 }
96
97 sub from_session {
98         my ($self, $frozenuser, $c) = @_;
99
100         return $self->load($frozenuser, $c);
101 }
102
103 sub check_password {
104         my ( $self, $password ) = @_;
105         my $query = $self->{c}->model->prepare(q{
106                 SELECT uid FROM users WHERE uid = ? AND password = md5(?)
107         });
108         $query->execute($self->id,$password);
109         if ($query->rows == 1){
110                 return $self;
111         }
112         return;
113 }
114
115
116 1;
117 __END__
118
119 =head1 AUTHOR
120
121 Michael Andreen (harv@ruin.nu)
122
123 =head1 LICENSE
124
125 GPL 2, or later.
126
127 =cut