🔒 Fix unauthorized manipulations of invitations (#254)
This commit is contained in:
parent
e32ef3685f
commit
ff9b320347
|
@ -5,6 +5,7 @@ Revision history for Lufi
|
||||||
- 💄 Disable signature when using LDAP (#249)
|
- 💄 Disable signature when using LDAP (#249)
|
||||||
- 🌐 Update translations
|
- 🌐 Update translations
|
||||||
- 🔒 Fix XSS where using zip feature (#254)
|
- 🔒 Fix XSS where using zip feature (#254)
|
||||||
|
- 🔒 Fix unauthorized manipulations of invitations (#254)
|
||||||
|
|
||||||
0.05.14 2021-06-16
|
0.05.14 2021-06-16
|
||||||
- 🔧 Set default morbo port to 3000 (as it should have stay)
|
- 🔧 Set default morbo port to 3000 (as it should have stay)
|
||||||
|
|
|
@ -122,61 +122,79 @@ sub delete_invitations {
|
||||||
my $c = shift;
|
my $c = shift;
|
||||||
my @tokens = @{$c->every_param('tokens[]')};
|
my @tokens = @{$c->every_param('tokens[]')};
|
||||||
|
|
||||||
my @result = ();
|
if ($c->is_user_authenticated) {
|
||||||
for my $token (@tokens) {
|
my @result = ();
|
||||||
my $i = Lufi::DB::Invitation->new(app => $c->app)
|
my @failures = ();
|
||||||
->from_token($token)
|
for my $token (@tokens) {
|
||||||
->deleted(1)
|
my $i = Lufi::DB::Invitation->new(app => $c->app)
|
||||||
->write;
|
->from_token($token);
|
||||||
push @result, { msg => $c->l('The invitation %1 has been deleted.', $i->token), token => $i->token, deleted => $i->deleted };
|
if ($i->ldap_user eq $c->current_user->{username}) {
|
||||||
}
|
$i->deleted(1)
|
||||||
|
->write;
|
||||||
|
push @result, { msg => $c->l('The invitation %1 has been deleted.', $i->token), token => $i->token, deleted => $i->deleted };
|
||||||
|
} else {
|
||||||
|
push @failures, $c->l('The invitation %1 can’t be deleted: it wasn’t created by you (%2).', $i->token, $c->current_user->{username});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$c->render(json => {
|
$c->render(json => {
|
||||||
success => true,
|
success => (scalar(@result) > 0) ? true : false,
|
||||||
tokens => \@result
|
tokens => \@result,
|
||||||
});
|
failures => \@failures
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
$c->redirect_to($c->url_for('login')->query(redirect => 'my_invitations'));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub resend_invitations {
|
sub resend_invitations {
|
||||||
my $c = shift;
|
my $c = shift;
|
||||||
my @tokens = @{$c->every_param('tokens[]')};
|
my @tokens = @{$c->every_param('tokens[]')};
|
||||||
|
|
||||||
my @success;
|
if ($c->is_user_authenticated) {
|
||||||
my @failures;
|
my @success = ();
|
||||||
for my $token (@tokens) {
|
my @failures = ();
|
||||||
my $i = Lufi::DB::Invitation->new(app => $c->app)
|
for my $token (@tokens) {
|
||||||
->from_token($token);
|
my $i = Lufi::DB::Invitation->new(app => $c->app)
|
||||||
|
->from_token($token);
|
||||||
|
|
||||||
if ($i->files_sent_at) {
|
if ($i->ldap_user eq $c->current_user->{username}) {
|
||||||
push @failures, $c->l('The invitation %1 can’t be resent: %2 has already sent files.<br>Please create a new invitation.', $i->token, $i->guest_mail);
|
if ($i->files_sent_at) {
|
||||||
} else {
|
push @failures, $c->l('The invitation %1 can’t be resent: %2 has already sent files.<br>Please create a new invitation.', $i->token, $i->guest_mail);
|
||||||
if ($c->config('invitations')->{'extend_invitation_expiration_on_resend'}) {
|
} else {
|
||||||
$i->expire_at(time + $i->expire_at - $i->created_at)
|
if ($c->config('invitations')->{'extend_invitation_expiration_on_resend'}) {
|
||||||
->write;
|
$i->expire_at(time + $i->expire_at - $i->created_at)
|
||||||
|
->write;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $from = ($c->config('invitations')->{'send_invitation_with_ldap_user_mail'}) ? $i->ldap_user_mail : $c->config('mail_sender');
|
||||||
|
my $url = $c->url_for('guest', token => $i->token)->to_abs;
|
||||||
|
my $expire = $c->get_date_lang()->time2str($c->l('%A %d %B %Y at %T'), $i->expire_at);
|
||||||
|
$c->mail(
|
||||||
|
from => $from,
|
||||||
|
to => $i->guest_mail,
|
||||||
|
template => 'invitations/invite',
|
||||||
|
format => 'mail',
|
||||||
|
ldap_user => ucfirst($i->ldap_user),
|
||||||
|
url => $url,
|
||||||
|
invitation => $i,
|
||||||
|
expires => $expire
|
||||||
|
);
|
||||||
|
|
||||||
|
push @success, { msg => $c->l('Invitation resent to %1.<br> URL: %2', $i->guest_mail, $url), expires => $expire, token => $i->token };
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
push @failures, $c->l('The invitation %1 can’t be resent: it wasn’t created by you (%2).', $i->token, $c->current_user->{username});
|
||||||
}
|
}
|
||||||
|
|
||||||
my $from = ($c->config('invitations')->{'send_invitation_with_ldap_user_mail'}) ? $i->ldap_user_mail : $c->config('mail_sender');
|
|
||||||
my $url = $c->url_for('guest', token => $i->token)->to_abs;
|
|
||||||
my $expire = $c->get_date_lang()->time2str($c->l('%A %d %B %Y at %T'), $i->expire_at);
|
|
||||||
$c->mail(
|
|
||||||
from => $from,
|
|
||||||
to => $i->guest_mail,
|
|
||||||
template => 'invitations/invite',
|
|
||||||
format => 'mail',
|
|
||||||
ldap_user => ucfirst($i->ldap_user),
|
|
||||||
url => $url,
|
|
||||||
invitation => $i,
|
|
||||||
expires => $expire
|
|
||||||
);
|
|
||||||
|
|
||||||
push @success, { msg => $c->l('Invitation resent to %1.<br> URL: %2', $i->guest_mail, $url), expires => $expire, token => $i->token };
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
$c->render(json => {
|
$c->render(json => {
|
||||||
success => \@success,
|
success => \@success,
|
||||||
failures => \@failures
|
failures => \@failures
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
|
$c->redirect_to($c->url_for('login')->query(redirect => 'my_invitations'));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub toggle_invitations_visibility {
|
sub toggle_invitations_visibility {
|
||||||
|
|
|
@ -41,7 +41,7 @@ msgstr "%1 sent you files"
|
||||||
msgid "%1 used your invitation to send you files:"
|
msgid "%1 used your invitation to send you files:"
|
||||||
msgstr "%1 used your invitation to send you files:"
|
msgstr "%1 used your invitation to send you files:"
|
||||||
|
|
||||||
#: lib/Lufi/Controller/Invitation.pm:160 lib/Lufi/Controller/Invitation.pm:85 themes/default/templates/invitations/my_invitations.html.ep:51 themes/default/templates/invitations/my_invitations.html.ep:52 themes/default/templates/invitations/my_invitations.html.ep:53 themes/default/templates/invitations/notification_files_sent.mail.ep:12
|
#: lib/Lufi/Controller/Invitation.pm:172 lib/Lufi/Controller/Invitation.pm:85 themes/default/templates/invitations/my_invitations.html.ep:51 themes/default/templates/invitations/my_invitations.html.ep:52 themes/default/templates/invitations/my_invitations.html.ep:53 themes/default/templates/invitations/notification_files_sent.mail.ep:12
|
||||||
msgid "%A %d %B %Y at %T"
|
msgid "%A %d %B %Y at %T"
|
||||||
msgstr "%A %d %B %Y at %T"
|
msgstr "%A %d %B %Y at %T"
|
||||||
|
|
||||||
|
@ -364,7 +364,7 @@ msgid "Invert selection"
|
||||||
msgstr "Invert selection"
|
msgstr "Invert selection"
|
||||||
|
|
||||||
#. ($i->guest_mail, $url)
|
#. ($i->guest_mail, $url)
|
||||||
#: lib/Lufi/Controller/Invitation.pm:172
|
#: lib/Lufi/Controller/Invitation.pm:184
|
||||||
msgid "Invitation resent to %1.<br> URL: %2"
|
msgid "Invitation resent to %1.<br> URL: %2"
|
||||||
msgstr "Invitation resent to %1.<br> URL: %2"
|
msgstr "Invitation resent to %1.<br> URL: %2"
|
||||||
|
|
||||||
|
@ -505,11 +505,11 @@ msgstr "Send all links by email"
|
||||||
msgid "Send the invitation"
|
msgid "Send the invitation"
|
||||||
msgstr "Send the invitation"
|
msgstr "Send the invitation"
|
||||||
|
|
||||||
#: themes/default/templates/mail.html.ep:46
|
#: themes/default/templates/mail.html.ep:47
|
||||||
msgid "Send with this server"
|
msgid "Send with this server"
|
||||||
msgstr "Send with this server"
|
msgstr "Send with this server"
|
||||||
|
|
||||||
#: themes/default/templates/mail.html.ep:47
|
#: themes/default/templates/mail.html.ep:49
|
||||||
msgid "Send with your own mail software"
|
msgid "Send with your own mail software"
|
||||||
msgstr "Send with your own mail software"
|
msgstr "Send with your own mail software"
|
||||||
|
|
||||||
|
@ -518,7 +518,7 @@ msgid "Sending part XX1 of XX2. Please, be patient, the progress bar can take a
|
||||||
msgstr "Sending part XX1 of XX2. Please, be patient, the progress bar can take a while to move."
|
msgstr "Sending part XX1 of XX2. Please, be patient, the progress bar can take a while to move."
|
||||||
|
|
||||||
#. (url_for('/')
|
#. (url_for('/')
|
||||||
#: themes/default/templates/partial/mail.js.ep:48
|
#: themes/default/templates/partial/mail.js.ep:49
|
||||||
msgid "Share your files in total privacy on %1"
|
msgid "Share your files in total privacy on %1"
|
||||||
msgstr "Share your files in total privacy on %1"
|
msgstr "Share your files in total privacy on %1"
|
||||||
|
|
||||||
|
@ -534,7 +534,7 @@ msgstr "Show zip content"
|
||||||
msgid "Signin"
|
msgid "Signin"
|
||||||
msgstr "Signin"
|
msgstr "Signin"
|
||||||
|
|
||||||
#: lib/Lufi/Controller/Invitation.pm:284 themes/default/templates/invitations/exception.html.ep:16
|
#: lib/Lufi/Controller/Invitation.pm:302 themes/default/templates/invitations/exception.html.ep:16
|
||||||
msgid "Sorry, the invitation doesn’t exist. Are you sure you are on the right URL?"
|
msgid "Sorry, the invitation doesn’t exist. Are you sure you are on the right URL?"
|
||||||
msgstr "Sorry, the invitation doesn’t exist. Are you sure you are on the right URL?"
|
msgstr "Sorry, the invitation doesn’t exist. Are you sure you are on the right URL?"
|
||||||
|
|
||||||
|
@ -556,7 +556,7 @@ msgid "Sorry, your invitation has expired or has been deleted. Please contact %1
|
||||||
msgstr "Sorry, your invitation has expired or has been deleted. Please contact %1 to have another invitation."
|
msgstr "Sorry, your invitation has expired or has been deleted. Please contact %1 to have another invitation."
|
||||||
|
|
||||||
#. ($invitation->ldap_user_mail)
|
#. ($invitation->ldap_user_mail)
|
||||||
#: lib/Lufi/Controller/Invitation.pm:277
|
#: lib/Lufi/Controller/Invitation.pm:295
|
||||||
msgid "The URLs of your files have been sent by email to %1."
|
msgid "The URLs of your files have been sent by email to %1."
|
||||||
msgstr "The URLs of your files have been sent by email to %1."
|
msgstr "The URLs of your files have been sent by email to %1."
|
||||||
|
|
||||||
|
@ -603,13 +603,23 @@ msgstr "The following email addresses are not valid: %1"
|
||||||
msgid "The guest email address (%1) is unvalid."
|
msgid "The guest email address (%1) is unvalid."
|
||||||
msgstr "The guest email address (%1) is unvalid."
|
msgstr "The guest email address (%1) is unvalid."
|
||||||
|
|
||||||
|
#. ($i->token, $c->current_user->{username})
|
||||||
|
#: lib/Lufi/Controller/Invitation.pm:136
|
||||||
|
msgid "The invitation %1 can’t be deleted: it wasn’t created by you (%2)."
|
||||||
|
msgstr "The invitation %1 can’t be deleted: it wasn’t created by you (%2)."
|
||||||
|
|
||||||
#. ($i->token, $i->guest_mail)
|
#. ($i->token, $i->guest_mail)
|
||||||
#: lib/Lufi/Controller/Invitation.pm:151
|
#: lib/Lufi/Controller/Invitation.pm:163
|
||||||
msgid "The invitation %1 can’t be resent: %2 has already sent files.<br>Please create a new invitation."
|
msgid "The invitation %1 can’t be resent: %2 has already sent files.<br>Please create a new invitation."
|
||||||
msgstr "The invitation %1 can’t be resent: %2 has already sent files.<br>Please create a new invitation."
|
msgstr "The invitation %1 can’t be resent: %2 has already sent files.<br>Please create a new invitation."
|
||||||
|
|
||||||
|
#. ($i->token, $c->current_user->{username})
|
||||||
|
#: lib/Lufi/Controller/Invitation.pm:187
|
||||||
|
msgid "The invitation %1 can’t be resent: it wasn’t created by you (%2)."
|
||||||
|
msgstr "The invitation %1 can’t be resent: it wasn’t created by you (%2)."
|
||||||
|
|
||||||
#. ($i->token)
|
#. ($i->token)
|
||||||
#: lib/Lufi/Controller/Invitation.pm:131
|
#: lib/Lufi/Controller/Invitation.pm:134
|
||||||
msgid "The invitation %1 has been deleted."
|
msgid "The invitation %1 has been deleted."
|
||||||
msgstr "The invitation %1 has been deleted."
|
msgstr "The invitation %1 has been deleted."
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@ msgstr ""
|
||||||
msgid "%1 used your invitation to send you files:"
|
msgid "%1 used your invitation to send you files:"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/Lufi/Controller/Invitation.pm:160 lib/Lufi/Controller/Invitation.pm:85 themes/default/templates/invitations/my_invitations.html.ep:51 themes/default/templates/invitations/my_invitations.html.ep:52 themes/default/templates/invitations/my_invitations.html.ep:53 themes/default/templates/invitations/notification_files_sent.mail.ep:12
|
#: lib/Lufi/Controller/Invitation.pm:172 lib/Lufi/Controller/Invitation.pm:85 themes/default/templates/invitations/my_invitations.html.ep:51 themes/default/templates/invitations/my_invitations.html.ep:52 themes/default/templates/invitations/my_invitations.html.ep:53 themes/default/templates/invitations/notification_files_sent.mail.ep:12
|
||||||
msgid "%A %d %B %Y at %T"
|
msgid "%A %d %B %Y at %T"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -364,7 +364,7 @@ msgid "Invert selection"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. ($i->guest_mail, $url)
|
#. ($i->guest_mail, $url)
|
||||||
#: lib/Lufi/Controller/Invitation.pm:172
|
#: lib/Lufi/Controller/Invitation.pm:184
|
||||||
msgid "Invitation resent to %1.<br> URL: %2"
|
msgid "Invitation resent to %1.<br> URL: %2"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -505,11 +505,11 @@ msgstr ""
|
||||||
msgid "Send the invitation"
|
msgid "Send the invitation"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: themes/default/templates/mail.html.ep:46
|
#: themes/default/templates/mail.html.ep:47
|
||||||
msgid "Send with this server"
|
msgid "Send with this server"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: themes/default/templates/mail.html.ep:47
|
#: themes/default/templates/mail.html.ep:49
|
||||||
msgid "Send with your own mail software"
|
msgid "Send with your own mail software"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -518,7 +518,7 @@ msgid "Sending part XX1 of XX2. Please, be patient, the progress bar can take a
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. (url_for('/')
|
#. (url_for('/')
|
||||||
#: themes/default/templates/partial/mail.js.ep:48
|
#: themes/default/templates/partial/mail.js.ep:49
|
||||||
msgid "Share your files in total privacy on %1"
|
msgid "Share your files in total privacy on %1"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -534,7 +534,7 @@ msgstr ""
|
||||||
msgid "Signin"
|
msgid "Signin"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: lib/Lufi/Controller/Invitation.pm:284 themes/default/templates/invitations/exception.html.ep:16
|
#: lib/Lufi/Controller/Invitation.pm:302 themes/default/templates/invitations/exception.html.ep:16
|
||||||
msgid "Sorry, the invitation doesn’t exist. Are you sure you are on the right URL?"
|
msgid "Sorry, the invitation doesn’t exist. Are you sure you are on the right URL?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -556,7 +556,7 @@ msgid "Sorry, your invitation has expired or has been deleted. Please contact %1
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#. ($invitation->ldap_user_mail)
|
#. ($invitation->ldap_user_mail)
|
||||||
#: lib/Lufi/Controller/Invitation.pm:277
|
#: lib/Lufi/Controller/Invitation.pm:295
|
||||||
msgid "The URLs of your files have been sent by email to %1."
|
msgid "The URLs of your files have been sent by email to %1."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -603,13 +603,23 @@ msgstr ""
|
||||||
msgid "The guest email address (%1) is unvalid."
|
msgid "The guest email address (%1) is unvalid."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#. ($i->token, $c->current_user->{username})
|
||||||
|
#: lib/Lufi/Controller/Invitation.pm:136
|
||||||
|
msgid "The invitation %1 can’t be deleted: it wasn’t created by you (%2)."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. ($i->token, $i->guest_mail)
|
#. ($i->token, $i->guest_mail)
|
||||||
#: lib/Lufi/Controller/Invitation.pm:151
|
#: lib/Lufi/Controller/Invitation.pm:163
|
||||||
msgid "The invitation %1 can’t be resent: %2 has already sent files.<br>Please create a new invitation."
|
msgid "The invitation %1 can’t be resent: %2 has already sent files.<br>Please create a new invitation."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#. ($i->token, $c->current_user->{username})
|
||||||
|
#: lib/Lufi/Controller/Invitation.pm:187
|
||||||
|
msgid "The invitation %1 can’t be resent: it wasn’t created by you (%2)."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#. ($i->token)
|
#. ($i->token)
|
||||||
#: lib/Lufi/Controller/Invitation.pm:131
|
#: lib/Lufi/Controller/Invitation.pm:134
|
||||||
msgid "The invitation %1 has been deleted."
|
msgid "The invitation %1 has been deleted."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
|
@ -44,9 +44,17 @@ function deleteInvit(e) {
|
||||||
Materialize.toast(t.msg, 6000, 'teal accent-3');
|
Materialize.toast(t.msg, 6000, 'teal accent-3');
|
||||||
$('#row-' + t.token).remove();
|
$('#row-' + t.token).remove();
|
||||||
});
|
});
|
||||||
|
data.failures.forEach(function(msg) {
|
||||||
|
Materialize.toast(msg, 10000, 'red accent-2');
|
||||||
|
});
|
||||||
disableButtons();
|
disableButtons();
|
||||||
} else {
|
} else {
|
||||||
Materialize.toast(data.msg, 10000, 'red accent-2');
|
data.failures.forEach(function(msg) {
|
||||||
|
Materialize.toast(msg, 10000, 'red accent-2');
|
||||||
|
});
|
||||||
|
if (data.msg) {
|
||||||
|
Materialize.toast(data.msg, 10000, 'red accent-2');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue