diff -Nur mantis-1.0.0rc1/admin/schema.php mantis/admin/schema.php --- mantis-1.0.0rc1/admin/schema.php Wed Jul 6 01:48:48 2005 +++ mantis/admin/schema.php Sun Aug 7 14:38:28 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')," @@ -216,13 +219,17 @@ $upgrade[] = Array('CreateTableSQL',Array(config_get('mantis_project_table')," id I UNSIGNED PRIMARY NOTNULL AUTOINCREMENT, - name C(128) NOTNULL DEFAULT \" '' \", + name C(128) NOTULL DEFAULT \" '' \", status I2 NOTNULL DEFAULT '10', enabled L NOTNULL DEFAULT '1', 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'))); @@ -339,5 +346,6 @@ $upgrade[] = Array('InsertData', Array( config_get('mantis_user_table'), "(1, 'administrator', '', 'root@localhost', '63a9f0ea7bb98050796b649e85481845', '2003-02-16 02:03:48', '2004-07-08 23:59:22', 1, 1, 90, 3, 0, 0, MD5(NOW()))" ) + "(2, 'mail', 'Mail Reporter', 'nomail@localhost', 'a268462c3c679a9027658c5aa723f97c', '2003-02-16 02:03:48', '2004-07-08 23:59:22', 1, 0, 25, 0, 0, 0, MD5(NOW()))" ) ); ?> diff -Nur mantis-1.0.0rc1/bug_report_mail.php mantis/bug_report_mail.php --- mantis-1.0.0rc1/bug_report_mail.php Thu Jan 1 01:00:00 1970 +++ mantis/bug_report_mail.php Sun Aug 7 13:51:56 2005 @@ -0,0 +1,39 @@ + + diff -Nur mantis-1.0.0rc1/config_defaults_inc.php mantis/config_defaults_inc.php --- mantis-1.0.0rc1/config_defaults_inc.php Sat Jul 23 01:37:06 2005 +++ mantis/config_defaults_inc.php Sun Aug 7 14:20:17 2005 @@ -1611,4 +1611,35 @@ # ) # ); $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; + ?> diff -Nur mantis-1.0.0rc1/core/category_api.php mantis/core/category_api.php --- mantis-1.0.0rc1/core/category_api.php Sat Feb 12 21:01:10 2005 +++ mantis/core/category_api.php Sun Aug 7 10:05:49 2005 @@ -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.0rc1/core/mail_api.php mantis/core/mail_api.php --- mantis-1.0.0rc1/core/mail_api.php Thu Jan 1 01:00:00 1970 +++ mantis/core/mail_api.php Sun Aug 7 14:27:34 2005 @@ -0,0 +1,449 @@ +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->description = "Report from: ".$p_mail['From']."\n\n".$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.0rc1/core/user_api.php mantis/core/user_api.php --- mantis-1.0.0rc1/core/user_api.php Fri Jul 22 17:34:02 2005 +++ mantis/core/user_api.php Sun Aug 7 10:09:36 2005 @@ -526,6 +526,26 @@ } } + # 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.0rc1/doc/README.bug_report_mail mantis/doc/README.bug_report_mail --- mantis-1.0.0rc1/doc/README.bug_report_mail Thu Jan 1 01:00:00 1970 +++ mantis/doc/README.bug_report_mail Sun Aug 7 14:40:33 2005 @@ -0,0 +1,109 @@ +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/file_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: +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.0rc1/doc/bug_report_mail.sql mantis/doc/bug_report_mail.sql --- mantis-1.0.0rc1/doc/bug_report_mail.sql Thu Jan 1 01:00:00 1970 +++ mantis/doc/bug_report_mail.sql Sun Aug 7 10:48:26 2005 @@ -0,0 +1,11 @@ +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 ; + diff -Nur mantis-1.0.0rc1/manage_proj_cat_edit_page.php mantis/manage_proj_cat_edit_page.php --- mantis-1.0.0rc1/manage_proj_cat_edit_page.php Sat Feb 12 21:01:06 2005 +++ mantis/manage_proj_cat_edit_page.php Sun Aug 7 10:23:56 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 @@ + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + +
+ + + +
+ +
+
+
+ +
+
+ + + +
+
+ + diff -Nur mantis-1.0.0rc1/manage_proj_cat_mail_delete.php mantis/manage_proj_cat_mail_delete.php --- mantis-1.0.0rc1/manage_proj_cat_mail_delete.php Thu Jan 1 01:00:00 1970 +++ mantis/manage_proj_cat_mail_delete.php Sun Aug 7 10:24:56 2005 @@ -0,0 +1,44 @@ + + +
+
+'; + + print_bracket_link( $t_redirect_url, lang_get( 'proceed' ) ); +?> +
+ + + diff -Nur mantis-1.0.0rc1/manage_proj_cat_mail_update.php mantis/manage_proj_cat_mail_update.php --- mantis-1.0.0rc1/manage_proj_cat_mail_update.php Thu Jan 1 01:00:00 1970 +++ mantis/manage_proj_cat_mail_update.php Sun Aug 7 10:25:59 2005 @@ -0,0 +1,59 @@ + + +
+
+'; + + print_bracket_link( $t_redirect_url, lang_get( 'proceed' ) ); +?> +
+ + + diff -Nur mantis-1.0.0rc1/manage_proj_edit_page.php mantis/manage_proj_edit_page.php --- mantis-1.0.0rc1/manage_proj_edit_page.php Tue Jul 19 15:42:48 2005 +++ mantis/manage_proj_edit_page.php Sun Aug 7 10:41:35 2005 @@ -18,6 +18,7 @@ require_once( $t_core_path . 'version_api.php' ); require_once( $t_core_path . 'custom_field_api.php' ); require_once( $t_core_path . 'icon_api.php' ); + require_once( $t_core_path . 'mail_api.php' ); ?> @@ -690,4 +692,76 @@ + + +
+
+
+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + +
+ + + +
+ +
+
+
+ +
+
+ + +
+
+
+ +
+
+ + + +
+
+ + +
+
+ + + +
+
+ + + diff -Nur mantis-1.0.0rc1/manage_proj_mail_categories.php mantis/manage_proj_mail_categories.php --- mantis-1.0.0rc1/manage_proj_mail_categories.php Thu Jan 1 01:00:00 1970 +++ mantis/manage_proj_mail_categories.php Sun Aug 7 10:30:02 2005 @@ -0,0 +1,43 @@ + + +
+
+'; + print_bracket_link( $t_redirect_url, lang_get( 'proceed' ) ); +?> +
+ + + diff -Nur mantis-1.0.0rc1/manage_proj_mail_delete.php mantis/manage_proj_mail_delete.php --- mantis-1.0.0rc1/manage_proj_mail_delete.php Thu Jan 1 01:00:00 1970 +++ mantis/manage_proj_mail_delete.php Sun Aug 7 10:31:01 2005 @@ -0,0 +1,43 @@ + + +
+
+'; + + print_bracket_link( $t_redirect_url, lang_get( 'proceed' ) ); +?> +
+ + + diff -Nur mantis-1.0.0rc1/manage_proj_mail_update.php mantis/manage_proj_mail_update.php --- mantis-1.0.0rc1/manage_proj_mail_update.php Thu Jan 1 01:00:00 1970 +++ mantis/manage_proj_mail_update.php Sun Aug 7 13:18:48 2005 @@ -0,0 +1,58 @@ + + +
+
+'; + + print_bracket_link( $t_redirect_url, lang_get( 'proceed' ) ); +?> +
+ + +