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