]> ruin.nu Git - ndwebbie.git/blob - lib/NDWeb/Controller/Settings.pm
3f09a435f8e57979dfa99e37b466432c901900bb
[ndwebbie.git] / lib / NDWeb / Controller / Settings.pm
1 package NDWeb::Controller::Settings;
2
3 use strict;
4 use warnings;
5 use feature ":5.10";
6 use parent 'Catalyst::Controller';
7
8 use NDWeb::Include;
9
10 use DateTime::TimeZone;
11 use Mail::Sendmail;
12 use Email::Valid;
13
14 =head1 NAME
15
16 NDWeb::Controller::Settings - Catalyst Controller
17
18 =head1 DESCRIPTION
19
20 Catalyst Controller.
21
22 =head1 METHODS
23
24 =cut
25
26
27 =head2 index 
28
29 =cut
30
31 sub index :Path :Args(0) {
32         my ( $self, $c ) = @_;
33         my $dbh = $c->model;
34
35         $c->stash(error => $c->flash->{error});
36
37         my @stylesheets = ('Default');
38         my $dir = $c->path_to('root/static/css/black.css')->dir;
39         while (my $file = $dir->next){
40                 if(!$file->is_dir && $file->basename =~ m{^(\w+)\.css$}){
41                         push @stylesheets,$1;
42                 }
43         }
44         $c->stash(stylesheets => \@stylesheets);
45
46         my ($birthday,$timezone,$email) = $dbh->selectrow_array(q{
47 SELECT birthday,timezone,email FROM users WHERE uid = $1
48                 },undef,$c->user->id);
49         $c->stash(birthday => $birthday);
50         $c->stash(email =>  $c->flash->{email} // $email);
51
52         my @timezone = split m{/},$timezone,2;
53         $c->stash(timezone => \@timezone);
54
55         my @cat = DateTime::TimeZone->categories;
56         unshift @cat, 'GMT';
57         $c->stash(tzcategories => \@cat);
58
59         my @countries = DateTime::TimeZone->names_in_category($timezone[0]);
60         $c->stash(tzcountries => \@countries);
61 }
62
63 sub changeStylesheet : Local {
64         my ( $self, $c ) = @_;
65         my $dbh = $c->model;
66
67         my $query = $dbh->prepare(q{UPDATE users SET css = NULLIF($2,'Default')
68                 WHERE uid = $1
69         });
70         $query->execute($c->user->id,html_escape $c->req->param('stylesheet'));
71
72         $c->res->redirect($c->uri_for(''));
73 }
74
75 sub changeBirthday : Local {
76         my ( $self, $c ) = @_;
77         my $dbh = $c->model;
78
79         my $query = $dbh->prepare(q{UPDATE users SET birthday = NULLIF($2,'')::date
80                 WHERE uid = $1
81                 });
82         eval{
83                 $query->execute($c->user->id,html_escape $c->req->param('birthday'));
84         };
85         if ($@){
86                 if ($@ =~ /invalid input syntax for type date/){
87                         $c->flash(error => 'Bad syntax for day, use YYYY-MM-DD.');
88                 }else{
89                         $c->flash(error => $@);
90                 }
91         }
92         $c->res->redirect($c->uri_for(''));
93 }
94
95 sub changeTimezone : Local {
96         my ( $self, $c ) = @_;
97         my $dbh = $c->model;
98
99         my $timezone = $c->req->param('timezone');
100         my $query = $dbh->prepare(q{UPDATE users SET timezone = $2 WHERE uid = $1});
101         eval{
102                 $dbh->selectrow_array(q{SELECT NOW() AT TIME ZONE $1},undef,$timezone);
103                 $query->execute($c->user->id,$timezone );
104         };
105         if ($@){
106                 $c->flash(error => $@);
107         }
108         $c->res->redirect($c->uri_for(''));
109 }
110
111 sub changePassword : Local {
112         my ( $self, $c ) = @_;
113         my $dbh = $c->model;
114
115         my $query = $dbh->prepare(q{UPDATE users SET password = MD5($1)
116                 WHERE password = MD5($2) AND uid = $3
117                 });
118         $query->execute($c->req->param('pass'),$c->req->param('oldpass'),$c->user->id);
119
120         $c->res->redirect($c->uri_for(''));
121 }
122
123 sub changeEmail : Local {
124         my ( $self, $c ) = @_;
125         my $dbh = $c->model;
126
127         my $email = $c->req->param('email');
128
129         unless (Email::Valid->address($email)){
130                 $c->flash(email => $email);
131                 $c->flash(error => 'Invalid email address');
132                 $c->res->redirect($c->uri_for(''));
133                 return,
134         }
135
136         eval{
137                 my $insert = $dbh->prepare(q{
138 INSERT INTO email_change (uid,email) VALUES ($1,$2) RETURNING id;
139                         });
140                 $insert->execute($c->user->id,$email);
141
142                 my ($id) = $insert->fetchrow_array;
143
144                 my %mail = (
145                         smtp => 'ruin.nu',
146                         To      => $email,
147                         From    => 'NewDawn Command <nd@ruin.nu>',
148                         'Content-type' => 'text/plain; charset="UTF-8"',
149                         Subject => 'Change email address',
150                         Message => qq{
151 You have requested to change email address on the NewDawn website.
152 If that is not the case, then feel free to ignore this email. Otherwise
153 use the following url to confirm the change:
154
155 }.$c->uri_for('confirmEmail',$id)."\n",
156                 );
157
158                 if (sendmail %mail) {
159                         $c->flash(error => 'Sent mail for confirmation.');
160                 }else {
161                         $c->flash(error => $Mail::Sendmail::error);
162                 }
163         };
164         if($@){
165                 if($@ =~ /duplicate key value violates unique constraint/){
166                         $c->flash(email => $email);
167                         $c->flash(error => 'Something went wrong, try to set the email again');
168                 }else{
169                         die $@;
170                 }
171         }
172         $c->res->redirect($c->uri_for(''));
173 }
174
175 sub confirmEmail : Local {
176         my ( $self, $c, $id ) = @_;
177         my $dbh = $c->model;
178
179         $dbh->begin_work;
180         my $query = $dbh->prepare(q{
181 UPDATE email_change SET confirmed = TRUE
182 WHERE uid = $1 AND id = $2 AND NOT confirmed
183 RETURNING email
184                 });
185         $query->execute($c->user->id,$id);
186         my ($email) = $query->fetchrow_array;
187
188         if ($email){
189                 $dbh->do(q{UPDATE users SET email = $2 WHERE uid = $1}
190                         ,undef,$c->user->id,$email);
191                 $c->flash(error => "Email updated.");
192         }else{
193                 $c->flash(error => "$id is not a valid change id for your account, or already confirmed");
194         }
195         $dbh->commit;
196         $c->res->redirect($c->uri_for(''));
197 }
198
199
200 =head1 AUTHOR
201
202 Michael Andreen (harv@ruin.nu)
203
204 =head1 LICENSE
205
206 GPL 2.0, or later.
207
208 =cut
209
210 1;