diff options
14 files changed, 0 insertions, 1151 deletions
diff --git a/extensions/TellUsMore/Config.pm b/extensions/TellUsMore/Config.pm deleted file mode 100644 index 9a20858b7..000000000 --- a/extensions/TellUsMore/Config.pm +++ /dev/null @@ -1,14 +0,0 @@ -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. -# -# This Source Code Form is "Incompatible With Secondary Licenses", as -# defined by the Mozilla Public License, v. 2.0. - -package Bugzilla::Extension::TellUsMore; - -use strict; - -use constant NAME => 'TellUsMore'; - -__PACKAGE__->NAME; diff --git a/extensions/TellUsMore/Extension.pm b/extensions/TellUsMore/Extension.pm deleted file mode 100644 index deffec9fe..000000000 --- a/extensions/TellUsMore/Extension.pm +++ /dev/null @@ -1,140 +0,0 @@ -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. -# -# This Source Code Form is "Incompatible With Secondary Licenses", as -# defined by the Mozilla Public License, v. 2.0. - -package Bugzilla::Extension::TellUsMore; -use strict; -use base qw(Bugzilla::Extension); - -use Bugzilla::Extension::TellUsMore::Constants; -use Bugzilla::Extension::TellUsMore::VersionMirror qw(update_versions); -use Bugzilla::Extension::TellUsMore::Process; - -use Scalar::Util; -use Bugzilla::Util qw(url_quote); - -our $VERSION = '1'; - -# -# initialisation -# - -sub db_schema_abstract_schema { - my ($self, $args) = @_; - $args->{'schema'}->{'tell_us_more'} = { - FIELDS => [ - id => { - TYPE => 'MEDIUMSERIAL', - NOTNULL => 1, - PRIMARYKEY => 1, - }, - token => { - TYPE => 'varchar(16)', - NOTNULL => 1, - }, - mail => { - TYPE => 'varchar(255)', - NOTNULL => 1, - }, - creation_ts => { - TYPE => 'DATETIME', - NOTNULL => 1, - }, - content => { - TYPE => 'LONGBLOB', - NOTNULL => 1, - }, - ], - }; -} - -sub install_before_final_checks { - my ($self, $args) = @_; - # trigger a version sync during checksetup - my $mirror = Bugzilla::Extension::TellUsMore::VersionMirror->new(); - if (!$mirror->check_setup(1)) { - print $mirror->setup_error, "\n"; - return; - } - $mirror->refresh(); -} - -# -# version mirror hooks -# - -sub object_end_of_create { - my ($self, $args) = @_; - my $object = $args->{'object'}; - - if ($self->is_version($object)) { - $self->_mirror->created($object); - } -} - -sub object_end_of_update { - my ($self, $args) = @_; - my $object = $args->{'object'}; - - if ($self->is_version($object)) { - $self->_mirror->updated($args->{'old_object'}, $object); - } -} - -sub object_before_delete { - my ($self, $args) = @_; - my $object = $args->{'object'}; - - if ($self->is_version($object)) { - $self->_mirror->deleted($object); - } -} - -sub is_version { - my ($self, $object) = @_; - my $class = Scalar::Util::blessed($object); - return $class eq 'Bugzilla::Version'; -} - -sub _mirror { - my ($self) = @_; - $self->{'mirror'} ||= Bugzilla::Extension::TellUsMore::VersionMirror->new(); - return $self->{'mirror'}; -} - -# -# token validation page -# - -sub page_before_template { - my ($self, $args) = @_; - my $page = $args->{'page_id'}; - - if ($page eq 'tellusmore.html') { - my $process = Bugzilla::Extension::TellUsMore::Process->new(); - my ($bug, $is_new_user) = $process->execute(Bugzilla->input_params->{'token'}); - my $url; - if ($bug) { - $url = sprintf(RESULT_URL_SUCCESS, url_quote($bug->id), ($is_new_user ? '1' : '0')); - } else { - $url = sprintf(RESULT_URL_FAILURE, url_quote($process->error)); - } - print Bugzilla->cgi->redirect($url); - exit; - } -} - -# -# web service -# - -sub webservice { - my ($self, $args) = @_; - my $dispatch = $args->{dispatch}; - $dispatch->{TellUsMore} = "Bugzilla::Extension::TellUsMore::WebService"; -} - -__PACKAGE__->NAME; diff --git a/extensions/TellUsMore/disabled b/extensions/TellUsMore/disabled deleted file mode 100644 index e69de29bb..000000000 --- a/extensions/TellUsMore/disabled +++ /dev/null diff --git a/extensions/TellUsMore/lib/Constants.pm b/extensions/TellUsMore/lib/Constants.pm deleted file mode 100644 index 110146ef6..000000000 --- a/extensions/TellUsMore/lib/Constants.pm +++ /dev/null @@ -1,89 +0,0 @@ -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. -# -# This Source Code Form is "Incompatible With Secondary Licenses", as -# defined by the Mozilla Public License, v. 2.0. - -package Bugzilla::Extension::TellUsMore::Constants; - -use strict; -use base qw(Exporter); - -our @EXPORT = qw( - TELL_US_MORE_LOGIN - - MAX_ATTACHMENT_COUNT - MAX_ATTACHMENT_SIZE - - MAX_REPORTS_PER_MINUTE - - TARGET_PRODUCT - SECURITY_GROUP - - DEFAULT_VERSION - DEFAULT_COMPONENT - - MANDATORY_BUG_FIELDS - OPTIONAL_BUG_FIELDS - - MANDATORY_ATTACH_FIELDS - OPTIONAL_ATTACH_FIELDS - - TOKEN_EXPIRY_DAYS - - VERSION_SOURCE_PRODUCTS - VERSION_TARGET_PRODUCT - - RESULT_URL_SUCCESS - RESULT_URL_FAILURE -); - -use constant TELL_US_MORE_LOGIN => 'tellusmore@input.bugs'; - -use constant MAX_ATTACHMENT_COUNT => 2; -use constant MAX_ATTACHMENT_SIZE => 512; # kilobytes - -use constant MAX_REPORTS_PER_MINUTE => 2; - -use constant TARGET_PRODUCT => 'Untriaged Bugs'; -use constant SECURITY_GROUP => 'core-security'; - -use constant DEFAULT_VERSION => 'unspecified'; -use constant DEFAULT_COMPONENT => 'General'; - -use constant MANDATORY_BUG_FIELDS => qw( - creator - description - product - summary - user_agent -); - -use constant OPTIONAL_BUG_FIELDS => qw( - attachments - creator_name - restricted - url - version -); - -use constant MANDATORY_ATTACH_FIELDS => qw( - filename - content_type - content -); - -use constant OPTIONAL_ATTACH_FIELDS => qw( - description -); - -use constant TOKEN_EXPIRY_DAYS => 7; - -use constant VERSION_SOURCE_PRODUCTS => ('Firefox', 'Fennec'); -use constant VERSION_TARGET_PRODUCT => 'Untriaged Bugs'; - -use constant RESULT_URL_SUCCESS => 'http://input.mozilla.org/bug/thanks/?bug_id=%s&is_new_user=%s'; -use constant RESULT_URL_FAILURE => 'http://input.mozilla.org/bug/thanks/?error=%s'; - -1; diff --git a/extensions/TellUsMore/lib/Process.pm b/extensions/TellUsMore/lib/Process.pm deleted file mode 100644 index a73866468..000000000 --- a/extensions/TellUsMore/lib/Process.pm +++ /dev/null @@ -1,263 +0,0 @@ -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. -# -# This Source Code Form is "Incompatible With Secondary Licenses", as -# defined by the Mozilla Public License, v. 2.0. - -package Bugzilla::Extension::TellUsMore::Process; - -use strict; -use warnings; - -use Bugzilla::Bug; -use Bugzilla::Component; -use Bugzilla::Constants; -use Bugzilla::Error; -use Bugzilla::Hook; -use Bugzilla::Product; -use Bugzilla::User; -use Bugzilla::Util; -use Bugzilla::Version; - -use Bugzilla::Extension::TellUsMore::Constants; - -use Data::Dumper; -use File::Basename; -use MIME::Base64; -use Safe; - -sub new { - my $invocant = shift; - my $class = ref($invocant) || $invocant; - my $object = {}; - bless($object, $class); - return $object; -} - -sub execute { - my ($self, $token) = @_; - my $dbh = Bugzilla->dbh; - - my ($bug, $user, $is_new_user); - Bugzilla->error_mode(ERROR_MODE_DIE); - eval { - $self->_delete_stale_issues(); - my ($mail, $params) = $self->_deserialise_token($token); - - $dbh->bz_start_transaction(); - - $self->_fix_invalid_params($params); - - ($user, $is_new_user) = $self->_get_user($mail, $params); - - $bug = $self->_create_bug($user, $params); - $self->_post_bug_hook($bug); - - $self->_delete_token($token); - $dbh->bz_commit_transaction(); - - $self->_send_mail($bug, $user); - }; - $self->{error} = $@; - Bugzilla->error_mode(ERROR_MODE_WEBPAGE); - return $self->{error} ? undef : ($bug, $is_new_user); -} - -sub error { - my ($self) = @_; - return $self->{error}; -} - -sub _delete_stale_issues { - my ($self) = @_; - my $dbh = Bugzilla->dbh; - - # delete issues older than TOKEN_EXPIRY_DAYS - - $dbh->do(" - DELETE FROM tell_us_more - WHERE creation_ts < NOW() - " . - $dbh->sql_interval(TOKEN_EXPIRY_DAYS, 'DAY') - ); -} - -sub _deserialise_token { - my ($self, $token) = @_; - my $dbh = Bugzilla->dbh; - - # validate token - - trick_taint($token); - my ($mail, $params) = $dbh->selectrow_array( - "SELECT mail,content FROM tell_us_more WHERE token=?", - undef, $token - ); - ThrowUserError('token_does_not_exist') unless $mail; - - # deserialise, return ($mail, $params) - - my $compartment = Safe->new(); - $compartment->reval($params) - || ThrowUserError('token_does_not_exist'); - $params = ${$compartment->varglob('VAR1')}; - - return ($mail, $params); -} - -sub _fix_invalid_params { - my ($self, $params) = @_; - - # silently adjust any params which are no longer valid - # so we don't lose the submission - - my $product = Bugzilla::Product->new({ name => TARGET_PRODUCT }) - || ThrowUserError('invalid_product_name', { product => TARGET_PRODUCT }); - - # component --> general - - my $component = Bugzilla::Component->new({ product => $product, name => $params->{component} }) - || Bugzilla::Component->new({ product => $product, name => DEFAULT_COMPONENT }) - || ThrowUserError('tum_invalid_component', { product => TARGET_PRODUCT, name => DEFAULT_COMPONENT }); - $params->{component} = $component->name; - - # version --> unspecified - - my $version = Bugzilla::Version->new({ product => $product, name => $params->{version} }) - || Bugzilla::Version->new({ product => $product, name => DEFAULT_VERSION }); - $params->{version} = $version->name; -} - -sub _get_user { - my ($self, $mail, $params) = @_; - - # return existing bmo user - - my $user = Bugzilla::User->new({ name => $mail }); - return ($user, 0) if $user; - - # or create new user - - $user = Bugzilla::User->create({ - login_name => $mail, - cryptpassword => '*', - realname => $params->{creator_name}, - }); - return ($user, 1); -} - -sub _create_bug { - my ($self, $user, $params) = @_; - my $template = Bugzilla->template; - my $vars = {}; - - # login as the user - - Bugzilla->set_user($user); - - # create the bug - - my $create = { - product => $params->{product}, - component => $params->{component}, - short_desc => $params->{summary}, - comment => $params->{description}, - version => $params->{version}, - rep_platform => $params->{rep_platform}, - op_sys => $params->{op_sys}, - bug_severity => $params->{bug_severity}, - priority => $params->{priority}, - bug_file_loc => $params->{bug_file_loc}, - }; - if ($params->{group}) { - $create->{groups} = [ $params->{group} ]; - }; - - my $bug = Bugzilla::Bug->create($create); - - # add attachments - - foreach my $attachment (@{$params->{attachments}}) { - $self->_add_attachment($bug, $attachment); - } - if (scalar @{$params->{attachments}}) { - $bug->update(); - } - - return $bug; -} - -sub _add_attachment { - my ($self, $bug, $params) = @_; - my $dbh = Bugzilla->dbh; - - # init - - my $timestamp = $dbh->selectrow_array('SELECT creation_ts FROM bugs WHERE bug_id=?', undef, $bug->bug_id); - my $data = decode_base64($params->{content}); - - my $description; - if ($params->{description}) { - $description = $params->{description}; - } else { - $description = $params->{filename}; - $description =~ s/\\/\//g; - $description = basename($description); - } - - # trigger content-type auto detection - - Bugzilla->input_params->{'contenttypemethod'} = 'autodetect'; - - # add attachment - - my $attachment = Bugzilla::Attachment->create({ - bug => $bug, - creation_ts => $timestamp, - data => $data, - description => $description, - filename => $params->{filename}, - mimetype => $params->{content_type}, - }); - - # add comment - - $bug->add_comment('', { - isprivate => 0, - type => CMT_ATTACHMENT_CREATED, - extra_data => $attachment->id, - }); -} - -sub _post_bug_hook { - my ($self, $bug) = @_; - - # trigger post_bug_after_creation hook - - my $vars = { - id => $bug->bug_id, - bug => $bug, - }; - Bugzilla::Hook::process('post_bug_after_creation', { vars => $vars }); -} - -sub _send_mail { - my ($self, $bug, $user) = @_; - - # send new-bug email - - Bugzilla::BugMail::Send($bug->bug_id, { changer => $user }); -} - -sub _delete_token { - my ($self, $token) = @_; - my $dbh = Bugzilla->dbh; - - # delete token - - trick_taint($token); - $dbh->do('DELETE FROM tell_us_more WHERE token=?', undef, $token); -} - -1; - diff --git a/extensions/TellUsMore/lib/VersionMirror.pm b/extensions/TellUsMore/lib/VersionMirror.pm deleted file mode 100644 index 24c645d91..000000000 --- a/extensions/TellUsMore/lib/VersionMirror.pm +++ /dev/null @@ -1,207 +0,0 @@ -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. -# -# This Source Code Form is "Incompatible With Secondary Licenses", as -# defined by the Mozilla Public License, v. 2.0. - -package Bugzilla::Extension::TellUsMore::VersionMirror; - -use strict; -use base qw(Exporter); -our @EXPORT_OK = qw(update_versions); - -use Bugzilla::Constants; -use Bugzilla::Product; - -use Bugzilla::Extension::TellUsMore::Constants; - -sub new { - my $invocant = shift; - my $class = ref($invocant) || $invocant; - my $object = {}; - bless($object, $class); - return $object; -} - -sub created { - my ($self, $created) = @_; - return unless $self->_should_process($created); - - my $version = $self->_get($created); - if ($version) { - # version already exists, reactivate if required - if (!$version->is_active) { - $version->set_is_active(1); - $version->update(); - } - } else { - # create version - $self->_create_version($created->name); - } -} - -sub updated { - my ($self, $old, $new) = @_; - return unless $self->_should_process($old); - - my $version = $self->_get($old) - or return; - - my $updated = 0; - if ($version->name ne $new->name) { - if ($version->bug_count) { - # version renamed, but old name has bugs - # create a new version to avoid touching bugs - $self->_create_version($new->name); - return; - } else { - # renaming the version is safe as it is unused - $version->set_name($new->name); - $updated = 1; - } - } - - if ($version->is_active != $new->is_active) { - if ($new->is_active) { - # activating, always safe - $version->set_is_active(1); - $updated = 1; - } else { - # can only deactivate when all source products agree - my $active = 0; - foreach my $product ($self->_sources) { - foreach my $product_version (@{$product->versions}) { - next unless _version_eq($product_version, $new); - if ($product_version->is_active) { - $active = 1; - last; - } - } - last if $active; - } - if (!$active) { - $version->set_is_active(0); - $updated = 1; - } - } - } - - if ($updated) { - $version->update(); - } -} - -sub deleted { - my ($self, $deleted) = @_; - return unless $self->_should_process($deleted); - - my $version = $self->_get($deleted) - or return; - - # can only delete when all source products agreee - foreach my $product ($self->_sources) { - next if $product->name eq $deleted->product->name; - if (grep { _version_eq($_, $version) } @{$product->versions}) { - return; - } - } - - if ($version->bug_count) { - # if there's active bugs, deactivate instead of deleting - $version->set_is_active(0); - $version->update(); - } else { - # no bugs, safe to delete - $version->remove_from_db(); - } -} - -sub check_setup { - my ($self, $full) = @_; - $self->{setup_error} = ''; - - if (!$self->_target) { - $self->{setup_error} = "TellUsMore: Error: Target product '" . VERSION_TARGET_PRODUCT . "' does not exist.\n"; - return 0; - } - return 1 unless $full; - - foreach my $name (VERSION_SOURCE_PRODUCTS) { - my $product = Bugzilla::Product->new({ name => $name }); - if (!$product) { - $self->{setup_error} .= "TellUsMore: Warning: Source product '$name' does not exist.\n"; - next; - } - my $component = Bugzilla::Component->new({ product => $self->_target, name => $name }); - if (!$component) { - $self->{setup_error} .= "TellUsMore: Warning: Target component '$name' does not exist.\n"; - } - } - return $self->{setup_error} ? 0 : 1; -} - -sub setup_error { - my ($self) = @_; - return $self->{setup_error}; -} - -sub refresh { - my ($self) = @_; - foreach my $product ($self->_sources) { - foreach my $version (@{$product->versions}) { - if (!$self->_get($version)) { - $self->created($version); - } - } - } -} - -sub _should_process { - my ($self, $version) = @_; - return 0 unless $self->check_setup(); - foreach my $product ($self->_sources) { - return 1 if $version->product->name eq $product->name; - } - return 0; -} - -sub _get { - my ($self, $query) = @_; - my $name = ref($query) ? $query->name : $query; - my @versions = grep { $_->name eq $name } @{$self->_target->versions}; - return scalar @versions ? $versions[0] : undef; -} - -sub _sources { - my ($self) = @_; - if (!$self->{sources} || scalar(@{$self->{sources}}) != scalar VERSION_SOURCE_PRODUCTS) { - my @sources; - foreach my $name (VERSION_SOURCE_PRODUCTS) { - my $product = Bugzilla::Product->new({ name => $name }); - push @sources, $product if $product; - } - $self->{sources} = \@sources; - } - return @{$self->{sources}}; -} - -sub _target { - my ($self) = @_; - $self->{target} ||= Bugzilla::Product->new({ name => VERSION_TARGET_PRODUCT }); - return $self->{target}; -} - -sub _version_eq { - my ($version_a, $version_b) = @_; - return lc($version_a->name) eq lc($version_b->name); -} - -sub _create_version { - my ($self, $name) = @_; - Bugzilla::Version->create({ product => $self->_target, value => $name }); - # remove bugzilla's cached list of versions - delete $self->_target->{versions}; -} - -1; diff --git a/extensions/TellUsMore/lib/WebService.pm b/extensions/TellUsMore/lib/WebService.pm deleted file mode 100644 index 3ace06ef3..000000000 --- a/extensions/TellUsMore/lib/WebService.pm +++ /dev/null @@ -1,259 +0,0 @@ -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. -# -# This Source Code Form is "Incompatible With Secondary Licenses", as -# defined by the Mozilla Public License, v. 2.0. - -package Bugzilla::Extension::TellUsMore::WebService; - -use strict; -use warnings; - -use base qw(Bugzilla::WebService Bugzilla::Extension); - -use Bugzilla::Component; -use Bugzilla::Constants; -use Bugzilla::Error; -use Bugzilla::Mailer; -use Bugzilla::Product; -use Bugzilla::User; -use Bugzilla::UserAgent; -use Bugzilla::Util; -use Bugzilla::Version; - -use Bugzilla::Extension::TellUsMore::Constants; - -use Data::Dumper; -use Email::MIME; -use MIME::Base64; - -sub submit { - my ($self, $params) = @_; - my $dbh = Bugzilla->dbh; - - # validation - - my $user = Bugzilla->login(LOGIN_REQUIRED); - if ($user->email ne TELL_US_MORE_LOGIN) { - ThrowUserError('tum_auth_failure'); - } - - if (Bugzilla->params->{disable_bug_updates}) { - ThrowUserError('tum_updates_disabled'); - } - - $self->_validate_params($params); - $self->_set_missing_params($params); - - my $creator = $self->_get_user($params->{creator}); - if ($creator && $creator->disabledtext ne '') { - ThrowUserError('tum_account_disabled', { user => $creator }); - } - - $self->_validate_rate($params); - - # create transient entry and email - - $dbh->bz_start_transaction(); - my $token = Bugzilla::Token::GenerateUniqueToken('tell_us_more', 'token'); - my $id = $self->_insert($params, $token); - my $email = $self->_generate_email($params, $token, $creator); - $dbh->bz_commit_transaction(); - - # send email - - MessageToMTA($email); - - # done, return the id from the tell_us_more table - - return $id; -} - -sub _validate_params { - my ($self, $params) = @_; - - $self->_validate_mandatory($params, 'Submission', MANDATORY_BUG_FIELDS); - $self->_remove_invalid_fields($params, MANDATORY_BUG_FIELDS, OPTIONAL_BUG_FIELDS); - - if (!validate_email_syntax($params->{creator})) { - ThrowUserError('illegal_email_address', { addr => $params->{creator} }); - } - - if ($params->{attachments}) { - if (scalar @{$params->{attachments}} > MAX_ATTACHMENT_COUNT) { - ThrowUserError('tum_too_many_attachments', { max => MAX_ATTACHMENT_COUNT }); - } - my $i = 0; - foreach my $attachment (@{$params->{attachments}}) { - $i++; - $self->_validate_mandatory($attachment, "Attachment $i", MANDATORY_ATTACH_FIELDS); - $self->_remove_invalid_fields($attachment, MANDATORY_ATTACH_FIELDS, OPTIONAL_ATTACH_FIELDS); - if (length(decode_base64($attachment->{content})) > MAX_ATTACHMENT_SIZE * 1024) { - ThrowUserError('tum_attachment_too_large', { filename => $attachment->{filename}, max => MAX_ATTACHMENT_SIZE }); - } - } - } - - # products are mapped to components of the target-product - - Bugzilla::Component->new({ name => $params->{product}, product => $self->_target_product }) - || ThrowUserError('invalid_product_name', { product => $params->{product} }); -} - -sub _set_missing_params { - my ($self, $params) = @_; - - # set the product and component correctly - - $params->{component} = $params->{product}; - $params->{product} = TARGET_PRODUCT; - - # priority, bug_severity - - $params->{priority} = Bugzilla->params->{defaultpriority}; - $params->{bug_severity} = Bugzilla->params->{defaultseverity}; - - # map invalid versions to 'unspecified' - - if (!$params->{version}) { - $params->{version} = DEFAULT_VERSION; - } else { - Bugzilla::Version->new({ product => $self->_target_product, name => $params->{version} }) - || ($params->{version} = DEFAULT_VERSION); - } - - # set url - - $params->{bug_file_loc} = $params->{url}; - - # detect the opsys and platform from user_agent - - $ENV{HTTP_USER_AGENT} = $params->{user_agent}; - $params->{rep_platform} = detect_platform(); - $params->{op_sys} = detect_op_sys(); - - # set group based on restricted - - $params->{group} = $params->{restricted} ? SECURITY_GROUP : ''; - delete $params->{restricted}; -} - -sub _get_user { - my ($self, $email) = @_; - - return Bugzilla::User->new({ name => $email }); -} - -sub _insert { - my ($self, $params, $token) = @_; - my $dbh = Bugzilla->dbh; - - local $Data::Dumper::Purity = 1; - local $Data::Dumper::Sortkeys = 1; - my $content = Dumper($params); - trick_taint($content); - - my $sth = $dbh->prepare(' - INSERT INTO tell_us_more(token, mail, creation_ts, content) - VALUES(?, ?, ?, ?) - '); - $sth->bind_param(1, $token); - $sth->bind_param(2, $params->{creator}); - $sth->bind_param(3, $dbh->selectrow_array('SELECT LOCALTIMESTAMP(0)')); - $sth->bind_param(4, $content, $dbh->BLOB_TYPE); - $sth->execute(); - - return $dbh->bz_last_key('tell_us_more', 'id'); -} - -sub _generate_email { - my ($self, $params, $token, $user) = @_; - - # create email parts - - my $template = Bugzilla->template_inner; - my ($message_header, $message_text, $message_html); - my $vars = { - token_url => correct_urlbase() . 'page.cgi?id=tellusmore.html&token=' . url_quote($token), - recipient_email => $params->{creator}, - recipient_name => ($user ? $user->name : $params->{creator_name}), - }; - - my $prefix = $user ? 'existing' : 'new'; - $template->process("email/$prefix-account.header.tmpl", $vars, \$message_header) - || ThrowCodeError('template_error', { template_error_msg => $template->error() }); - $template->process("email/$prefix-account.txt.tmpl", $vars, \$message_text) - || ThrowCodeError('template_error', { template_error_msg => $template->error() }); - $template->process("email/$prefix-account.html.tmpl", $vars, \$message_html) - || ThrowCodeError('template_error', { template_error_msg => $template->error() }); - - # create email object - - my @parts = ( - Email::MIME->create( - attributes => { content_type => "text/plain" }, - body => $message_text, - ), - Email::MIME->create( - attributes => { content_type => "text/html" }, - body => $message_html, - ), - ); - my $email = new Email::MIME("$message_header\n"); - $email->content_type_set('multipart/alternative'); - $email->parts_set(\@parts); - - return $email; -} - -sub _validate_mandatory { - my ($self, $params, $name, @fields) = @_; - - my @missing_fields; - foreach my $field (@fields) { - if (!exists $params->{$field} || $params->{$field} eq '') { - push @missing_fields, $field; - } - } - - if (scalar @missing_fields) { - ThrowUserError('tum_missing_fields', { name => $name, missing => \@missing_fields }); - } -} - -sub _remove_invalid_fields { - my ($self, $params, @valid_fields) = @_; - - foreach my $field (keys %$params) { - if (!grep { $_ eq $field } @valid_fields) { - delete $params->{$field}; - } - } -} - -sub _validate_rate { - my ($self, $params) = @_; - my $dbh = Bugzilla->dbh; - - my ($report_count) = $dbh->selectrow_array(' - SELECT COUNT(*) - FROM tell_us_more - WHERE mail = ? - AND creation_ts >= NOW() - ' . $dbh->sql_interval(1, 'MINUTE') - , undef, $params->{creator} - ); - if ($report_count + 1 > MAX_REPORTS_PER_MINUTE) { - ThrowUserError('tum_rate_exceeded', { max => MAX_REPORTS_PER_MINUTE }); - } -} - -sub _target_product { - my ($self) = @_; - - my $product = Bugzilla::Product->new({ name => TARGET_PRODUCT }) - || ThrowUserError('invalid_product_name', { product => TARGET_PRODUCT }); - return $product; -} - -1; diff --git a/extensions/TellUsMore/template/en/default/email/existing-account.header.tmpl b/extensions/TellUsMore/template/en/default/email/existing-account.header.tmpl deleted file mode 100644 index b4d5b10dc..000000000 --- a/extensions/TellUsMore/template/en/default/email/existing-account.header.tmpl +++ /dev/null @@ -1,10 +0,0 @@ -[%# This Source Code Form is subject to the terms of the Mozilla Public - # License, v. 2.0. If a copy of the MPL was not distributed with this - # file, You can obtain one at http://mozilla.org/MPL/2.0/. - # - # This Source Code Form is "Incompatible With Secondary Licenses", as - # defined by the Mozilla Public License, v. 2.0. - #%] -Subject: Thank you filing a [% terms.bug %] on Firefox! -From: Mozilla Development Team <nobody@mozilla.org> -To: [% recipient_name FILTER none %] <[% recipient_email FILTER none %]> diff --git a/extensions/TellUsMore/template/en/default/email/existing-account.html.tmpl b/extensions/TellUsMore/template/en/default/email/existing-account.html.tmpl deleted file mode 100644 index 923caded6..000000000 --- a/extensions/TellUsMore/template/en/default/email/existing-account.html.tmpl +++ /dev/null @@ -1,36 +0,0 @@ -[%# This Source Code Form is subject to the terms of the Mozilla Public - # License, v. 2.0. If a copy of the MPL was not distributed with this - # file, You can obtain one at http://mozilla.org/MPL/2.0/. - # - # This Source Code Form is "Incompatible With Secondary Licenses", as - # defined by the Mozilla Public License, v. 2.0. - #%] -<p> -Thank you filing a [% terms.bug %] on Firefox! We appreciate you taking the time out of -your day to enhance the quality of our favorite open web browser. -</p> - -<p> -Wait one second though! Before this [% terms.bug %] is filed, we need you to confirm this -is a real e-mail account. So, please click on the link below to confirm that it -is! -</p> - -<p> -<a href="[% token_url FILTER none %]">[% token_url FILTER html %]</a> -</p> - -<p> -If you'd like to get involved with the Mozilla Community in other ways such as -localization, testing, development and design, please look at our Get Involved -page: -</p> - -<p> -<a href="http://www.mozilla.org/contribute/">http://www.mozilla.org/contribute/</a> -</p> - -<p> -Thank You For Your Help,<br> -The Firefox Development Team -</p> diff --git a/extensions/TellUsMore/template/en/default/email/existing-account.txt.tmpl b/extensions/TellUsMore/template/en/default/email/existing-account.txt.tmpl deleted file mode 100644 index e3d82e37f..000000000 --- a/extensions/TellUsMore/template/en/default/email/existing-account.txt.tmpl +++ /dev/null @@ -1,24 +0,0 @@ -[%# This Source Code Form is subject to the terms of the Mozilla Public - # License, v. 2.0. If a copy of the MPL was not distributed with this - # file, You can obtain one at http://mozilla.org/MPL/2.0/. - # - # This Source Code Form is "Incompatible With Secondary Licenses", as - # defined by the Mozilla Public License, v. 2.0. - #%] -Thank you filing a [% terms.bug %] on Firefox! We appreciate you taking the time out of -your day to enhance the quality of our favorite open web browser. - -Wait one second though! Before this [% terms.bug %] is filed, we need you to confirm this -is a real e-mail account. So, please click on the link below to confirm that it -is! - -[% token_url FILTER none %] - -If you'd like to get involved with the Mozilla Community in other ways such as -localization, testing, development and design, please look at our Get Involved -page: - -http://www.mozilla.org/contribute/ - -Thank You For Your Help, -The Firefox Development Team diff --git a/extensions/TellUsMore/template/en/default/email/new-account.header.tmpl b/extensions/TellUsMore/template/en/default/email/new-account.header.tmpl deleted file mode 100644 index b4d5b10dc..000000000 --- a/extensions/TellUsMore/template/en/default/email/new-account.header.tmpl +++ /dev/null @@ -1,10 +0,0 @@ -[%# This Source Code Form is subject to the terms of the Mozilla Public - # License, v. 2.0. If a copy of the MPL was not distributed with this - # file, You can obtain one at http://mozilla.org/MPL/2.0/. - # - # This Source Code Form is "Incompatible With Secondary Licenses", as - # defined by the Mozilla Public License, v. 2.0. - #%] -Subject: Thank you filing a [% terms.bug %] on Firefox! -From: Mozilla Development Team <nobody@mozilla.org> -To: [% recipient_name FILTER none %] <[% recipient_email FILTER none %]> diff --git a/extensions/TellUsMore/template/en/default/email/new-account.html.tmpl b/extensions/TellUsMore/template/en/default/email/new-account.html.tmpl deleted file mode 100644 index 41006592b..000000000 --- a/extensions/TellUsMore/template/en/default/email/new-account.html.tmpl +++ /dev/null @@ -1,36 +0,0 @@ -[%# This Source Code Form is subject to the terms of the Mozilla Public - # License, v. 2.0. If a copy of the MPL was not distributed with this - # file, You can obtain one at http://mozilla.org/MPL/2.0/. - # - # This Source Code Form is "Incompatible With Secondary Licenses", as - # defined by the Mozilla Public License, v. 2.0. - #%] -<p> -Thank you filing a [% terms.bugs %] on Firefox! We appreciate you taking the time out of -your day to enhance the quality of our favorite open web browser. -</p> - -<p> -Wait one second though! Before this [% terms.bugs %] is filed, we need you to confirm this -is a real e-mail account. So, please click on the link below to confirm that it -is! -</p> - -<p> -<a href="[% token_url FILTER none %]">[% token_url FILTER html %]</a> -</p> - -<p> -If you'd like to get involved with the Mozilla Community in other ways such as -localization, testing, development and design, please look at our Get Involved -page: -</p> - -<p> -<a href="http://www.mozilla.org/contribute/">http://www.mozilla.org/contribute/</a> -</p> - -<p> -Thank You For Your Help,<br> -The Firefox Development Team -</p> diff --git a/extensions/TellUsMore/template/en/default/email/new-account.txt.tmpl b/extensions/TellUsMore/template/en/default/email/new-account.txt.tmpl deleted file mode 100644 index 93d2a3eea..000000000 --- a/extensions/TellUsMore/template/en/default/email/new-account.txt.tmpl +++ /dev/null @@ -1,24 +0,0 @@ -[%# This Source Code Form is subject to the terms of the Mozilla Public - # License, v. 2.0. If a copy of the MPL was not distributed with this - # file, You can obtain one at http://mozilla.org/MPL/2.0/. - # - # This Source Code Form is "Incompatible With Secondary Licenses", as - # defined by the Mozilla Public License, v. 2.0. - #%] -Thank you filing a [% terms.bugs %] on Firefox! We appreciate you taking the time out of -your day to enhance the quality of our favorite open web browser. - -Wait one second though! Before this [% terms.bugs %] is filed, we need you to confirm this -is a real e-mail account. So, please click on the link below to confirm that it -is! - -[% token_url FILTER none %] - -If you'd like to get involved with the Mozilla Community in other ways such as -localization, testing, development and design, please look at our Get Involved -page: - -http://www.mozilla.org/contribute/ - -Thank You For Your Help, -The Firefox Development Team diff --git a/extensions/TellUsMore/template/en/default/hook/global/user-error-errors.html.tmpl b/extensions/TellUsMore/template/en/default/hook/global/user-error-errors.html.tmpl deleted file mode 100644 index 16fe2f1a3..000000000 --- a/extensions/TellUsMore/template/en/default/hook/global/user-error-errors.html.tmpl +++ /dev/null @@ -1,39 +0,0 @@ -[%# This Source Code Form is subject to the terms of the Mozilla Public - # License, v. 2.0. If a copy of the MPL was not distributed with this - # file, You can obtain one at http://mozilla.org/MPL/2.0/. - # - # This Source Code Form is "Incompatible With Secondary Licenses", as - # defined by the Mozilla Public License, v. 2.0. - #%] - -[% IF error == "tum_auth_failure" %] - You are not authorized to use this feature. - -[% ELSIF error == "tum_updates_disabled" %] - Issue reporting is temporarily disabled; please wait a few minutes and try again. - -[% ELSIF error == "tum_account_disabled" %] - The account associated with '[% user.login FILTER none %]' is disabled: - [% user.disabledtext FILTER none %] - -[% ELSIF error == "tum_too_many_attachments" %] - More than [% max FILTER none %] attachments were provided. - -[% ELSIF error == "tum_attachment_too_large" %] - [% filename FILTER none %] is larger than [% max FILTER none %]k. - -[% ELSIF error == "tum_missing_fields" %] - [% name FILTER none %] is missing the following mandatory field - [%~ "s" IF missing.size > 1 %]: [%%] - [% FOREACH field = missing %] - [% field FILTER none %] - [%~ ", " UNLESS loop.last() %] - [% END %] - -[% ELSIF error == "tum_rate_exceeded" %] - You cannot report more than [% max FILTER none %] issues per minute. - -[% ELSIF error == "tum_invalid_component" %] - The product [% product FILTER none %] is missing the component [% name FILTER none %]. - -[% END %] |