1 package NDWeb::Controller::Settings;
6 use parent 'Catalyst::Controller';
10 use DateTime::TimeZone;
16 NDWeb::Controller::Settings - Catalyst Controller
31 sub index :Path :Args(0) {
32 my ( $self, $c ) = @_;
35 $c->stash(error => $c->flash->{error});
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$}){
44 $c->stash(stylesheets => \@stylesheets);
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);
52 my @timezone = split m{/},$timezone,2;
53 $c->stash(timezone => \@timezone);
55 my @cat = DateTime::TimeZone->categories;
57 $c->stash(tzcategories => \@cat);
59 my @countries = DateTime::TimeZone->names_in_category($timezone[0]);
60 $c->stash(tzcountries => \@countries);
63 sub changeStylesheet : Local {
64 my ( $self, $c ) = @_;
67 my $query = $dbh->prepare(q{UPDATE users SET css = NULLIF($2,'Default')
70 $query->execute($c->user->id,html_escape $c->req->param('stylesheet'));
72 $c->res->redirect($c->uri_for(''));
75 sub changeBirthday : Local {
76 my ( $self, $c ) = @_;
79 my $query = $dbh->prepare(q{UPDATE users SET birthday = NULLIF($2,'')::date
83 $query->execute($c->user->id,html_escape $c->req->param('birthday'));
86 if ($@ =~ /invalid input syntax for type date/){
87 $c->flash(error => 'Bad syntax for day, use YYYY-MM-DD.');
89 $c->flash(error => $@);
92 $c->res->redirect($c->uri_for(''));
95 sub changeTimezone : Local {
96 my ( $self, $c ) = @_;
99 my $timezone = $c->req->param('timezone');
100 my $query = $dbh->prepare(q{UPDATE users SET timezone = $2 WHERE uid = $1});
102 $dbh->selectrow_array(q{SELECT NOW() AT TIME ZONE $1},undef,$timezone);
103 $query->execute($c->user->id,$timezone );
106 $c->flash(error => $@);
108 $c->res->redirect($c->uri_for(''));
111 sub changePassword : Local {
112 my ( $self, $c ) = @_;
115 if (length $c->req->param('pass') < 4) {
116 $c->flash(error => "Your password need to be at least 4 characters");
118 my $query = $dbh->prepare(q{UPDATE users SET password = $1
119 WHERE password = crypt($2,password) AND uid = $3
121 $query->execute($c->req->param('pass'),$c->req->param('oldpass'),$c->user->id);
123 $c->flash(error => "Old password was invalid") unless $query->rows;
126 $c->res->redirect($c->uri_for(''));
129 sub changeEmail : Local {
130 my ( $self, $c ) = @_;
133 my $email = $c->req->param('email');
135 unless (Email::Valid->address($email)){
136 $c->flash(email => $email);
137 $c->flash(error => 'Invalid email address');
138 $c->res->redirect($c->uri_for(''));
143 my $insert = $dbh->prepare(q{
144 INSERT INTO email_change (uid,email) VALUES ($1,$2) RETURNING id;
146 $insert->execute($c->user->id,$email);
148 my ($id) = $insert->fetchrow_array;
153 From => 'NewDawn Command <nd@ruin.nu>',
154 'Content-type' => 'text/plain; charset="UTF-8"',
155 Subject => 'Change email address',
157 You have requested to change email address on the NewDawn website.
158 If that is not the case, then feel free to ignore this email. Otherwise
159 use the following url to confirm the change:
161 }.$c->uri_for('confirmEmail',$id)."\n",
164 if (sendmail %mail) {
165 $c->flash(error => 'Sent mail for confirmation.');
167 $c->flash(error => $Mail::Sendmail::error);
171 if($@ =~ /duplicate key value violates unique constraint/){
172 $c->flash(email => $email);
173 $c->flash(error => 'Something went wrong, try to set the email again');
178 $c->res->redirect($c->uri_for(''));
181 sub confirmEmail : Local {
182 my ( $self, $c, $id ) = @_;
186 my $query = $dbh->prepare(q{
187 UPDATE email_change SET confirmed = TRUE
188 WHERE uid = $1 AND id = $2 AND NOT confirmed
191 $query->execute($c->user->id,$id);
192 my ($email) = $query->fetchrow_array;
195 $dbh->do(q{UPDATE users SET email = $2 WHERE uid = $1}
196 ,undef,$c->user->id,$email);
197 $c->flash(error => "Email updated.");
199 $c->flash(error => "$id is not a valid change id for your account, or already confirmed");
202 $c->res->redirect($c->uri_for(''));
208 Michael Andreen (harv@ruin.nu)