diff --git a/Classes/Controller/CategorycommentController.php b/Classes/Controller/CategorycommentController.php index abfb094..9579e0d 100644 --- a/Classes/Controller/CategorycommentController.php +++ b/Classes/Controller/CategorycommentController.php @@ -6,6 +6,7 @@ use Jp\Jpfaq\Domain\Repository\CategorycommentRepository; use Jp\Jpfaq\Domain\Repository\CategoryRepository; use Jp\Jpfaq\Service\SendMailService; +use Jp\Jpfaq\Utility\IsBot; use Jp\Jpfaq\Utility\TypoScript; use Psr\Http\Message\ResponseInterface; use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; @@ -69,15 +70,17 @@ public function initializeAction(): void */ public function commentAction(array $catUids, int $pluginUid): ResponseInterface { - $currentUid = $this->request->getAttribute('currentContentObject')->data['uid']; + if (!IsBot::isBot()) { + $currentUid = $this->request->getAttribute('currentContentObject')->data['uid']; - if ($currentUid == $pluginUid) { - $this->view->assignMultiple([ - 'catUids' => $catUids, - 'currentUid' => $currentUid, - ]); + if ($currentUid == $pluginUid) { + $this->view->assignMultiple([ + 'catUids' => $catUids, + 'currentUid' => $currentUid, + ]); - return $this->htmlResponse(); + return $this->htmlResponse(); + } } // Else do not render view diff --git a/Classes/Controller/QuestionController.php b/Classes/Controller/QuestionController.php index 378e5f5..aef834f 100644 --- a/Classes/Controller/QuestionController.php +++ b/Classes/Controller/QuestionController.php @@ -5,6 +5,7 @@ use Jp\Jpfaq\Domain\Model\Question; use Jp\Jpfaq\Domain\Repository\CategoryRepository; use Jp\Jpfaq\Domain\Repository\QuestionRepository; +use Jp\Jpfaq\Utility\IsBot; use Jp\Jpfaq\Utility\TypoScript; use Psr\Http\Message\ResponseInterface; use TYPO3\CMS\Core\Utility\GeneralUtility; @@ -125,7 +126,7 @@ public function listAction(): ResponseInterface */ public function helpfulnessAction(Question $question, bool $helpful, int $pluginUid): ResponseInterface|ForwardResponse { - if (!$this->isBot()) { + if (!IsBot::isBot()) { $currentUid = $this->request->getAttribute('currentContentObject')->data['uid']; if ($currentUid == $pluginUid) { @@ -194,21 +195,4 @@ private function updateHelpful(Question $question, bool $helpful): void // Store user interaction on helpfulness in session $GLOBALS['TSFE']->fe_user->setKey('ses', $questionUid, $helpful); } - - /** - * Check if browser is a well known bot - * - * @return bool - */ - private function isBot(): bool - { - $userAgent = $_SERVER['HTTP_USER_AGENT']; - $bots = $this->settings['bots']; - $bots = explode(',', $bots); - - foreach ($bots as $bot) { - if (stripos($userAgent, htmlspecialchars($bot)) !== false) return true; - } - return false; - } } diff --git a/Classes/Utility/IsBot.php b/Classes/Utility/IsBot.php new file mode 100644 index 0000000..4a9edd7 --- /dev/null +++ b/Classes/Utility/IsBot.php @@ -0,0 +1,24 @@ + + */ +class Typo3Utility +{ + /** + * Get typoscript settings for a plugin + * + * @param string $plugin + * + * @return mixed + */ + public static function getSettings(string $plugin): mixed + { + $plugin = htmlspecialchars($plugin); + $configurationManager = GeneralUtility::makeInstance(BackendConfigurationManager::class); + $typoScriptSettings = $configurationManager->getTypoScriptSetup(); + + $typoScriptService = GeneralUtility::makeInstance(TypoScriptService::class); + $typoScriptSettingsWithoutDots = $typoScriptService->convertTypoScriptArrayToPlainArray($typoScriptSettings); + + return $typoScriptSettingsWithoutDots['plugin'][$plugin]['settings']; + } +} diff --git a/Configuration/TypoScript/setup.typoscript b/Configuration/TypoScript/setup.typoscript index a655665..7043c2e 100644 --- a/Configuration/TypoScript/setup.typoscript +++ b/Configuration/TypoScript/setup.typoscript @@ -77,7 +77,7 @@ plugin.tx_jpfaq_faq { includeJsAndCssInTemplate = {$plugin.tx_jpfaq_faq.settings.includeJsAndCssInTemplate} setSchemaOrgOnHtmlTag = {$plugin.tx_jpfaq_faq.settings.setSchemaOrgOnHtmlTag} - bots = Googlebot,Baiduspider,ia_archiver,R6_FeedFetcher,NetcraftSurveyAgent,Sogou web spider,bingbot,Yahoo! Slurp,facebookexternalhit,PrintfulBot,msnbot,Twitterbot,UnwindFetchor,urlresolver,Butterfly,TweetmemeBot,PaperLiBot,MJ12bot,AhrefsBot,Exabot,Ezooms,YandexBot,SearchmetricsBot,picsearch,TweetedTimes Bot,QuerySeekerSpider,ShowyouBot,woriobot,merlinkbot,BazQuxBot,Kraken,SISTRIX Crawler,R6_CommentReader,magpie-crawler,GrapeshotCrawler,PercolateCrawler,MaxPointCrawler,R6_FeedFetcher,NetSeer crawler,grokkit-crawler,SMXCrawler,PulseCrawler,Y!J-BRW,80legs,Mediapartners-Google,Spinn3r,InAGist,Python-urllib,NING,TencentTraveler,Feedfetcher-Google,mon.itor.us,spbot,Feedly,bitlybot,ADmantX,Niki-Bot,Pinterest,python-requests,DotBot,HTTP_Request2,linkdexbot,A6-Indexer,Baiduspider,TwitterFeed,Microsoft Office,Pingdom,BTWebClient,KatBot,SiteCheck,proximic,Sleuth,Abonti,(BOT for JCE),Baidu,Tiny Tiny RSS,newsblur,updown_tester,linkdex,baidu,searchmetrics,genieo,majestic12,spinn3r,profound,domainappender,VegeBot,terrykyleseoagency.com,CommonCrawler Node,AdlesseBot,metauri.com,libwww-perl,rogerbot-crawler,MegaIndex.ru,ltx71,Qwantify,Traackr.com,Re-Animator Bot,Pcore-HTTP,BoardReader,omgili,okhttp,CCBot,Java/1.8,semrush.com,feedbot,CommonCrawler,AdlesseBot,MetaURI,ibwww-perl,rogerbot,MegaIndex,BLEXBot,FlipboardProxy,techinfo@ubermetrics-technologies.com,trendictionbot,Mediatoolkitbot,trendiction,ubermetrics,ScooperBot,TrendsmapResolver,Nuzzel,Go-http-client,Applebot,LivelapBot,GroupHigh,SemrushBot,ltx71,commoncrawl,istellabot,DomainCrawler,cs.daum.net,StormCrawler,GarlikCrawler,The Knowledge AI,getstream.io/winds,YisouSpider,archive.org_bot,semantic-visions.com,FemtosearchBot,360Spider,linkfluence.com,glutenfreepleasure.com,Gluten Free Crawler,YaK/1.0,Cliqzbot,app.hypefactors.com,axios,semantic-visions.com,webdatastats.com,schmorp.de,SEOkicks,DuckDuckBot,Barkrowler,ZoominfoBot,Linguee Bot,Mail.RU_Bot,OnalyticaBot,Linguee Bot,admantx-adform,Buck/2.2,Barkrowler,Zombiebot,Nutch,SemanticScholarBot,Jetslide,scalaj-http,XoviBot,sysomos.com,PocketParser,newspaper,serpstatbot,MetaJobBot,SeznamBot/3.2,Velen,PhxBot + bots = Googlebot,Baiduspider,ia_archiver,R6_FeedFetcher,NetcraftSurveyAgent,Sogouwebspider,bingbot,Yahoo!Slurp,facebookexternalhit,PrintfulBot,msnbot,Twitterbot,UnwindFetchor,urlresolver,Butterfly,TweetmemeBot,PaperLiBot,MJ12bot,AhrefsBot,Exabot,Ezooms,YandexBot,SearchmetricsBot,picsearch,TweetedTimesBot,QuerySeekerSpider,ShowyouBot,woriobot,merlinkbot,BazQuxBot,Kraken,SISTRIXCrawler,R6_CommentReader,magpie-crawler,GrapeshotCrawler,PercolateCrawler,MaxPointCrawler,NetSeercrawler,grokkit-crawler,SMXCrawler,PulseCrawler,Y!J-BRW,80legs,Mediapartners-Google,InAGist,Python-urllib,NING,TencentTraveler,Feedfetcher-Google,mon.itor.us,spbot,Feedly,bitlybot,ADmantX,Niki-Bot,Pinterest,python-requests,DotBot,HTTP_Request2,linkdexbot,A6-Indexer,TwitterFeed,MicrosoftOffice,Pingdom,BTWebClient,KatBot,SiteCheck,proximic,Sleuth,Abonti,(BOTforJCE),Baidu,TinyTinyRSS,newsblur,updown_tester,linkdex,baidu,searchmetrics,genieo,majestic12,spinn3r,profound,domainappender,VegeBot,terrykyleseoagency.com,CommonCrawlerNode,AdlesseBot,metauri.com,libwww-perl,rogerbot-crawler,ltx71,Qwantify,Traackr.com,Re-AnimatorBot,Pcore-HTTP,BoardReader,omgili,okhttp,CCBot,Java/1.8,semrush.com,feedbot,CommonCrawler,MetaURI,ibwww-perl,rogerbot,MegaIndex,BLEXBot,FlipboardProxy,techinfo@ubermetrics-technologies.com,trendictionbot,Mediatoolkitbot,trendiction,ubermetrics,ScooperBot,TrendsmapResolver,Nuzzel,Go-http-client,Applebot,LivelapBot,GroupHigh,SemrushBot,commoncrawl,istellabot,DomainCrawler,cs.daum.net,StormCrawler,GarlikCrawler,TheKnowledgeAI,getstream.io/winds,YisouSpider,archive.org_bot,semantic-visions.com,FemtosearchBot,360Spider,linkfluence.com,glutenfreepleasure.com,GlutenFreeCrawler,YaK/1.0,Cliqzbot,app.hypefactors.com,axios,webdatastats.com,schmorp.de,SEOkicks,DuckDuckBot,Barkrowler,ZoominfoBot,LingueeBot,Mail.RU_Bot,OnalyticaBot,admantx-adform,Zombiebot,Nutch,SemanticScholarBot,Jetslide,scalaj-http,XoviBot,sysomos.com,PocketParser,newspaper,serpstatbot,MetaJobBot,SeznamBot/3.2,VelenPublicWebCrawler/1.0,WordPress.commShots,adscanner,BacklinkCrawler,netEstateNECrawler,AstuteSRM,GigablastOpenSource/1.0,DomainStatsBot,Winds:OpenSourceRSS&Podcast,dlvr.it,BehloolBot,7Siters,AwarioSmartBot,Apache-HttpClient/5,SeekportCrawler,AHC/2.1,eCairn-Grabber,mediawordsbot,PHP-Curl-Class,Scrapy,curl/7,Blackboard,NetNewsWire,node-fetch,admantx,metadataparser,DomainsProject,SerendeputyBot,Moreover,DuckDuckGo,monitoring-plugins,Selfoss,Adsbot,acebookexternalhit,SpiderLing,Cocolyzebot,TTD-Content,superfeedr,Twingly,Google-Apps-Scrip,LinkpadBot,CensysInspect,Reeder,tweetedtimes,Amazonbot,MauiBot,SymfonyBrowserKit,DataForSeoBot,GoogleProducer,TinEye-bot-live,sindresorhus/got,CriteoBot,Down/5,YahooAdmonitoring,MetaInspector,PetalBot,MetadataScraper,CloudflareSpeedTest,aiohttp,AppEngine-Google,heritrix,sqlmap,Buck,wp_is_mobile,01h4x.com,404checker,404enemy,AIBOT,ALittleClient,ASPSeek,Aboundex,Acunetix,AfD-Verbotsverfahren,AiHitBot,Aipbot,Alexibot,AllSubmitter,Alligator,AlphaBot,Anarchie,Anarchy,Anarchy99,Ankit,Anthill,Apexoo,Aspiegel,Asterias,Atomseobot,Attach,AwarioRssBot,BBBike,BDCbot,BDFetch,BackDoorBot,BackStreet,BackWeb,Backlink-Ceck,Badass,Bandit,BatchFTP,BattleztarBazinga,BetaBot,Bigfoot,Bitacle,BlackWidow,BlackHole,Blow,BlowFish,Boardreader,Bolt,BotALot,Brandprotect,Brandwatch,Buddy,BuiltBotTough,BuiltWith,Bullseye,BunnySlippers,BuzzSumo,CATExplorador,CODE87,CSHttp,Calculon,CazoodleBot,Cegbfeieh,CheTeam,CheeseBot,CherryPicker,ChinaClaw,Chlooe,Citoid,Claritybot,Cloudmapping,Cogentbot,Collector,Copier,CopyRightCheck,Copyscape,Cosmos,Craftbot,CrawlingatHomeProject,CrazyWebCrawler,Crescent,CrunchBot,Curious,Custo,CyotekWebCopy,DBLBot,DIIbot,DSearch,DTSAgent,DataCha0s,DatabaseDriverMysqli,Demon,Deusu,Devil,Digincore,DigitalPebble,Dirbuster,Disco,Discobot,Discoverybot,Dispatch,DittoSpyder,DnBCrawler-Analytics,DnyzBot,DomCopBot,DomainAppender,DomainSigmaCrawler,Dotbot,DownloadWonder,Dragonfly,Drip,ECCP/1.0,EMailSiphon,EMailWolf,EasyDL,Ebingbong,Ecxi,EirGrabber,EroCrawler,Evil,ExpressWebPictures,ExtLinksBot,Extractor,ExtractorPro,ExtremePictureFinder,EyeNetIE,FDM,FHscan,Fimap,Firefox/7.0,FlashGet,Flunky,Foobot,Freeuploader,FrontPage,Fuzz,FyberSpider,Fyrebot,G-i-g-a-b-o-t,GT::WWW,GalaxyBot,Genieo,GermCrawler,GetRight,GetWeb,Getintent,Gigabot,Go!Zilla,Go-Ahead-Got-It,GoZilla,Gotit,GrabNet,Grabber,Grafula,GrapeFX,GridBot,HEADMasterSEO,HMView,HTMLparser,HTTP::Lite,HTTrack,Haansoft,HaosouSpider,Harvest,Havij,Hloader,HonoluluBot,Humanlinks,HybridBot,IDBTE4M,IDBot,IRLbot,Iblog,Id-search,IlseBot,ImageFetch,ImageSucker,IndeedBot,IndyLibrary,InfoNaviRobot,InfoTekies,Intelliseek,InterGET,InternetSeer,InternetNinja,Iria,Iskanie,IstellaBot,JOCWebSpider,JamesBOT,Jbrofuzz,JennyBot,JetCar,Jetty,JikeSpider,Joomla,Jorgee,JustView,Jyxobot,KenjinSpider,KeybotTranslation-Search-Machine,KeywordDensity,Kinza,Kozmosbot,LNSpiderguy,LWP::Simple,Lanshanbot,Larbin,Leap,LeechFTP,LeechGet,LexiBot,Lftp,LibWeb,Libwhisker,LieBaoFast,Lightspeedsystems,Likse,LinkScan,LinkWalker,Linkbot,LinkextractorPro,LinksManager,LinqiaMetadataDownloaderBot,LinqiaRSSBot,LinqiaScrapeBot,Lipperhey,LipperheySpider,Litemage_walker,Lmspider,MFC_Tear_Sample,MIDowntool,MIIxpc,MQQBrowser,MSFrontPage,MSIECrawler,MTRobot,Mag-Net,Magnet,Majestic-SEO,Majestic12,MajesticSEO,MarkMonitor,MarkWatch,MassDownloader,Masscan,MataHari,Mb2345Browser,MeanPathBot,Meanpathbot,Metauri,MicroMessenger,MicrosoftDataAccess,MicrosoftURLControl,Minefield,MisterPiX,MoblieSafari,Mojeek,Mojolicious,MolokaiBot,MorfeusFuckingScanner,Mozlila,Mr.4x3,Msrabot,Musobot,NICErsPRO,NPbot,NameIntelligence,Nameprotect,Navroad,NearSite,Needle,Nessus,NetAnts,NetLyzer,NetMechanic,NetSpider,NetZIP,NetVampire,Netcraft,Nettrack,Netvibes,NextGenSearchBot,Nibbler,Niki-bot,Nikto,NimbleCrawler,Nimbostratus,Ninja,Nmap,Not,Nuclei,Octopus,OfflineExplorer,OfflineNavigator,OnCrawl,OpenLinkProfiler,OpenVAS,Openfind,Openvas,OrangeBot,OrangeSpider,OutclicksBot,OutfoxBot,PECL::HTTP,PHPCrawl,POE-Component-Client-HTTP,PageAnalyzer,PageGrabber,PageScorer,PageThing.com,PageAnalyzer,Pandalytics,Panscient,PapaFoto,Pavuk,PeoplePal,Petalbot,Pi-Monster,Picscout,Picsearch,PictureFinder,Piepmatz,Pimonster,Pixray,PleaseCrawl,Pockey,ProPowerBot,ProWebWalker,Probethenet,Psbot,Pu_iN,Pump,PxBroker,PyCurl,QueryNMetasearch,Quick-Crawler,RSSingBot,RankActive,RankActiveLinkBot,RankFlex,RankingBot,RankingBot2,Rankivabot,RankurBot,Re-re,ReGet,RealDownload,Reaper,RebelMouse,Recorder,RedesScrapy,RepoMonkey,Ripper,RocketCrawler,Rogerbot,SBIder,SEOlyticsCrawler,SEOprofiler,SEOstats,SISTRIX,SMTBot,SalesIntelligent,ScanAlert,Scanbot,ScoutJet,Screaming,ScreenerBot,ScrepyBot,Searchestate,Seekport,SemanticJuice,Semrush,SentiBot,SeoSiteCheckup,SeobilityBot,Seomoz,Shodan,Siphon,SiteCheckerBotCrawler,SiteExplorer,SiteLockSpider,SiteSnagger,SiteSucker,SiteSucker,Sitebeam,Siteimprove,Sitevigil,SlySearch,SmartDownload,Snake,Snapbot,Snoopy,SocialRankIOBot,Sociscraper,Sosospider,Sottopop,SpaceBison,Spammen,SpankBot,Spanner,Spbot,SputnikBot,Sqlmap,Sqlworm,Sqworm,Steeler,Stripper,Sucker,Sucuri,SuperBot,SuperHTTP,Surfbot,SurveyBot,Suzuran,Swiftbot,Szukacz,T0PHackTeam,T8Abot,Teleport,TeleportPro,Telesoft,Telesphoreo,Telesphorep,TheNomad,TheIntraformant,Thumbor,TightTwatBot,Titan,Toata,Toweyabot,Tracemyfile,Trendiction,Trendictionbot,True_Robot,Turingos,Turnitin,TurnitinBot,TwengaBot,Twice,Typhoeus,URLy.Warning,URLyWarning,UnisterBot,Upflow,V-BOT,VBProject,VCI,Vacuum,Vagabondo,VelenPublicWebCrawler,VeriCiteCrawler,VidibleScraper,Virusdie,VoidEYE,Voil,Voltron,WASALive-Bot,WBSearchBot,WEBDAV,WISENutbot,WPScan,WWW-Collector-E,WWW-Mechanize,WWW::Mechanize,WWWOFFLE,Wallpapers,Wallpapers/3.0,WallpapersHD,WeSEE,WebAuto,WebBandit,WebCollage,WebCopier,WebEnhancer,WebFetch,WebFuck,WebGoIS,WebImageCollector,WebLeacher,WebPix,WebReaper,WebSauger,WebStripper,WebSucker,WebWhacker,WebZIP,WebAuto,WebCollage,WebEnhancer,WebFetch,WebFuck,WebPix,WebSauger,WebSucker,Webalta,WebmasterWorldForumBot,Webshag,WebsiteExtractor,WebsiteQuester,WebsiteQuester,Webster,Whack,Whacker,Whatweb,Who.isBot,Widow,WinHTTrack,WiseGuysRobot,Wonderbot,Woobot,Wotbox,Wprecon,XaldonWebSpider,Xaldon_WebSpider,Xenu,YoudaoBot,Zade,Zauba,Zermelo,Zeus,Zitebot,ZmEu,ZoomBot,ZumBot,ZyBorg,arquivo-web-crawler,arquivo.pt,autoemailspider,backlink-check,cah.io.community,check1.exe,clark-crawler,coccocbot,cognitiveseo,com.plumanalytics,crawl.sogou.com,crawler.feedback,crawler4j,dataforseo.com,demandbase-bot,domainsproject.org,eCatch,evc-batch,facebookscraper,gopher,instabid,internetVistamonitor,ips-agent,isitwp.com,iubenda-radar,lwp-request,lwp-trivial,meanpathbot,mediawords,muhstik-scan,oBot,pagescorer,pcBrowser,plumanalytics,polarisversion,probe-image-size,ripz,s1z.ru,satoristudio.net,scan.lol,seobility,seocompany.store,seoscanners,seostar,sexsearcher,sitechecker.pro,siteripz,sogouspider,sp_auditbot,spyfu,sysscan,tAkeOut,trendiction.com,trendiction.de,ubermetrics-technologies.com,voyagerx.com,webgains-bot,webmeup-crawler,webpros.com,webprosbot,x09Mozilla,x22Mozilla,xpymep1.exe,zauba.io,zgrab,petalsearch,protopage,Miniflux,Feeder,Semanticbot,ImageFetcher,Mastodon,Neevabot,Pleroma,Akkoma,koyu.space,Embedly,Mjukisbyxor,GiantRhubarb,GozleBot,Friendica,WhatsApp,XenForo,Yeti,MuckRack,PhxBot,Bytespider,GPTBot,SummalyBot,LinkedInBot,SpiderWeb,SpaceCowboys,LCC,Paqlebot } } diff --git a/Documentation/ChangeLog/Index.rst b/Documentation/ChangeLog/Index.rst index 82d9a57..a3bcfe8 100644 --- a/Documentation/ChangeLog/Index.rst +++ b/Documentation/ChangeLog/Index.rst @@ -10,6 +10,11 @@ ChangeLog ========= +12.5.0 +""""" +#. Use null coalescence for undefined array indices, for if not all settings are set. (Michiel Roos) +#. Improved bot detection for helpfullness and comment actions + 12.4.2 """"" #. Small bugfix in isBot function diff --git a/Documentation/Settings.cfg b/Documentation/Settings.cfg index da3f86e..b12d22d 100644 --- a/Documentation/Settings.cfg +++ b/Documentation/Settings.cfg @@ -1,8 +1,8 @@ [general] project = Frequently Asked Questions -release = 12.4.2 -version = 12.4 -copyright = 2023 +release = 12.5.0 +version = 12.5 +copyright = 2024 [notify] about_new_build = no diff --git a/Documentation/Settings.yml b/Documentation/Settings.yml index 05caeef..c133f2e 100644 --- a/Documentation/Settings.yml +++ b/Documentation/Settings.yml @@ -4,10 +4,10 @@ --- conf.py: - copyright: 2023 + copyright: 2024 project: jpFAQ - version: 12.4 - release: 12.4.2 + version: 12.5 + release: 12.5.0 intersphinx_mapping: t3tsref: - http://docs.typo3.org/typo3cms/TyposcriptReference/ diff --git a/Documentation/User/Index.rst b/Documentation/User/Index.rst index 39a2c69..cb79d9a 100644 --- a/Documentation/User/Index.rst +++ b/Documentation/User/Index.rst @@ -22,6 +22,7 @@ Users Manual #. If would like to track helpfulness of questions, which shows a comment form when visitors click 'not helpful', check 'Show a comment form under each question' #. If the email and comment fields in the flexform are not filled in, the corresponding typoscript settings will be used. #. You can also present a feedback form under each plugin. Check 'Show a (categories) comment form under this list of questions'. +#. On upgrade from older major version, make sure the plugin is saved again with the correct flexform values and recheck included typoscript settings. .. _11.6: diff --git a/ext_emconf.php b/ext_emconf.php index 53f0f21..848550c 100644 --- a/ext_emconf.php +++ b/ext_emconf.php @@ -7,12 +7,12 @@ 'author' => 'Jacco van der Post', 'author_email' => 'jacco@id-webdesign.nl', 'state' => 'stable', - 'version' => '12.4.2', + 'version' => '12.5.0', 'constraints' => [ 'depends' => [ - 'typo3' => '12.4.2-12.4.99', + 'typo3' => '12.4.0-12.4.99', ], 'conflicts' => [],