#版权所有(C)2002-2006 Yves Perrin#版权所有(C)2014、2016、2017 Assaf Gordon#版权所有(C)2001-2011、2013、2017 Sylvain Beucler#版权所有(C)2013、2014、2017-2024 Ineev##此文件是Savane的一部分。##发布2008-03-30之前编写的代码(提交8b757b2565ff)#根据GNU通用公共许可证版本3的条款或(在您的#选项)任何更高版本;其他捐款包括#GNU Affero General Public许可证版本3或(由您选择)#任何更高版本。AGPL和GPL的许可证通知如下。##Savane是一个自由软件:你可以重新发布和/或修改它#根据GNU事务通用公共许可证的条款#由自由软件基金会发布#许可证,或(根据您的选择)任何更高版本。##Savane的分发是为了希望它有用,#但无任何保证;甚至没有#适销性或特定用途的适用性。请参阅#GNU Affero通用公共许可证了解更多详细信息。##您应该已经收到GNU事务通用公共许可证的副本#与此程序一起使用。如果没有,请参阅##Savane是免费软件:您可以重新分发和/或修改它#根据GNU通用公共许可的条款#由自由软件基金会发布#许可证,或(根据您的选择)任何更高版本。##Savane的分发是为了希望它有用,#但无任何保证;甚至没有#适销性或特定用途的适用性。请参阅#GNU通用公共许可证了解更多详细信息。##您应该已经收到GNU通用公共许可证的副本#与此程序一起使用。如果没有,请参阅require_once('../include/init.php');require_once('../include/group.php');require_once('../include/trackers/general.php');require_once('../include/trackers/voots.php');if(!$group_id)exit_no_group();$is_trackeradmin=member_check(0,$group_id,member_create_tracker_flag(ARTIFACT))。'2');函数extract_revert_order(){全局$revert_comment_order,$order_reverted;$revert_comment_order=假;$revert=sane_import('request',['true'=>['revert_order','revert_bis']]);$revert_comment_order=设置($revert['revert_order']);$order_reverted=isset($revert['revert_bis']);if($order_reverted)$revert_comment_order=$回复注释顺序;}extract_revert_order();#提及是否有附加文件:我们无法预先填充HTML输入文件。函数warn_about_uploads(){$文件名=[];对于($i=1;$i<5;$i++)$filenames[]=“input_file$i”;$files=sane_import('files',['pass'=>$filenames]);foreach($files作为$file){if(!is_array($file)|!isset($file['error'])继续;if($file['error']!=UPLOAD_ERR_OK||!isset($file['name']))继续;$msg=冲刺(_(“警告:不要忘记重新附加文件“%s”),$file[“名称”]);fb($msg,1);}}函数fb_anon_check_failed($check){if(!$check)回报;联邦调查局(_(“您没有登录,也没有进入魔法\n”.“反垃圾邮件号码,请返回!”),1);}提取(sane_import(“请求”,[“函数”=>“函数”,“数字”=>['item_file_id','item_cc_id']]));提取(sane_import('post',['true'=>['submitreturn','preview'],“数字”=>[“comment_type_id”,“quote_no”,“new_vote”],“pass”=>“comment”,“preg”=>[['发件人电子邮件','/^[a-zA-Z0-9_.+-]+@(([a-zA-Z0-9-])+\.)+[a-zA-Z0-9]+$/'],]]));#将空值指定给只有跟踪管理员可以修改的字段。foreach公司(['依赖搜索','重新分配更改组搜索','cc_comment','add_cc','重新分配更改组',“depends_search_only_artifact”,“重新分配更改工件”,“depends_search_only_group”,“depender_on_task”,“pendent_on_bugs”,'依赖于支持','依赖于补丁',]作为$var)$$var=空;if($is_trackeradmin)提取(sane_import('post',['pass'=>['depends_search','resignal_change_group_search'],“特殊字符”=>“cc_comment”,“preg”=>[['add_cc','/^[-+_@.,;\s\da-zA-Z]*$/'],['重新分配更改组','/^[-_[:alnum:]]*$/']],“字符串”=>[[“dependens_search_only_artifact”,'重新分配_更改_事实',['all','support','bugs','task','patch']],[“depends_search_only_group”,['any','notany']],“数组”=>[[“dependent_on_task”,“depend _on_bugs”,“从属_ on_support”,“dependent_on_patch”,[null,'数字']]]]));foreach(['reassign_change_group_search','depends_search']作为$var)if(!is_scalar($$var))$$var=“”;提取(sane_import('post',['array’=>[['canned_response',[null,'digits']]]));if(空($canned_reresponse))$canned_rensense=空;提取(sane_import('get',[“数字”=>[“comment_internal_id”,“item_depends_on”],“工件”=>“item_depends_on_artifact”,]));if($have_item_id和空($func))$func='detailitem';#首先初始化全局数据结构。trackers_init($group_id);$project=项目获取对象($group_id);$changed=false;$更改=[];$previous_form_bad_fields=假;$browse_preamble=$address=“”;if(!$func)$func='浏览';$process_comment=假;if($preview||isset($quote_no)||$order_reverted)$process_comment=真;if($process_comment)$submitreturn=1;开关($func){case'search':#搜索项。包括/include/trackers_run/search.php’;断裂;case“digest”:#项目摘要:选择项目。case'digestselectfield':#项目摘要:选择字段。case'digestget':#项目摘要:输出。case'view-dependencies':#特殊摘要。包括/include/trackers_run/digest.php';断裂;case'browse':#列出项目(默认值)。包括'/include/trackers_run/browse.php';断裂;案例“additem”:包括/include/trackers_run/add.php';断裂;案例“detailitem”:包括/include/trackers_run/mod.php';断裂;案例“添加后”:#实际上,在数据库中添加表单中填写的内容。$fields=sane_import('post',['strings'=>[['check','1984年']],#截至2022-02年,前端从未读取spam_stats表,#因此,我们可以安全地“传递”“详细信息”和“formid”。“pass”=>[“form_id”,“details”],“true”=>“submit”]);if(!isset($fields['submit'])$preview=true;数据库_自动执行(“spam_stats”,[“tracker”=>ARTIFACT,“bug_id”=>0,“type”=>“new”,“用户id”=>用户getid(),“表单id”=>$字段['form_id'],“ip”=>“127.0.0.1”,“check_value”=>$fields['check'],“details”=>$fields['details']]);$stat_id=db_insertid(空);$anon_check_failed=错误;if(!user_isloggedin())$anon_check_failed=空($fields['check']);表单检查();#获取表单中使用的错误字段列表。$vfl=trackers_extract_field_list();$item_id=空;if(空($preview)&&$anon_check_failed){#数据控制层。$item_id=trackers_data_create_item($group_id,$vfl,$address);数据库执行(_E)('更新spam_stats设置bug_id=?WHERE id=?',[$item_id,$stat_id]);}if($previous_form_bad_fields||!空($preview)||$anon_check_failed)warn_about_uploads();if($itemid&&空($preview)&&$anon_check_failed){#如果有新文件,请附加新文件。#因为我们需要首先创建项目以获得项目id,所以#函数无法正常工作,我们将无法更新#即时评论,在评论中提及附件。#然而,这不太可能是一个问题,因为#文件是注释旁边的部分,原始的#在最新评论中提交。所以距离总是#最佳。列表($已更改,)=trackers_attach_several_files($item_id,$group_id,$更改);#添加新抄送(如果有)。if($add_cc)trackers_add_cc($item_id,$add_cc,$cc_comment,$changes);#发起人电子邮件:#“提交项目的人的电子邮件地址#(如果与提交者字段不同,请将地址添加到CC列表)”。#仅当字段存在并使用时才应用此行为。$oe_field_name=“发起人电子邮件”;if(trackers_data_is_used($oe_field_name)){#发起人电子邮件仅对匿名用户可用。如果(!user_isloggedin()&&trackers_data_is_showed_on_add_nologin($oe_field_name)){if(validate_email($originator_email))跟踪器_add_cc($item_id,$originator_email,“-SUB-”,$changes);elseif(!空($originator_email))fb(_(“发件人电子邮件无效,因此未添加\n”.“复制到副本列表。”),1);}}#发送电子邮件通知用户项目更新#(对于第一个参数,get_item_notification的第三个参数必须为0#提交)。列表($additional_address,$sendall)=trackers_data_get_item_notification_info($item_id,ARTIFACT,0);if((修剪($地址)!=“”)&&$sendall)$地址。=", ";$地址。=$其他地址;trackers_mail_followup($item_id,$address);}否则#!($item_id&&空($preview)&&$anon_check_failed){#发生了一些错误。#缺少必填字段?#相关错误消息应该是由#trackers_data_create_item。#重新显示同一页。if($previous_form_bad_fields||$preview||$anon_check_failed){#复制以前的表单值(考虑日期)#重新显示它们并将nocache初始化为0。foreach($vfl作为$fieldname=>$value){if(trackers_data_is_date_field($fieldname))列表($value,$ok)=utils_date_to_unixtime($值);$$fieldname=$value;}fb_anon-check_failed($anon_check_faired);$nocache=0;包括/include/trackers_run/add.php';断裂;}#否则,这很奇怪,也没什么可做的。fb(_(“缺少参数,未添加任何内容。”),1);} # !($item_id&&空($preview)&&$匿名检查失败)#显示浏览项目页面。包括/include/trackers_run/browse.php';断裂;案例“修改后”:#实际上在数据库中添加表单中填写的内容#对于数据库中已经存在的错误,保留给item techn。#或经理。$fields=sane_import('post',[“数字”=>['item_id'],“strings”=>[[“check”,“1984”]],“pass”=>[“comment”,“form_id”]]);数据库_自动执行(“spam_stats”,[“tracker”=>ARTIFACT,“bug_id”=>$fields[“item_id”],“type”=>“comment”,“user_id”=>user_getid(),“form_id”=>$字段[“form_id”],“ip”=>“127.0.0.1”,“check_value”=>$fields['check'],“details”=>$fields[“comment”]]);表单检查();$anon_check_failed=错误;if(!user_isloggedin())$anon_check_failed=空($fields['check'])&&$过程注释;#筛选出不允许提交数据的人员#也一样(显然是通过使用旧形式或其他方式)。$result=db_execute(“选择隐私、discussion_lock、submitted_by来自“.ARTIFACT.”WHERE bug_id=?AND group_id=?”,[$item_id,$group_id]);if(db_numrows($result)>0){#检查物品是否为私人物品,如果为私人物品则拒绝邮寄#用户没有适当的权限(不是成员,不是提交者)。if(dbresult($result,0,'privacy')=='2'){如果(!成员检查(user_getid(),$group_id)&&db_result($result,0,'submitted_by')!=用户获取ID()){#因为这里的用户预期会有恶意行为,#返回一条没有提供太多信息的错误消息。exit_permission_denied();}}if(!$is_trackeradmin&&dbresult($result,0,'discussion_lock'))退出权限();if(!group_restrictions_check($group_id,ARTIFACT,TRACKER_EVENT_COMMENT))退出权限();}elseif(!$is_trackeradmin)退出权限();#跟踪更改。$更改=[];#特例:在这种情况下,我们可能正在搜索一个项目#重印同一页,加上搜索结果。if($depends_search ||$resignal_changegroup_search){if($depends_search){$msg=冲刺(_(“您提供了搜索词以获取此项的列表”。“可能依赖。下面,在[%s依赖项]节中,”.“您现在可以选择适当的选项并提交”.“表格”),$sys_https_url$_服务器['SCRIPT_NAME']。'#依赖关系');fb($msg);}if($重新分配更改组搜索){$msg=冲刺(_(“您提供了搜索词来获取组列表”。“项目可能应该重新分配给。下面的部分中\n”。“[%s重新分配此项目],您现在可以选择”。“适当分组并提交表单。”),$sys_https_url$_服务器['SCRIPT_NAME']。'#重新分配');fb($msg);}包括/include/trackers_run/mod.php';退出(0);}#获取表单中使用的错误字段列表。$vfl=trackers_extract_field_list();$changed=0;if($process_comment)warn_about_uploads();其他的{fb_anon-check_failed($anon_check_faired);如果(!$anon_check_failed){列表($已更改,$附加注释)=trackers_attach_several_files($item_id,$group_id,$更改);#如果有此评论的项目,请添加其他#提供参考文献的注释。如果(array_key_exists('comment',$vfl)&&$vfl['comment']!='')$vfl['注释'].=$附加意见;$已更改|=trackers_data_handle_update($group_id、$item_id、$1dependent_on_task、$dependent _on_bugs、,$dependent_on_support、$depender_on_spatch、$canned_reresponse、,$vfl、$changes、$address);}#由于缺少字段,更新失败?重印并压扁#剩下的动作正常完成。if(!$已更改&&($previous_form_bad_fields||$anon_check_failed)){warn_about_uploads();#将以前的表单值(考虑日期)复制到#重新显示它们并将nocache初始化为0。foreach($vfl作为$fieldname=>$value){if(trackers_data_is_date_field($fieldname))列表($value,$ok)=utils_date_to_unixtime($值);$$fieldname=$value;}$nocache=0;包括/include/trackers_run/mod.php';退出(0);}if($add_cc)#添加CC时无需发送通知,#它与项目本身无关。trackers_add_cc($item_id,$add_cc,$cc_comment,$changes);if(trackers_data_is_used(“投票”))trackers_votes_update($item_id,$new_vote);} # !$流程_意见#在完成所有必要的操作之后,现在处理通知。if($已更改){#检查我们是否应该将所有修改发送到一个地址。列表($additional_address,$sendall)=trackers_data_get_item_notification_info($item_id,ARTIFACT,1);if($sendall&&trim($address)!="")$地址。=", ";$地址。=$其他地址;trackers_mail_followup($item_id,$address,$changes);#如果assigned_to被更改,而之前分配的人#当他不再被分配时,想要从CC中删除,现在就执行。#我们在项目更新后进行此操作,因此之前的受让人#收到了此更改的通知。if(!空($changes['assigned_to']['del']){$prev_uid=用户获取ID($changes['assigned_to']['del']);if(user_get_preference(“删除cc_notassignee”,$prev_uid)){#对此没有反馈。trackers_delete_cc_by_user($item_id,$prev_uid);}}}#处理条目的重新分配。为什么这么晚?#因为有人重新分配输入的所有信息#错误必须出现在原始报告中,并且会重复出现#在新的一个。如果($重新分配更改组||($reportal_change_artifact&&($repartal_changer_artif事实!=artifact))){dbg(“重新分配项目:重新分配更改组:$resignal_change_group,”.“重新分配更改artifact:$resignal_change_artifact,artifact:”ARTIFACT);跟踪器_数据_分配项($item_id、$resignal_change_group、$resonalle_change_artifact);}#显示浏览项目页面,除非用户想要返回#为了同一份报告,做些别的。if(!$submitreturn){包括/include/trackers_run/browse.php’;退出(0);}if(!$process_comment){if(isset($itemid)){#如果存在,请在URL中包含跟踪器项目编号。标题(“位置:{$_SERVER['PHP_SELF']}?$item_id”);退出(0);}$_POST=$_FILES=[];$dependents_search=$recreate_change_group_search=$add_cc=$input_file=$changed=$vfl=$details=$comment=null;$nocache=1;}包括/include/trackers_run/mod.php';退出(0);案例“delete_file”:#删除附件。if($is_trackeradmin){表单检查id(true);trackers_data_delete_file($group_id、$item_id、$item_file_id);#取消设置以前的设置并返回到项目。$depends_search=$重新分配更改组搜索=$add_cc=$input_file=$changed=$vfl=$details=null;包括/include/trackers_run/mod.php';}其他的退出权限();断裂;案例“delete_cc”:#从抄送中删除一个人。$changed=trackers_delete_cc($group_id,$item_id,$1item_cc_id,$更改);#取消设置以前的设置并返回到项目。$depends_search=$重新分配更改组搜索=$add_cc=$input_file=$changed=$vfl=$details=null;包括/include/trackers_run/mod.php';断裂;案例“delete_dependency”:$已更改|=trackers_delete_dependency($group_id、$item_id、$item_depends_on、$item-depends_on_artifact、,$个更改);if($已更改){#看看我们是否应该将所有修改发送到一个地址。列表($additional_address,$sendall)=trackers_data_get_item_notification_info($item_id,ARTIFACT,1);if($sendall&&trim($address)!="")$地址。=", ";$地址。=$附加地址;trackers_mail_followup($item_id,$address,$changes);}#取消设置以前的设置并返回到项目。$depends_search=$重新分配更改组搜索=$add_cc=$input_file=$changed=$vfl=$details=$changes=$address=null;包括/include/trackers_run/mod.php';断裂;案例“flagspam”:#仅允许登录用户。if(!user_isloggedin()){#不要使用exit_not_logged_in(),因为用户没有#如果他一开始没有登录,他就有正当理由来这里#(未提供链接)。退出权限();}#根据用户凭据确定其他垃圾邮件核心。#+1=登录用户#+3=组成员#+5=组管理员$spamcore=1;if(成员检查(0,$groupid)){if(member_check(0,$group_id,'A'))$spamcore=5;其他的$spamcore=3;}spam_flag($item_id、$comment_internal_id、$spamcore、$group_id);#如果不是项目本身,则返回项目页面#标记为垃圾邮件。包括/include/trackers_run/mod.php';断裂;案例“unflagspam”:#取消标记所有垃圾邮件:仅适用于组管理员。if(!member_check(0,$group_id,'A')){#不要使用exit_not_loged_in(),因为用户没有#如果他一开始没有登录,他就有正当理由来这里#(未提供链接)。退出权限();}spam_unflag($item_id,$comment_internal_id,ARTIFACT,$group_id);包括/include/trackers_run/mod.php';断裂;案例“查看垃圾邮件”:包括/include/trackers_run/mod.php';断裂;案例“浏览”:违约:包括/include/trackers_run/browse.php';断裂;}#开关($func)?>