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 my $query = $dbh->prepare(q{UPDATE users SET password = MD5($1)
116 WHERE password = MD5($2) AND uid = $3
118 $query->execute($c->req->param('pass'),$c->req->param('oldpass'),$c->user->id);
120 $c->res->redirect($c->uri_for(''));
123 sub changeEmail : Local {
124 my ( $self, $c ) = @_;
127 my $email = $c->req->param('email');
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(''));
137 my $insert = $dbh->prepare(q{
138 INSERT INTO email_change (uid,email) VALUES ($1,$2) RETURNING id;
140 $insert->execute($c->user->id,$email);
142 my ($id) = $insert->fetchrow_array;
147 From => 'NewDawn Command <nd@ruin.nu>',
148 'Content-type' => 'text/plain; charset="UTF-8"',
149 Subject => 'Change email address',
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:
155 }.$c->uri_for('confirmEmail',$id)."\n",
158 if (sendmail %mail) {
159 $c->flash(error => 'Sent mail for confirmation.');
161 $c->flash(error => $Mail::Sendmail::error);
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');
172 $c->res->redirect($c->uri_for(''));
175 sub confirmEmail : Local {
176 my ( $self, $c, $id ) = @_;
180 my $query = $dbh->prepare(q{
181 UPDATE email_change SET confirmed = TRUE
182 WHERE uid = $1 AND id = $2 AND NOT confirmed
185 $query->execute($c->user->id,$id);
186 my ($email) = $query->fetchrow_array;
189 $dbh->do(q{UPDATE users SET email = $2 WHERE uid = $1}
190 ,undef,$c->user->id,$email);
191 $c->flash(error => "Email updated.");
193 $c->flash(error => "$id is not a valid change id for your account, or already confirmed");
196 $c->res->redirect($c->uri_for(''));
202 Michael Andreen (harv@ruin.nu)