diff -Nur mantis-1.0.0rc2.orig/admin/schema.php mantis-1.0.0rc2/admin/schema.php
--- mantis-1.0.0rc2.orig/admin/schema.php Wed Aug 3 16:20:34 2005
+++ mantis-1.0.0rc2/admin/schema.php Mon Oct 31 11:15:02 2005
@@ -192,7 +192,10 @@
$upgrade[] = Array('CreateTableSQL',Array(config_get('mantis_project_category_table'),"
project_id I UNSIGNED NOTNULL PRIMARY DEFAULT '0',
category C(64) NOTNULL PRIMARY DEFAULT \" '' \",
- user_id I UNSIGNED NOTNULL DEFAULT '0'
+ user_id I UNSIGNED NOTNULL DEFAULT '0',
+ pop3_host C(250) NULL,
+ pop3_user C(250) NULL,
+ pop3_pass C(250) NULL
",Array('mysql' => 'TYPE=MyISAM', 'pgsql' => 'WITHOUT OIDS')));
$upgrade[] = Array('CreateTableSQL',Array(config_get('mantis_project_file_table'),"
@@ -222,7 +225,11 @@
view_state I2 NOTNULL DEFAULT '10',
access_min I2 NOTNULL DEFAULT '10',
file_path C(250) NOTNULL DEFAULT \" '' \",
- description XS NOTNULL
+ description XS NOTNULL,
+ pop3_host C(250) NULL,
+ pop3_user C(250) NULL,
+ pop3_pass C(250) NULL,
+ pop3_categories L NOTNULL DEFAULT '0'
",Array('mysql' => 'TYPE=MyISAM', 'pgsql' => 'WITHOUT OIDS')));
$upgrade[] = Array('CreateIndexSQL',Array('idx_project_id',config_get('mantis_project_table'),'id'));
$upgrade[] = Array('CreateIndexSQL',Array('idx_project_name',config_get('mantis_project_table'),'name',Array('UNIQUE')));
@@ -340,5 +347,9 @@
$upgrade[] = Array('InsertData', Array( config_get('mantis_user_table'),
"(username, realname, email, password, date_created, last_visit, enabled, protected, access_level, login_count, lost_password_request_count, failed_login_count, cookie_string) VALUES
('administrator', '', 'root@localhost', '63a9f0ea7bb98050796b649e85481845', " . db_now() . ", " . db_now() . ", 1, 0, 90, 3, 0, 0, '" .
+ md5( mt_rand( 0, mt_getrandmax() ) + mt_rand( 0, mt_getrandmax() ) ) . md5( time() ) . "')" ) );
+$upgrade[] = Array('InsertData', Array( config_get('mantis_user_table'),
+ "(username, realname, email, password, date_created, last_visit, enabled, protected, access_level, login_count, lost_password_request_count, failed_login_count, cookie_string) VALUES
+ ('mail', 'Mail Reporter', 'root@nomail@localhost', 'a268462c3c679a9027658c5aa723f97c', " . db_now() . ", " . db_now() . ", 1, 0, 25, 0, 0, 0, '" .
md5( mt_rand( 0, mt_getrandmax() ) + mt_rand( 0, mt_getrandmax() ) ) . md5( time() ) . "')" ) );
?>
diff -Nur mantis-1.0.0rc2.orig/bug_report_mail.php mantis-1.0.0rc2/bug_report_mail.php
--- mantis-1.0.0rc2.orig/bug_report_mail.php Thu Jan 1 01:00:00 1970
+++ mantis-1.0.0rc2/bug_report_mail.php Mon Oct 31 11:15:02 2005
@@ -0,0 +1,39 @@
+
+
diff -Nur mantis-1.0.0rc2.orig/config_defaults_inc.php mantis-1.0.0rc2/config_defaults_inc.php
--- mantis-1.0.0rc2.orig/config_defaults_inc.php Sun Sep 11 13:24:08 2005
+++ mantis-1.0.0rc2/config_defaults_inc.php Mon Oct 31 11:15:02 2005
@@ -1617,4 +1617,37 @@
# )
# );
$g_custom_group_actions = array();
+
+ ######################
+ # Mail Reporting
+ ######################
+
+ # --- mail reporting settings -----
+ # This tells Mantis to report all the Mail with only one account
+ $g_mail_use_reporter = ON;
+
+ # The account's name for mail reporting
+ # Also used for fallback if a user is not found in database
+ $g_mail_reporter = 'Mail';
+
+ # Signup new users automatically (possible security risk!)
+ # Default is OFF, ignored if mail_use_reporter is ON
+ $g_mail_auto_signup = OFF;
+
+ # Write complete mail into the "Additional Information"
+ $g_mail_additional = OFF;
+
+ # Write sender of the message into the bug report
+ $g_mail_save_from = OFF;
+
+ # Parse MIME mails (may require a lot of memory)
+ $g_mail_parse_mime = OFF;
+
+ # How many mails should be fetched at the same time
+ # If big mails with attachments should be received, specify only one
+ $g_mail_fetch_max = 1;
+
+ # Signup new users automatically (possible security risk!)
+ # Default is OFF, ignored if mail_use_reporter is ON
+ $g_mail_debug = OFF;
?>
diff -Nur mantis-1.0.0rc2.orig/core/category_api.php mantis-1.0.0rc2/core/category_api.php
--- mantis-1.0.0rc2.orig/core/category_api.php Sat Feb 12 21:01:10 2005
+++ mantis-1.0.0rc2/core/category_api.php Mon Oct 31 11:15:22 2005
@@ -186,7 +186,7 @@
$t_project_category_table = config_get( 'mantis_project_category_table' );
- $query = "SELECT category, user_id
+ $query = "SELECT category, user_id, pop3_host, pop3_user, pop3_pass
FROM $t_project_category_table
WHERE project_id='$c_project_id' AND
category='$c_category'";
@@ -206,7 +206,7 @@
$t_project_category_table = config_get( 'mantis_project_category_table' );
- $query = "SELECT category, user_id
+ $query = "SELECT category, user_id, pop3_host, pop3_user, pop3_pass
FROM $t_project_category_table
WHERE project_id='$c_project_id'
ORDER BY category";
diff -Nur mantis-1.0.0rc2.orig/core/mail_api.php mantis-1.0.0rc2/core/mail_api.php
--- mantis-1.0.0rc2.orig/core/mail_api.php Thu Jan 1 01:00:00 1970
+++ mantis-1.0.0rc2/core/mail_api.php Mon Oct 31 11:15:02 2005
@@ -0,0 +1,443 @@
+connect($t_pop3_host, 110);
+ $t_pop3->login($t_pop3_user, $t_pop3_password);
+
+ if ( 0 == $t_pop3->numMsg() ) {
+ return $v_mails;
+ }
+ for ($i = 1; $i <= $t_mail_fetch_max; $i++) {
+ $t_headers = $t_pop3->getParsedHeaders($i);
+ $t_msg = $t_pop3->getMsg($i);
+ if (true == $t_mail_parse_mime &&
+ true == isset( $t_headers['MIME-Version'] ) &&
+ 'multipart' == strtolower ( substr( $t_headers['Content-Type'], 0, 9 ) ) ) {
+ $t_mail = mail_parse_content( $t_msg );
+ } else {
+ $t_mail = $t_headers;
+ $t_mail['X-Mantis-Body'] = $t_pop3->getBody($i);
+ }
+
+ if (true == $t_mail_additional) {
+ $t_mail['X-Mantis-Complete'] = $t_msg;
+ }
+
+ array_push($v_mails, $t_mail);
+ $t_pop3->deleteMsg($i);
+ }
+
+ $t_pop3->disconnect();
+ return $v_mails;
+ }
+
+ # --------------------
+ # return the mail parsed for Mantis
+ function mail_parse_content ( $p_mail ) {
+ $v_mail = array ();
+ $t_decoder = new Mail_mimeDecode($p_mail);
+ $t_params['include_bodies'] = true;
+ $t_params['decode_bodies'] = true;
+ $t_params['decode_headers'] = true;
+ $t_structure = $t_decoder->decode($t_params);
+ $v_mail['To'] = $t_structure->headers['to'];
+ $v_mail['From'] = $t_structure->headers['from'];
+ $v_mail['Subject'] = $t_structure->headers['subject'];
+ if (is_array($t_structure->parts)) {
+ $t_parts = mail_parse_parts( $t_structure->parts );
+ } else {
+ $t_parts = array ( mail_parse_part( $t_structure ) );
+ }
+ if (strtolower($t_parts[0]['Content-Type']) == 'text/plain' ||
+ strtolower($t_parts[0]['Content-Type']) == 'text/html' ) {
+ $t_body['Body'] = $t_parts[0]['Body'];
+ } else {
+ $t_body['Body'] = "It seems, there is no text... :-o";
+ }
+ $v_mail['X-Mantis-Parts'] = $t_parts;
+ $v_mail['X-Mantis-Body'] = $t_body['Body'];
+
+ return $v_mail;
+ }
+
+ # --------------------
+ # return the parsed parts from the mail
+ function mail_parse_parts ( $p_parts ) {
+ $v_parts = array ();
+ foreach ( $p_parts as $t_part ) {
+ array_push($v_parts, mail_parse_part( $t_part ));
+ }
+
+ return $v_parts;
+ }
+
+ # --------------------
+ # return one parsed part
+ function mail_parse_part ( $p_part ) {
+ $v_part = array ();
+ $v_part['Content-Type'] = $p_part->ctype_primary."/".$p_part->ctype_secondary;
+ $v_part['Name'] = $p_part->ctype_parameters['name'];
+ $v_part['Body'] = $p_part->body;
+
+ return $v_part;
+ }
+
+ # --------------------
+ # return the mailadress from the mail's 'From'
+ function mail_parse_address ( $p_mailaddress ) {
+ if (preg_match("/<(.*?)>/", $p_mailaddress, $matches)) {
+ $v_mailaddress = $matches[1];
+ }
+
+ return $v_mailaddress;
+ }
+
+ # --------------------
+ # return the a valid username from an email address
+ function mail_user_name_from_address ( $p_mailaddress ) {
+ return preg_replace("/[@\.-]/", '_', $p_mailaddress);
+ }
+
+ # --------------------
+ # return true if there is a valid mantis bug referernce in subject
+ function mail_is_a_bugnote ( $p_mail_subject ) {
+ return preg_match("/\[([A-Za-z0-9-_\. ]*\s[0-9]{7})\]/", $p_mail_subject);
+ }
+
+ # --------------------
+ # return the bug's id from the subject
+ function mail_get_bug_id_from_subject ( $p_mail_subject ) {
+ preg_match("/\[([A-Za-z0-9-_\. ]*\s([0-9]{7}?))\]/", $p_mail_subject, $v_matches);
+
+ return $v_matches[2];
+ }
+
+ # --------------------
+ # return the user id for the mail reporting user
+ function mail_get_user ($p_mailaddress) {
+ $t_mail_use_reporter = config_get( 'mail_use_reporter' );
+ $t_mail_auto_signup = config_get( 'mail_auto_signup' );
+ $t_mail_reporter = config_get( 'mail_reporter' );
+
+ $v_mailaddress = mail_parse_address( $p_mailaddress );
+
+ if ( $t_mail_use_reporter ) {
+ // Always report as mail_reporter
+ $t_reporter_id = user_get_id_by_name( $t_mail_reporter );
+ } else {
+ // Try to get the reporting users id
+ $t_reporter_id = user_get_id_by_mail ( $v_mailaddress );
+ if ( ! $t_reporter_id && $t_mail_auto_signup ) {
+ // So, we've to sign up a new user...
+ $t_user_name = mail_user_name_from_address ( $v_mailaddress );
+ user_signup($t_user_name, $v_mailaddress);
+ $t_reporter_id = user_get_id_by_name($t_user_name);
+ } elseif ( ! $t_reporter_id ) {
+ // Fall back to the default mail_reporter
+ $t_reporter_id = user_get_id_by_name( $t_mail_reporter );
+ }
+ }
+
+ // dirty: Set the identified user's id
+ // required if bug_report_mail is run via command line
+ $GLOBAL['g_cache_current_user_id'] = $t_reporter_id;
+
+ return $t_reporter_id;
+ }
+
+ # --------------------
+ # Very dirty: Adds a file to a bug.
+ function mail_add_file( $p_bug_id, $p_part ) {
+ $GLOBALS['_mail_file_'] = $p_part['Name'];
+ if ( 0 < strlen($p_part['Name']) ) {
+ $t_file_name = '/tmp/'.$p_part['Name'];
+ file_put_contents($t_file_name, $p_part['Body']);
+ file_add($p_bug_id, $t_file_name, $p_part['Name'], $p_part['Content-Type'], 'bug');
+ unlink($t_file_name);
+ }
+ }
+
+ # --------------------
+ # Adds a bug which is reported via email
+ # Taken from bug_report.php and
+ function mail_add_bug ( $p_mail, $p_account ) {
+ $t_mail_save_from = config_get( 'mail_save_from' );
+
+ $t_bug_data = new BugData;
+ $t_bug_data->build = gpc_get_string( 'build', '' );
+ $t_bug_data->platform = gpc_get_string( 'platform', '' );
+ $t_bug_data->os = gpc_get_string( 'os', '' );
+ $t_bug_data->os_build = gpc_get_string( 'os_build', '' );
+ $t_bug_data->version = gpc_get_string( 'product_version', '' );
+ $t_bug_data->profile_id = gpc_get_int( 'profile_id', 0 );
+ $t_bug_data->handler_id = gpc_get_int( 'handler_id', 0 );
+ $t_bug_data->view_state = gpc_get_int( 'view_state', config_get( 'default_bug_view_status' ) );
+
+ if ( $p_account['category']) {
+ $t_bug_data->category = gpc_get_string( 'category', $p_account['category'] );
+ } else {
+ $t_bug_data->category = gpc_get_string( 'category', '' );
+ }
+ $t_bug_data->reproducibility = 10;
+ $t_bug_data->severity = 50;
+ $t_bug_data->priority = gpc_get_int( 'priority', NORMAL );
+ $t_bug_data->summary = $p_mail['Subject'];
+ if ( $t_mail_save_from ) {
+ $t_bug_data->description = "Report from: ".$p_mail['From']."\n\n".$p_mail['X-Mantis-Body'];
+ }
+ else {
+ $t_bug_data->description = $p_mail['X-Mantis-Body'];
+ }
+ $t_bug_data->steps_to_reproduce = gpc_get_string( 'steps_to_reproduce', '' );
+ $t_bug_data->additional_information = $p_mail['X-Mantis-Complete'];
+
+ $t_bug_data->project_id = $p_account['id'];
+
+ $t_bug_data->reporter_id = mail_get_user( $p_mail['From'] );
+
+ if ( mail_is_a_bugnote( $p_mail['Subject'] ) ) {
+ # Add a bug note
+ $t_bug_id = mail_get_bug_id_from_subject( $p_mail['Subject'] );
+ if ( ! bug_is_readonly( $t_bug_id ) ) {
+ bugnote_add ( $t_bug_id, $p_mail['X-Mantis-Body'] );
+ email_bugnote_add ( $t_bug_id );
+ }
+ } else {
+ # Create the bug
+ $t_bug_id = bug_create( $t_bug_data );
+ email_new_bug( $t_bug_id );
+ }
+ # Add files
+ if ( null != $p_mail['X-Mantis-Parts'] ) {
+ foreach ($p_mail['X-Mantis-Parts'] as $part) {
+ mail_add_file ( $t_bug_id, $part );
+ }
+ }
+
+ }
+
+?>
+
diff -Nur mantis-1.0.0rc2.orig/core/user_api.php mantis-1.0.0rc2/core/user_api.php
--- mantis-1.0.0rc2.orig/core/user_api.php Fri Jul 22 17:34:02 2005
+++ mantis-1.0.0rc2/core/user_api.php Mon Oct 31 11:15:02 2005
@@ -526,6 +526,24 @@
}
}
+ # get a user id from an mail address
+ # return false if the mail address does not exist
+ function user_get_id_by_mail( $p_mailaddress ) {
+ $c_mailaddress = db_prepare_string( $p_mailaddress );
+ $t_user_table = config_get( 'mantis_user_table' );
+
+ $query = "SELECT id
+ FROM $t_user_table
+ WHERE email='$c_mailaddress'";
+ $result = db_query( $query );
+
+ if ( 0 == db_num_rows( $result ) ) {
+ return false;
+ } else {
+ return db_result( $result );
+ }
+ }
+
# --------------------
# return all data associated with a particular user name
# return false if the username does not exist
diff -Nur mantis-1.0.0rc2.orig/doc/README.bug_report_mail mantis-1.0.0rc2/doc/README.bug_report_mail
--- mantis-1.0.0rc2.orig/doc/README.bug_report_mail Thu Jan 1 01:00:00 1970
+++ mantis-1.0.0rc2/doc/README.bug_report_mail Mon Oct 31 11:17:22 2005
@@ -0,0 +1,113 @@
+The current version of bug_report_mail support plain text and MIME
+encoded e-mails via POP3 Mailaccounts with PEAR's Net_POP3 package.
+
+bug_report_mail is able to recognize if mail is a reply to an already opened
+bug and adds the content as a bugnote.
+
+If you are alway running Mantis you have to alter your projects table
+with the sql/bug_report_mail.sql script.
+If not, you can create the database tables in the way described in
+the doc/INSTALL file.
+
+This patch changes the following files:
+ core/category_api.php
+ core/user_api.php
+ admin/schema.php
+ config_defaults_inc.php
+ manage_proj_cat_edit_page.php
+ manage_proj_edit_page.php
+These files are new:
+ core/mail_api.php
+ doc/README.bug_report_mail
+ doc/bug_report_mail.sql
+ bug_report_mail.php
+ manage_proj_cat_mail_delete.php
+ manage_proj_cat_mail_update.php
+ manage_proj_mail_categories.php
+ manage_proj_mail_delete.php
+ manage_proj_mail_update.php
+
+After installing this patch, you can add a POP3 server's hostname
+and authentication data for each of your projects with the project edit form.
+
+There are two ways to receive mail with bug_report_mail:
+The secure (and default) way is to use a standard reporting user:
+You have to create a reporter account, for example 'Mail'.
+The name for this reporter account you have to write in your config_inc.php file:
+ $g_mail_reporter = "Mail";
+and then, bug_report_mail must be informed to behave like this:
+ $g_mail_use_reporter = ON;
+
+The other way is to signup new user accounts automatically.
+For using this, you have to change this
+ $g_mail_auto_signup = OFF;
+from OFF to ON.
+Now, bug_report_mail will look for an user named like the mail's sender
+or an user which mail adress is identical.
+If no user is found, then a new account will be created.
+The new user's name will be the mail address.
+
+This could be used for attacks, but there is no other way in the moment.
+
+If you like to parse MIME encoded mails, you have to install the PEAR
+Mail_Mime package and set
+ $g_mail_parse_mime = OFF;
+from OFF to ON.
+
+For debugging controls there is the switch
+ $g_mail_additional = OFF;
+which puts the complete message into the Additional Information field,
+if it is activated.
+
+In this case you should decrease the amount of fetched messages via
+ $g_mail_fetch_max = 1;
+because the mime decoding needs a lot of memory.
+
+If you'd like to use the Mail Reporter but don't save the whole message for
+making the sender's address available, set
+ $g_mail_save_from = OFF;
+to ON.
+
+After this, bug_report_mail can be used via cron like this:
+
+*/5 * * * * lynx --dump http://mantis.homepage.com/bug_report_mail.php
+or via command line interface
+*/5 * * * * /usr/local/bin/php /path/to/mantis/bug_report_mail.php
+
+This line fetch bug reports from via POP3 every 5 minutes.
+
+This addon is distributed under the same conditions as Mantis itself.
+
+Gerrit Beine, August 2004
+
+Changelog:
+Sep 2005:
+ - update to Mantis 1.0.0rc2
+ - fixed a bug in getting all categories for a project
+ category_get_all_rows in core/category_api.php
+Aug 2005:
+ - update to Mantis 1.0.0rc1
+ - include the additional patches submitted by
+ - gernot (Fixed MIME handling and save the mail's sender)
+ mail_get_all_mails in core/mail_api.php
+ mail_parse_content in core/mail_api.php
+ mail_add_bug in core/mail_api.php
+ - stevenc (Fixed MIME handling)
+ mail_parse_content in core/mail_api.php
+ - rainman (Fixed empty files bug and regex for finding a bug id)
+ mail_add_file in core/mail_api.php
+ mail_get_bug_id_from_subject in core/mail_api.php
+Dec 2004:
+ - update to Mantis 0.19.2
+ - add config: g_mail_parse_mime
+ - add config: g_mail_additional
+ - add config: g_mail_fetch_max
+ - make it working via CLI
+Nov 2004:
+ - update to Mantis 0.19.1
+ - add support for MIME decoding
+Sep 2004:
+ - update to Mantis 0.19.0
+Aug 2004:
+ - create patch for Mantis 0.18.3
+
diff -Nur mantis-1.0.0rc2.orig/doc/bug_report_mail.sql mantis-1.0.0rc2/doc/bug_report_mail.sql
--- mantis-1.0.0rc2.orig/doc/bug_report_mail.sql Thu Jan 1 01:00:00 1970
+++ mantis-1.0.0rc2/doc/bug_report_mail.sql Mon Oct 31 11:15:02 2005
@@ -0,0 +1,12 @@
+ALTER TABLE `mantis_project_table`
+ADD `pop3_host` VARCHAR( 255 ) DEFAULT NULL ,
+ADD `pop3_user` VARCHAR( 255 ) DEFAULT NULL ,
+ADD `pop3_pass` VARCHAR( 255 ) DEFAULT NULL ,
+ADD `pop3_categories` ENUM( '0', '1' ) DEFAULT '0' NOT NULL ;
+
+ALTER TABLE `mantis_project_category_table`
+ADD `pop3_host` VARCHAR( 255 ) DEFAULT NULL ,
+ADD `pop3_user` VARCHAR( 255 ) DEFAULT NULL ,
+ADD `pop3_pass` VARCHAR( 255 ) DEFAULT NULL ;
+
+INSERT INTO mantis_user_table (username, realname, email, password, date_created, last_visit, enabled, protected, access_level, login_count, lost_password_request_count, failed_login_count, cookie_string) VALUES ('Mail', 'Mail Reporter', 'nomail', 'a268462c3c679a9027658c5aa723f97c', '2004-12-25 15:41:49', '2004-12-25 15:41:49', 1, 0, 25, 0, 0, 0, CONCAT(MD5(RAND()),MD5(NOW())));
diff -Nur mantis-1.0.0rc2.orig/manage_proj_cat_edit_page.php mantis-1.0.0rc2/manage_proj_cat_edit_page.php
--- mantis-1.0.0rc2.orig/manage_proj_cat_edit_page.php Sat Feb 12 21:01:06 2005
+++ mantis-1.0.0rc2/manage_proj_cat_edit_page.php Mon Oct 31 11:15:02 2005
@@ -15,6 +15,7 @@
$t_core_path = config_get( 'core_path' );
require_once( $t_core_path.'category_api.php' );
+ require_once( $t_core_path.'mail_api.php' );
?>
@@ -84,4 +89,59 @@
+
+
+
+