From d564e10f70709b853e2b02680bcc16c8be63e1ed Mon Sep 17 00:00:00 2001 From: =?utf8?q?M=C3=A9lanie=20Le=20Bail?= Date: Mon, 19 Apr 2010 14:51:08 +0000 Subject: [PATCH] Forumml plugin --- .gitattributes | 109 +++ .../forumml/PEAR/Archive_Tar-1.3.3.tgz | Bin 0 -> 18119 bytes .../forumml/PEAR/Console_Getopt-1.2.3.tgz | Bin 0 -> 4011 bytes plugins/coclico/forumml/PEAR/Mail-1.1.14.tgz | Bin 0 -> 17537 bytes .../coclico/forumml/PEAR/Mail_Mbox-0.6.1.tgz | Bin 0 -> 13492 bytes .../coclico/forumml/PEAR/Mail_Mime-1.5.2.tgz | Bin 0 -> 22176 bytes .../forumml/PEAR/Mail_mimeDecode-1.5.0.tgz | Bin 0 -> 9281 bytes .../forumml/PEAR/Structures_Graph-1.0.2.tgz | Bin 0 -> 30947 bytes .../coclico/forumml/PEAR/XML_Util-1.2.1.tgz | Bin 0 -> 17729 bytes plugins/coclico/forumml/README.txt | 46 ++ plugins/coclico/forumml/TODO | 11 + plugins/coclico/forumml/bin/db-upgrade.pl | 301 +++++++ plugins/coclico/forumml/bin/installFF.sh | 26 + plugins/coclico/forumml/bin/mail_2_DBFF.php | 143 ++++ plugins/coclico/forumml/bin/mail_2_DBFF.pl | 106 +++ plugins/coclico/forumml/bin/ml_arch_2_DBFF.pl | 71 ++ .../coclico/forumml/common/forumml-init.php | 36 + plugins/coclico/forumml/db/forumml-init.sql | 104 +++ plugins/coclico/forumml/db/install.sql | 85 ++ plugins/coclico/forumml/debian/README.Debian | 6 + plugins/coclico/forumml/debian/README.source | 9 + plugins/coclico/forumml/debian/changelog | 11 + plugins/coclico/forumml/debian/compat | 1 + plugins/coclico/forumml/debian/control | 20 + plugins/coclico/forumml/debian/copyright | 63 ++ plugins/coclico/forumml/debian/docs | 0 .../debian/dsf-in/plugin-forumml.postinst | 55 ++ .../debian/dsf-in/plugin-forumml.prerm | 45 ++ .../coclico/forumml/debian/po/templates.pot | 0 plugins/coclico/forumml/debian/rules | 90 +++ plugins/coclico/forumml/debian/source/format | 1 + plugins/coclico/forumml/etc/forumml.inc.dist | 15 + .../ForumMLGroupSearchEngine.class.php | 30 + .../ForumMLHtmlSearchRenderer.class.php | 123 +++ .../forumml/include/ForumMLInsert.class.php | 356 +++++++++ .../include/ForumMLPluginDescriptor.class.php | 29 + .../include/ForumMLPluginInfo.class.php | 135 ++++ .../include/ForumMLSearchEngine.class.php | 43 + .../include/ForumMLSearchQuery.class.php | 59 ++ .../include/ForumML_Attachment.class.php | 95 +++ .../include/ForumML_AttachmentDao.class.php | 36 + .../include/ForumML_FileStorage.class.php | 144 ++++ .../include/ForumML_HTMLPurifier.class.php | 103 +++ .../include/ForumML_MessageDao.class.php | 162 ++++ .../include/ForumML_MessageManager.class.php | 44 ++ .../include/ForumML_mimeDecode.class.php | 106 +++ .../forumml/include/forummlPlugin.class.php | 235 ++++++ .../forumml/packaging/control/000source | 10 + .../packaging/control/222plugin-forumml | 4 + .../control/222plugin-forumml.shortdesc | 3 + .../forumml/packaging/dirs/plugin-forumml | 8 + .../forumml/packaging/docs/plugin-forumml | 1 + .../forumml/packaging/install/plugin-forumml | 6 + .../forumml/packaging/links/plugin-forumml | 1 + plugins/coclico/forumml/selinux/forumml0.pp | Bin 0 -> 10883 bytes plugins/coclico/forumml/selinux/forumml0.te | 157 ++++ plugins/coclico/forumml/selinux/forumml1.pp | Bin 0 -> 10883 bytes plugins/coclico/forumml/selinux/forumml1.te | 157 ++++ plugins/coclico/forumml/selinux/forumml2.pp | Bin 0 -> 10995 bytes plugins/coclico/forumml/selinux/forumml2.te | 158 ++++ plugins/coclico/forumml/selinux/forumml3.pp | Bin 0 -> 10995 bytes plugins/coclico/forumml/selinux/forumml3.te | 158 ++++ plugins/coclico/forumml/selinux/forumml4.pp | Bin 0 -> 10995 bytes plugins/coclico/forumml/selinux/forumml4.te | 158 ++++ plugins/coclico/forumml/selinux/forumml5.pp | Bin 0 -> 10995 bytes plugins/coclico/forumml/selinux/forumml5.te | 158 ++++ plugins/coclico/forumml/selinux/forumml6.pp | Bin 0 -> 10995 bytes plugins/coclico/forumml/selinux/forumml6.te | 158 ++++ plugins/coclico/forumml/selinux/forumml7.pp | Bin 0 -> 10995 bytes plugins/coclico/forumml/selinux/forumml7.te | 158 ++++ plugins/coclico/forumml/selinux/forumml8.pp | Bin 0 -> 7289 bytes plugins/coclico/forumml/selinux/forumml8.te | 109 +++ .../forumml/site-content/en_US/forumml.tab | 100 +++ .../forumml/site-content/fr_FR/forumml.tab | 100 +++ .../forumml/tests/ForumML_FileStorageTest.php | 185 +++++ .../forumml/tests/ForumML_InsertTest.php | 221 ++++++ .../_fixtures/samples/attachment_only.mbox | 238 ++++++ ...inline_content_and_attch_in_html_only.mbox | 391 +++++++++ ...e_content_and_attch_in_text_plus_html.mbox | 406 ++++++++++ ...html_with_inline_content_in_html_only.mbox | 248 ++++++ ...with_inline_content_in_text_plus_html.mbox | 265 +++++++ .../samples/pure_html_in_html_only.mbox | 49 ++ .../samples/pure_html_text_plus_html.mbox | 64 ++ .../tests/_fixtures/samples/pure_text.mbox | 40 + .../samples/text_plus_attachment.mbox | 238 ++++++ plugins/coclico/forumml/translations/en.po | 0 .../coclico/forumml/translations/gforge.pot | 0 .../forumml/utils/manage-translations.sh | 56 ++ plugins/coclico/forumml/www/forumml_utils.php | 742 ++++++++++++++++++ plugins/coclico/forumml/www/index.php | 137 ++++ plugins/coclico/forumml/www/message.php | 224 ++++++ .../forumml/www/scripts/cc_attach_js.php | 71 ++ .../coclico/forumml/www/scripts/forumml.js | 53 ++ .../forumml/www/themes/default/css/style.css | 110 +++ .../www/themes/default/images/ic/attach.png | Bin 0 -> 391 bytes .../www/themes/default/images/ic/comment.png | Bin 0 -> 413 bytes .../themes/default/images/ic/comment_add.png | Bin 0 -> 530 bytes .../www/themes/default/images/ic/comments.png | Bin 0 -> 557 bytes .../www/themes/default/images/ic/msg.png | Bin 0 -> 264 bytes .../default/images/ic/resultset_first.png | Bin 0 -> 522 bytes .../images/ic/resultset_first_disabled.png | Bin 0 -> 536 bytes .../default/images/ic/resultset_last.png | Bin 0 -> 524 bytes .../images/ic/resultset_last_disabled.png | Bin 0 -> 537 bytes .../default/images/ic/resultset_next.png | Bin 0 -> 395 bytes .../images/ic/resultset_next_disabled.png | Bin 0 -> 419 bytes .../default/images/ic/resultset_previous.png | Bin 0 -> 389 bytes .../images/ic/resultset_previous_disabled.png | Bin 0 -> 418 bytes .../default/images/ic/spinner-greenie.gif | Bin 0 -> 3292 bytes .../www/themes/default/images/ic/trash.png | Bin 0 -> 778 bytes plugins/coclico/forumml/www/upload.php | 92 +++ plugins/coclico/mailman/www/admin/index.php | 2 +- plugins/coclico/mailman/www/mailman_utils.php | 2 +- 112 files changed, 8490 insertions(+), 2 deletions(-) create mode 100644 plugins/coclico/forumml/PEAR/Archive_Tar-1.3.3.tgz create mode 100644 plugins/coclico/forumml/PEAR/Console_Getopt-1.2.3.tgz create mode 100644 plugins/coclico/forumml/PEAR/Mail-1.1.14.tgz create mode 100644 plugins/coclico/forumml/PEAR/Mail_Mbox-0.6.1.tgz create mode 100644 plugins/coclico/forumml/PEAR/Mail_Mime-1.5.2.tgz create mode 100644 plugins/coclico/forumml/PEAR/Mail_mimeDecode-1.5.0.tgz create mode 100644 plugins/coclico/forumml/PEAR/Structures_Graph-1.0.2.tgz create mode 100644 plugins/coclico/forumml/PEAR/XML_Util-1.2.1.tgz create mode 100644 plugins/coclico/forumml/README.txt create mode 100644 plugins/coclico/forumml/TODO create mode 100755 plugins/coclico/forumml/bin/db-upgrade.pl create mode 100755 plugins/coclico/forumml/bin/installFF.sh create mode 100755 plugins/coclico/forumml/bin/mail_2_DBFF.php create mode 100755 plugins/coclico/forumml/bin/mail_2_DBFF.pl create mode 100755 plugins/coclico/forumml/bin/ml_arch_2_DBFF.pl create mode 100644 plugins/coclico/forumml/common/forumml-init.php create mode 100644 plugins/coclico/forumml/db/forumml-init.sql create mode 100644 plugins/coclico/forumml/db/install.sql create mode 100644 plugins/coclico/forumml/debian/README.Debian create mode 100644 plugins/coclico/forumml/debian/README.source create mode 100644 plugins/coclico/forumml/debian/changelog create mode 100644 plugins/coclico/forumml/debian/compat create mode 100644 plugins/coclico/forumml/debian/control create mode 100644 plugins/coclico/forumml/debian/copyright create mode 100644 plugins/coclico/forumml/debian/docs create mode 100644 plugins/coclico/forumml/debian/dsf-in/plugin-forumml.postinst create mode 100644 plugins/coclico/forumml/debian/dsf-in/plugin-forumml.prerm create mode 100644 plugins/coclico/forumml/debian/po/templates.pot create mode 100755 plugins/coclico/forumml/debian/rules create mode 100644 plugins/coclico/forumml/debian/source/format create mode 100644 plugins/coclico/forumml/etc/forumml.inc.dist create mode 100644 plugins/coclico/forumml/include/ForumMLGroupSearchEngine.class.php create mode 100644 plugins/coclico/forumml/include/ForumMLHtmlSearchRenderer.class.php create mode 100644 plugins/coclico/forumml/include/ForumMLInsert.class.php create mode 100644 plugins/coclico/forumml/include/ForumMLPluginDescriptor.class.php create mode 100644 plugins/coclico/forumml/include/ForumMLPluginInfo.class.php create mode 100644 plugins/coclico/forumml/include/ForumMLSearchEngine.class.php create mode 100644 plugins/coclico/forumml/include/ForumMLSearchQuery.class.php create mode 100644 plugins/coclico/forumml/include/ForumML_Attachment.class.php create mode 100644 plugins/coclico/forumml/include/ForumML_AttachmentDao.class.php create mode 100644 plugins/coclico/forumml/include/ForumML_FileStorage.class.php create mode 100644 plugins/coclico/forumml/include/ForumML_HTMLPurifier.class.php create mode 100644 plugins/coclico/forumml/include/ForumML_MessageDao.class.php create mode 100644 plugins/coclico/forumml/include/ForumML_MessageManager.class.php create mode 100644 plugins/coclico/forumml/include/ForumML_mimeDecode.class.php create mode 100644 plugins/coclico/forumml/include/forummlPlugin.class.php create mode 100644 plugins/coclico/forumml/packaging/control/000source create mode 100644 plugins/coclico/forumml/packaging/control/222plugin-forumml create mode 100644 plugins/coclico/forumml/packaging/control/222plugin-forumml.shortdesc create mode 100644 plugins/coclico/forumml/packaging/dirs/plugin-forumml create mode 100644 plugins/coclico/forumml/packaging/docs/plugin-forumml create mode 100644 plugins/coclico/forumml/packaging/install/plugin-forumml create mode 100644 plugins/coclico/forumml/packaging/links/plugin-forumml create mode 100644 plugins/coclico/forumml/selinux/forumml0.pp create mode 100644 plugins/coclico/forumml/selinux/forumml0.te create mode 100644 plugins/coclico/forumml/selinux/forumml1.pp create mode 100644 plugins/coclico/forumml/selinux/forumml1.te create mode 100644 plugins/coclico/forumml/selinux/forumml2.pp create mode 100644 plugins/coclico/forumml/selinux/forumml2.te create mode 100644 plugins/coclico/forumml/selinux/forumml3.pp create mode 100644 plugins/coclico/forumml/selinux/forumml3.te create mode 100644 plugins/coclico/forumml/selinux/forumml4.pp create mode 100644 plugins/coclico/forumml/selinux/forumml4.te create mode 100644 plugins/coclico/forumml/selinux/forumml5.pp create mode 100644 plugins/coclico/forumml/selinux/forumml5.te create mode 100644 plugins/coclico/forumml/selinux/forumml6.pp create mode 100644 plugins/coclico/forumml/selinux/forumml6.te create mode 100644 plugins/coclico/forumml/selinux/forumml7.pp create mode 100644 plugins/coclico/forumml/selinux/forumml7.te create mode 100644 plugins/coclico/forumml/selinux/forumml8.pp create mode 100644 plugins/coclico/forumml/selinux/forumml8.te create mode 100644 plugins/coclico/forumml/site-content/en_US/forumml.tab create mode 100644 plugins/coclico/forumml/site-content/fr_FR/forumml.tab create mode 100644 plugins/coclico/forumml/tests/ForumML_FileStorageTest.php create mode 100644 plugins/coclico/forumml/tests/ForumML_InsertTest.php create mode 100644 plugins/coclico/forumml/tests/_fixtures/samples/attachment_only.mbox create mode 100644 plugins/coclico/forumml/tests/_fixtures/samples/html_with_inline_content_and_attch_in_html_only.mbox create mode 100644 plugins/coclico/forumml/tests/_fixtures/samples/html_with_inline_content_and_attch_in_text_plus_html.mbox create mode 100644 plugins/coclico/forumml/tests/_fixtures/samples/html_with_inline_content_in_html_only.mbox create mode 100644 plugins/coclico/forumml/tests/_fixtures/samples/html_with_inline_content_in_text_plus_html.mbox create mode 100644 plugins/coclico/forumml/tests/_fixtures/samples/pure_html_in_html_only.mbox create mode 100644 plugins/coclico/forumml/tests/_fixtures/samples/pure_html_text_plus_html.mbox create mode 100644 plugins/coclico/forumml/tests/_fixtures/samples/pure_text.mbox create mode 100644 plugins/coclico/forumml/tests/_fixtures/samples/text_plus_attachment.mbox create mode 100644 plugins/coclico/forumml/translations/en.po create mode 100644 plugins/coclico/forumml/translations/gforge.pot create mode 100755 plugins/coclico/forumml/utils/manage-translations.sh create mode 100644 plugins/coclico/forumml/www/forumml_utils.php create mode 100644 plugins/coclico/forumml/www/index.php create mode 100644 plugins/coclico/forumml/www/message.php create mode 100644 plugins/coclico/forumml/www/scripts/cc_attach_js.php create mode 100644 plugins/coclico/forumml/www/scripts/forumml.js create mode 100644 plugins/coclico/forumml/www/themes/default/css/style.css create mode 100644 plugins/coclico/forumml/www/themes/default/images/ic/attach.png create mode 100644 plugins/coclico/forumml/www/themes/default/images/ic/comment.png create mode 100644 plugins/coclico/forumml/www/themes/default/images/ic/comment_add.png create mode 100644 plugins/coclico/forumml/www/themes/default/images/ic/comments.png create mode 100644 plugins/coclico/forumml/www/themes/default/images/ic/msg.png create mode 100644 plugins/coclico/forumml/www/themes/default/images/ic/resultset_first.png create mode 100644 plugins/coclico/forumml/www/themes/default/images/ic/resultset_first_disabled.png create mode 100644 plugins/coclico/forumml/www/themes/default/images/ic/resultset_last.png create mode 100644 plugins/coclico/forumml/www/themes/default/images/ic/resultset_last_disabled.png create mode 100644 plugins/coclico/forumml/www/themes/default/images/ic/resultset_next.png create mode 100644 plugins/coclico/forumml/www/themes/default/images/ic/resultset_next_disabled.png create mode 100644 plugins/coclico/forumml/www/themes/default/images/ic/resultset_previous.png create mode 100644 plugins/coclico/forumml/www/themes/default/images/ic/resultset_previous_disabled.png create mode 100644 plugins/coclico/forumml/www/themes/default/images/ic/spinner-greenie.gif create mode 100644 plugins/coclico/forumml/www/themes/default/images/ic/trash.png create mode 100644 plugins/coclico/forumml/www/upload.php diff --git a/.gitattributes b/.gitattributes index 13866058f0..be8cd29fbc 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3949,6 +3949,115 @@ packaging/tag_packaging_create -text packaging/tag_packaging_delete -text plugins/coclico/Makefile -text plugins/coclico/Makefile.debian -text +plugins/coclico/forumml/PEAR/Archive_Tar-1.3.3.tgz -text svneol=unset#unset +plugins/coclico/forumml/PEAR/Console_Getopt-1.2.3.tgz -text svneol=unset#unset +plugins/coclico/forumml/PEAR/Mail-1.1.14.tgz -text svneol=unset#unset +plugins/coclico/forumml/PEAR/Mail_Mbox-0.6.1.tgz -text svneol=unset#unset +plugins/coclico/forumml/PEAR/Mail_Mime-1.5.2.tgz -text svneol=unset#unset +plugins/coclico/forumml/PEAR/Mail_mimeDecode-1.5.0.tgz -text svneol=unset#unset +plugins/coclico/forumml/PEAR/Structures_Graph-1.0.2.tgz -text svneol=unset#unset +plugins/coclico/forumml/PEAR/XML_Util-1.2.1.tgz -text svneol=unset#unset +plugins/coclico/forumml/README.txt -text +plugins/coclico/forumml/TODO -text +plugins/coclico/forumml/bin/db-upgrade.pl -text +plugins/coclico/forumml/bin/installFF.sh -text +plugins/coclico/forumml/bin/mail_2_DBFF.php -text +plugins/coclico/forumml/bin/mail_2_DBFF.pl -text +plugins/coclico/forumml/bin/ml_arch_2_DBFF.pl -text +plugins/coclico/forumml/common/forumml-init.php -text +plugins/coclico/forumml/db/forumml-init.sql -text +plugins/coclico/forumml/db/install.sql -text +plugins/coclico/forumml/debian/README.Debian -text +plugins/coclico/forumml/debian/README.source -text +plugins/coclico/forumml/debian/changelog -text +plugins/coclico/forumml/debian/compat -text +plugins/coclico/forumml/debian/control -text +plugins/coclico/forumml/debian/copyright -text +plugins/coclico/forumml/debian/docs -text +plugins/coclico/forumml/debian/dsf-in/plugin-forumml.postinst -text +plugins/coclico/forumml/debian/dsf-in/plugin-forumml.prerm -text +plugins/coclico/forumml/debian/po/templates.pot -text +plugins/coclico/forumml/debian/rules -text +plugins/coclico/forumml/debian/source/format -text +plugins/coclico/forumml/etc/forumml.inc.dist -text +plugins/coclico/forumml/include/ForumMLGroupSearchEngine.class.php -text +plugins/coclico/forumml/include/ForumMLHtmlSearchRenderer.class.php -text +plugins/coclico/forumml/include/ForumMLInsert.class.php -text +plugins/coclico/forumml/include/ForumMLPluginDescriptor.class.php -text +plugins/coclico/forumml/include/ForumMLPluginInfo.class.php -text +plugins/coclico/forumml/include/ForumMLSearchEngine.class.php -text +plugins/coclico/forumml/include/ForumMLSearchQuery.class.php -text +plugins/coclico/forumml/include/ForumML_Attachment.class.php -text +plugins/coclico/forumml/include/ForumML_AttachmentDao.class.php -text +plugins/coclico/forumml/include/ForumML_FileStorage.class.php -text +plugins/coclico/forumml/include/ForumML_HTMLPurifier.class.php -text +plugins/coclico/forumml/include/ForumML_MessageDao.class.php -text +plugins/coclico/forumml/include/ForumML_MessageManager.class.php -text +plugins/coclico/forumml/include/ForumML_mimeDecode.class.php -text +plugins/coclico/forumml/include/forummlPlugin.class.php -text +plugins/coclico/forumml/packaging/control/000source -text +plugins/coclico/forumml/packaging/control/222plugin-forumml -text +plugins/coclico/forumml/packaging/control/222plugin-forumml.shortdesc -text +plugins/coclico/forumml/packaging/dirs/plugin-forumml -text +plugins/coclico/forumml/packaging/docs/plugin-forumml -text +plugins/coclico/forumml/packaging/install/plugin-forumml -text +plugins/coclico/forumml/packaging/links/plugin-forumml -text +plugins/coclico/forumml/selinux/forumml0.pp -text svneol=unset#unset +plugins/coclico/forumml/selinux/forumml0.te -text +plugins/coclico/forumml/selinux/forumml1.pp -text svneol=unset#unset +plugins/coclico/forumml/selinux/forumml1.te -text +plugins/coclico/forumml/selinux/forumml2.pp -text svneol=unset#unset +plugins/coclico/forumml/selinux/forumml2.te -text +plugins/coclico/forumml/selinux/forumml3.pp -text svneol=unset#unset +plugins/coclico/forumml/selinux/forumml3.te -text +plugins/coclico/forumml/selinux/forumml4.pp -text svneol=unset#unset +plugins/coclico/forumml/selinux/forumml4.te -text +plugins/coclico/forumml/selinux/forumml5.pp -text svneol=unset#unset +plugins/coclico/forumml/selinux/forumml5.te -text +plugins/coclico/forumml/selinux/forumml6.pp -text svneol=unset#unset +plugins/coclico/forumml/selinux/forumml6.te -text +plugins/coclico/forumml/selinux/forumml7.pp -text svneol=unset#unset +plugins/coclico/forumml/selinux/forumml7.te -text +plugins/coclico/forumml/selinux/forumml8.pp -text svneol=unset#unset +plugins/coclico/forumml/selinux/forumml8.te -text +plugins/coclico/forumml/site-content/en_US/forumml.tab -text +plugins/coclico/forumml/site-content/fr_FR/forumml.tab -text +plugins/coclico/forumml/tests/ForumML_FileStorageTest.php -text +plugins/coclico/forumml/tests/ForumML_InsertTest.php -text +plugins/coclico/forumml/tests/_fixtures/samples/attachment_only.mbox -text +plugins/coclico/forumml/tests/_fixtures/samples/html_with_inline_content_and_attch_in_html_only.mbox -text +plugins/coclico/forumml/tests/_fixtures/samples/html_with_inline_content_and_attch_in_text_plus_html.mbox -text +plugins/coclico/forumml/tests/_fixtures/samples/html_with_inline_content_in_html_only.mbox -text +plugins/coclico/forumml/tests/_fixtures/samples/html_with_inline_content_in_text_plus_html.mbox -text +plugins/coclico/forumml/tests/_fixtures/samples/pure_html_in_html_only.mbox -text +plugins/coclico/forumml/tests/_fixtures/samples/pure_html_text_plus_html.mbox -text +plugins/coclico/forumml/tests/_fixtures/samples/pure_text.mbox -text +plugins/coclico/forumml/tests/_fixtures/samples/text_plus_attachment.mbox -text +plugins/coclico/forumml/translations/en.po -text +plugins/coclico/forumml/translations/gforge.pot -text +plugins/coclico/forumml/utils/manage-translations.sh -text +plugins/coclico/forumml/www/forumml_utils.php -text +plugins/coclico/forumml/www/index.php -text +plugins/coclico/forumml/www/message.php -text +plugins/coclico/forumml/www/scripts/cc_attach_js.php -text +plugins/coclico/forumml/www/scripts/forumml.js -text +plugins/coclico/forumml/www/themes/default/css/style.css -text +plugins/coclico/forumml/www/themes/default/images/ic/attach.png -text svneol=unset#unset +plugins/coclico/forumml/www/themes/default/images/ic/comment.png -text svneol=unset#unset +plugins/coclico/forumml/www/themes/default/images/ic/comment_add.png -text svneol=unset#unset +plugins/coclico/forumml/www/themes/default/images/ic/comments.png -text svneol=unset#unset +plugins/coclico/forumml/www/themes/default/images/ic/msg.png -text svneol=unset#unset +plugins/coclico/forumml/www/themes/default/images/ic/resultset_first.png -text svneol=unset#unset +plugins/coclico/forumml/www/themes/default/images/ic/resultset_first_disabled.png -text svneol=unset#unset +plugins/coclico/forumml/www/themes/default/images/ic/resultset_last.png -text svneol=unset#unset +plugins/coclico/forumml/www/themes/default/images/ic/resultset_last_disabled.png -text svneol=unset#unset +plugins/coclico/forumml/www/themes/default/images/ic/resultset_next.png -text svneol=unset#unset +plugins/coclico/forumml/www/themes/default/images/ic/resultset_next_disabled.png -text svneol=unset#unset +plugins/coclico/forumml/www/themes/default/images/ic/resultset_previous.png -text svneol=unset#unset +plugins/coclico/forumml/www/themes/default/images/ic/resultset_previous_disabled.png -text svneol=unset#unset +plugins/coclico/forumml/www/themes/default/images/ic/spinner-greenie.gif -text svneol=unset#unset +plugins/coclico/forumml/www/themes/default/images/ic/trash.png -text svneol=unset#unset +plugins/coclico/forumml/www/upload.php -text plugins/coclico/mailman/README.txt -text plugins/coclico/mailman/bin/db-delete.pl -text plugins/coclico/mailman/bin/db-upgrade.pl -text diff --git a/plugins/coclico/forumml/PEAR/Archive_Tar-1.3.3.tgz b/plugins/coclico/forumml/PEAR/Archive_Tar-1.3.3.tgz new file mode 100644 index 0000000000000000000000000000000000000000..2cc3c08fb6bd38e3777a9772cdc9d4d0aa06498b GIT binary patch literal 18119 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%0AZADDK%e@}R&Un<1Z~L{O#GD9sy^ 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 literal 0 HcmV?d00001 diff --git a/plugins/coclico/forumml/PEAR/Mail_Mime-1.5.2.tgz b/plugins/coclico/forumml/PEAR/Mail_Mime-1.5.2.tgz new file mode 100644 index 0000000000000000000000000000000000000000..c288ade229b325571cf529fe12b9ed04a73e45f2 GIT binary patch literal 22176 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 literal 0 HcmV?d00001 diff --git a/plugins/coclico/forumml/PEAR/Mail_mimeDecode-1.5.0.tgz b/plugins/coclico/forumml/PEAR/Mail_mimeDecode-1.5.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..5b12f7c7dda35dfc67735f1895f0cf15b1b7ddaa GIT binary patch literal 9281 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 literal 0 HcmV?d00001 diff --git a/plugins/coclico/forumml/PEAR/Structures_Graph-1.0.2.tgz b/plugins/coclico/forumml/PEAR/Structures_Graph-1.0.2.tgz new file mode 100644 index 0000000000000000000000000000000000000000..f46064632a7e92cb769e69e2b8aff00d70116964 GIT binary patch literal 30947 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®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 literal 0 HcmV?d00001 diff --git a/plugins/coclico/forumml/README.txt b/plugins/coclico/forumml/README.txt new file mode 100644 index 0000000000..eada33e66d --- /dev/null +++ b/plugins/coclico/forumml/README.txt @@ -0,0 +1,46 @@ +ForumML + +ForumML is a contraction of "Forum - Mailing List". +The goal of the plugin is to add forum-like behaviors to mailing lists. + +ForumML is a plugin that adds a web interface to mailing list archives. +It makes it easier to browse and search mailing lists. +It also provides a way to post to a list from the web interface. +In this case, Codendi uses your login email adress to post to the list. +The actual acceptance/distribution/archival of the message still +depends on mailman configuration. + + +==== INSTALLATION === + +bin/installFF.sh should do whatever is necessary for the plugin works +* creation of directory with good rights +* installation of pear packages +* config mailman + +==== Importing existing list archives in Codendi ==== + +## To import ML archives of specific projects, into ForumML DB, +run 'mail_2_DB.php' script. +1st argument: list name +2nd argument: 2 +$> /usr/share/codendi/src/utils/php-launcher /usr/share/codendi/plugins/forumml/bin/mail_2_DB.php codex-support 2 + +## To import ML archives of all Codendi projects, for which the plugin is enabled +run 'ml_arch_2_DB.pl' script: +$> /usr/share/codendi/plugins/forumml/bin/ml_arch_2_DB.pl + + +==== Importing existing list archives in iFusionForge ==== + +## To import ML archives of specific projects, into ForumML DB, +run 'mail_2_DBFF.php' script. +1st argument: list name +2nd argument: 2 +$> /usr/bin/php -q -d include_path=.:/etc/gforge:/usr/share/gforge:/usr/share/gforge/www/include:/usr/share/gforge/plugins forumml/bin/mail_2_DBFF.php mylistname 2 + +## To import ML archives of all projects, for which the plugin is enabled +run 'ml_arch_2_DBFF.pl' script: +$> forumml/bin/ml_arch_2_DBFF.pl + + diff --git a/plugins/coclico/forumml/TODO b/plugins/coclico/forumml/TODO new file mode 100644 index 0000000000..0a2a2b0e53 --- /dev/null +++ b/plugins/coclico/forumml/TODO @@ -0,0 +1,11 @@ +==== Current limitations ==== +- For HTML emails send in Text+HTML (aka multipart/alternative) we can display + the HTML version only because it's the first attachment we treat. + +==== For a future release ==== +- Refactor DB: +-- Mime messages tables (esp. multipart/alternative) +-- Store often used headers as table columns (date, ctype, subject, message_id) +- Insert "Reply" form with Javascript to avoid page reload+move to anchor, which is a bit disturbing... +- provide way to post to mailing list in the main List page. +- extend search to message bodies (now only on subjects) diff --git a/plugins/coclico/forumml/bin/db-upgrade.pl b/plugins/coclico/forumml/bin/db-upgrade.pl new file mode 100755 index 0000000000..246cacb28c --- /dev/null +++ b/plugins/coclico/forumml/bin/db-upgrade.pl @@ -0,0 +1,301 @@ +#!/usr/bin/perl -w +# +# Debian-specific script to upgrade the database between releases +# Roland Mas + +use strict ; +use diagnostics ; + +use DBI ; +use MIME::Base64 ; +use HTML::Entities ; + +use vars qw/$dbh @reqlist $query/ ; +use vars qw/$sys_default_domain $sys_cvs_host $sys_download_host + $sys_shell_host $sys_users_host $sys_docs_host $sys_lists_host + $sys_dns1_host $sys_dns2_host $FTPINCOMING_DIR $FTPFILES_DIR + $sys_urlroot $sf_cache_dir $sys_name $sys_themeroot + $sys_news_group $sys_dbhost $sys_dbname $sys_dbuser $sys_dbpasswd + $sys_ldap_base_dn $sys_ldap_host $admin_login $admin_password + $server_admin $domain_name $newsadmin_groupid $statsadmin_groupid + $skill_list/ ; +use vars qw/$pluginname/ ; + +sub is_lesser ( $$ ) ; +sub is_greater ( $$ ) ; +sub debug ( $ ) ; +sub parse_sql_file ( $ ) ; + +require ("/usr/share/gforge/lib/include.pl") ; # Include a few predefined functions +require ("/usr/share/gforge/lib/sqlparser.pm") ; # Our magic SQL parser + +debug "You'll see some debugging info during this installation." ; +debug "Do not worry unless told otherwise." ; + +&db_connect ; + +# debug "Connected to the database OK." ; + +$pluginname = "forumml" ; + +$dbh->{AutoCommit} = 0; +$dbh->{RaiseError} = 1; +eval { + my ($sth, @array, $version, $path, $target) ; + + &create_metadata_table ("0") ; + + $version = &get_db_version ; + $target = "0.1" ; + if (is_lesser $version, $target) { + my @filelist = ( "/usr/share/gforge/plugins/$pluginname/db/$pluginname-init.sql" ) ; + + foreach my $file (@filelist) { + debug "Processing $file" ; + @reqlist = @{ &parse_sql_file ($file) } ; + + foreach my $s (@reqlist) { + $query = $s ; + # debug $query ; + $sth = $dbh->prepare ($query) ; + $sth->execute () ; + $sth->finish () ; + } + } + @reqlist = () ; + + &update_db_version ($target) ; + debug "Committing." ; + $dbh->commit () ; + } + +# $version = &get_db_version ; +# $target = "0.2" ; +# if (is_lesser $version, $target) { +# debug "Adding local data." ; +# +# do "/etc/gforge/local.pl" or die "Cannot read /etc/gforge/local.pl" ; +# +# my $ip_address = qx/host $domain_name | awk '{print \}'/ ; +# +# @reqlist = ( +# "INSERT INTO plugin_".$pluginname."_sample_data (domain, ip_address) VALUES ('$domain_name', '$ip_address')", +# ) ; +# +# foreach my $s (@reqlist) { +# $query = $s ; +# # debug $query ; +# $sth = $dbh->prepare ($query) ; +# $sth->execute () ; +# $sth->finish () ; +# } +# @reqlist = () ; +# +# &update_db_version ($target) ; +# debug "Committing." ; +# $dbh->commit () ; +# } + + debug "It seems your database install/upgrade went well and smoothly. That's cool." ; + debug "Please enjoy using Debian FusionForge." ; + + # There should be a commit at the end of every block above. + # If there is not, then it might be symptomatic of a problem. + # For safety, we roll back. + $dbh->rollback (); +}; + +if ($@) { + warn "Transaction aborted because $@" ; + debug "Transaction aborted because $@" ; + debug "Last SQL query was:\n$query\n(end of query)" ; + $dbh->rollback ; + debug "Please report this bug on the Debian bug-tracking system." ; + debug "Please include the previous messages as well to help debugging." ; + debug "You should not worry too much about this," ; + debug "your DB is still in a consistent state and should be usable." ; + exit 1 ; +} + +$dbh->rollback ; +$dbh->disconnect ; + +sub is_lesser ( $$ ) { + my $v1 = shift || 0 ; + my $v2 = shift || 0 ; + + my $rc = system "dpkg --compare-versions $v1 lt $v2" ; + + return (! $rc) ; +} + +sub is_greater ( $$ ) { + my $v1 = shift || 0 ; + my $v2 = shift || 0 ; + + my $rc = system "dpkg --compare-versions $v1 gt $v2" ; + + return (! $rc) ; +} + +sub debug ( $ ) { + my $v = shift ; + chomp $v ; + print STDERR "$v\n" ; +} + +sub create_metadata_table ( $ ) { + my $v = shift || "0" ; + my $tablename = "plugin_" .$pluginname . "_meta_data" ; + # Do we have the metadata table? + + $query = "SELECT count(*) FROM pg_class WHERE relname = '$tablename' and relkind = 'r'"; + # debug $query ; + my $sth = $dbh->prepare ($query) ; + $sth->execute () ; + my @array = $sth->fetchrow_array () ; + $sth->finish () ; + + # Let's create this table if we have it not + + if ($array [0] == 0) { + debug "Creating $tablename table." ; + $query = "CREATE TABLE $tablename (key varchar primary key, value text not null)" ; + # debug $query ; + $sth = $dbh->prepare ($query) ; + $sth->execute () ; + $sth->finish () ; + } + + $query = "SELECT count(*) FROM $tablename WHERE key = 'db-version'"; + # debug $query ; + $sth = $dbh->prepare ($query) ; + $sth->execute () ; + @array = $sth->fetchrow_array () ; + $sth->finish () ; + + # Empty table? We'll have to fill it up a bit + + if ($array [0] == 0) { + debug "Inserting first data into $tablename table." ; + $query = "INSERT INTO $tablename (key, value) VALUES ('db-version', '$v')" ; + # debug $query ; + $sth = $dbh->prepare ($query) ; + $sth->execute () ; + $sth->finish () ; + } +} + +sub update_db_version ( $ ) { + my $v = shift or die "Not enough arguments" ; + my $tablename = "plugin_" .$pluginname . "_meta_data" ; + + debug "Updating $tablename table." ; + $query = "UPDATE $tablename SET value = '$v' WHERE key = 'db-version'" ; + # debug $query ; + my $sth = $dbh->prepare ($query) ; + $sth->execute () ; + $sth->finish () ; +} + +sub get_db_version () { + my $tablename = "plugin_" .$pluginname . "_meta_data" ; + + $query = "SELECT value FROM $tablename WHERE key = 'db-version'" ; + # debug $query ; + my $sth = $dbh->prepare ($query) ; + $sth->execute () ; + my @array = $sth->fetchrow_array () ; + $sth->finish () ; + + my $version = $array [0] ; + + return $version ; +} + +sub drop_table_if_exists ( $ ) { + my $tname = shift or die "Not enough arguments" ; + $query = "SELECT count(*) FROM pg_class WHERE relname='$tname' AND relkind='r'" ; + my $sth = $dbh->prepare ($query) ; + $sth->execute () ; + my @array = $sth->fetchrow_array () ; + $sth->finish () ; + + if ($array [0] != 0) { + # debug "Dropping table $tname" ; + $query = "DROP TABLE $tname" ; + # debug $query ; + $sth = $dbh->prepare ($query) ; + $sth->execute () ; + $sth->finish () ; + } +} + +sub drop_sequence_if_exists ( $ ) { + my $sname = shift or die "Not enough arguments" ; + $query = "SELECT count(*) FROM pg_class WHERE relname='$sname' AND relkind='S'" ; + my $sth = $dbh->prepare ($query) ; + $sth->execute () ; + my @array = $sth->fetchrow_array () ; + $sth->finish () ; + + if ($array [0] != 0) { + # debug "Dropping sequence $sname" ; + $query = "DROP SEQUENCE $sname" ; + # debug $query ; + $sth = $dbh->prepare ($query) ; + $sth->execute () ; + $sth->finish () ; + } +} + +sub drop_index_if_exists ( $ ) { + my $iname = shift or die "Not enough arguments" ; + $query = "SELECT count(*) FROM pg_class WHERE relname='$iname' AND relkind='i'" ; + my $sth = $dbh->prepare ($query) ; + $sth->execute () ; + my @array = $sth->fetchrow_array () ; + $sth->finish () ; + + if ($array [0] != 0) { + # debug "Dropping index $iname" ; + $query = "DROP INDEX $iname" ; + # debug $query ; + $sth = $dbh->prepare ($query) ; + $sth->execute () ; + $sth->finish () ; + } +} + +sub drop_view_if_exists ( $ ) { + my $iname = shift or die "Not enough arguments" ; + $query = "SELECT count(*) FROM pg_class WHERE relname='$iname' AND relkind='v'" ; + my $sth = $dbh->prepare ($query) ; + $sth->execute () ; + my @array = $sth->fetchrow_array () ; + $sth->finish () ; + + if ($array [0] != 0) { + # debug "Dropping view $iname" ; + $query = "DROP VIEW $iname" ; + # debug $query ; + $sth = $dbh->prepare ($query) ; + $sth->execute () ; + $sth->finish () ; + } +} + +sub bump_sequence_to ( $$ ) { + my ($sth, @array, $seqname, $targetvalue) ; + + $seqname = shift ; + $targetvalue = shift ; + + do { + $query = "select nextval ('$seqname')" ; + $sth = $dbh->prepare ($query) ; + $sth->execute () ; + @array = $sth->fetchrow_array () ; + $sth->finish () ; + } until $array[0] >= $targetvalue ; +} diff --git a/plugins/coclico/forumml/bin/installFF.sh b/plugins/coclico/forumml/bin/installFF.sh new file mode 100755 index 0000000000..0dff40f53b --- /dev/null +++ b/plugins/coclico/forumml/bin/installFF.sh @@ -0,0 +1,26 @@ +#! /bin/sh + +echo "#" +echo "# ForumML Plugin install" +echo "#" + +## Chown ForumMl temp and data dir +touch /var/log/gforge/forumml_hook.log +chown root.list /var/log/gforge/forumml_hook.log +chmod 664 /var/log/gforge/forumml_hook.log +chown gforge.gforge /var/spool/forumml /var/lib/gforge/forumml +chown gforge.gforge /usr/share/gforge/plugins/forumml/bin/mail_2_DBFF.pl +chmod 06755 /usr/share/gforge/plugins/forumml/bin/mail_2_DBFF.pl + +## Update Mailman config to enable the Hook +if ! grep -q ^PUBLIC_EXTERNAL_ARCHIVER /usr/lib/mailman/Mailman/mm_cfg.py +then + cat <> /usr/lib/mailman/Mailman/mm_cfg.py +# ForumML Plugin +PUBLIC_EXTERNAL_ARCHIVER = '/usr/share/gforge/plugins/forumml/bin/mail_2_DBFF.pl %(listname)s ;' +PRIVATE_EXTERNAL_ARCHIVER = '/usr/share/gforge/plugins/forumml/bin/mail_2_DBFF.pl %(listname)s ;' +EOF +fi + +## restart mailman +invoke-rc.d mailman restart diff --git a/plugins/coclico/forumml/bin/mail_2_DBFF.php b/plugins/coclico/forumml/bin/mail_2_DBFF.php new file mode 100755 index 0000000000..fa08f6c690 --- /dev/null +++ b/plugins/coclico/forumml/bin/mail_2_DBFF.php @@ -0,0 +1,143 @@ +#! /usr/bin/php5 + 0) { + $id_list = db_result($res,0,'group_list_id'); + $gr_id = db_result($res,0,'group_id'); +} else { + $stderr = fopen('php://stderr', 'w'); + fwrite($stderr, "Invalid mailing-list $list \n"); + fclose($stderr); + exit; +} +$plugin_manager =& PluginManager::instance(); +$p =& $plugin_manager->getPluginByName('forumml'); +if ($p && $plugin_manager->isPluginAvailable($p) ) { + if ($argv[2] == 2) { + // get list archive + $forumml_arch = $GLOBALS['forumml_arch'];; + $mbox_file = $forumml_arch."/private/".$list.".mbox/".$list.".mbox"; + // check if mbox file exists + if (! is_file($mbox_file)) { + $stderr = fopen('php://stderr', 'w'); + fwrite($stderr, "Invalid mbox file $mbox_file \n"); + fclose($stderr); + exit; + } + // Do not import from archives if there are already messages for this list + $sql = 'SELECT NULL FROM plugin_forumml_message WHERE id_list = $1 LIMIT 1'; + $res = db_query_params($sql,array($id_list)); + if ($res && db_numrows($res) > 0) { + $stderr = fopen('php://stderr', 'w'); + fwrite($stderr, "Cannot import messages from archive.\nThere are already messages in the database for $list ($mbox_file)\n"); + fclose($stderr); + exit; + } + } else { + // get 3rd argument + $temp_file = $argv[3]; + // get temp file parent dir + $forumml_tmp = $GLOBALS['forumml_tmp']; + $mbox_file = $forumml_tmp."/".$temp_file; + } + // Open the mail that has been temporary stored + $mbox = new Mail_Mbox($mbox_file); + $mbox->open(); + if (PEAR::isError($mbox)) { + print "Unable to open mbox: ".$mbox->getMessage().PHP_EOL; + } else { + $nbMailInserted = 0; + $num_msg = $mbox->size(); + for ($i = 0; $i < $num_msg; $i++) { + $thisMessage = $mbox->get($i); + if (PEAR::isError($thisMessage)) { + print "Unable to get message $i: ".$thisMessage->getMessage().PHP_EOL; + } else { + // Decode email + $args['include_bodies'] = TRUE; + $args['decode_bodies'] = TRUE; + $args['decode_headers'] = TRUE; + $args['crlf'] = "\r\n"; + $decoder = new ForumML_mimeDecode($thisMessage, "\r\n"); + $structure = $decoder->decode($args); + + // Get ForumML storage + $forumml_dir = $GLOBALS['forumml_dir']; + $forumml_storage = new ForumML_FileStorage($forumml_dir); + + // Store email + $insert = new ForumMLInsert($id_list); + $msgId = $insert->storeEmail($structure, $forumml_storage); + if ($msgId) { + $nbMailInserted++; + } + } + } + + // Display message when importing a mail archive + if ($argv[2] == 2) { + if ($num_msg == $nbMailInserted) { + echo 'Operation Completed.'.$num_msg.' imported'.PHP_EOL; + } else { + echo '*** Error: '.$num_msg.' in '.$mbox_file.' file but '. $nbMailInserted.' stored in database'.PHP_EOL; + } + } + } +} + +// delete temporary file +/*if ($argv[2] == 1) { + if (is_file($mbox_file)) { + unlink($mbox_file); + } +} +*/ +?> diff --git a/plugins/coclico/forumml/bin/mail_2_DBFF.pl b/plugins/coclico/forumml/bin/mail_2_DBFF.pl new file mode 100755 index 0000000000..acb133cc64 --- /dev/null +++ b/plugins/coclico/forumml/bin/mail_2_DBFF.pl @@ -0,0 +1,106 @@ +#!/usr/bin/perl -UT + +# Copyright (c) STMicroelectronics, 2005. All Rights Reserved. +# +# Originally written by Jean-Philippe Giola, 2005 +# +# This file is a part of codendi. +# +# codendi is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# codendi is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with codendi; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +# Taint mode enabled + +# mailing-list name should contain only alphabetical characters, '-' and '.' +sub validate_listname { + my $arg = shift; + my $listname = ""; + my $match = 0; + + if($arg =~ /^([-.\w]+)$/) { + if ($match == 0) { + $listname = $1; + } + } + return $listname; +} + +use strict; + +# Set default path (required by taint mode) +$ENV{'PATH'} = '/usr/bin:/bin'; +my $debug; +open ( $debug , '>> /tmp/debugperl' ); +# Hook log file +my $logfile = "/var/log/gforge/forumml_hook.log"; + +# Redirect outputs +open STDOUT, ">>", $logfile or die "cannot append to '$logfile': $!\n"; +open STDERR, ">&STDOUT" or die "cannot append STDERR to STDOUT: $!\n"; + +# Search if there are lists we shouldn't treat +my $conf = '/usr/share/gforge/plugins/forumml/etc/forumml.inc'; +if (-f $conf) { + # Get the variable defined in forumml.inc + my @exc_lists; + open(FORUMML_INC, "<$conf"); + while () { + if (m/^\$forumml_excluded_lists[ ]*=[ ]*"(.*)"[ ]*;[ ]*$/) { + @exc_lists = split(/[ ]*,[ ]*/, $1); + } + } + close(FORUMML_INC); + + # Test if given list is excluded or not + foreach my $list (@exc_lists) { + if ($list eq $ARGV[0]) { + exit 2; + } + } +} + +# First argument is mandatory (list name) +my $listname = $ARGV[0]; +chomp($listname); +if($listname eq "") { + exit 1 +} + +# Get mail from STDIN, store it in a temporary file, then pass it to php script +my $range = 100; +my $random = int(rand($range)); +my $temp = "mail_tmp_".$random."_".time(); +my $path = "/var/spool/forumml/".$temp; +open(OUT, ">>$path"); +while (defined($_ = )) { + print OUT $_; +} +close(OUT); + +# Get PHP_PARAMS variable from php-laucher.sh +my $PHP_PARAMS="-q -d include_path=.:/etc/gforge:/usr/share/gforge:/usr/share/gforge/www/include:/usr/share/gforge/plugins"; +#open(PHP_LAUNCHER, ") { +# if (m/^[ ]*PHP_PARAMS="(.*)"$/) { +# $PHP_PARAMS=$1; +# last; +# } +#} +#close(PHP_LAUNCHER); + +# store mail in ForumML DB +exec "/usr/bin/php $PHP_PARAMS /usr/share/gforge/plugins/forumml/bin/mail_2_DBFF.php $listname 1 $temp"; + +close STDOUT; +close STDERR; diff --git a/plugins/coclico/forumml/bin/ml_arch_2_DBFF.pl b/plugins/coclico/forumml/bin/ml_arch_2_DBFF.pl new file mode 100755 index 0000000000..6df75eeb3b --- /dev/null +++ b/plugins/coclico/forumml/bin/ml_arch_2_DBFF.pl @@ -0,0 +1,71 @@ +#!/usr/bin/perl + +# +# Copyright (c) STMicroelectronics, 2007. All Rights Reserved. +# +# Originally written by Mohamed CHAARI, 2007 +# +# This file is a part of codendi. +# +# codendi is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# codendi is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with codendi; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +=pod + +This script aims at achieving the migration of archives, of all _active_ mailing-lists, to the ForumML database. +Only projects that enabled ForumML plugin are concerned by this migration. + +=cut + +# Search if there are lists we shouldn't treat +my $conf = '/usr/share/gforge/plugins/forumml/etc/forumml.inc'; +my %excluded_list; +if (-f $conf) { + # Get the variable defined in forumml.inc + my @exc_lists; + open(FORUMML_INC, "<$conf"); + while () { + if (m/^\$forumml_excluded_lists[ ]*=[ ]*"(.*)"[ ]*;[ ]*$/) { + @exc_lists = split(/[ ]*,[ ]*/, $1); + } + } + close(FORUMML_INC); + + # Test if given list is excluded or not + foreach my $list (@exc_lists) { + $excluded_list{$list} = 0; + } +} + +# Get PHP_PARAMS variable from php-laucher.sh +my $PHP_PARAMS="-q -d include_path=.:/etc/gforge:/usr/share/gforge:/usr/share/gforge/www/include:/usr/share/gforge/plugins"; + +#use strict; +use DBI; + +require "/etc/gforge/local.pl"; +my $dbh = DBI->connect("DBI:Pg:host=localhost ;dbname=$sys_dbname ; user= $sys_dbuser ; password=$sys_dbpasswd") or die "Couldn't connect to database: " . DBI->errstr; + + +# get all active mailing-lists +my $query = "SELECT list_name, group_id FROM mail_group_list WHERE status = 3"; +my $req = $dbh->prepare($query); +$req->execute(); +while (my ($list_name,$group_id) = $req->fetchrow()) { + if(! exists $excluded_list{$list_name}) { + print "Processing ".$list_name." mailing-list ...\n "; + system("/usr/bin/php $PHP_PARAMS /usr/share/gforge/plugins/forumml/bin/mail_2_DBFF.php $list_name 2"); + } +} diff --git a/plugins/coclico/forumml/common/forumml-init.php b/plugins/coclico/forumml/common/forumml-init.php new file mode 100644 index 0000000000..6c8ff1cfcf --- /dev/null +++ b/plugins/coclico/forumml/common/forumml-init.php @@ -0,0 +1,36 @@ + diff --git a/plugins/coclico/forumml/db/forumml-init.sql b/plugins/coclico/forumml/db/forumml-init.sql new file mode 100644 index 0000000000..90b9ae5f2b --- /dev/null +++ b/plugins/coclico/forumml/db/forumml-init.sql @@ -0,0 +1,104 @@ +-- alter table plugin_forumml_message add column last_thread_update int unsigned not null default 0 after body; +CREATE SEQUENCE plugin_forumml_pk_seq + START WITH 1 + INCREMENT BY 1 + MAXVALUE 2147483647 + NO MINVALUE + CACHE 1; + +CREATE TABLE plugin_forumml_attachment ( + id_attachment INTEGER DEFAULT nextval('plugin_forumml_pk_seq'::text) NOT NULL, + id_message INTEGER NOT NULL, + file_name TEXT NOT NULL, + file_type character varying(80) NOT NULL, + file_size INTEGER NOT NULL, + file_path character varying(255) NOT NULL, + content_id character varying(255) not null default '', + PRIMARY KEY(id_attachment) +); + + + +CREATE SEQUENCE plugin_forumml_header_pk_seq + START WITH 1 + INCREMENT BY 1 + MAXVALUE 2147483647 + NO MINVALUE + CACHE 1; + +CREATE TABLE plugin_forumml_header ( + id_header INTEGER DEFAULT nextval('plugin_forumml_header_pk_seq'::text) NOT NULL, + name character varying(255) NOT NULL, + PRIMARY KEY(id_header) +); + +CREATE SEQUENCE plugin_forumml_message_pk_seq + START WITH 1 + INCREMENT BY 1 + MAXVALUE 2147483647 + NO MINVALUE + CACHE 1; + +CREATE TABLE plugin_forumml_message ( + id_message INTEGER DEFAULT nextval('plugin_forumml_message_pk_seq'::text) NOT NULL, + id_list INTEGER NOT NULL, + id_parent INTEGER NOT NULL, + body TEXT NULL, + last_thread_update INTEGER NOT NULL DEFAULT 0, + msg_type character varying(30) not null default '', + cached_html text default null, + PRIMARY KEY(id_message) +); + +CREATE TABLE plugin_forumml_messageheader ( + id_message INTEGER NOT NULL, + id_header INTEGER NOT NULL, + value TEXT NOT NULL, + PRIMARY KEY(id_message, id_header) +); + +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('1','message-id'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('2','date'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('3','from'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('4','subject'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('5','return-path'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('6','delivered-to'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('7','to'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('8','in-reply-to'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('9','references'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('10','x-mailer'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('11','mime-version'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('12','content-type'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('13','content-transfer-encoding'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('14','sender'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('15','errors-to'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('16','x-beenthere'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('17','x-mailman-version'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('18','precedence'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('19','list-help'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('20','list-post'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('21','list-subscribe'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('22','list-id'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('23','list-unsubscribe'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('24','list-archive'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('25','x-original-to'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('26','x-priority'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('27','x-msmail-priority'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('28','importance'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('29','x-mimeole'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('30','reply-to'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('31','x-list-received-date'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('32','user-agent'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('33','x-mailman-approved-at'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('34','cc'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('35','x-mozilla-status'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('36','x-mozilla-status2'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('37','thread-index'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('38','x-accept-language'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('39','keywords'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('40','organization'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('41','x-reply-to'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('42','x-enigmail-version'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('43','x-enigmail-supports'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('44','x-ms-tnef-correlator'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('45','x-pgp-universal'); diff --git a/plugins/coclico/forumml/db/install.sql b/plugins/coclico/forumml/db/install.sql new file mode 100644 index 0000000000..de6f259bf6 --- /dev/null +++ b/plugins/coclico/forumml/db/install.sql @@ -0,0 +1,85 @@ +-- alter table plugin_forumml_message add column last_thread_update int unsigned not null default 0 after body; +CREATE TABLE plugin_forumml_attachment ( + id_attachment INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, + id_message INTEGER UNSIGNED NOT NULL, + file_name TEXT NOT NULL, + file_type VARCHAR(80) NOT NULL, + file_size INTEGER UNSIGNED NOT NULL, + file_path VARCHAR(255) NOT NULL, + content_id varchar(255) not null default '', + PRIMARY KEY(id_attachment), + KEY idx_fk_id_message (id_message, content_id(10)) +); + +CREATE TABLE plugin_forumml_header ( + id_header INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, + name VARCHAR(255) NOT NULL, + PRIMARY KEY(id_header), + KEY idx_name (name (20)) +); + +CREATE TABLE plugin_forumml_message ( + id_message INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, + id_list INTEGER UNSIGNED NOT NULL, + id_parent INTEGER UNSIGNED NOT NULL, + body TEXT NULL, + last_thread_update INTEGER UNSIGNED NOT NULL DEFAULT 0, + msg_type varchar(30) not null default '', + cached_html mediumtext default null, + PRIMARY KEY(id_message), + KEY idx_fk_id_list (id_list), + KEY idx_fk_id_parent (id_parent) +); + +CREATE TABLE plugin_forumml_messageheader ( + id_message INTEGER UNSIGNED NOT NULL, + id_header INTEGER UNSIGNED NOT NULL, + value TEXT NOT NULL, + PRIMARY KEY(id_message, id_header) +); + +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('1','message-id'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('2','date'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('3','from'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('4','subject'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('5','return-path'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('6','delivered-to'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('7','to'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('8','in-reply-to'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('9','references'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('10','x-mailer'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('11','mime-version'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('12','content-type'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('13','content-transfer-encoding'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('14','sender'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('15','errors-to'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('16','x-beenthere'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('17','x-mailman-version'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('18','precedence'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('19','list-help'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('20','list-post'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('21','list-subscribe'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('22','list-id'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('23','list-unsubscribe'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('24','list-archive'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('25','x-original-to'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('26','x-priority'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('27','x-msmail-priority'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('28','importance'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('29','x-mimeole'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('30','reply-to'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('31','x-list-received-date'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('32','user-agent'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('33','x-mailman-approved-at'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('34','cc'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('35','x-mozilla-status'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('36','x-mozilla-status2'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('37','thread-index'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('38','x-accept-language'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('39','keywords'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('40','organization'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('41','x-reply-to'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('42','x-enigmail-version'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('43','x-enigmail-supports'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('44','x-ms-tnef-correlator'); +INSERT INTO plugin_forumml_header (id_header, name) VALUES ('45','x-pgp-universal'); diff --git a/plugins/coclico/forumml/debian/README.Debian b/plugins/coclico/forumml/debian/README.Debian new file mode 100644 index 0000000000..21c3a671a2 --- /dev/null +++ b/plugins/coclico/forumml/debian/README.Debian @@ -0,0 +1,6 @@ +fusionforge-plugin-forumml for Debian +--------------------- + +See README.Debian in fusionforge-common package + + -- Christian Bayle Mon, 08 Mar 2010 16:37:51 +0100 diff --git a/plugins/coclico/forumml/debian/README.source b/plugins/coclico/forumml/debian/README.source new file mode 100644 index 0000000000..c05e006444 --- /dev/null +++ b/plugins/coclico/forumml/debian/README.source @@ -0,0 +1,9 @@ +forumml for Debian +--------------------- + + + + + + diff --git a/plugins/coclico/forumml/debian/changelog b/plugins/coclico/forumml/debian/changelog new file mode 100644 index 0000000000..f1dca2366c --- /dev/null +++ b/plugins/coclico/forumml/debian/changelog @@ -0,0 +1,11 @@ +fusionforge-plugin-forumml (1.1-1) karmic; urgency=low + + * Bump new version + + -- Mélanie Le Bail Fri, 16 Apr 2010 17:14:10 +0200 + +fusionforge-plugin-forumml (1.0-1) unstable; urgency=low + + * Initial release (Closes: #nnnn) + + -- Christian Bayle Mon, 08 Mar 2010 16:37:51 +0100 diff --git a/plugins/coclico/forumml/debian/compat b/plugins/coclico/forumml/debian/compat new file mode 100644 index 0000000000..7f8f011eb7 --- /dev/null +++ b/plugins/coclico/forumml/debian/compat @@ -0,0 +1 @@ +7 diff --git a/plugins/coclico/forumml/debian/control b/plugins/coclico/forumml/debian/control new file mode 100644 index 0000000000..50412f1c59 --- /dev/null +++ b/plugins/coclico/forumml/debian/control @@ -0,0 +1,20 @@ +Source: fusionforge-plugin-forumml +Section: devel +Priority: optional +Maintainer: Christian Bayle +Uploaders: Roland Mas +Build-Depends-Indep: devscripts +Build-Depends: debhelper (>= 7), perl, gettext +Standards-Version: 3.8.4 +Homepage: http://fusionforge.org/ +Vcs-Bzr: http://scm.fusionforge.org/bzr/fusionforge/svn-trunk-ro/ + +Package: fusionforge-plugin-forumml +Architecture: all +Depends: gforge-common, gforge-db-postgresql | gforge-db, gforge-web-apache2 | gforge-web, php5-cli, php-mail, php-mail-mime, php-mail-mbox, php-mail-mimedecode, ${misc:Depends} +Description: collaborative development tool - ForumML plugin + . + This plugin contains the ForumML subsystem of FusionForge. It allows each + FusionForge project to have its own ForumML, and gives some + control over it to the project's administrator. + diff --git a/plugins/coclico/forumml/debian/copyright b/plugins/coclico/forumml/debian/copyright new file mode 100644 index 0000000000..33ab88a1c0 --- /dev/null +++ b/plugins/coclico/forumml/debian/copyright @@ -0,0 +1,63 @@ +The "sourceforge" package was first debianised on Wed, 22 Nov 2000 +22:06:35 +0100 by Roland Mas . Work has been +constant since then, and the package evolved a great deal. It began +to work, for a start, and then it evolved into GForge, what with the +more recent versions of the Sourceforge software having been made +proprietary. And then in early 2009 it evolved into FusionForge, what +with the more recent versions of GForge having been rewritten as +proprietary software without a name change. + +FusionForge is Copyright © 2009-2010 by several people, including: +Alain Peyrat +Alexandre Neymann +Christian Bayle +Roland Mas +Gonéri Le Bouder +Julien Heyman +Olivier Meunier + +GForge itself is Copyright © 2000-2008 by a fair number of people, +including: +Tim Perdue +Roland Mas <99.roland.mas@aist.enst.fr> +Christian Bayle +Tom Copeland +Guillaume Smet +Francisco Gimeno +Sung Kim +Alain Peyrat + +Past Members of the development team include: +Reinhard Spisser +Ryan T. Sammartino +Edward Ritter +Michael Jennings + +Since FusionForge, and GForge before it, was initially a fork of +Sourceforge, here's the copyright info for the Sourceforge software: +,---- +| The original sources were downloaded from http://www.sourceforge.net/ +| +| Authors: The Sourceforge crew at VA Linux. They are many, they +| change as time goes by, and they are listed on the Sourceforge +| website. Let them be thanked for their work. +| +| Copyright: +| +| This software is Copyright © 1999-2000 by VA Linux. +| +| You are free to distribute this software under the terms of the GNU +| General Public License. +`---- + +The packaging and installing scripts (in the debian/ and deb-specific/ +directories amongst others) are Copyright © 2000-2010 by Christian +Bayle and Roland Mas . You +are free to use and redistribute them under the terms of the GNU +General Public License, version 2 or (at your option) any later +version published by the Free Software Foundation. + +See Also Copyright file in fusionforge package + +On Debian systems, the complete text of the GNU General Public License +can be found in the /usr/share/common-licenses directory. diff --git a/plugins/coclico/forumml/debian/docs b/plugins/coclico/forumml/debian/docs new file mode 100644 index 0000000000..e69de29bb2 diff --git a/plugins/coclico/forumml/debian/dsf-in/plugin-forumml.postinst b/plugins/coclico/forumml/debian/dsf-in/plugin-forumml.postinst new file mode 100644 index 0000000000..17d64f3dae --- /dev/null +++ b/plugins/coclico/forumml/debian/dsf-in/plugin-forumml.postinst @@ -0,0 +1,55 @@ +#! /bin/sh +# postinst script for @OLDPACKAGE@-plugin-forumml +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `configure' +# * `abort-upgrade' +# * `abort-remove' `in-favour' +# +# * `abort-deconfigure' `in-favour' +# `removing' +# +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package +# +# quoting from the policy: +# Any necessary prompting should almost always be confined to the +# post-installation script, and should be protected with a conditional +# so that unnecessary prompting doesn't happen if a package's +# installation fails and the `postinst' is called with `abort-upgrade', +# `abort-remove' or `abort-deconfigure'. + +case "$1" in + configure) + @OLDPACKAGE@-config + + # Prepare database + su -s /bin/sh @OLDPACKAGE@ -c '/usr/share/@OLDPACKAGE@/bin/register-plugin forumml "ForumML"' + /usr/share/gforge/plugins/forumml/bin/installFF.sh + su -s /bin/sh @OLDPACKAGE@ -c '/usr/share/@OLDPACKAGE@/plugins/forumml/bin/db-upgrade.pl' + /usr/share/@OLDPACKAGE@/plugins/forumml/bin/ml_arch_2_DBFF.pl + + ;; + + abort-upgrade|abort-remove|abort-deconfigure) + + ;; + + *) + echo "postinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 + + diff --git a/plugins/coclico/forumml/debian/dsf-in/plugin-forumml.prerm b/plugins/coclico/forumml/debian/dsf-in/plugin-forumml.prerm new file mode 100644 index 0000000000..8ca8633398 --- /dev/null +++ b/plugins/coclico/forumml/debian/dsf-in/plugin-forumml.prerm @@ -0,0 +1,45 @@ +#! /bin/sh +# prerm script for @OLDPACKAGE@-plugin-forumml +# +# see: dh_installdeb(1) +set -e + +#DEBHELPER# + +# summary of how this script can be called: +# * `remove' +# * `upgrade' +# * `failed-upgrade' +# * `remove' `in-favour' +# * `deconfigure' `in-favour' +# `removing' +# +# for details, see http://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + remove|deconfigure) + if [ -f /var/run/postgresql/.s.PGSQL.5432 ] + then + /usr/share/@OLDPACKAGE@/bin/unregister-plugin forumml + else + echo "WARNING: database not available to unregister ForumML plugin" + fi + ;; + upgrade|failed-upgrade) + ;; + *) + echo "prerm called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + + + +exit 0 + + diff --git a/plugins/coclico/forumml/debian/po/templates.pot b/plugins/coclico/forumml/debian/po/templates.pot new file mode 100644 index 0000000000..e69de29bb2 diff --git a/plugins/coclico/forumml/debian/rules b/plugins/coclico/forumml/debian/rules new file mode 100755 index 0000000000..00deab1409 --- /dev/null +++ b/plugins/coclico/forumml/debian/rules @@ -0,0 +1,90 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. +# This file was originally written by Joey Hess and Craig Small. +# As a special exception, when this file is copied by dh-make into a +# dh-make output file, you may use that output file without restriction. +# This special exception was added by Craig Small in version 0.37 of dh-make. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 +SRCPACKAGE=$(shell head -1 $(CURDIR)/debian/changelog | sed 's/\(.[^ ]*\) .*/\1/') +MAJOR=$(shell head -1 $(CURDIR)/debian/changelog | sed 's/.*(\(.*\)-[^-]*).*/\1/') +ORIGFILE=$(SRCPACKAGE)_$(MAJOR).orig.tar.gz +OLDPACKAGE=gforge +PACKAGE=fusionforge +FORGENAME=FusionForge + +SED_REPLACE=sed -e 's/@PACKAGE@/$(PACKAGE)/g' -e 's/@SRCPACKAGE@/$(SRCPACKAGE)/g' -e 's/@FORGENAME@/$(FORGENAME)/g' -e 's/@OLDPACKAGE@/$(OLDPACKAGE)/g' + +CRONDFILES=$(patsubst packaging/cron.d/%,debian/$(PACKAGE)-%.cron.d,$(wildcard packaging/cron.d/[a-z]*)) +DIRSFILES=$(patsubst packaging/dirs/%,debian/$(PACKAGE)-%.dirs,$(wildcard packaging/dirs/[a-z]*)) +LINKSFILES=$(patsubst packaging/links/%,debian/$(PACKAGE)-%.links,$(wildcard packaging/links/[a-z]*)) +INSTALLFILES=$(patsubst packaging/install/%,debian/$(PACKAGE)-%.install,$(wildcard packaging/install/[a-z]*)) +DOCSFILES=$(patsubst packaging/docs/%,debian/$(PACKAGE)-%.docs,$(wildcard packaging/docs/[a-z]*)) +POFILES=$(patsubst debian/dsf-po/%,debian/po/%,$(wildcard debian/dsf-po/*) debian/po/POTFILES.in) +DSFINFILES=$(patsubst debian/dsf-in/%,debian/$(PACKAGE)-%,$(wildcard debian/dsf-in/[a-z]*)) + +.PHONY: conffiles +conffiles: $(CRONDFILES) $(DIRSFILES) $(LINKSFILES) $(INSTALLFILES) $(DOCSFILES) $(DSFINFILES) debian/control + +debian/$(PACKAGE)-%.cron.d: + (cat $(CURDIR)/packaging/cron.d/00phpcron ; sed -e 's/\$$FFUSER/$(PACKAGE)/g' $(CURDIR)/packaging/cron.d/$*) > $@ + +debian/$(PACKAGE)-%.dirs: + cp $(CURDIR)/packaging/dirs/$* $@ + +debian/$(PACKAGE)-%.links: + cp $(CURDIR)/packaging/links/$* $@ + +debian/$(PACKAGE)-%.install: + cp $(CURDIR)/packaging/install/$* $@ + +debian/$(PACKAGE)-%.docs: + cp $(CURDIR)/packaging/docs/$* $@ + +debian/control: $(wildcard packaging/control/*) + ls $(CURDIR)/packaging/control/[0-9][0-9][0-9]* | grep -v shortdesc | grep -v scmcpold | while read file ; do cat $${file}; if [ -f $${file}.shortdesc ] ; then cat $(CURDIR)/packaging/control/AAAdesc; echo ' .'; cat $${file}.shortdesc; fi; echo ''; done | $(SED_REPLACE) > $@ + +debian/po/templates.pot: $(wildcard debian/dsf-in/*.templates.dsfh-in) $(wildcard debian/dsf-helper/*.templates) + @debconf-updatepo --podir=debian/dsf-po + +debian/po/%: + cat $(patsubst debian/po/%,debian/dsf-po/%,$@) | $(SED_REPLACE) > $@ + +# postinst and prerm files +debian/$(PACKAGE)-%: + cat $(patsubst debian/$(PACKAGE)-%,debian/dsf-in/%,$@) | $(SED_REPLACE) > $@ + +build: debian/po/templates.pot conffiles + dh $@ + # Build gettext *.mo files + utils/manage-translations.sh build + +clean: + dh $@ + rm -f $(CURDIR)/debian/*.cron.d + rm -f $(CURDIR)/debian/*.dirs + rm -f $(CURDIR)/debian/*.links + rm -f $(CURDIR)/debian/*.install + rm -f $(CURDIR)/debian/*.docs + rm -f $(CURDIR)/debian/*.postinst + rm -f $(CURDIR)/debian/*.prerm + rm -rf locales + rm -f $(POFILES) + +makeorig: + find $(PKGDIR) -type f -or -type l | grep -v '/CVS/' | \ + grep -v '/.svn/' | grep -v '/.testbox/' | \ + grep -v rpm-specific | grep -v docs/phpdoc/docs | \ + grep -v ^./debian/ | grep -v \\.jar$$ | \ + grep -v \\.pdf$$ | grep -v plugins/fckeditor/www/_samples | \ + cpio -o -H ustar | gzip > ../$(ORIGFILE) + +#binary: + #dh $@ + #ls $(CURDIR)/debian/$(SRCPACKAGE)/ + #chmod 06755 $(CURDIR)/debian/$(SRCPACKAGE)/usr/share/gforge + +%: + dh $@ diff --git a/plugins/coclico/forumml/debian/source/format b/plugins/coclico/forumml/debian/source/format new file mode 100644 index 0000000000..d3827e75a5 --- /dev/null +++ b/plugins/coclico/forumml/debian/source/format @@ -0,0 +1 @@ +1.0 diff --git a/plugins/coclico/forumml/etc/forumml.inc.dist b/plugins/coclico/forumml/etc/forumml.inc.dist new file mode 100644 index 0000000000..b748bd79d0 --- /dev/null +++ b/plugins/coclico/forumml/etc/forumml.inc.dist @@ -0,0 +1,15 @@ + diff --git a/plugins/coclico/forumml/include/ForumMLGroupSearchEngine.class.php b/plugins/coclico/forumml/include/ForumMLGroupSearchEngine.class.php new file mode 100644 index 0000000000..562b80841a --- /dev/null +++ b/plugins/coclico/forumml/include/ForumMLGroupSearchEngine.class.php @@ -0,0 +1,30 @@ +GroupSearchEngine(SEARCH__TYPE_IS_LIST, + 'ForumMLHtmlSearchRenderer', + _('ForumML')); + } + + function isAvailable($parameters) { + if (parent::isAvailable($parameters)) { + if ($this->Group->usesPlugin('forumml')) { + return true; + } + } + return false; + } +} + +?> diff --git a/plugins/coclico/forumml/include/ForumMLHtmlSearchRenderer.class.php b/plugins/coclico/forumml/include/ForumMLHtmlSearchRenderer.class.php new file mode 100644 index 0000000000..b540e943de --- /dev/null +++ b/plugins/coclico/forumml/include/ForumMLHtmlSearchRenderer.class.php @@ -0,0 +1,123 @@ +groupId = $groupId; + + $searchQuery = new ForumMLSearchQuery($words, $offset, $isExact, $groupId); + + //init the searchrendererr + $this->HtmlGroupSearchRenderer(SEARCH__TYPE_IS_LIST, $words, $isExact, + $searchQuery, $groupId, 'list'); + + // $this->tableHeaders = array(_('Thread'),_('Submitted on'), _('Author')); + + + + } + + /** + * getRows - get the html output for result rows + * + * @return string html output + */ + function getRows() { + $plugin_manager =& PluginManager::instance(); + $p =& $plugin_manager->getPluginByName('forumml'); + $rowsCount = $this->searchQuery->getRowsCount(); + $result =& $this->searchQuery->getResult(); + $dateFormat = _('Y-m-d H:i'); + + $group = group_get_object($this->groupId); + $group_name = $group->getUnixName(); + + $data = unserialize(db_result($result, 0, 'versiondata')); + + $return = " + + + + + "; + $idx=0; + while ($rows = db_fetch_array($result)) { + $idx++; + if ($idx % 2 == 0) { + $class="boxitemalt bgcolor-white"; + } else { + $class="boxitem bgcolor-grey"; + } + $subject=$rows['subject']; + + $res2 = $this->getForumMLDao()->getHeaderValue($rows['id_message'],array(2,3)); + $k = 1; + while ($rows2 =$res2->getRow()) { + $header[$k] = $rows2['value']; + $k++; + } + $from = mb_decode_mimeheader($header[1]); + + // Replace '<' by '<' and '>' by '>'. Otherwise the email adress won't be displayed + // because it will be considered as an xhtml tag. + $from = preg_replace('/\/', '>', $from); + $date = date("Y-m-d H:i",strtotime($header[2])); + // purify message subject (CODENDI_PURIFIER_FORUMML level) + $hp =& ForumML_HTMLPurifier::instance(); + $subject = $hp->purify($subject,CODENDI_PURIFIER_FORUMML); + + // display the resulting threads in rows + $return .= " + + + + "; + } + $return .='
". + _('Thread')." + ". + _('Submitted on')." + ". + _('Author')." +
+   + ".$subject." + + ".$date." + + ".$from." +
'; + return $return; + } + + function getForumMLDao() { + return new ForumML_MessageDao(CodendiDataAccess::instance()); + } +} + +?> diff --git a/plugins/coclico/forumml/include/ForumMLInsert.class.php b/plugins/coclico/forumml/include/ForumMLInsert.class.php new file mode 100644 index 0000000000..54b1cf5636 --- /dev/null +++ b/plugins/coclico/forumml/include/ForumMLInsert.class.php @@ -0,0 +1,356 @@ +id_list = $list_id; + } + + // Insert values into forumml_messageheader table + function insertMessageHeader($id_header,$value) { + + $qry = sprintf('INSERT INTO plugin_forumml_messageheader'. + ' (id_message, id_header, value)'. + ' VALUES ($1,$2,$3)'); + db_query_params($qry,array($this->id_message , $id_header , $value)); + } + + // Insert values into forumml_attachment table + function insertAttachment($id_message, $filename,$filetype,$filepath,$content_id="") { + if (is_file($filepath)) { + $filesize = filesize($filepath); + } else { + $filesize = 0; + } + $qry = sprintf('INSERT INTO plugin_forumml_attachment'. + ' (id_message, file_name, file_type, file_size, file_path, content_id)'. + ' VALUES ($1,$2,$3,$4,$5,$6)'); + db_query_params($qry,array($id_message , $filename , $filetype , $filesize , $filepath , $content_id)); + } + + // Insert values into forumml_header table + function insertHeader($header) { + + // Search if the header is already in the table + $qry = sprintf('SELECT id_header'. + ' FROM plugin_forumml_header'. + ' WHERE name = $1'); + $result = db_query_params($qry,array($header)); + + // If not, insert it + if (db_result($result,0,'id_header') == "") { + $sql = sprintf('INSERT INTO plugin_forumml_header'. + ' (name)'. + ' VALUES ($1)'); + $res = db_query_params($sql,array($header)); + return (db_insertid($res,'plugin_forumml_header','id_header')); + } else { + return (db_result($result,0,'id_header')); + } + } + + function getParentMessageFromHeader($messageIdHeader) { + $qry = 'SELECT id_message'. + ' FROM plugin_forumml_messageheader'. + ' WHERE id_header = 1'. + ' AND value = $1 '; + $result = db_query_params($qry,array($messageIdHeader)); + if ($result && !db_error($result)) { + $row = db_fetch_array($result); + return $row['id_message']; + } + return false; + } + + function updateParentDate($messageId, $date) { + if ($messageId != 0) { + $sql = 'SELECT id_parent, last_thread_update FROM plugin_forumml_message WHERE id_message = $1'; + $dar = db_query_params($sql,array($messageId)); + if ($dar && !db_error($dar)) { + $row = db_fetch_array($dar); + if ($date > $row['last_thread_update']) { + $sql = 'UPDATE plugin_forumml_message'. + ' SET last_thread_update =$1 '. + ' WHERE id_message=$2'; + db_query_params($sql,array($date,$messageId)); + + $this->updateParentDate($row['id_parent'], $date); + } + } + } + } + + // Insert values into forumml_message table + function insertMessage($structure,$body,$ctype="") { + + $this->mail = $structure; + + if (isset($structure["in-reply-to"])) { + // special case: 'in-reply-to' header may contain "Message from ... " + if (preg_match('/^Message from.*$/',$structure["in-reply-to"])) { + $arr = explode(" ",$structure["in-reply-to"]); + $reply_to = $arr[count($structure["in-reply-to"]) - 1]; + } else { + $reply_to = $structure["in-reply-to"]; + } + } else { + if (isset($structure["references"])) { + // special case: 'in-reply-to' header is not set, but 'references' - which contain list of parent messages ids - is set + $ref_arr = explode(" ",$structure["references"]); + $reply_to = $ref_arr[count($structure["references"]) - 1]; + } else { + $reply_to = ""; + } + } + + // Message date + // Cannot rely on server's date because it might be different + // and it doesn't work when it comes to load mail archives! + $messageDate = strtotime($structure['date']); + + $id_parent = 0; + // If the current message is an answer + if ($reply_to != "") { + $id_parent = $this->getParentMessageFromHeader($reply_to); + } + + if ($id_parent != 0) { + $this->updateParentDate($id_parent, $messageDate); + } + + $sql = sprintf('INSERT INTO plugin_forumml_message'. + ' ( id_list, id_parent, body, last_thread_update, msg_type)'. + ' VALUES ($1, $2, $3, $4, $5)'); + $res = db_query_params($sql,array($this->id_list , $id_parent , $body , $messageDate , $ctype)); + $this->id_message = db_insertid($res,'plugin_forumml_message','id_message'); + + // All headers of the current mail are stored in the forumml_messageheader table + $k=0; + foreach ($structure as $header => $value_header) { + $k++; + if ($k != 1) { + if ($header != "received") { + $id_header = $this->insertHeader($header); + if (is_array($value_header)) { + $value_header = implode(",",$value_header); + } + $this->insertMessageHeader($id_header,$value_header); + } + } + } + + return $this->id_message; + } + + /** + * Encode string in UTF8 if source charset given or if detected + */ + function getUtf8String($string,$charset=null) { + if ($charset == null) { + $charset = mb_detect_encoding($string); + } + if ($charset) { + return mb_convert_encoding($string, 'UTF-8', $charset); + } else { + return $string; + } + } + + /** + * Convert structure body to utf8 if charset defined in structure headers + */ + function getUtf8Body($structure) { + $charset = null; + if (isset($structure->headers["content-type"]) && isset($structure->ctype_parameters['charset'])) { + $charset = $structure->ctype_parameters['charset']; + } + if (isset($structure->body)) { + return $this->getUtf8String($structure->body, $charset); + } else { + return ''; + } + } + + /** + * Extract from given structure the content and store it as an attachment of the given message + * + * @param Integer $messageId Message id + * @param Object $struct Subpart of a Mime message to treat + * @param Object $mailHeaders Headers of the message (not the subpart) + * @param ForumML_FileStorage $storage Object that manage the file storage on FS + */ + function storePart($messageId, $struct, $mailHeaders, $storage) { + if (isset($struct->body) && trim($struct->body) != "") { + $body = $struct->body; + $filetype = $struct->headers["content-type"]; + if ($struct->ctype_primary == 'text' && $struct->ctype_secondary == 'html') { + $filename = "message_".substr($mailHeaders["message-id"], 1, strpos($mailHeaders["message-id"], '@') - 1).".html"; + } else { + if (! isset($struct->d_parameters["filename"])) { + // special case where a content is attached, without filename + $pos = strpos($filetype,"name="); + if ($pos === false) { + // set filename to 'attachment_' + $filename = "attachment"; + } else { + // get filename from 'name' section + $filename = substr(substr($filetype,$pos),6,-1); + } + } else { + $filename = $struct->d_parameters["filename"]; + } + } + $basename = basename($filename); + + // For multipart/related emails + $content_id = ''; + if (isset($struct->headers['content-id'])) { + $content_id = $struct->headers['content-id']; + } + + // store attachment in /var/lib/codendi/forumml// + $date = date("Y_m_d",strtotime($mailHeaders["date"])); + $fpath = $storage->store($basename, $struct->body, $this->id_list, $date); + + // insert attachment in the DB + $this->insertAttachment($messageId, $basename, $filetype, $fpath, $content_id); + } + } + + /** + * Parse recursively Mime message to create the message and it's attachments in DB + * + * A MIME message is a hierarchical organization that maybe very + * simple for a text message (just one structure with headers and + * a text body) to a very complex HTML mail with inline images, + * attachments sent in Text+HTML. + * + * The main challenge of this method is to find the "root" of the + * MIME message to store it as a message in the DB, all the other + * stuff will be attached to this message as an attachment. + * + * The root message can be either: + * - The text version of the message. This applies for + * -> mail in plain text (with or without attachments) + * -> mail in HTML sent in Text+HTML + * - If no text version available: + * -> if their is an HTML version of the mail, we store it + * (happens with mail sent in HTML only). + * -> if their is no HTML, we store an empty body. + * + * How do we detect the root message: + * -> We crawl the hierarchy and we take the first text/plain or + * text/html part. + * -> Otherwise, if we are about to store an attachment (an + * attachment is everything but first text/plain or first + * text/html) we create a empty message. + * + * @see http://en.wikipedia.org/wiki/MIME + * + * @param Object $struct Subpart of a Mime message to treat + * @param Object $mailHeaders Headers of the message (not the subpart) + * @param ForumML_FileStorage $storage Object that manage the file storage on FS + * @param Integer $messageId Message id + */ + function storeMime($struct, $mailHeaders, $storage, $messageId=0) { + if ($struct->ctype_primary == 'multipart') { + foreach ($struct->parts as $part) { + $messageId = $this->storeMime($part, $mailHeaders, $storage, $messageId); + } + } else { + $inserted = false; + if ($struct->ctype_primary == 'text') { + switch ($struct->ctype_secondary) { + case 'html': + case 'plain': + if ($messageId == null) { + $body = $this->getUtf8Body($struct); + if (isset($struct->headers["content-type"])) { + $ctype = $struct->headers["content-type"]; + } else { + $ctype = ""; + } + $messageId = $this->insertMessage($mailHeaders, $body, $ctype); + $inserted = true; + } + break; + } + } + + if ($messageId == 0) { + if (isset($struct->headers["content-type"])) { + $ctype = $struct->headers["content-type"]; + } else { + $ctype = ""; + } + $messageId = $this->insertMessage($mailHeaders, "", $ctype); + } + + if (!$inserted) { + $this->storePart($messageId, $struct, $mailHeaders, $storage); + } + } + return $messageId; + } + + /** + * Abandon all hope you who enter here! Mail & MIME is at best a nightmare, take a couple of + * bottles before diving into this code... + * http://en.wikipedia.org/wiki/MIME + * + * List (not comprehensive) of email possibilities + * Text text/plain + * -> pure_text.mbox + * Text + attached files multipat/mixed (text/plain, other/mime) + * -> text_plus_attachment.mbox + * HTML (sent in Text + HTML) multipart/alternative (text/plain, text/html) + * -> pure_html_text_plus_html.mbox + * HTML (sent in HTML) text/html + * -> pure_html_in_html_only.mbox + * HTML + inline image (sent in Text + HTML) multipart/alternative(text/plain, multipart/related(text/html, image/png)) + * -> html_with_inline_content_in_text_plus_html.mbox + * HTML + inline image (sent in HTML) multipart/related(text/html, image/png) + * -> html_with_inline_content_in_html_only.mbox + * HTML + attached file (sent in Text + HTML) multipart/mixed(multipart/alternative(text/plain, text/html), other/mime)) + * HTML + attached file (sent in HTML) multipart/mixed(text/html, other/mime) + * HTML + inline image + attached file (sent in Text + HTML) multipart/mixed(multipart/alternative(text/plain, multipart/related(text/html, image/png)), other/mime) + * -> html_with_inline_content_and_attch_in_text_plus_html.mbox + * HTML + inline image + attached file (sent in HTML) multipart/mixed(multipart/related(text/html, image/png), other/mime) + * -> html_with_inline_content_and_attch_in_html_only.mbox + */ + public function storeEmail($email, $storage) { + return $this->storeMime($email, $email->headers, $storage); + } +} + +?> diff --git a/plugins/coclico/forumml/include/ForumMLPluginDescriptor.class.php b/plugins/coclico/forumml/include/ForumMLPluginDescriptor.class.php new file mode 100644 index 0000000000..f0d2fd9a12 --- /dev/null +++ b/plugins/coclico/forumml/include/ForumMLPluginDescriptor.class.php @@ -0,0 +1,29 @@ +. + */ + +require_once('common/plugin/PluginDescriptor.class.php'); + +class ForumMLPluginDescriptor extends PluginDescriptor { + + function __construct() { + parent::__construct('ForumML', 'v2.0', $GLOBALS['Language']->getText('plugin_forumml', 'descriptor_description')); + } +} +?> diff --git a/plugins/coclico/forumml/include/ForumMLPluginInfo.class.php b/plugins/coclico/forumml/include/ForumMLPluginInfo.class.php new file mode 100644 index 0000000000..a7a55e1f9d --- /dev/null +++ b/plugins/coclico/forumml/include/ForumMLPluginInfo.class.php @@ -0,0 +1,135 @@ +. + */ + +require_once('common/plugin/PluginInfo.class.php'); +require_once('ForumMLPluginDescriptor.class.php'); +require_once('common/include/PropertyDescriptor.class.php'); + +class ForumMLPluginInfo extends PluginInfo { + + function __construct($plugin) { + parent::__construct($plugin); + $this->setPluginDescriptor(new ForumMLPluginDescriptor()); + $this->_conf_path = $plugin->getPluginEtcRoot() .'/forumml.inc'; + $this->loadProperties(); + + } + + function loadProperties() { + if (is_file($this->_conf_path)) { + $this->checkConfigurationFiles($this->_conf_path); + $variables = $this->_getVariablesFromConfigurationFile($this->_conf_path); + foreach($variables as $variable) { + $key =& $variable['name']; + if (preg_match('`^"(.*)"$`', $variable['value'], $match) || + preg_match('`^\'(.*)\'$`', $variable['value'], $match)) + { + $value = $match[1]; + } + else + { + $value = $variable['value']; + } + $descriptor =& new PropertyDescriptor($key, $value); + $this->_addPropertyDescriptor($descriptor); + } + } + } + + function saveProperties() { + copy($this->_conf_path, $this->_conf_path .'.'. date('YmdHis')); + $content = file_get_contents($this->_conf_path); + $descs =& $this->getPropertyDescriptors(); + $keys =& $descs->getKeys(); + $iter =& $keys->iterator(); + while($iter->valid()) { + $key =& $iter->current(); + $desc =& $descs->get($key); + $desc_name =& $desc->getName(); + if (is_bool($desc->getValue())) { + $replace = '$1'. ($desc->getValue() ? 'true' : 'false') .';'; + } else { + $replace = '$1"'.addslashes($desc->getValue()).'";'; + } + $content = preg_replace( + '`((?:^|\n)\$'. preg_quote($desc_name) .'\s*=\s*)(.*)\s*;`', + $replace, + $content + ); + $iter->next(); + } + $f = fopen($this->_conf_path, 'w'); + if ($f) { + fwrite($f, $content); + fclose($f); + } + } + + function getPropertyValueForName($name) { + $desc = $this->getPropertyDescriptorForName($name); + return $desc ? $desc->getValue() : $desc; + } + + function _getVariablesFromConfigurationFile($file) { + $tokens = token_get_all(file_get_contents($file)); + + $variables = array(); + $current = 0; + foreach($tokens as $token) { + switch ($token[0]) { + case T_VARIABLE: + $variables[$current] = array('name' => substr($token[1], 1), 'value' => ''); + break; + case T_STRING: + case T_CONSTANT_ENCAPSED_STRING: + case T_DNUMBER: + case T_LNUMBER: + case T_NUM_STRING: + if (T_STRING == $token[0] && (!strcasecmp($token[1], "false") || !strcasecmp($token[1], "true"))) { + $val = (bool)strcasecmp($token[1], "false"); + if (isset($variables[$current])) { + $variables[$current]['value'] = $val; + } + } else { + if (isset($variables[$current])) { + $variables[$current]['value'] .= $token[1]; + } + } + break; + case '*': + if (isset($variables[$current])) { + $variables[$current]['value'] .= $token[0]; + } + break; + case ';': + $current++; + break; + default: + break; + } + } + return $variables; + } + + function checkConfigurationFiles() { + require($this->_conf_path); + } +} +?> diff --git a/plugins/coclico/forumml/include/ForumMLSearchEngine.class.php b/plugins/coclico/forumml/include/ForumMLSearchEngine.class.php new file mode 100644 index 0000000000..a4e37d0f95 --- /dev/null +++ b/plugins/coclico/forumml/include/ForumMLSearchEngine.class.php @@ -0,0 +1,43 @@ +groupId = $groupId; + $this->rendererClassName = $rendererClassName; + + $this->GroupSearchEngine($type, $rendererClassName, $label); + } + + function isAvailable($parameters) { + return true; + } + + function & getSearchRenderer($words, $offset, $exact) { + require_once($this->rendererClassName.'.class.php'); + $renderer = new $this->rendererClassName($words, $offset, $exact, + $this->groupId); + return $renderer; + } +} + +?> diff --git a/plugins/coclico/forumml/include/ForumMLSearchQuery.class.php b/plugins/coclico/forumml/include/ForumMLSearchQuery.class.php new file mode 100644 index 0000000000..5442aa41a7 --- /dev/null +++ b/plugins/coclico/forumml/include/ForumMLSearchQuery.class.php @@ -0,0 +1,59 @@ +groupId = $groupId; + + $this->SearchQuery($words, $offset, $isExact); + } + + /** + * getQuery - get the query built to get the search results + * + * @return array query+params array + */ + function getQuery() { + + $pat = '_g'.$this->groupId.'_'; + $len = strlen($pat)+1; + $qpa = db_construct_qpa () ; + $qpa = db_construct_qpa ($qpa, + 'SELECT mh.id_message, mh.value as subject, m.id_list '. + ' FROM plugin_forumml_message m, plugin_forumml_messageheader mh'. + ' WHERE mh.id_header = $1'. + ' AND m.id_parent = 0'. + ' AND m.id_message = mh.id_message AND ', + array (4)) ; + $qpa=$this->addIlikeCondition($qpa, 'mh.value'); + return $qpa ; + } +} + +?> diff --git a/plugins/coclico/forumml/include/ForumML_Attachment.class.php b/plugins/coclico/forumml/include/ForumML_Attachment.class.php new file mode 100644 index 0000000000..cbb36fa5b2 --- /dev/null +++ b/plugins/coclico/forumml/include/ForumML_Attachment.class.php @@ -0,0 +1,95 @@ +. + */ + +require_once 'ForumML_AttachmentDao.class.php'; + +class ForumML_Attachment { + private $_dao; + + function getById($id) { + $attach = null; + $dar = $this->getDao()->getById($id); + if ($dar && !$dar->isError()) { + $attch = $dar->current(); + $attch['type'] = $this->getType($attch); + } + return $attch; + } + + /** + * Return attachment mime type + * + * Try to get it from the db and if it fails, try with filename + */ + function getType($row) { + /*if (preg_match('/^[ ]*(.*\/.*)[ ]*;?.*$/', $row['file_type'], $matches)) { + $type = $matches[1]; + } else { + // Retrieve the uploaded file type + switch(strtoupper(strrchr($row['file_name'], "."))) { + case ".GZ": + $type = "application/x-gzip"; + break; + case ".TGZ": + $type = "application/x-gzip"; + break; + case ".ZIP": + $type = "application/zip"; + break; + case ".PDF": + $type = "application/pdf"; + break; + case ".PNG": + $type = "image/png"; + break; + case ".GIF": + $type = "image/gif"; + break; + case ".JPG": + $type = "image/jpeg"; + break; + case ".TXT": + $type = "text/plain"; + break; + case ".HTM": + $type = "text/html"; + break; + case ".HTML": + $type = "text/html"; + break; + default: + $type = "application/octet-stream"; + break; + } + } + return $type;*/ + return mime_content_type($row['file_path']); + } + + function getDao() { + if (!isset($this->_dao)) { + $this->_dao = new ForumML_AttachmentDao(CodendiDataAccess::instance()); + } + return $this->_dao; + } + +} + +?> diff --git a/plugins/coclico/forumml/include/ForumML_AttachmentDao.class.php b/plugins/coclico/forumml/include/ForumML_AttachmentDao.class.php new file mode 100644 index 0000000000..0fdb8284c6 --- /dev/null +++ b/plugins/coclico/forumml/include/ForumML_AttachmentDao.class.php @@ -0,0 +1,36 @@ +. + */ + +require_once 'common/dao/include/DataAccessObject.class.php'; + +class ForumML_AttachmentDao extends DataAccessObject { + + function __construct($da) { + parent::__construct($da); + } + + function getById($id) { + $sql = 'SELECT * FROM plugin_forumml_attachment WHERE id_attachment = $1'; + return $this->retrieve($sql,array($id)); + } + +} + +?> diff --git a/plugins/coclico/forumml/include/ForumML_FileStorage.class.php b/plugins/coclico/forumml/include/ForumML_FileStorage.class.php new file mode 100644 index 0000000000..a885b4115b --- /dev/null +++ b/plugins/coclico/forumml/include/ForumML_FileStorage.class.php @@ -0,0 +1,144 @@ +root = $root; + } + + /** + * Store - stores attached files in the ForumML root dir + * + * @param filename: name of attached file + * @param content: content of attached file + * @param list: mailing-list name + * @param date: date of attachment in YYYY_MM_DD format + * @param encod: encoding of attachment + * + * @return int size of attached file + */ + function store($filename, $content, $list, $date, $encod="") { + $path = $this->_getPath($filename, $list, $date, "store"); + $ret = file_put_contents($path, $content); + if ($ret !== false) { + return $path; + } else { + return false; + } + } + + /** + * Store: + * +---------------------------------------------------------------------------------+ + * | +-----------------------------------------+ | + * | | | | + * _|__ _______ _|__ | | + * name list_id date v v + * Attach.doc 7 2007_10_19 => foruuml_dir//2007_10_19/Attach_doc + * | ^ + * +---------------------------------------------+| + * + * + * Upload (to temporary location): + * +-----------------------------------------------------------------------+ + * | | + * | | + * _|__ | + * name v + * Attach.doc => foruuml_dir/upload/Attach_doc + * + */ + + /** + * _getPath - Get the absolute path where to Upload/Store attached file + * + * @param name: basename of attached file + * @param list: mailing-list name + * @param date: attachment date (YYYY_MM_DD) + * @param string type: upload/store + * + * @return string path + */ + function _getPath($name, $list, $date, $type) { + $name = trim($name); + + if (trim($name) == '') { + $name = 'attachment'; + } else { + $name = mb_convert_encoding($name, 'ascii', 'utf-8'); + // restrict file name to 64 characters (maximum) + if (strlen($name) > 64) { + $name = substr($name, 0, 64); + } + + $name = preg_replace('`[^a-z0-9_-]`i', '_', $name); + $name = preg_replace('`_{2,}`', '_', $name); + } + + if ($type == "upload") { + $path_elements = array($this->root, $type); + } else if ($type == "store") { + $path_elements = array($this->root, $list, $date); + } + + $path = ''; + foreach($path_elements as $elem) { + $path .= $elem .'/'; + if (!is_dir($path)) { + mkdir($path, 0755); + } + } + + // Ensure that same file doesn't exists yet + $ext = ''; + $i = 1; + while($this->fileExists($path.$name.$ext)) { + $ext = '_'.$i; + $i++; + } + + return $path.$name.$ext; + } + + function fileExists($path) { + return is_file($path); + } + +} + +?> diff --git a/plugins/coclico/forumml/include/ForumML_HTMLPurifier.class.php b/plugins/coclico/forumml/include/ForumML_HTMLPurifier.class.php new file mode 100644 index 0000000000..95a16f51b0 --- /dev/null +++ b/plugins/coclico/forumml/include/ForumML_HTMLPurifier.class.php @@ -0,0 +1,103 @@ + and CSS styles + */ + function getForumMLConfig() { + + $config = $this->getCodendiConfig(); + // allow
html tag, used to display ForumML messages replies + $config->set('HTML.AllowedElements', 'blockquote'); + // support CSS + $config->set('CSS.DefinitionRev', 1); + return $config; + } + + /** + * HTML Purifier configuration factory + */ + function getHPConfig($level) { + $config = null; + switch($level) { + case CODENDI_PURIFIER_FORUMML: + $config = $this->getForumMLConfig(); + break; + + default: + $config = parent::getHPConfig($level); + } + return $config; + } + + /** + * Perform HTML purification depending of level purification required and create links. + */ + function purify($html, $level=0, $groupId=0) { + $clean = ''; + switch($level) { + case CODENDI_PURIFIER_FORUMML: + require_once($GLOBALS['htmlpurifier_dir'].'HTMLPurifier.auto.php'); + $hp = HTMLPurifier::getInstance(); + $config = $this->getHPConfig($level); + $clean = util_make_links($hp->purify($html, $config), $groupId); + break; + default: + $clean = parent::purify($html,$level,$groupId); + } + return $clean; + } +} + +?> diff --git a/plugins/coclico/forumml/include/ForumML_MessageDao.class.php b/plugins/coclico/forumml/include/ForumML_MessageDao.class.php new file mode 100644 index 0000000000..829fa0690d --- /dev/null +++ b/plugins/coclico/forumml/include/ForumML_MessageDao.class.php @@ -0,0 +1,162 @@ +. + */ + +require_once 'common/dao/include/DataAccessObject.class.php'; + +define('FORUMML_MESSAGE_ID', 1); +define('FORUMML_DATE', 2); +define('FORUMML_FROM', 3); +define('FORUMML_SUBJECT', 4); +define('FORUMML_CONTENT_TYPE', 12); +define('FORUMML_CC', 34); +class ForumML_MessageDao extends DataAccessObject { + + function __construct($da) { + parent::__construct($da); + } + + function searchHeaderValue($messageId, $headerId) { + $sql = 'SELECT mh.value'. + ' FROM plugin_forumml_message m'. + ' JOIN plugin_forumml_messageheader mh'. + ' ON (mh.id_message = m.id_message)'. + ' JOIN plugin_forumml_header h'. + ' ON (h.id_header = mh.id_header)'. + ' WHERE m.id_message = $1'. + ' AND h.id_header = $2'; + return $this->retrieve($sql,array($messageId,$headerId)); + } + + function getMessageHeaders($id_message) { + $sql = 'SELECT value'. + ' FROM plugin_forumml_messageheader'. + ' WHERE id_message = $1'. + ' AND id_header < 5'. + ' ORDER BY id_header'; + return $this->retrieve($sql,array($id_message)); + } + + function getSpecificMessage($id_message,$list_id) { + $sql ='SELECT value, body'. + ' FROM plugin_forumml_message m, plugin_forumml_messageheader mh'. + ' WHERE m.id_message =$1 '. + ' AND mh.id_message = m.id_message'. + ' AND m.id_list = $2'. + ' AND mh.id_header = $3'; + return $this->retrieve($sql,array($id_message,$list_id,FORUMML_SUBJECT)); + } + + function getHeaderValue($id, $ids) { + if (!isset($ids)) { + $ids = 'SELECT id_header FROM plugin_forumml_messageheader'; + } + $sql = 'SELECT value , id_header FROM plugin_forumml_messageheader'. + ' WHERE id_message =$1 and id_header IN ($2,$3) ORDER BY id_header DESC'; + return $this->retrieve($sql,array($id,$ids[0],$ids[1])); + } + + function getAllThreadsFromList($list_id,$offset,$chunks) { + $sql = 'SELECT m.id_message, m.last_thread_update as lastup, mh_d.value as date, mh_f.value as sender, mh_s.value as subject'. + ' FROM plugin_forumml_message m'. + ' LEFT JOIN plugin_forumml_messageheader mh_d ON (mh_d.id_message = m.id_message AND mh_d.id_header = $1)'. + ' LEFT JOIN plugin_forumml_messageheader mh_f ON (mh_f.id_message = m.id_message AND mh_f.id_header = $2) '. + ' LEFT JOIN plugin_forumml_messageheader mh_s ON (mh_s.id_message = m.id_message AND mh_s.id_header = $3) '. + ' WHERE m.id_parent = 0'. + ' AND id_list = $4 '. + ' ORDER BY m.last_thread_update DESC'. + ' OFFSET $5'. + ' LIMIT $6'; + return $this->retrieve($sql,array(FORUMML_DATE,FORUMML_FROM,FORUMML_SUBJECT,$list_id,$offset,$chunks)); + } + + function countAllThreadsFromList($list_id) { + $sql = 'SELECT COUNT(*) as nb'. + ' FROM plugin_forumml_message m'. + ' LEFT JOIN plugin_forumml_messageheader mh_d ON (mh_d.id_message = m.id_message AND mh_d.id_header = $1)'. + ' LEFT JOIN plugin_forumml_messageheader mh_f ON (mh_f.id_message = m.id_message AND mh_f.id_header = $2) '. + ' LEFT JOIN plugin_forumml_messageheader mh_s ON (mh_s.id_message = m.id_message AND mh_s.id_header = $3) '. + ' WHERE m.id_parent = 0'. + ' AND id_list = $4 GROUP BY m.last_thread_update'. + ' ORDER BY m.last_thread_update DESC'; + return $this->retrieve($sql,array(FORUMML_DATE,FORUMML_FROM,FORUMML_SUBJECT,$list_id)); + } + + function countChildrenFromParents ($parents) { + $sql = 'SELECT id_message'. + ' FROM plugin_forumml_message m'. + ' WHERE m.id_parent IN ($1)'; + return $this->retrieve($sql,array($parents)); + } + + function getChildrenFromDepthLevel($parents) { + $sql = 'SELECT m.*, mh_d.value as date, mh_f.value as sender, mh_s.value as subject, mh_ct.value as content_type, mh_cc.value as cc, a.id_attachment, a.file_name, a.file_type, a.file_size, a.file_path, a.content_id'. + ' FROM plugin_forumml_message m'. + ' LEFT JOIN plugin_forumml_messageheader mh_d ON (mh_d.id_message = m.id_message AND mh_d.id_header = $1)'. + ' LEFT JOIN plugin_forumml_messageheader mh_f ON (mh_f.id_message = m.id_message AND mh_f.id_header = $2) '. + ' LEFT JOIN plugin_forumml_messageheader mh_s ON (mh_s.id_message = m.id_message AND mh_s.id_header = $3) '. + ' LEFT JOIN plugin_forumml_messageheader mh_ct ON (mh_ct.id_message = m.id_message AND mh_ct.id_header = $4) '. + ' LEFT JOIN plugin_forumml_messageheader mh_cc ON (mh_cc.id_message = m.id_message AND mh_cc.id_header = $5) '. + " LEFT JOIN plugin_forumml_attachment a ON (a.id_message = m.id_message AND a.content_id = '')". + ' WHERE m.id_parent IN ($6)'; + + return $this->retrieve($sql,array(FORUMML_DATE,FORUMML_FROM,FORUMML_SUBJECT,FORUMML_CONTENT_TYPE,FORUMML_CC,$parents)); + } + + function getFlattenedThread($topic) { + $sql = 'SELECT m.*, mh_d.value as date, mh_f.value as sender, mh_s.value as subject, mh_ct.value as content_type, mh_cc.value as cc, a.id_attachment, a.file_name, a.file_type, a.file_size, a.file_path, a.content_id'. + ' FROM plugin_forumml_message m'. + ' LEFT JOIN plugin_forumml_messageheader mh_d ON (mh_d.id_message = m.id_message AND mh_d.id_header = $1)'. + ' LEFT JOIN plugin_forumml_messageheader mh_f ON (mh_f.id_message = m.id_message AND mh_f.id_header = $2)'. + ' LEFT JOIN plugin_forumml_messageheader mh_s ON (mh_s.id_message = m.id_message AND mh_s.id_header = $3)'. + ' LEFT JOIN plugin_forumml_messageheader mh_ct ON (mh_ct.id_message = m.id_message AND mh_ct.id_header = $4)'. + ' LEFT JOIN plugin_forumml_messageheader mh_cc ON (mh_cc.id_message = m.id_message AND mh_cc.id_header = $5)'. + " LEFT JOIN plugin_forumml_attachment a ON (a.id_message = m.id_message AND a.content_id = '')". + ' WHERE m.id_message =$6 '; + return $this->retrieve($sql,array(FORUMML_DATE,FORUMML_FROM,FORUMML_SUBJECT,FORUMML_CONTENT_TYPE,FORUMML_CC,$topic)); + } + + function updateCacheHTML($cache,$id) { + return $this->update('UPDATE plugin_forumml_message SET cached_html= $1 WHERE id_message= $2',array($cache,$id)); + } + + function getAttachment($id_message,$match) { + $sql = 'SELECT id_attachment FROM plugin_forumml_attachment WHERE id_message=$1 and content_id=<$2>'; + return $this->retrieve($sql,array($id_message , $match)); + } + function searchArchives($list_id,$pattern) { + $sql = 'SELECT mh.id_message, mh.value'. + ' FROM plugin_forumml_message m, plugin_forumml_messageheader mh'. + ' WHERE mh.id_header = $1'. + ' AND m.id_list = $2'. + ' AND m.id_parent = 0'. + ' AND m.id_message = mh.id_message'. + ' AND mh.value LIKE $3'; + return $this->retrieve($sql,array(FORUMML_SUBJECT,$list_id,$pattern)); + + } + + function hasArchives($list_id) { + $qry = 'SELECT NULL FROM plugin_forumml_message WHERE id_list = $1 LIMIT 1'; + return $this->retrieve($qry,array($list_id)); + } + +} + +?> diff --git a/plugins/coclico/forumml/include/ForumML_MessageManager.class.php b/plugins/coclico/forumml/include/ForumML_MessageManager.class.php new file mode 100644 index 0000000000..2fabf1fba9 --- /dev/null +++ b/plugins/coclico/forumml/include/ForumML_MessageManager.class.php @@ -0,0 +1,44 @@ +. + */ + +require_once 'ForumML_MessageDao.class.php'; + +class ForumML_MessageManager { + private $_dao; + + function getHeaderValue($messageId, $headerId) { + $dar = $this->getDao()->searchHeaderValue($messageId, $headerId); + if ($dar && !$dar->isError()) { + $row = $dar->current(); + return $row['value']; + } + return false; + } + + function getDao() { + if (!isset($this->_dao)) { + $this->_dao = new ForumML_MessageDao(CodendiDataAccess::instance()); + } + return $this->_dao; + } + +} + +?> \ No newline at end of file diff --git a/plugins/coclico/forumml/include/ForumML_mimeDecode.class.php b/plugins/coclico/forumml/include/ForumML_mimeDecode.class.php new file mode 100644 index 0000000000..6ef0c86b08 --- /dev/null +++ b/plugins/coclico/forumml/include/ForumML_mimeDecode.class.php @@ -0,0 +1,106 @@ +. + */ + +require_once('Mail/mimeDecode.php'); + +class ForumML_mimeDecode extends Mail_mimeDecode { + + /** + * Redfined here just to avoid breakage on isStatic test (first line). + * It's just a copy/paste of parent's method + */ + function decode($params = null) + { + // determine if this method has been called statically + $isStatic = !(isset($this) && get_class($this) == __CLASS__); + + // Have we been called statically? + // If so, create an object and pass details to that. + if ($isStatic AND isset($params['input'])) { + + $obj = new Mail_mimeDecode($params['input']); + $structure = $obj->decode($params); + + // Called statically but no input + } elseif ($isStatic) { + return PEAR::raiseError('Called statically and no input given'); + + // Called via an object + } else { + $this->_include_bodies = isset($params['include_bodies']) ? + $params['include_bodies'] : false; + $this->_decode_bodies = isset($params['decode_bodies']) ? + $params['decode_bodies'] : false; + $this->_decode_headers = isset($params['decode_headers']) ? + $params['decode_headers'] : false; + + $structure = $this->_decode($this->_header, $this->_body); + if ($structure === false) { + $structure = $this->raiseError($this->_error); + } + } + + return $structure; + } + + /** + * Redefined to convert headers to utf8 automatically. Same method than + * parent except code between // +++ Codendi: UTF8 + */ + function _decodeHeader($input) + { + // Remove white space between encoded-words + $input = preg_replace('/(=\?[^?]+\?(q|b)\?[^?]*\?=)(\s)+=\?/i', '\1=?', $input); + + // For each encoded-word... + while (preg_match('/(=\?([^?]+)\?(q|b)\?([^?]*)\?=)/i', $input, $matches)) { + + $encoded = $matches[1]; + $charset = $matches[2]; + $encoding = $matches[3]; + $text = $matches[4]; + + switch (strtolower($encoding)) { + case 'b': + $text = base64_decode($text); + break; + + case 'q': + $text = str_replace('_', ' ', $text); + preg_match_all('/=([a-f0-9]{2})/i', $text, $matches); + foreach($matches[1] as $value) + $text = str_replace('='.$value, chr(hexdec($value)), $text); + break; + } + + // +++ Codendi: UTF8 + if (function_exists('mb_convert_encoding')) { + $text = mb_convert_encoding($text, 'UTF-8', $charset); + } + // --- Codendi: UTF8 + + $input = str_replace($encoded, $text, $input); + } + + return $input; + } +} + +?> diff --git a/plugins/coclico/forumml/include/forummlPlugin.class.php b/plugins/coclico/forumml/include/forummlPlugin.class.php new file mode 100644 index 0000000000..0ad3ac6588 --- /dev/null +++ b/plugins/coclico/forumml/include/forummlPlugin.class.php @@ -0,0 +1,235 @@ +. + */ +require_once('preplugins.php'); +require_once('ForumMLSearchEngine.class.php'); + + +class ForumMLPlugin extends Plugin { + + function __construct($id=0) { + parent::__construct($id); + $this->name = "forumml" ; + $this->text = "ForumML" ; // To show in the tabs, use... + $this->_addHook("user_personal_links");//to make a link to the user�s personal part of the plugin + $this->_addHook("usermenu") ; + $this->_addHook("groupisactivecheckbox") ; // The "use ..." checkbox in editgroupinfo + $this->_addHook("groupisactivecheckboxpost") ; // + $this->_addHook("userisactivecheckbox") ; // The "use ..." checkbox in user account + $this->_addHook("userisactivecheckboxpost") ; // + $this->_addHook("project_admin_plugins"); // to show up in the admin page fro group + $this->_addHook('browse_archives','forumml_browse_archives',false); + $this->_addHook('cssfile','cssFile',false); + $this->_addHook('javascript_file', 'jsFile', false); + $this->_addHook('search_type', 'search_type', false); + $this->_addHook('layout_searchbox_options', 'forumml_searchbox_option', false); + $this->_addHook('layout_searchbox_hiddenInputs', 'forumml_searchbox_hiddenInput', false); + $this->_addHook('plugins_powered_search', 'forumml_search', false); + $this->_addHook('cssfile'); + $this->_addHook('search_engines'); + $this->_addHook('full_search_engines'); + // Set ForumML plugin scope to 'Projects' wide + //$this->setScope(Plugin::SCOPE_PROJECT); + $this->allowedForProject = array(); + } + + function CallHook ($hookname, $params) { + global $use_mailmanplugin,$G_SESSION,$HTML,$gfcommon,$gfwww,$gfplugins; + if ($hookname == "usermenu") { + $text = $this->text; // this is what shows in the tab + if ($G_SESSION->usesPlugin("mailman")) { + $param = '?type=user&id=' . $G_SESSION->getId() . "&pluginname=" . $this->name; // we indicate the part we�re calling is the user one + echo ' | ' . $HTML->PrintSubMenu (array ($text), + array ('/plugins/mailman/index.php' . $param )); + } + } elseif ($hookname =='cssfile') { + echo ''; + } elseif ($hookname == "groupisactivecheckbox") { + //Check if the group is active + // this code creates the checkbox in the project edit public info page to activate/deactivate the plugin + $group_id=$params['group']; + $group = &group_get_object($group_id); + echo ""; + echo ""; + echo ' usesPlugin ( $this->name ) ) { + echo "CHECKED"; + } + echo ">
"; + echo ""; + echo ""; + echo "Use ".$this->text." Plugin"; + echo ""; + echo ""; + + } elseif ($hookname == "groupisactivecheckboxpost") { + // this code actually activates/deactivates the plugin after the form was submitted in the project edit public info page + $group_id=$params['group']; + $group = &group_get_object($group_id); + $use_mailmanplugin = getStringFromRequest('use_forummlplugin'); + if ( $use_mailmanplugin == 1 ) { + $group->setPluginUse ( $this->name ); + } else { + $group->setPluginUse ( $this->name, false ); + } + } elseif ($hookname == "userisactivecheckbox") { + //check if user is active + // this code creates the checkbox in the user account manteinance page to activate/deactivate the plugin + $user = $params['user']; + echo ""; + echo ""; + echo ' usesPlugin ( $this->name ) ) { + echo "CHECKED"; + } + echo "> Use ".$this->text." Plugin"; + echo ""; + echo ""; + } elseif ($hookname == "userisactivecheckboxpost") { + // this code actually activates/deactivates the plugin after the form was submitted in the user account manteinance page + $user = $params['user']; + $use_mailmanplugin = getStringFromRequest('use_forummlplugin'); + if ( $use_mailmanplugin == 1 ) { + $user->setPluginUse ( $this->name ); + } else { + $user->setPluginUse ( $this->name, false ); + } + echo ""; + echo ""; + echo ' usesPlugin ( $this->name ) ) { + echo "CHECKED"; + } + echo "> Use ".$this->text." Plugin"; + echo ""; + echo ""; + } elseif ($hookname == 'search_engines') { + $myfile=fopen('/tmp/hook','a'); + // FIXME: when the hook is called, the group_id is not set. + // So I use the global variable instead. + $request =& HTTPRequest::instance(); + $group_id = (int) $request->get('group_id'); + if ($group_id) { + $group =& group_get_object($group_id); + if ($group->usesPlugin('forumml')) { + $params->addSearchEngine( + SEARCH__TYPE_IS_LIST, + new ForumMLSearchEngine(SEARCH__TYPE_IS_LIST, + 'ForumMLHtmlSearchRenderer', + _("This project's mailing lists"), $group_id) + ); + } + } + } elseif ($hookname == "browse_archives") { + $this->forumml_browse_archives($params); + } elseif ($hookname == "cssfile") { + $this->cssFile($params); + } elseif ($hookname == "javascript_file") { + $this->jsFile($params); + } elseif ($hookname == "search_type") { + $this->search_type($params); + } elseif ($hookname == "layout_searchbox_options") { + $this->forumml_searchbox_option($params); + } elseif ($hookname == "layout_searchbox_hiddenInputs") { + $this->forumml_searchbox_hiddenInput($params); + } elseif ($hookname == "plugins_powered_search") { + $this->forumml_search($params); + + } + } + + function &getPluginInfo() { + if (!is_a($this->pluginInfo, 'ForumMLPluginInfo')) { + require_once('ForumMLPluginInfo.class.php'); + $this->pluginInfo =& new ForumMLPluginInfo($this); + } + return $this->pluginInfo; + } + + /** + * Return true if current project has the right to use this plugin. + */ + function isAllowed($group_id=false) { + if(!$group_id) { + $request =& HTTPRequest::instance(); + $group_id = (int) $request->get('group_id'); + } + $pm = ProjectManager::instance(); + $Group = $pm->getProject($group_id); + return $Group->usesPlugin('forumml'); + } + + function forumml_searchbox_option($params) { + $request =& HTTPRequest::instance(); + $group_id = (int) $request->get('group_id'); + if(isset($_REQUEST['list']) && isset($group_id)) { + $params['option_html'] .= "\t\n"; + } + } + + function forumml_searchbox_hiddenInput($params) { + if(isset($_REQUEST['list'])) { + $params['input_html'] .= "\t\n"; + } + } + + function forumml_browse_archives($params) { + if ($this->isAllowed()) { + $request =& HTTPRequest::instance(); + $group_id = (int) $request->get('group_id'); + $params['html'] = '
'._('Archives').''; + } + } + + function cssFile($params) { + $request =& HTTPRequest::instance(); + if (strpos($_SERVER['REQUEST_URI'], $this->getPluginPath()) === 0) { + echo ''."\n"; + } + } + + function jsFile($params) { + //$request =& HTTPRequest::instance(); + if (strpos($_SERVER['REQUEST_URI'], $this->getPluginPath()) === 0) { + //echo ''."\n"; + echo ''."\n"; + } + } + + function forumml_search($params) { + if($params['type_of_search'] == 'mail') { + $params['plugins_powered_search'] = true; + } + } + + function search_type($params) { + if(isset($params['type_of_search']) && $params['type_of_search'] == 'mail') { + $request =& HTTPRequest::instance(); + $group_id = (int) $request->get('group_id'); + $list = (int) $request->get('list'); + util_return_to('/plugins/forumml/message.php?group_id='.$group_id.'&list='.$list.'&search='.urlencode($params['words'])); + } + } + +} + +?> diff --git a/plugins/coclico/forumml/packaging/control/000source b/plugins/coclico/forumml/packaging/control/000source new file mode 100644 index 0000000000..105b726962 --- /dev/null +++ b/plugins/coclico/forumml/packaging/control/000source @@ -0,0 +1,10 @@ +Source: @SRCPACKAGE@ +Section: devel +Priority: optional +Maintainer: Christian Bayle +Uploaders: Roland Mas +Build-Depends-Indep: devscripts +Build-Depends: debhelper (>= 7), perl, gettext +Standards-Version: 3.8.4 +Homepage: http://fusionforge.org/ +Vcs-Bzr: http://scm.fusionforge.org/bzr/fusionforge/svn-trunk-ro/ diff --git a/plugins/coclico/forumml/packaging/control/222plugin-forumml b/plugins/coclico/forumml/packaging/control/222plugin-forumml new file mode 100644 index 0000000000..17d8fffcf8 --- /dev/null +++ b/plugins/coclico/forumml/packaging/control/222plugin-forumml @@ -0,0 +1,4 @@ +Package: @SRCPACKAGE@ +Architecture: all +Depends: @OLDPACKAGE@-common, @OLDPACKAGE@-db-postgresql | @OLDPACKAGE@-db, @OLDPACKAGE@-web-apache2 | @OLDPACKAGE@-web, php5-cli, php-mail, php-mail-mime, php-mail-mbox, php-mail-mimedecode, ${misc:Depends} +Description: collaborative development tool - ForumML plugin diff --git a/plugins/coclico/forumml/packaging/control/222plugin-forumml.shortdesc b/plugins/coclico/forumml/packaging/control/222plugin-forumml.shortdesc new file mode 100644 index 0000000000..a3039f6537 --- /dev/null +++ b/plugins/coclico/forumml/packaging/control/222plugin-forumml.shortdesc @@ -0,0 +1,3 @@ + This plugin contains the ForumML subsystem of FusionForge. It allows each + FusionForge project to have its own ForumML, and gives some + control over it to the project's administrator. diff --git a/plugins/coclico/forumml/packaging/dirs/plugin-forumml b/plugins/coclico/forumml/packaging/dirs/plugin-forumml new file mode 100644 index 0000000000..b03aa3e27d --- /dev/null +++ b/plugins/coclico/forumml/packaging/dirs/plugin-forumml @@ -0,0 +1,8 @@ +etc/gforge/httpd.d +etc/gforge/plugins/forumml +usr/share/gforge/plugins/forumml/cgi-bin +usr/share/gforge/plugins/forumml/common +usr/share/gforge/plugins/forumml/www +var/spool/forumml +var/lib/gforge/forumml +var/log/gforge diff --git a/plugins/coclico/forumml/packaging/docs/plugin-forumml b/plugins/coclico/forumml/packaging/docs/plugin-forumml new file mode 100644 index 0000000000..e174728f54 --- /dev/null +++ b/plugins/coclico/forumml/packaging/docs/plugin-forumml @@ -0,0 +1 @@ +debian/README.Debian diff --git a/plugins/coclico/forumml/packaging/install/plugin-forumml b/plugins/coclico/forumml/packaging/install/plugin-forumml new file mode 100644 index 0000000000..68dde05412 --- /dev/null +++ b/plugins/coclico/forumml/packaging/install/plugin-forumml @@ -0,0 +1,6 @@ +common/* usr/share/gforge/plugins/forumml/common/ +include/* usr/share/gforge/plugins/forumml/include/ +db/* usr/share/gforge/plugins/forumml/db/ +bin/* usr/share/gforge/plugins/forumml/bin/ +www/* usr/share/gforge/plugins/forumml/www/ +etc/* usr/share/gforge/plugins/forumml/etc/ diff --git a/plugins/coclico/forumml/packaging/links/plugin-forumml b/plugins/coclico/forumml/packaging/links/plugin-forumml new file mode 100644 index 0000000000..c34289e82a --- /dev/null +++ b/plugins/coclico/forumml/packaging/links/plugin-forumml @@ -0,0 +1 @@ +/usr/share/gforge/plugins/forumml/www /usr/share/gforge/www/plugins/forumml diff --git a/plugins/coclico/forumml/selinux/forumml0.pp b/plugins/coclico/forumml/selinux/forumml0.pp new file mode 100644 index 0000000000000000000000000000000000000000..d7c4f17fa27e6f6261161ac4e8d7440ec29a3b2d GIT binary patch literal 10883 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 literal 0 HcmV?d00001 diff --git a/plugins/coclico/forumml/selinux/forumml0.te b/plugins/coclico/forumml/selinux/forumml0.te new file mode 100644 index 0000000000..fb2ba85fc6 --- /dev/null +++ b/plugins/coclico/forumml/selinux/forumml0.te @@ -0,0 +1,157 @@ + +module forumml0 1.0; + +require { + type mailman_mail_t; + type unconfined_t; + type semanage_t; + type usr_t; + type var_run_t; + type postfix_smtpd_t; + type xfs_t; + type initrc_t; + type system_dbusd_t; + type tmp_t; + type mysqld_etc_t; + type avahi_t; + type mysqld_db_t; + type httpd_sys_content_t; + type logwatch_t; + type postfix_smtp_t; + type postfix_bounce_t; + type ifconfig_t; + type lib_t; + type mysqld_var_run_t; + type nscd_t; + type useradd_t; + type mysqld_t; + type named_t; + type postfix_cleanup_t; + type postfix_master_t; + type setroubleshootd_t; + type postfix_pickup_t; + type groupadd_t; + type crond_t; + type system_mail_t; + type postfix_qmgr_t; + type httpd_t; + class fifo_file { write read ioctl getattr }; + class process signal; + class unix_stream_socket { connectto read write }; + class tcp_socket { read write }; + class file { execute read create ioctl execute_no_trans write getattr unlink append }; + class sock_file write; + class lnk_file { read getattr }; + class dir { write search getattr remove_name add_name }; +} + +#============= avahi_t ============== +allow avahi_t mysqld_db_t:dir search; +allow avahi_t mysqld_etc_t:file getattr; + +#============= groupadd_t ============== +allow groupadd_t initrc_t:unix_stream_socket connectto; + +#============= httpd_t ============== +allow httpd_t crond_t:unix_stream_socket { read write }; +allow httpd_t initrc_t:unix_stream_socket connectto; +allow httpd_t mysqld_etc_t:file { read getattr }; +allow httpd_t system_mail_t:process signal; +allow httpd_t tmp_t:file { read getattr }; +allow httpd_t unconfined_t:unix_stream_socket { read write }; +allow httpd_t usr_t:file { create unlink append }; + +#============= ifconfig_t ============== +allow ifconfig_t initrc_t:tcp_socket { read write }; + +#============= logwatch_t ============== +allow logwatch_t initrc_t:unix_stream_socket connectto; +allow logwatch_t mysqld_etc_t:file read; +allow logwatch_t mysqld_t:unix_stream_socket connectto; + +#============= mailman_mail_t ============== +allow mailman_mail_t httpd_sys_content_t:dir { search getattr }; +allow mailman_mail_t httpd_sys_content_t:file { read getattr }; +allow mailman_mail_t httpd_sys_content_t:lnk_file { read getattr }; +allow mailman_mail_t initrc_t:unix_stream_socket connectto; +allow mailman_mail_t lib_t:dir { write remove_name add_name }; +allow mailman_mail_t lib_t:file { write create unlink }; +allow mailman_mail_t self:fifo_file { write read ioctl getattr }; +allow mailman_mail_t usr_t:file { read getattr ioctl execute execute_no_trans }; +allow mailman_mail_t usr_t:lnk_file { read getattr }; +allow mailman_mail_t var_run_t:dir { write add_name }; +allow mailman_mail_t var_run_t:file { create ioctl append getattr }; + +#============= named_t ============== +allow named_t mysqld_db_t:dir search; +allow named_t mysqld_etc_t:file { read getattr }; + +#============= nscd_t ============== +allow nscd_t useradd_t:unix_stream_socket { read write }; + +#============= postfix_bounce_t ============== +allow postfix_bounce_t initrc_t:unix_stream_socket connectto; +allow postfix_bounce_t mysqld_db_t:dir search; +allow postfix_bounce_t mysqld_etc_t:file { read getattr }; +allow postfix_bounce_t mysqld_t:unix_stream_socket connectto; +allow postfix_bounce_t mysqld_var_run_t:sock_file write; + +#============= postfix_cleanup_t ============== +allow postfix_cleanup_t initrc_t:unix_stream_socket connectto; +allow postfix_cleanup_t mysqld_db_t:dir search; +allow postfix_cleanup_t mysqld_etc_t:file { read getattr }; +allow postfix_cleanup_t mysqld_t:unix_stream_socket connectto; +allow postfix_cleanup_t mysqld_var_run_t:sock_file write; +allow postfix_cleanup_t usr_t:file { read getattr }; + +#============= postfix_master_t ============== +allow postfix_master_t initrc_t:unix_stream_socket connectto; +allow postfix_master_t mysqld_etc_t:file { read getattr }; + +#============= postfix_pickup_t ============== +allow postfix_pickup_t initrc_t:unix_stream_socket connectto; +allow postfix_pickup_t mysqld_db_t:dir search; +allow postfix_pickup_t mysqld_etc_t:file { read getattr }; +allow postfix_pickup_t mysqld_var_run_t:sock_file write; + +#============= postfix_qmgr_t ============== +allow postfix_qmgr_t initrc_t:unix_stream_socket connectto; +allow postfix_qmgr_t mysqld_db_t:dir search; +allow postfix_qmgr_t mysqld_etc_t:file getattr; + +#============= postfix_smtp_t ============== +allow postfix_smtp_t initrc_t:unix_stream_socket connectto; +allow postfix_smtp_t mysqld_db_t:dir search; +allow postfix_smtp_t mysqld_etc_t:file { read getattr }; +allow postfix_smtp_t mysqld_t:unix_stream_socket connectto; +allow postfix_smtp_t mysqld_var_run_t:sock_file write; +allow postfix_smtp_t usr_t:file { read getattr }; + +#============= postfix_smtpd_t ============== +allow postfix_smtpd_t initrc_t:unix_stream_socket connectto; +allow postfix_smtpd_t mysqld_db_t:dir search; +allow postfix_smtpd_t mysqld_etc_t:file { read getattr }; +allow postfix_smtpd_t mysqld_t:unix_stream_socket connectto; +allow postfix_smtpd_t mysqld_var_run_t:sock_file write; + +#============= semanage_t ============== +allow semanage_t httpd_sys_content_t:lnk_file read; +allow semanage_t initrc_t:unix_stream_socket connectto; +allow semanage_t mysqld_t:unix_stream_socket connectto; +allow semanage_t mysqld_var_run_t:sock_file write; + +#============= setroubleshootd_t ============== +allow setroubleshootd_t httpd_sys_content_t:lnk_file read; + +#============= system_dbusd_t ============== +allow system_dbusd_t initrc_t:unix_stream_socket connectto; +allow system_dbusd_t mysqld_t:unix_stream_socket connectto; +allow system_dbusd_t mysqld_var_run_t:sock_file write; + +#============= system_mail_t ============== +allow system_mail_t crond_t:unix_stream_socket { read write }; +allow system_mail_t httpd_t:file read; +allow system_mail_t initrc_t:unix_stream_socket connectto; + +#============= xfs_t ============== +allow xfs_t mysqld_t:unix_stream_socket connectto; diff --git a/plugins/coclico/forumml/selinux/forumml1.pp b/plugins/coclico/forumml/selinux/forumml1.pp new file mode 100644 index 0000000000000000000000000000000000000000..b2ae71493cd4c0c6728ece54a50d98392549b5ce GIT binary patch literal 10883 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 literal 0 HcmV?d00001 diff --git a/plugins/coclico/forumml/selinux/forumml1.te b/plugins/coclico/forumml/selinux/forumml1.te new file mode 100644 index 0000000000..959d572ed4 --- /dev/null +++ b/plugins/coclico/forumml/selinux/forumml1.te @@ -0,0 +1,157 @@ + +module forumml1 1.0; + +require { + type mailman_mail_t; + type unconfined_t; + type semanage_t; + type usr_t; + type var_run_t; + type postfix_smtpd_t; + type xfs_t; + type initrc_t; + type system_dbusd_t; + type tmp_t; + type mysqld_etc_t; + type avahi_t; + type mysqld_db_t; + type httpd_sys_content_t; + type logwatch_t; + type postfix_smtp_t; + type postfix_bounce_t; + type ifconfig_t; + type lib_t; + type mysqld_var_run_t; + type nscd_t; + type useradd_t; + type mysqld_t; + type named_t; + type postfix_cleanup_t; + type postfix_master_t; + type setroubleshootd_t; + type postfix_pickup_t; + type groupadd_t; + type crond_t; + type system_mail_t; + type postfix_qmgr_t; + type httpd_t; + class fifo_file { write read ioctl getattr }; + class process signal; + class unix_stream_socket { connectto read write }; + class tcp_socket { read write }; + class file { execute read create ioctl execute_no_trans write getattr unlink append }; + class sock_file write; + class lnk_file { read getattr }; + class dir { write search getattr remove_name add_name }; +} + +#============= avahi_t ============== +allow avahi_t mysqld_db_t:dir search; +allow avahi_t mysqld_etc_t:file getattr; + +#============= groupadd_t ============== +allow groupadd_t initrc_t:unix_stream_socket connectto; + +#============= httpd_t ============== +allow httpd_t crond_t:unix_stream_socket { read write }; +allow httpd_t initrc_t:unix_stream_socket connectto; +allow httpd_t mysqld_etc_t:file { read getattr }; +allow httpd_t system_mail_t:process signal; +allow httpd_t tmp_t:file { read getattr }; +allow httpd_t unconfined_t:unix_stream_socket { read write }; +allow httpd_t usr_t:file { create unlink append }; + +#============= ifconfig_t ============== +allow ifconfig_t initrc_t:tcp_socket { read write }; + +#============= logwatch_t ============== +allow logwatch_t initrc_t:unix_stream_socket connectto; +allow logwatch_t mysqld_etc_t:file read; +allow logwatch_t mysqld_t:unix_stream_socket connectto; + +#============= mailman_mail_t ============== +allow mailman_mail_t httpd_sys_content_t:dir { search getattr }; +allow mailman_mail_t httpd_sys_content_t:file { read getattr }; +allow mailman_mail_t httpd_sys_content_t:lnk_file { read getattr }; +allow mailman_mail_t initrc_t:unix_stream_socket connectto; +allow mailman_mail_t lib_t:dir { write remove_name add_name }; +allow mailman_mail_t lib_t:file { write create unlink }; +allow mailman_mail_t self:fifo_file { write read ioctl getattr }; +allow mailman_mail_t usr_t:file { read getattr ioctl execute execute_no_trans }; +allow mailman_mail_t usr_t:lnk_file { read getattr }; +allow mailman_mail_t var_run_t:dir { write add_name }; +allow mailman_mail_t var_run_t:file { create ioctl append getattr }; + +#============= named_t ============== +allow named_t mysqld_db_t:dir search; +allow named_t mysqld_etc_t:file { read getattr }; + +#============= nscd_t ============== +allow nscd_t useradd_t:unix_stream_socket { read write }; + +#============= postfix_bounce_t ============== +allow postfix_bounce_t initrc_t:unix_stream_socket connectto; +allow postfix_bounce_t mysqld_db_t:dir search; +allow postfix_bounce_t mysqld_etc_t:file { read getattr }; +allow postfix_bounce_t mysqld_t:unix_stream_socket connectto; +allow postfix_bounce_t mysqld_var_run_t:sock_file write; + +#============= postfix_cleanup_t ============== +allow postfix_cleanup_t initrc_t:unix_stream_socket connectto; +allow postfix_cleanup_t mysqld_db_t:dir search; +allow postfix_cleanup_t mysqld_etc_t:file { read getattr }; +allow postfix_cleanup_t mysqld_t:unix_stream_socket connectto; +allow postfix_cleanup_t mysqld_var_run_t:sock_file write; +allow postfix_cleanup_t usr_t:file { read getattr }; + +#============= postfix_master_t ============== +allow postfix_master_t initrc_t:unix_stream_socket connectto; +allow postfix_master_t mysqld_etc_t:file { read getattr }; + +#============= postfix_pickup_t ============== +allow postfix_pickup_t initrc_t:unix_stream_socket connectto; +allow postfix_pickup_t mysqld_db_t:dir search; +allow postfix_pickup_t mysqld_etc_t:file { read getattr }; +allow postfix_pickup_t mysqld_var_run_t:sock_file write; + +#============= postfix_qmgr_t ============== +allow postfix_qmgr_t initrc_t:unix_stream_socket connectto; +allow postfix_qmgr_t mysqld_db_t:dir search; +allow postfix_qmgr_t mysqld_etc_t:file getattr; + +#============= postfix_smtp_t ============== +allow postfix_smtp_t initrc_t:unix_stream_socket connectto; +allow postfix_smtp_t mysqld_db_t:dir search; +allow postfix_smtp_t mysqld_etc_t:file { read getattr }; +allow postfix_smtp_t mysqld_t:unix_stream_socket connectto; +allow postfix_smtp_t mysqld_var_run_t:sock_file write; +allow postfix_smtp_t usr_t:file { read getattr }; + +#============= postfix_smtpd_t ============== +allow postfix_smtpd_t initrc_t:unix_stream_socket connectto; +allow postfix_smtpd_t mysqld_db_t:dir search; +allow postfix_smtpd_t mysqld_etc_t:file { read getattr }; +allow postfix_smtpd_t mysqld_t:unix_stream_socket connectto; +allow postfix_smtpd_t mysqld_var_run_t:sock_file write; + +#============= semanage_t ============== +allow semanage_t httpd_sys_content_t:lnk_file read; +allow semanage_t initrc_t:unix_stream_socket connectto; +allow semanage_t mysqld_t:unix_stream_socket connectto; +allow semanage_t mysqld_var_run_t:sock_file write; + +#============= setroubleshootd_t ============== +allow setroubleshootd_t httpd_sys_content_t:lnk_file read; + +#============= system_dbusd_t ============== +allow system_dbusd_t initrc_t:unix_stream_socket connectto; +allow system_dbusd_t mysqld_t:unix_stream_socket connectto; +allow system_dbusd_t mysqld_var_run_t:sock_file write; + +#============= system_mail_t ============== +allow system_mail_t crond_t:unix_stream_socket { read write }; +allow system_mail_t httpd_t:file read; +allow system_mail_t initrc_t:unix_stream_socket connectto; + +#============= xfs_t ============== +allow xfs_t mysqld_t:unix_stream_socket connectto; diff --git a/plugins/coclico/forumml/selinux/forumml2.pp b/plugins/coclico/forumml/selinux/forumml2.pp new file mode 100644 index 0000000000000000000000000000000000000000..ed2112a0a4043f7d60dd61d8c7ba1525243e8040 GIT binary patch literal 10995 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 literal 0 HcmV?d00001 diff --git a/plugins/coclico/forumml/selinux/forumml2.te b/plugins/coclico/forumml/selinux/forumml2.te new file mode 100644 index 0000000000..c23e33bfcc --- /dev/null +++ b/plugins/coclico/forumml/selinux/forumml2.te @@ -0,0 +1,158 @@ + +module forumml2 1.0; + +require { + type mailman_mail_t; + type unconfined_t; + type semanage_t; + type usr_t; + type var_run_t; + type postfix_smtpd_t; + type xfs_t; + type initrc_t; + type system_dbusd_t; + type tmp_t; + type mysqld_etc_t; + type avahi_t; + type mysqld_db_t; + type httpd_sys_content_t; + type logwatch_t; + type postfix_smtp_t; + type postfix_bounce_t; + type ifconfig_t; + type lib_t; + type mysqld_var_run_t; + type nscd_t; + type useradd_t; + type mysqld_t; + type named_t; + type postfix_cleanup_t; + type postfix_master_t; + type setroubleshootd_t; + type postfix_pickup_t; + type groupadd_t; + type crond_t; + type system_mail_t; + type postfix_qmgr_t; + type httpd_t; + class fifo_file { write read ioctl getattr }; + class process signal; + class unix_stream_socket { connectto read write }; + class tcp_socket { read write }; + class file { execute read create ioctl execute_no_trans write getattr unlink append }; + class sock_file write; + class lnk_file { read getattr }; + class dir { write search getattr read remove_name add_name }; +} + +#============= avahi_t ============== +allow avahi_t mysqld_db_t:dir search; +allow avahi_t mysqld_etc_t:file getattr; + +#============= groupadd_t ============== +allow groupadd_t initrc_t:unix_stream_socket connectto; + +#============= httpd_t ============== +allow httpd_t crond_t:unix_stream_socket { read write }; +allow httpd_t initrc_t:unix_stream_socket connectto; +allow httpd_t mysqld_etc_t:file { read getattr }; +allow httpd_t system_mail_t:process signal; +allow httpd_t tmp_t:file { read getattr }; +allow httpd_t unconfined_t:unix_stream_socket { read write }; +allow httpd_t usr_t:file { create unlink append }; + +#============= ifconfig_t ============== +allow ifconfig_t initrc_t:tcp_socket { read write }; + +#============= logwatch_t ============== +allow logwatch_t initrc_t:unix_stream_socket connectto; +allow logwatch_t mysqld_etc_t:file read; +allow logwatch_t mysqld_t:unix_stream_socket connectto; + +#============= mailman_mail_t ============== +allow mailman_mail_t httpd_sys_content_t:dir { read search getattr }; +allow mailman_mail_t httpd_sys_content_t:file { read getattr }; +allow mailman_mail_t httpd_sys_content_t:lnk_file { read getattr }; +allow mailman_mail_t initrc_t:unix_stream_socket connectto; +allow mailman_mail_t lib_t:dir { write remove_name add_name }; +allow mailman_mail_t lib_t:file { write create unlink }; +allow mailman_mail_t self:fifo_file { write read ioctl getattr }; +allow mailman_mail_t tmp_t:file { read getattr }; +allow mailman_mail_t usr_t:file { read getattr ioctl execute execute_no_trans }; +allow mailman_mail_t usr_t:lnk_file { read getattr }; +allow mailman_mail_t var_run_t:dir { write remove_name add_name }; +allow mailman_mail_t var_run_t:file { read create ioctl append getattr }; + +#============= named_t ============== +allow named_t mysqld_db_t:dir search; +allow named_t mysqld_etc_t:file { read getattr }; + +#============= nscd_t ============== +allow nscd_t useradd_t:unix_stream_socket { read write }; + +#============= postfix_bounce_t ============== +allow postfix_bounce_t initrc_t:unix_stream_socket connectto; +allow postfix_bounce_t mysqld_db_t:dir search; +allow postfix_bounce_t mysqld_etc_t:file { read getattr }; +allow postfix_bounce_t mysqld_t:unix_stream_socket connectto; +allow postfix_bounce_t mysqld_var_run_t:sock_file write; + +#============= postfix_cleanup_t ============== +allow postfix_cleanup_t initrc_t:unix_stream_socket connectto; +allow postfix_cleanup_t mysqld_db_t:dir search; +allow postfix_cleanup_t mysqld_etc_t:file { read getattr }; +allow postfix_cleanup_t mysqld_t:unix_stream_socket connectto; +allow postfix_cleanup_t mysqld_var_run_t:sock_file write; +allow postfix_cleanup_t usr_t:file { read getattr }; + +#============= postfix_master_t ============== +allow postfix_master_t initrc_t:unix_stream_socket connectto; +allow postfix_master_t mysqld_etc_t:file { read getattr }; + +#============= postfix_pickup_t ============== +allow postfix_pickup_t initrc_t:unix_stream_socket connectto; +allow postfix_pickup_t mysqld_db_t:dir search; +allow postfix_pickup_t mysqld_etc_t:file { read getattr }; +allow postfix_pickup_t mysqld_var_run_t:sock_file write; + +#============= postfix_qmgr_t ============== +allow postfix_qmgr_t initrc_t:unix_stream_socket connectto; +allow postfix_qmgr_t mysqld_db_t:dir search; +allow postfix_qmgr_t mysqld_etc_t:file getattr; + +#============= postfix_smtp_t ============== +allow postfix_smtp_t initrc_t:unix_stream_socket connectto; +allow postfix_smtp_t mysqld_db_t:dir search; +allow postfix_smtp_t mysqld_etc_t:file { read getattr }; +allow postfix_smtp_t mysqld_t:unix_stream_socket connectto; +allow postfix_smtp_t mysqld_var_run_t:sock_file write; +allow postfix_smtp_t usr_t:file { read getattr }; + +#============= postfix_smtpd_t ============== +allow postfix_smtpd_t initrc_t:unix_stream_socket connectto; +allow postfix_smtpd_t mysqld_db_t:dir search; +allow postfix_smtpd_t mysqld_etc_t:file { read getattr }; +allow postfix_smtpd_t mysqld_t:unix_stream_socket connectto; +allow postfix_smtpd_t mysqld_var_run_t:sock_file write; + +#============= semanage_t ============== +allow semanage_t httpd_sys_content_t:lnk_file read; +allow semanage_t initrc_t:unix_stream_socket connectto; +allow semanage_t mysqld_t:unix_stream_socket connectto; +allow semanage_t mysqld_var_run_t:sock_file write; + +#============= setroubleshootd_t ============== +allow setroubleshootd_t httpd_sys_content_t:lnk_file read; + +#============= system_dbusd_t ============== +allow system_dbusd_t initrc_t:unix_stream_socket connectto; +allow system_dbusd_t mysqld_t:unix_stream_socket connectto; +allow system_dbusd_t mysqld_var_run_t:sock_file write; + +#============= system_mail_t ============== +allow system_mail_t crond_t:unix_stream_socket { read write }; +allow system_mail_t httpd_t:file read; +allow system_mail_t initrc_t:unix_stream_socket connectto; + +#============= xfs_t ============== +allow xfs_t mysqld_t:unix_stream_socket connectto; diff --git a/plugins/coclico/forumml/selinux/forumml3.pp b/plugins/coclico/forumml/selinux/forumml3.pp new file mode 100644 index 0000000000000000000000000000000000000000..41d34e7b56654d0c275ef03458bf409d61f4701a GIT binary patch literal 10995 zcmchd%Z}^D5kQs6!+FQf`)%DH2yEm7Qn)~XERt20Sr8hDGoxII9E+{%YrqRGybbab z`JVhwR+Bo-E_RJX4v9!k0aabEuIlP;_Q<~V&!^A-^OeP70lu&J50!tQ<6r-{{PVUt zzFYpK-W+%3jjFz(h}$<60mi%faNO^AzyGT8AOG$n)Bq;%+XxC@QzQfkg!N<5)ay58 z__|7HKRs+ii5nRX;l1uyXPvuO1)EDppOzwN4AM zDwbQmE7!+RG9CB0yD;p^vD$5`H<-xMuY}bMtb~h%Z;Dt{brBA$s`;Vn0CF25AFJ)V zq6xa1y}K58#6_@h7Pzjfs$7Rqvj(f$s^8;Q)uA{Xt0MeJ)!$bf@_h*5aZ@y(HH8)z$|@9r&>xJr zKh{mS)4jT_kJY*?0)D@k@Lli9RdswU0v{tMFtm>Co#wyW-WP$LvE5PjS!LU58xHFt zaO~ez9E!AhyL#9b@w>)t$mQK#Qv~Mo?G8Dl9V~<9V%0oILw>vZ{?k=hKNP|CcgSnM z+V1wNs$lH4>{lc4nlc>fmuSGrb`o+Wj*@#!l8xQxlBR=axU1=B&_SJ|> zccbI^bMc1`WVhAYi1G6g2Oe=vL+L*mb7|Jk`-?yZLv#F7(jiMiTSi9wzZR-}5L6f`PJl}&;zgFh}5@{yH;X2se!XgR#94Hhd(oB#+^J|p{ zB+^Wr>S1_D|^Z3~LG7q%5Hlp(&Du8BxDF^5AujGrr zB(%9UqW2(9@H}effTzFuCFynO*M`o6r~q2t#f=II5@{ybuXUHE-od|VE?bW%51MQv zIuD`(X!e(KT~man9y4>KT_UdsW>3B6wo>sEl}85qI?{gtq4R*<&f9!Nb)d<{ zqVpgsfacdK4@jh$V4tp|3v)Ub8MGYfiVx=CExB>N%me$miACo@Q~-Owi_Uyz9jOBH zdbsLd{U6T!rN19je+RX0jw|g%-UUfIJC8P*(0iD`&AN?9!d;;akF{6&S4X1OF z!7J4`CL1N*tH3JMZw zCdgp#mpssUz<#y8y5#$4yH!ay^b{GiI^u_#bUO5aedeAdzN5oT+bcZVrq7<>u(V!l4{9ez(U`PUj+nwx^4w z3JMZwCfKLW!-Aa7MFuTLt2`i)W`cd{JS@oRTx8I4SaftAuAAec^AOe*2}}af5zKWg zmMWh4Ssixn<|E3uxrk?TQG(7d^5{HZ=WV}HG+$93G&zZrIa+lDB+^WXGj--R$3~lt z4Cb{Uy__RDBqC0L2QAi<@_zj(a0iLBni5+e1*cr|}ys@MzTwM2;hFQ>}b^Wv2pf|c6!xr|x6 v-WG4A&*fP^i#HPZc@K-XvW2;C#ap;bzE{QD_yqg@lv6|Blj03J;SBx@bslog literal 0 HcmV?d00001 diff --git a/plugins/coclico/forumml/selinux/forumml3.te b/plugins/coclico/forumml/selinux/forumml3.te new file mode 100644 index 0000000000..efee305523 --- /dev/null +++ b/plugins/coclico/forumml/selinux/forumml3.te @@ -0,0 +1,158 @@ + +module forumml3 1.0; + +require { + type mailman_mail_t; + type unconfined_t; + type semanage_t; + type usr_t; + type var_run_t; + type postfix_smtpd_t; + type xfs_t; + type initrc_t; + type system_dbusd_t; + type tmp_t; + type mysqld_etc_t; + type avahi_t; + type mysqld_db_t; + type httpd_sys_content_t; + type logwatch_t; + type postfix_smtp_t; + type postfix_bounce_t; + type ifconfig_t; + type lib_t; + type mysqld_var_run_t; + type nscd_t; + type useradd_t; + type mysqld_t; + type named_t; + type postfix_cleanup_t; + type postfix_master_t; + type setroubleshootd_t; + type postfix_pickup_t; + type groupadd_t; + type crond_t; + type system_mail_t; + type postfix_qmgr_t; + type httpd_t; + class fifo_file { write read ioctl getattr }; + class process signal; + class unix_stream_socket { connectto read write }; + class tcp_socket { read write }; + class file { execute read create ioctl execute_no_trans write getattr unlink append }; + class sock_file write; + class lnk_file { read getattr }; + class dir { write search getattr read remove_name add_name }; +} + +#============= avahi_t ============== +allow avahi_t mysqld_db_t:dir search; +allow avahi_t mysqld_etc_t:file getattr; + +#============= groupadd_t ============== +allow groupadd_t initrc_t:unix_stream_socket connectto; + +#============= httpd_t ============== +allow httpd_t crond_t:unix_stream_socket { read write }; +allow httpd_t initrc_t:unix_stream_socket connectto; +allow httpd_t mysqld_etc_t:file { read getattr }; +allow httpd_t system_mail_t:process signal; +allow httpd_t tmp_t:file { read getattr }; +allow httpd_t unconfined_t:unix_stream_socket { read write }; +allow httpd_t usr_t:file { create unlink append }; + +#============= ifconfig_t ============== +allow ifconfig_t initrc_t:tcp_socket { read write }; + +#============= logwatch_t ============== +allow logwatch_t initrc_t:unix_stream_socket connectto; +allow logwatch_t mysqld_etc_t:file read; +allow logwatch_t mysqld_t:unix_stream_socket connectto; + +#============= mailman_mail_t ============== +allow mailman_mail_t httpd_sys_content_t:dir { read search getattr }; +allow mailman_mail_t httpd_sys_content_t:file { read getattr }; +allow mailman_mail_t httpd_sys_content_t:lnk_file { read getattr }; +allow mailman_mail_t initrc_t:unix_stream_socket connectto; +allow mailman_mail_t lib_t:dir { write remove_name add_name }; +allow mailman_mail_t lib_t:file { write create unlink }; +allow mailman_mail_t self:fifo_file { write read ioctl getattr }; +allow mailman_mail_t tmp_t:file { read getattr }; +allow mailman_mail_t usr_t:file { read getattr ioctl execute execute_no_trans }; +allow mailman_mail_t usr_t:lnk_file { read getattr }; +allow mailman_mail_t var_run_t:dir { write remove_name add_name }; +allow mailman_mail_t var_run_t:file { getattr read create unlink ioctl append }; + +#============= named_t ============== +allow named_t mysqld_db_t:dir search; +allow named_t mysqld_etc_t:file { read getattr }; + +#============= nscd_t ============== +allow nscd_t useradd_t:unix_stream_socket { read write }; + +#============= postfix_bounce_t ============== +allow postfix_bounce_t initrc_t:unix_stream_socket connectto; +allow postfix_bounce_t mysqld_db_t:dir search; +allow postfix_bounce_t mysqld_etc_t:file { read getattr }; +allow postfix_bounce_t mysqld_t:unix_stream_socket connectto; +allow postfix_bounce_t mysqld_var_run_t:sock_file write; + +#============= postfix_cleanup_t ============== +allow postfix_cleanup_t initrc_t:unix_stream_socket connectto; +allow postfix_cleanup_t mysqld_db_t:dir search; +allow postfix_cleanup_t mysqld_etc_t:file { read getattr }; +allow postfix_cleanup_t mysqld_t:unix_stream_socket connectto; +allow postfix_cleanup_t mysqld_var_run_t:sock_file write; +allow postfix_cleanup_t usr_t:file { read getattr }; + +#============= postfix_master_t ============== +allow postfix_master_t initrc_t:unix_stream_socket connectto; +allow postfix_master_t mysqld_etc_t:file { read getattr }; + +#============= postfix_pickup_t ============== +allow postfix_pickup_t initrc_t:unix_stream_socket connectto; +allow postfix_pickup_t mysqld_db_t:dir search; +allow postfix_pickup_t mysqld_etc_t:file { read getattr }; +allow postfix_pickup_t mysqld_var_run_t:sock_file write; + +#============= postfix_qmgr_t ============== +allow postfix_qmgr_t initrc_t:unix_stream_socket connectto; +allow postfix_qmgr_t mysqld_db_t:dir search; +allow postfix_qmgr_t mysqld_etc_t:file getattr; + +#============= postfix_smtp_t ============== +allow postfix_smtp_t initrc_t:unix_stream_socket connectto; +allow postfix_smtp_t mysqld_db_t:dir search; +allow postfix_smtp_t mysqld_etc_t:file { read getattr }; +allow postfix_smtp_t mysqld_t:unix_stream_socket connectto; +allow postfix_smtp_t mysqld_var_run_t:sock_file write; +allow postfix_smtp_t usr_t:file { read getattr }; + +#============= postfix_smtpd_t ============== +allow postfix_smtpd_t initrc_t:unix_stream_socket connectto; +allow postfix_smtpd_t mysqld_db_t:dir search; +allow postfix_smtpd_t mysqld_etc_t:file { read getattr }; +allow postfix_smtpd_t mysqld_t:unix_stream_socket connectto; +allow postfix_smtpd_t mysqld_var_run_t:sock_file write; + +#============= semanage_t ============== +allow semanage_t httpd_sys_content_t:lnk_file read; +allow semanage_t initrc_t:unix_stream_socket connectto; +allow semanage_t mysqld_t:unix_stream_socket connectto; +allow semanage_t mysqld_var_run_t:sock_file write; + +#============= setroubleshootd_t ============== +allow setroubleshootd_t httpd_sys_content_t:lnk_file read; + +#============= system_dbusd_t ============== +allow system_dbusd_t initrc_t:unix_stream_socket connectto; +allow system_dbusd_t mysqld_t:unix_stream_socket connectto; +allow system_dbusd_t mysqld_var_run_t:sock_file write; + +#============= system_mail_t ============== +allow system_mail_t crond_t:unix_stream_socket { read write }; +allow system_mail_t httpd_t:file read; +allow system_mail_t initrc_t:unix_stream_socket connectto; + +#============= xfs_t ============== +allow xfs_t mysqld_t:unix_stream_socket connectto; diff --git a/plugins/coclico/forumml/selinux/forumml4.pp b/plugins/coclico/forumml/selinux/forumml4.pp new file mode 100644 index 0000000000000000000000000000000000000000..5085c6ea89e3bbc1acd1dcf0c7c9c0216182da6d GIT binary patch literal 10995 zcmchdOONBo4S=1_`~7~uJbxg_0=b76AV3buDaRZHx2^70#+JNNd3F}aL5Ey}{E7UY z{GXgU{7OZMZA&cy_J#mid=**6Dph-S`LE}{|MzpN)e8KM;y+dXwvK=K!}?D}dHS&a zbG19|^E*|2NfEcNC<2TRRed@f_P_hQ@*n-?x2OS3;MWiozMx155D432)>PYfdHAAA zXg{fokmE*%I^XPw2oQ$MAh0WH=HM3Rd|eq7b$+Pc=UKTq5qBXgiu?A&2AUX zWC6)SRMI#3rrti`2@t?9cVE8C9*TVoj6MbS%Vi3HnYDqyv97jx(^&1A;<4Q9zuMWN zldT5TL-A0>L@#!Tz;=pi8}{U3idzCH*$Zj_e==AWR!)B8&GDF*ao0rL>a-Ad#d7lx z`SuiYrsE!~3qw^-<-RE2VIoVv5>_*^5-t+HDPmSuS*SN<^F7r8GpF%k9vgXq!)6Ipv3|S!bcPHGBRTCbx zR`=DZ+~!%p@24}q+kL(%Psc3qF>(T9>nI*H|3mSZ1uA3JQTD~oin0jxHVYj4Hx$Pr zZQgI5iY$KDxQ)4dcxbY~e7@Z=hg88lXf9UGgEZ#1uO2_ygzZxntiEGjhfT3RY|4zW zE7{K{;x&1wtJD2HZ=R|u?7Fk~*@Uy5#bMKgyzYE|G2?qIw(mF!HvY{C-?aJNeHPfa z-D_oEoQ0)t4&0zvre97(eAG=HdHv$y{&>PG<&B5?s|lZNU6mS!gMBmM(%tBI{#^XA z1KAh4H)8x`!huIz)3Eg)PPsH&_27}=f{bMe2Q9R{SYr;SMo*24vz~}xCI0yEm^}G5 z$3mGWhmi$N_SX}h`l*NfknSSM?Qv7~#rY=3-TkT2jj~DJ!?EN|uD5&hsLui4)ZK)a zJ{WxAC50s?l^KiHKU+BcXu|2#7Y zL^=@cyk6&35Y_c_aZr#*2Z9Xte(4V?IuF>Xo+z3xyq8ssD@5l(Q~+&Wt2`i)4g|ZM zxB21&nyhT((RmORKKs5K9SCu5wvUBe2BrpkxbEn8?F-3XMWM!A-AdrGYIuPP;uih$JOi>;*S=mK7Qi{l_*c#E>mW|{dR6xz%7JEoEyu0yYx+qQ z^J?lISi`OE(rY<5kN;>g+q0+)n!H-IDqWtXBwg=!&2Ph{IcDDTx4I@<&&B$>pN1E8 zzVusbl*|1Rm-plKzu{eWQ9lo&0%&V%l?No!fmjYk^Th`=**J6_L@ZG>$E+?dwJEWLO~)O2r_8%TIB(W zbRgJg-}biimu~1OGH5xjs#U9j6eQAtAcK95nOePdzRUyrxvdHc66rvY!QL-jp@=mGoOo48Kil13YlLCeu94@jf~SyHQYa+hIR~ka!bRKS6t1IqRD#83d*4^sGZ$f$Y!M`~f zZO@`SX!6n=t1wTlf~rT~ zLC)tQgO;OJ9*{@}f_?5hEXes>WYBV0baWnWo8zkU5Y`n5Oajpn9QLtVt9apO`>=C2 zA5q55MZB1c5_Eo%N9O@MZ~L91`HJ$O$w{2e(W)aLkq(47b7yXIY_!?P;II~?*KJMvlZF8oz2wdVh856xig*pOXnua}98Ot4lguczRt&&sR$ zAJ~0Il{fI((iG)&G{#)EA$bqN^-V?I0MF8_m*`G;v%gWE|NM2{6J&Nq+9XE$fV>MK ztjEB5f4rSOAhY-VKHh;k4?RBK!pg0$$LlF->gDlj9-Y{~$UMFzIZEV>aX!;wlwtAcnig}J{qs5n5lQ> zT%G!5yqX%v9vQDBMCyz2YW~QSu@}Z`i4gl=&Xuv}#Va`k+iKV6GG*<0TfCJ%mlypk m-bmn=JuKcz35UKFZ{aTaUKMZS6YTp_&JBG}iZ|$l3-}+rZ*tH8 literal 0 HcmV?d00001 diff --git a/plugins/coclico/forumml/selinux/forumml4.te b/plugins/coclico/forumml/selinux/forumml4.te new file mode 100644 index 0000000000..d732923fe8 --- /dev/null +++ b/plugins/coclico/forumml/selinux/forumml4.te @@ -0,0 +1,158 @@ + +module forumml4 1.0; + +require { + type mailman_mail_t; + type unconfined_t; + type semanage_t; + type usr_t; + type var_run_t; + type postfix_smtpd_t; + type xfs_t; + type initrc_t; + type system_dbusd_t; + type tmp_t; + type mysqld_etc_t; + type avahi_t; + type mysqld_db_t; + type httpd_sys_content_t; + type logwatch_t; + type postfix_smtp_t; + type postfix_bounce_t; + type ifconfig_t; + type lib_t; + type mysqld_var_run_t; + type nscd_t; + type useradd_t; + type mysqld_t; + type named_t; + type postfix_cleanup_t; + type postfix_master_t; + type setroubleshootd_t; + type postfix_pickup_t; + type groupadd_t; + type crond_t; + type system_mail_t; + type postfix_qmgr_t; + type httpd_t; + class fifo_file { write read ioctl getattr }; + class process signal; + class unix_stream_socket { connectto read write }; + class tcp_socket { read write }; + class file { execute read create ioctl execute_no_trans write getattr unlink append }; + class sock_file write; + class lnk_file { read getattr }; + class dir { write search getattr read remove_name add_name }; +} + +#============= avahi_t ============== +allow avahi_t mysqld_db_t:dir search; +allow avahi_t mysqld_etc_t:file getattr; + +#============= groupadd_t ============== +allow groupadd_t initrc_t:unix_stream_socket connectto; + +#============= httpd_t ============== +allow httpd_t crond_t:unix_stream_socket { read write }; +allow httpd_t initrc_t:unix_stream_socket connectto; +allow httpd_t mysqld_etc_t:file { read getattr }; +allow httpd_t system_mail_t:process signal; +allow httpd_t tmp_t:file { read getattr }; +allow httpd_t unconfined_t:unix_stream_socket { read write }; +allow httpd_t usr_t:file { create unlink append }; + +#============= ifconfig_t ============== +allow ifconfig_t initrc_t:tcp_socket { read write }; + +#============= logwatch_t ============== +allow logwatch_t initrc_t:unix_stream_socket connectto; +allow logwatch_t mysqld_etc_t:file read; +allow logwatch_t mysqld_t:unix_stream_socket connectto; + +#============= mailman_mail_t ============== +allow mailman_mail_t httpd_sys_content_t:dir { read write search getattr }; +allow mailman_mail_t httpd_sys_content_t:file { read getattr }; +allow mailman_mail_t httpd_sys_content_t:lnk_file { read getattr }; +allow mailman_mail_t initrc_t:unix_stream_socket connectto; +allow mailman_mail_t lib_t:dir { write remove_name add_name }; +allow mailman_mail_t lib_t:file { write create unlink }; +allow mailman_mail_t self:fifo_file { write read ioctl getattr }; +allow mailman_mail_t tmp_t:file { read getattr }; +allow mailman_mail_t usr_t:file { read getattr ioctl execute execute_no_trans }; +allow mailman_mail_t usr_t:lnk_file { read getattr }; +allow mailman_mail_t var_run_t:dir { write remove_name add_name }; +allow mailman_mail_t var_run_t:file { getattr read create unlink ioctl append }; + +#============= named_t ============== +allow named_t mysqld_db_t:dir search; +allow named_t mysqld_etc_t:file { read getattr }; + +#============= nscd_t ============== +allow nscd_t useradd_t:unix_stream_socket { read write }; + +#============= postfix_bounce_t ============== +allow postfix_bounce_t initrc_t:unix_stream_socket connectto; +allow postfix_bounce_t mysqld_db_t:dir search; +allow postfix_bounce_t mysqld_etc_t:file { read getattr }; +allow postfix_bounce_t mysqld_t:unix_stream_socket connectto; +allow postfix_bounce_t mysqld_var_run_t:sock_file write; + +#============= postfix_cleanup_t ============== +allow postfix_cleanup_t initrc_t:unix_stream_socket connectto; +allow postfix_cleanup_t mysqld_db_t:dir search; +allow postfix_cleanup_t mysqld_etc_t:file { read getattr }; +allow postfix_cleanup_t mysqld_t:unix_stream_socket connectto; +allow postfix_cleanup_t mysqld_var_run_t:sock_file write; +allow postfix_cleanup_t usr_t:file { read getattr }; + +#============= postfix_master_t ============== +allow postfix_master_t initrc_t:unix_stream_socket connectto; +allow postfix_master_t mysqld_etc_t:file { read getattr }; + +#============= postfix_pickup_t ============== +allow postfix_pickup_t initrc_t:unix_stream_socket connectto; +allow postfix_pickup_t mysqld_db_t:dir search; +allow postfix_pickup_t mysqld_etc_t:file { read getattr }; +allow postfix_pickup_t mysqld_var_run_t:sock_file write; + +#============= postfix_qmgr_t ============== +allow postfix_qmgr_t initrc_t:unix_stream_socket connectto; +allow postfix_qmgr_t mysqld_db_t:dir search; +allow postfix_qmgr_t mysqld_etc_t:file getattr; + +#============= postfix_smtp_t ============== +allow postfix_smtp_t initrc_t:unix_stream_socket connectto; +allow postfix_smtp_t mysqld_db_t:dir search; +allow postfix_smtp_t mysqld_etc_t:file { read getattr }; +allow postfix_smtp_t mysqld_t:unix_stream_socket connectto; +allow postfix_smtp_t mysqld_var_run_t:sock_file write; +allow postfix_smtp_t usr_t:file { read getattr }; + +#============= postfix_smtpd_t ============== +allow postfix_smtpd_t initrc_t:unix_stream_socket connectto; +allow postfix_smtpd_t mysqld_db_t:dir search; +allow postfix_smtpd_t mysqld_etc_t:file { read getattr }; +allow postfix_smtpd_t mysqld_t:unix_stream_socket connectto; +allow postfix_smtpd_t mysqld_var_run_t:sock_file write; + +#============= semanage_t ============== +allow semanage_t httpd_sys_content_t:lnk_file read; +allow semanage_t initrc_t:unix_stream_socket connectto; +allow semanage_t mysqld_t:unix_stream_socket connectto; +allow semanage_t mysqld_var_run_t:sock_file write; + +#============= setroubleshootd_t ============== +allow setroubleshootd_t httpd_sys_content_t:lnk_file read; + +#============= system_dbusd_t ============== +allow system_dbusd_t initrc_t:unix_stream_socket connectto; +allow system_dbusd_t mysqld_t:unix_stream_socket connectto; +allow system_dbusd_t mysqld_var_run_t:sock_file write; + +#============= system_mail_t ============== +allow system_mail_t crond_t:unix_stream_socket { read write }; +allow system_mail_t httpd_t:file read; +allow system_mail_t initrc_t:unix_stream_socket connectto; + +#============= xfs_t ============== +allow xfs_t mysqld_t:unix_stream_socket connectto; diff --git a/plugins/coclico/forumml/selinux/forumml5.pp b/plugins/coclico/forumml/selinux/forumml5.pp new file mode 100644 index 0000000000000000000000000000000000000000..c545fc9f876df49c44b204fb244a9bb31608aa55 GIT binary patch literal 10995 zcmchdOONBm5rCD+%Xufx`)TbTh~q=fE-VlrhvbxF4unSH%qT07W3jbf13vJOYmh&Y z-{b$2)1h+s4 zd|f59pB}cM#ElGxaKw1EO1>{Rk;qKW(~G$+oe_53eWXAuO(KHJu%j||ImoVL6kQTV|4U9 z>Q@Qb;ZGEa0Z61B*?-o2vfC7ISBK(otcvhsRexV`$oC5%?H6fuVJ5?==72_Pz*I#;T+2vz=|LZ8)rp zz_EW#vJDp&^1#j1IbhWvK*{imz2ekg*~cgSnM z+V1wNs$lF&_Un;&O&JdL@pe}>4|N?j-C6u<#M#bbziL8x=zM=O;rqBlY9A=ObPzZ#>-Jjrgn&b){iA*jFPi z-Hndt&&3})klj}IMvPyKIPi#T8n*t^F_&ho9y~H!kfAJLuZ6Z3Yslf)=&5mWmLn0Y z#GmZ%lPBNiP$=`{Fp9v*elX&xpL!_w=`NDo9yev5oo{m7+#VaoMx2gKd59NE?Joiu49)S+Nrx;6Z6)#PNje>R z5aqz$kCRZ4NHf9C>vdWMQC&Y52L*{V6J)UWOMg(&dB9HfMA3ZVy{uwfAvzDD0%-GE z8Cit?bz%FfF{AO(pu6XI~MUMpHmQ64l|*;zSKioqP5 z$2HD8eMW;h*vCJ0(Y9_;88o@8=6MZH{aT#^NTit%hwET>3yUP|bD&U=NHakO&97A+ zkVrGZZt=|*AJAl*gwBJg0QPv`7#f*xi+HnAS!@n ze<=s&@t@?2za+G|Hlp_+PVhWx=76Wa`X%Xg=+}nMgQx&n-o=dy3KD51*spb$rryE7 zYc5-lC=Z%!BRUVF0%-P^a$M`ark_-UwYt__dMO9z@r7>K_RRi4lNXCtrSr3tr0e}I z`E58i$HaU7TGwRjIa^=%)9|d$=YC6#a=u^U@_xMhH@wR(>gPdJ0Bvop@_`+cN;0HO1M z-Ok&5MRlOb#-j5eDuCwKDi27cnP8vZM;GRFE;492(iI=f!CP|Ue3=LKa}$fsgQx)Z zeixnj%zdOCkk`XiYxRFP^Oyd9O#L0yeREu?61fVJbaozXGNJb{vsSZm#2@_{TzmrM z$uVOeu?(kkk-;nNV^)p}zmIu2F8e;_<+$wbwp#YHvy`N}(s{HRZZgM(=P@tG#CeFW z)AkJSsM=6_)K9aY}IYfDp<*U=br-iG8o2-i0ic>_F4vtFVb<<0&| zdH(a)X-|;Z8EKOk=mYXDgs>h1>;3U|`hd*d_xpGU>YRIgyoHrpUys*Q)YQx4)jT?} zf5$87JMcX_-bUu!r{gVjKRoZv@m98U){o;Id`+weXUuMWH{MPUj_bAYCcbzpXX>x< zX10`jYP^MFS|5$qQ_R#mbE;1LGG0xMV~>ni5+e1*cr|}ys@MzTwM2;hFQ>}b^Wv2p zf^D_ya~ZRCy)E8KpUbm;7H=f*^Bxv&rG&X}#ap;bzE{QD_yqg@lv6|Blj03J;SBx< Dd)RXE literal 0 HcmV?d00001 diff --git a/plugins/coclico/forumml/selinux/forumml5.te b/plugins/coclico/forumml/selinux/forumml5.te new file mode 100644 index 0000000000..c3a7994b15 --- /dev/null +++ b/plugins/coclico/forumml/selinux/forumml5.te @@ -0,0 +1,158 @@ + +module forumml5 1.0; + +require { + type mailman_mail_t; + type unconfined_t; + type semanage_t; + type usr_t; + type var_run_t; + type postfix_smtpd_t; + type xfs_t; + type initrc_t; + type system_dbusd_t; + type tmp_t; + type mysqld_etc_t; + type avahi_t; + type mysqld_db_t; + type httpd_sys_content_t; + type logwatch_t; + type postfix_smtp_t; + type postfix_bounce_t; + type ifconfig_t; + type lib_t; + type mysqld_var_run_t; + type nscd_t; + type useradd_t; + type mysqld_t; + type named_t; + type postfix_cleanup_t; + type postfix_master_t; + type setroubleshootd_t; + type postfix_pickup_t; + type groupadd_t; + type crond_t; + type system_mail_t; + type postfix_qmgr_t; + type httpd_t; + class fifo_file { write read ioctl getattr }; + class process signal; + class unix_stream_socket { connectto read write }; + class tcp_socket { read write }; + class file { execute read create ioctl execute_no_trans write getattr unlink append }; + class sock_file write; + class lnk_file { read getattr }; + class dir { write search getattr read remove_name add_name }; +} + +#============= avahi_t ============== +allow avahi_t mysqld_db_t:dir search; +allow avahi_t mysqld_etc_t:file getattr; + +#============= groupadd_t ============== +allow groupadd_t initrc_t:unix_stream_socket connectto; + +#============= httpd_t ============== +allow httpd_t crond_t:unix_stream_socket { read write }; +allow httpd_t initrc_t:unix_stream_socket connectto; +allow httpd_t mysqld_etc_t:file { read getattr }; +allow httpd_t system_mail_t:process signal; +allow httpd_t tmp_t:file { read getattr }; +allow httpd_t unconfined_t:unix_stream_socket { read write }; +allow httpd_t usr_t:file { create unlink append }; + +#============= ifconfig_t ============== +allow ifconfig_t initrc_t:tcp_socket { read write }; + +#============= logwatch_t ============== +allow logwatch_t initrc_t:unix_stream_socket connectto; +allow logwatch_t mysqld_etc_t:file read; +allow logwatch_t mysqld_t:unix_stream_socket connectto; + +#============= mailman_mail_t ============== +allow mailman_mail_t httpd_sys_content_t:dir { read write search getattr add_name }; +allow mailman_mail_t httpd_sys_content_t:file { read getattr }; +allow mailman_mail_t httpd_sys_content_t:lnk_file { read getattr }; +allow mailman_mail_t initrc_t:unix_stream_socket connectto; +allow mailman_mail_t lib_t:dir { write remove_name add_name }; +allow mailman_mail_t lib_t:file { write create unlink }; +allow mailman_mail_t self:fifo_file { write read ioctl getattr }; +allow mailman_mail_t tmp_t:file { read getattr }; +allow mailman_mail_t usr_t:file { read getattr ioctl execute execute_no_trans }; +allow mailman_mail_t usr_t:lnk_file { read getattr }; +allow mailman_mail_t var_run_t:dir { write remove_name add_name }; +allow mailman_mail_t var_run_t:file { getattr read create unlink ioctl append }; + +#============= named_t ============== +allow named_t mysqld_db_t:dir search; +allow named_t mysqld_etc_t:file { read getattr }; + +#============= nscd_t ============== +allow nscd_t useradd_t:unix_stream_socket { read write }; + +#============= postfix_bounce_t ============== +allow postfix_bounce_t initrc_t:unix_stream_socket connectto; +allow postfix_bounce_t mysqld_db_t:dir search; +allow postfix_bounce_t mysqld_etc_t:file { read getattr }; +allow postfix_bounce_t mysqld_t:unix_stream_socket connectto; +allow postfix_bounce_t mysqld_var_run_t:sock_file write; + +#============= postfix_cleanup_t ============== +allow postfix_cleanup_t initrc_t:unix_stream_socket connectto; +allow postfix_cleanup_t mysqld_db_t:dir search; +allow postfix_cleanup_t mysqld_etc_t:file { read getattr }; +allow postfix_cleanup_t mysqld_t:unix_stream_socket connectto; +allow postfix_cleanup_t mysqld_var_run_t:sock_file write; +allow postfix_cleanup_t usr_t:file { read getattr }; + +#============= postfix_master_t ============== +allow postfix_master_t initrc_t:unix_stream_socket connectto; +allow postfix_master_t mysqld_etc_t:file { read getattr }; + +#============= postfix_pickup_t ============== +allow postfix_pickup_t initrc_t:unix_stream_socket connectto; +allow postfix_pickup_t mysqld_db_t:dir search; +allow postfix_pickup_t mysqld_etc_t:file { read getattr }; +allow postfix_pickup_t mysqld_var_run_t:sock_file write; + +#============= postfix_qmgr_t ============== +allow postfix_qmgr_t initrc_t:unix_stream_socket connectto; +allow postfix_qmgr_t mysqld_db_t:dir search; +allow postfix_qmgr_t mysqld_etc_t:file getattr; + +#============= postfix_smtp_t ============== +allow postfix_smtp_t initrc_t:unix_stream_socket connectto; +allow postfix_smtp_t mysqld_db_t:dir search; +allow postfix_smtp_t mysqld_etc_t:file { read getattr }; +allow postfix_smtp_t mysqld_t:unix_stream_socket connectto; +allow postfix_smtp_t mysqld_var_run_t:sock_file write; +allow postfix_smtp_t usr_t:file { read getattr }; + +#============= postfix_smtpd_t ============== +allow postfix_smtpd_t initrc_t:unix_stream_socket connectto; +allow postfix_smtpd_t mysqld_db_t:dir search; +allow postfix_smtpd_t mysqld_etc_t:file { read getattr }; +allow postfix_smtpd_t mysqld_t:unix_stream_socket connectto; +allow postfix_smtpd_t mysqld_var_run_t:sock_file write; + +#============= semanage_t ============== +allow semanage_t httpd_sys_content_t:lnk_file read; +allow semanage_t initrc_t:unix_stream_socket connectto; +allow semanage_t mysqld_t:unix_stream_socket connectto; +allow semanage_t mysqld_var_run_t:sock_file write; + +#============= setroubleshootd_t ============== +allow setroubleshootd_t httpd_sys_content_t:lnk_file read; + +#============= system_dbusd_t ============== +allow system_dbusd_t initrc_t:unix_stream_socket connectto; +allow system_dbusd_t mysqld_t:unix_stream_socket connectto; +allow system_dbusd_t mysqld_var_run_t:sock_file write; + +#============= system_mail_t ============== +allow system_mail_t crond_t:unix_stream_socket { read write }; +allow system_mail_t httpd_t:file read; +allow system_mail_t initrc_t:unix_stream_socket connectto; + +#============= xfs_t ============== +allow xfs_t mysqld_t:unix_stream_socket connectto; diff --git a/plugins/coclico/forumml/selinux/forumml6.pp b/plugins/coclico/forumml/selinux/forumml6.pp new file mode 100644 index 0000000000000000000000000000000000000000..8e86513e10de7c1d9aa5f9afae5bbda86e39d49d GIT binary patch literal 10995 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 UZG3`#f6A$$?@93nop1*K1Ili57XSbN literal 0 HcmV?d00001 diff --git a/plugins/coclico/forumml/selinux/forumml7.te b/plugins/coclico/forumml/selinux/forumml7.te new file mode 100644 index 0000000000..4a0608d061 --- /dev/null +++ b/plugins/coclico/forumml/selinux/forumml7.te @@ -0,0 +1,158 @@ + +module forumml7 1.0; + +require { + type mailman_mail_t; + type unconfined_t; + type semanage_t; + type usr_t; + type var_run_t; + type postfix_smtpd_t; + type xfs_t; + type initrc_t; + type system_dbusd_t; + type tmp_t; + type mysqld_etc_t; + type avahi_t; + type mysqld_db_t; + type httpd_sys_content_t; + type logwatch_t; + type postfix_smtp_t; + type postfix_bounce_t; + type ifconfig_t; + type lib_t; + type mysqld_var_run_t; + type nscd_t; + type useradd_t; + type mysqld_t; + type named_t; + type postfix_cleanup_t; + type postfix_master_t; + type setroubleshootd_t; + type postfix_pickup_t; + type groupadd_t; + type crond_t; + type system_mail_t; + type postfix_qmgr_t; + type httpd_t; + class fifo_file { write read ioctl getattr }; + class process signal; + class unix_stream_socket { connectto read write }; + class tcp_socket { read write }; + class file { execute read create ioctl execute_no_trans write getattr unlink append }; + class sock_file write; + class lnk_file { read getattr }; + class dir { write search getattr read remove_name add_name }; +} + +#============= avahi_t ============== +allow avahi_t mysqld_db_t:dir search; +allow avahi_t mysqld_etc_t:file getattr; + +#============= groupadd_t ============== +allow groupadd_t initrc_t:unix_stream_socket connectto; + +#============= httpd_t ============== +allow httpd_t crond_t:unix_stream_socket { read write }; +allow httpd_t initrc_t:unix_stream_socket connectto; +allow httpd_t mysqld_etc_t:file { read getattr }; +allow httpd_t system_mail_t:process signal; +allow httpd_t tmp_t:file { read getattr }; +allow httpd_t unconfined_t:unix_stream_socket { read write }; +allow httpd_t usr_t:file { create unlink append }; + +#============= ifconfig_t ============== +allow ifconfig_t initrc_t:tcp_socket { read write }; + +#============= logwatch_t ============== +allow logwatch_t initrc_t:unix_stream_socket connectto; +allow logwatch_t mysqld_etc_t:file read; +allow logwatch_t mysqld_t:unix_stream_socket connectto; + +#============= mailman_mail_t ============== +allow mailman_mail_t httpd_sys_content_t:dir { read write search getattr add_name }; +allow mailman_mail_t httpd_sys_content_t:file { read write getattr create }; +allow mailman_mail_t httpd_sys_content_t:lnk_file { read getattr }; +allow mailman_mail_t initrc_t:unix_stream_socket connectto; +allow mailman_mail_t lib_t:dir { write remove_name add_name }; +allow mailman_mail_t lib_t:file { write create unlink }; +allow mailman_mail_t self:fifo_file { write read ioctl getattr }; +allow mailman_mail_t tmp_t:file { read getattr }; +allow mailman_mail_t usr_t:file { read getattr ioctl execute execute_no_trans }; +allow mailman_mail_t usr_t:lnk_file { read getattr }; +allow mailman_mail_t var_run_t:dir { write remove_name add_name }; +allow mailman_mail_t var_run_t:file { getattr read create unlink ioctl append }; + +#============= named_t ============== +allow named_t mysqld_db_t:dir search; +allow named_t mysqld_etc_t:file { read getattr }; + +#============= nscd_t ============== +allow nscd_t useradd_t:unix_stream_socket { read write }; + +#============= postfix_bounce_t ============== +allow postfix_bounce_t initrc_t:unix_stream_socket connectto; +allow postfix_bounce_t mysqld_db_t:dir search; +allow postfix_bounce_t mysqld_etc_t:file { read getattr }; +allow postfix_bounce_t mysqld_t:unix_stream_socket connectto; +allow postfix_bounce_t mysqld_var_run_t:sock_file write; + +#============= postfix_cleanup_t ============== +allow postfix_cleanup_t initrc_t:unix_stream_socket connectto; +allow postfix_cleanup_t mysqld_db_t:dir search; +allow postfix_cleanup_t mysqld_etc_t:file { read getattr }; +allow postfix_cleanup_t mysqld_t:unix_stream_socket connectto; +allow postfix_cleanup_t mysqld_var_run_t:sock_file write; +allow postfix_cleanup_t usr_t:file { read getattr }; + +#============= postfix_master_t ============== +allow postfix_master_t initrc_t:unix_stream_socket connectto; +allow postfix_master_t mysqld_etc_t:file { read getattr }; + +#============= postfix_pickup_t ============== +allow postfix_pickup_t initrc_t:unix_stream_socket connectto; +allow postfix_pickup_t mysqld_db_t:dir search; +allow postfix_pickup_t mysqld_etc_t:file { read getattr }; +allow postfix_pickup_t mysqld_var_run_t:sock_file write; + +#============= postfix_qmgr_t ============== +allow postfix_qmgr_t initrc_t:unix_stream_socket connectto; +allow postfix_qmgr_t mysqld_db_t:dir search; +allow postfix_qmgr_t mysqld_etc_t:file getattr; + +#============= postfix_smtp_t ============== +allow postfix_smtp_t initrc_t:unix_stream_socket connectto; +allow postfix_smtp_t mysqld_db_t:dir search; +allow postfix_smtp_t mysqld_etc_t:file { read getattr }; +allow postfix_smtp_t mysqld_t:unix_stream_socket connectto; +allow postfix_smtp_t mysqld_var_run_t:sock_file write; +allow postfix_smtp_t usr_t:file { read getattr }; + +#============= postfix_smtpd_t ============== +allow postfix_smtpd_t initrc_t:unix_stream_socket connectto; +allow postfix_smtpd_t mysqld_db_t:dir search; +allow postfix_smtpd_t mysqld_etc_t:file { read getattr }; +allow postfix_smtpd_t mysqld_t:unix_stream_socket connectto; +allow postfix_smtpd_t mysqld_var_run_t:sock_file write; + +#============= semanage_t ============== +allow semanage_t httpd_sys_content_t:lnk_file read; +allow semanage_t initrc_t:unix_stream_socket connectto; +allow semanage_t mysqld_t:unix_stream_socket connectto; +allow semanage_t mysqld_var_run_t:sock_file write; + +#============= setroubleshootd_t ============== +allow setroubleshootd_t httpd_sys_content_t:lnk_file read; + +#============= system_dbusd_t ============== +allow system_dbusd_t initrc_t:unix_stream_socket connectto; +allow system_dbusd_t mysqld_t:unix_stream_socket connectto; +allow system_dbusd_t mysqld_var_run_t:sock_file write; + +#============= system_mail_t ============== +allow system_mail_t crond_t:unix_stream_socket { read write }; +allow system_mail_t httpd_t:file read; +allow system_mail_t initrc_t:unix_stream_socket connectto; + +#============= xfs_t ============== +allow xfs_t mysqld_t:unix_stream_socket connectto; diff --git a/plugins/coclico/forumml/selinux/forumml8.pp b/plugins/coclico/forumml/selinux/forumml8.pp new file mode 100644 index 0000000000000000000000000000000000000000..e5c4390899d605883dbfb5594d3b800c1207fa4f GIT binary patch literal 7289 zcmcJU$!_CD5QY_H-}mhlopT5>hXA>yF1aPAJODvUw9Qx|Jz{GXAVB5?f;?|dPJPWT zvLsO=0nHTfch}Zcy|HbV|9$xDzt?878Tdr;kIElw|HrS3-^yzDZ1H=&+O3PZs@_uI z_KpIgzpl5t&1U`c>&id+;YZZa+X<*4WQGH1Rc>M5R4lhe9tt>OKi!t0cwd<}6x(7` zKPj>*-xTCxM7~-@88g9k@CrTiYl?ikytUb(wS_4=TUU44b-6AWiJp;63u3hQz2DZ$ zqG>EdQ{Ghh`rYW-IuZmx*X4B`Bk!#N0gtj?hBbMZ?M)H#5Vq(^$rLOKJ!1gGRLPHi zV2d!}x~tY@bw_*xy7;y^pQ#!`_DkGV<+H2_I)zQv)XTdfus%GNbyXG15Nca6dHhh^ zj~8qn>_2>c^`}P3wxYa|7^A)CQGc7jCHz!D3`kOd6jjIqp}E^b?)P;Qu60YU>Rq)gvcMDwf6jNgF7j%3p9R+Z-U;Wj zD#Lb}19!YRb(IAUn2%=2&C)j;?nXQ|`!00E-m=nFi^ulOiE!-|i!OX-Lm7FyG!rLl zABM7fnZiaFhr?Vk6l2%uPH|XYpK!2cJ>J|TPdi#2u$Rj`*?=r?MZP)_Q$L(gY|{A? zj{7?_yX3gK+BLdRZYQ7FkZ1SVs{Jf6*kF#|CmpgRSP~T@i{6u{06M?)*rM}<-JVeM z71aTgjYa24Q~;e{V$gX)P5QaQd_{R+@@)1(rB)Z2)JW3xev4>9?+LrbH(ya5Fgc!1 z(rMR`C_@SohMNNnEhN1d;akSi~}~- zdUT$|37$u7u?~MG<7e@#N9RdY0A_!oJS4I08|>_l%^!;-*jVe)dlD6Z+2_hb65GD9 z9Ov$<#W);`49q@zp@Ndcwr{X=mkxjYi|TBw_2@i_3c&2=ad}5A~y*m3|rC)g18&9GF==Lgc=saOR{6k(;2l}x{ulhVD=D6rQCgvD953Zf< z4H1FKvxN#u65GB(2Av;4lq9x&gMIW(T(thuc3q1Mx*V76)j|U)No@ND8FV=kgU%D` zvG=NdNhai&w~@ssP@WuPdo?-71$#9)#|3+}NNbnWTZar%=&lNj&J%WfN6c4L2fVCe z)X^J>GQj-ORvr0aA3G1?KoZ-&K?at?ICP${kG)szt2>@!$~t^*aRNNB`TnguB(ZH9 zcwjyc4-b(=XC%gGe~Rb#Vr;--@wX8q38uGxs{T724@rWJw|=Vr7ab2tY}@8l@GksC zEPKjb)&DrKR0E%~{YSub^th+$zgP2DS6Aov2Cf#Rdat7vcwAoh9)#e0vu{SQ*fY-QG^&+w5I|+dD8nD{6Z^TbByiUd=}wi`QOB zAv>)j7OcIE;&or7_7=*J`-N$5W#UK0Xz$=xZUyL5b}Kr2JH_WTX$sBW#8+yYmWs>X z%$8X}+3VS|R75^hr^2yUvy-t{e5i~CVy|SQY&vaG_>{FR1bZumq`l&=HxhWi;Onhi N>#oS_4XQt){{gw<&Kv*$ literal 0 HcmV?d00001 diff --git a/plugins/coclico/forumml/selinux/forumml8.te b/plugins/coclico/forumml/selinux/forumml8.te new file mode 100644 index 0000000000..ecda007496 --- /dev/null +++ b/plugins/coclico/forumml/selinux/forumml8.te @@ -0,0 +1,109 @@ + +module forumml8 1.0; + +require { + type mailman_mail_t; + type usr_t; + type mysqld_t; + type postfix_smtpd_t; + type xfs_t; + type setroubleshootd_t; + type system_dbusd_t; + type tmp_t; + type mysqld_etc_t; + type initrc_t; + type mysqld_db_t; + type httpd_sys_content_t; + type logwatch_t; + type postfix_smtp_t; + type postfix_bounce_t; + type var_run_t; + type mysqld_var_run_t; + type named_t; + type postfix_cleanup_t; + type postfix_master_t; + type postfix_pickup_t; + type system_mail_t; + type postfix_qmgr_t; + type httpd_t; + type avahi_t; + class fifo_file { write read getattr ioctl }; + class process signal; + class unix_stream_socket connectto; + class file { write getattr read create unlink }; + class sock_file write; + class lnk_file read; + class dir { write search read remove_name create add_name }; +} + +#============= avahi_t ============== +allow avahi_t mysqld_db_t:dir search; +allow avahi_t mysqld_etc_t:file getattr; + +#============= httpd_t ============== +allow httpd_t system_mail_t:process signal; + +#============= logwatch_t ============== +allow logwatch_t initrc_t:unix_stream_socket connectto; +allow logwatch_t mysqld_etc_t:file read; +allow logwatch_t mysqld_t:unix_stream_socket connectto; + +#============= mailman_mail_t ============== +allow mailman_mail_t httpd_sys_content_t:dir { read write create add_name }; +allow mailman_mail_t httpd_sys_content_t:file { read write create }; +allow mailman_mail_t httpd_sys_content_t:lnk_file read; +allow mailman_mail_t self:fifo_file { write read getattr ioctl }; +allow mailman_mail_t tmp_t:file { read getattr }; +allow mailman_mail_t usr_t:file read; +allow mailman_mail_t var_run_t:dir { write remove_name }; +allow mailman_mail_t var_run_t:file { read unlink }; + +#============= named_t ============== +allow named_t mysqld_db_t:dir search; +allow named_t mysqld_etc_t:file { read getattr }; + +#============= postfix_bounce_t ============== +allow postfix_bounce_t initrc_t:unix_stream_socket connectto; +allow postfix_bounce_t mysqld_db_t:dir search; +allow postfix_bounce_t mysqld_etc_t:file getattr; +allow postfix_bounce_t mysqld_t:unix_stream_socket connectto; + +#============= postfix_cleanup_t ============== +allow postfix_cleanup_t initrc_t:unix_stream_socket connectto; +allow postfix_cleanup_t mysqld_db_t:dir search; +allow postfix_cleanup_t mysqld_etc_t:file getattr; + +#============= postfix_master_t ============== +allow postfix_master_t initrc_t:unix_stream_socket connectto; +allow postfix_master_t mysqld_etc_t:file getattr; + +#============= postfix_pickup_t ============== +allow postfix_pickup_t initrc_t:unix_stream_socket connectto; +allow postfix_pickup_t mysqld_db_t:dir search; +allow postfix_pickup_t mysqld_etc_t:file { read getattr }; +allow postfix_pickup_t mysqld_var_run_t:sock_file write; + +#============= postfix_qmgr_t ============== +allow postfix_qmgr_t initrc_t:unix_stream_socket connectto; +allow postfix_qmgr_t mysqld_db_t:dir search; +allow postfix_qmgr_t mysqld_etc_t:file getattr; + +#============= postfix_smtp_t ============== +allow postfix_smtp_t initrc_t:unix_stream_socket connectto; +allow postfix_smtp_t mysqld_db_t:dir search; +allow postfix_smtp_t mysqld_etc_t:file getattr; + +#============= postfix_smtpd_t ============== +allow postfix_smtpd_t initrc_t:unix_stream_socket connectto; +allow postfix_smtpd_t mysqld_db_t:dir search; +allow postfix_smtpd_t mysqld_etc_t:file getattr; + +#============= setroubleshootd_t ============== +allow setroubleshootd_t httpd_sys_content_t:lnk_file read; + +#============= system_dbusd_t ============== +allow system_dbusd_t mysqld_t:unix_stream_socket connectto; +allow system_dbusd_t mysqld_var_run_t:sock_file write; + +#============= xfs_t ============== +allow xfs_t mysqld_t:unix_stream_socket connectto; diff --git a/plugins/coclico/forumml/site-content/en_US/forumml.tab b/plugins/coclico/forumml/site-content/en_US/forumml.tab new file mode 100644 index 0000000000..82126c9ed8 --- /dev/null +++ b/plugins/coclico/forumml/site-content/en_US/forumml.tab @@ -0,0 +1,100 @@ +#/** +# * +# * Plugin forumml scripts message catalog (English) +# * +# * +# * Copyright (c) STMicroelectronics, 2007. All Rights Reserved. +# * +# * Originally written by Mohamed CHAARI, 2007. STMicroelectronics. +# * +# * This file is a part of codendi. +# * +# * codendi is free software; you can redistribute it and/or modify +# * it under the terms of the GNU General Public License as published by +# * the Free Software Foundation; either version 2 of the License, or +# * (at your option) any later version. +# * +# * codendi is distributed in the hope that it will be useful, +# * but WITHOUT ANY WARRANTY; without even the implied warranty of +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# * GNU General Public License for more details. +# * +# * You should have received a copy of the GNU General Public License +# * along with codendi; if not, write to the Free Software +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# * +# * +# * +# * +# */ +# +# +#----------------------------------------------- +# Script:plugins/forumml/www/index.php +# +plugin_forumml descriptor_description ForumML provide a nice view of GNU Mailman archives. +plugin_forumml post Post a New Thread +plugin_forumml archives Archives +plugin_forumml browse_arch Browse Archives +plugin_forumml attach_file Attach file +plugin_forumml title_root Mailing-List '$1' +plugin_forumml list_arch Archives +plugin_forumml list_new_thread Mailing-List '$1' - New Thread +plugin_forumml new_thread Submit a new Thread: +plugin_forumml subject_exist Your subject already exist, please Change it... +plugin_forumml last_by last by +plugin_forumml subject Subject +plugin_forumml add_cc Add cc +plugin_forumml attach Attach: +plugin_forumml message Message: +plugin_forumml cc Cc: +plugin_forumml from From: +plugin_forumml reply Reply +plugin_forumml erase Erase +plugin_forumml wrong_list The mailing-list does not exist or is inactive. +plugin_forumml specify_list You must specify the mailing-list id. +plugin_forumml type_subject Submit failed. You must specify the mail subject. +plugin_forumml email_delay There can be some delay before to see the message in the archives. +plugin_forumml back_to_list Back to the list +plugin_forumml warn_permission Please check that you are allowed to post to this list. Otherwise, your message may not be distributed. +# +#----------------------------------------------- +# Script:plugins/forumml/www/message.php +# +plugin_forumml post_thread Post a new Thread +plugin_forumml original_archive Mailman Archives +plugin_forumml thread Thread +plugin_forumml submitted_on Submitted on +plugin_forumml author Author +plugin_forumml empty_archives Empty Archives +plugin_forumml search_result Search results for '$1' +plugin_forumml found thread(s) found +# +#----------------------------------------------- +# Script:plugins/forumml/www/upload.php +# +plugin_forumml missing_param Missing 'date' and/or 'filename' parameters. +plugin_forumml attchment_not_found Attachment not found +# +#----------------------------------------------- +# Script:plugins/forumml/www/forumml_utils.php +# +plugin_forumml show_message_from From: +plugin_forumml show_message_cc Cc: +plugin_forumml show_message_date on $1 +plugin_forumml show_message_subject Subject: +plugin_forumml begin First messages +plugin_forumml previous Previous $1 messages +plugin_forumml threads Threads +plugin_forumml next Next $1 messages +plugin_forumml end Last messages +plugin_forumml invalid_mail Submit failed. Invalid e-mail address in CC List.
'$1' +plugin_forumml mail_succeed Mail Sent successfully. +plugin_forumml mail_fail Sending Mail failed. +plugin_forumml msg_html_format Message (in HTML format) +plugin_forumml toggle_font Toggle font familly (typewriter/normal) +# +#----------------------------------------------- +# Script:plugins/forumml/include/forummlPlugin.class.php +# +plugin_forumml this_list This Mailing-List diff --git a/plugins/coclico/forumml/site-content/fr_FR/forumml.tab b/plugins/coclico/forumml/site-content/fr_FR/forumml.tab new file mode 100644 index 0000000000..8cdc89d742 --- /dev/null +++ b/plugins/coclico/forumml/site-content/fr_FR/forumml.tab @@ -0,0 +1,100 @@ +#/** +# * +# * Plugin forumml scripts message catalog (French) +# * +# * +# * Copyright (c) STMicroelectronics, 2007. All Rights Reserved. +# * +# * Originally written by Mohamed CHAARI, 2007. STMicroelectronics. +# * +# * This file is a part of codendi. +# * +# * codendi is free software; you can redistribute it and/or modify +# * it under the terms of the GNU General Public License as published by +# * the Free Software Foundation; either version 2 of the License, or +# * (at your option) any later version. +# * +# * codendi is distributed in the hope that it will be useful, +# * but WITHOUT ANY WARRANTY; without even the implied warranty of +# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# * GNU General Public License for more details. +# * +# * You should have received a copy of the GNU General Public License +# * along with codendi; if not, write to the Free Software +# * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# * +# * +# * +# * +# */ +# +# +#----------------------------------------------- +# Script:plugins/forumml/www/index.php +# +plugin_forumml descriptor_description ForumML fournit une interface plus conviviale pour naviger dans des archives Mailman. +plugin_forumml post Soumettre un nouveau fil de discussion +plugin_forumml archives Archives +plugin_forumml browse_arch Naviguer dans les archives +plugin_forumml attach_file Attacher un fichier +plugin_forumml title_root Liste de diffusion '$1' +plugin_forumml list_arch Archives +plugin_forumml list_new_thread Liste de diffusion '$1' - Nouveau fil de discussion +plugin_forumml new_thread Soumettre un nouveau fil de discussion: +plugin_forumml subject_exist Le sujet choisi existe déjà, veuillez le changer... +plugin_forumml last_by Dernier auteur +plugin_forumml subject Sujet +plugin_forumml add_cc Ajouter Cc +plugin_forumml attach Attacher: +plugin_forumml message Message: +plugin_forumml cc Cc: +plugin_forumml from Envoyé par: +plugin_forumml reply Répondre +plugin_forumml erase Effacer +plugin_forumml wrong_list Cette liste de diffusion n'existe pas ou bien elle est inactive. +plugin_forumml specify_list Vous devez spécifier l'identificateur (id) de la liste de diffusion. +plugin_forumml type_subject L'envoi a échoué. Vous devez spécifier le sujet du mail. +plugin_forumml email_delay Il peut y avoir un délai avant de le voir apparaître dans les archives. +plugin_forumml back_to_list Retour à la liste +plugin_forumml warn_permission Veillez vérifier que vous êtes autorisé à poster dans cette liste, sans quoi votre message pourrait ne pas être distribué +# +#----------------------------------------------- +# Script:plugins/forumml/www/message.php +# +plugin_forumml post_thread Soumettre un nouveau fil de discussion +plugin_forumml original_archive Archives Mailman +plugin_forumml thread Fil de discussion +plugin_forumml submitted_on Date +plugin_forumml author Auteur +plugin_forumml empty_archives Archives vides +plugin_forumml search_result Résultat de recherche pour '$1' +plugin_forumml found Fil(s) trouvé(s) +# +#----------------------------------------------- +# Script:plugins/forumml/www/upload.php +# +plugin_forumml missing_param Les paramètres 'date' et/ou 'filename' sont manquants. +plugin_forumml attchment_not_found Attachement manquant +# +#----------------------------------------------- +# Script:plugins/forumml/www/forumml_utils.php +# +plugin_forumml show_message_from De : +plugin_forumml show_message_cc Cc : +plugin_forumml show_message_date le $1 +plugin_forumml show_message_subject Sujet : +plugin_forumml begin Premiers fils +plugin_forumml previous Les $1 fils précédents +plugin_forumml threads Fils +plugin_forumml next Les $1 fils suivants +plugin_forumml end Derniers fils +plugin_forumml invalid_mail Echec d'envoi. Adresse courriel en Cc non valide.
'$1' +plugin_forumml mail_succeed E-mail envoyé avec succès. +plugin_forumml mail_fail Echec d'envoi de l'e-mail. +plugin_forumml msg_html_format Message (en format HTML) +plugin_forumml toggle_font Changer la police (courier/normal) +# +#----------------------------------------------- +# Script:plugins/forumml/include/forummlPlugin.class.php +# +plugin_forumml this_list Cette Liste diff --git a/plugins/coclico/forumml/tests/ForumML_FileStorageTest.php b/plugins/coclico/forumml/tests/ForumML_FileStorageTest.php new file mode 100644 index 0000000000..bae5f68727 --- /dev/null +++ b/plugins/coclico/forumml/tests/ForumML_FileStorageTest.php @@ -0,0 +1,185 @@ +_fixture = dirname(__FILE__).'/_fixtures'; + // validchar for attachment name + $this->_namePattern = "`[^a-z0-9_-]`i"; + } + + private function _deleteIfExists($path) { + if (is_dir($path)) { + rmdir($path); + } elseif (file_exists($path)) { + unlink($path); + } + } + + private function _getFileStorage($path) { + $fs = new ForumML_FileStorageTestVersion($this); + $fs->root = $path; + $fs->setReturnValue('fileExists', false); + return $fs; + } + + function setUp() { + } + + function tearDown() { + $this->_deleteIfExists($this->_fixture.'/gpig-interest/2007_10_24/Screenshot_jpg'); + $this->_deleteIfExists($this->_fixture.'/gpig-interest/2007_10_24'); + $this->_deleteIfExists($this->_fixture.'/gpig-interest'); + + } + + function testForumML_FileStorage() { + $fstorage = $this->_getFileStorage($this->_fixture); + $this->assertNotNull($fstorage->root); + $this->assertIsA($fstorage->root, 'string'); + $this->assertEqual($fstorage->root,$this->_fixture); + $this->assertNoErrors(); + } + + // case 1: an attachment file whose name has more than 64 characters + function test_getPathFileNameWithMoreThan64Char() { + $fs1 = $this->_getFileStorage($this->_fixture); + $name1 = "a string with more than 64 characters, which is the limit allowed for ForumML attachments"; + $list1 = "gpig-interest"; + $date1 = "2007_10_24"; + $type1 = "store"; + + // check returned path + $path1 = $fs1->_getPath($name1,$list1,$date1,$type1); + $this->assertNotNull($path1); + $this->assertIsA($path1, 'string'); + $this->assertNoErrors(); + // check filename length is restricted to 64 characters + $path_array1 = explode("/",$path1); + $fname1 = $path_array1[count($path_array1) - 1]; + $this->assertNotEqual($name1,$fname1); + $this->assertEqual(strlen($fname1),63); + // check other path components + $flist1 = $path_array1[count($path_array1) - 3]; + $this->assertEqual($flist1,$list1); + $fdate1 = $path_array1[count($path_array1) - 2]; + $this->assertEqual($fdate1,$date1); + // check regexp + $this->assertWantedPattern($this->_namePattern,$name1); + } + + // case 2: an attachment file whose name has less than 64 characters + function test_getPathFileNameWithLessThan64Char() { + $fs1 = $this->_getFileStorage($this->_fixture); + $name2 = "filename less than 64 chars"; + $list1 = "gpig-interest"; + $date1 = "2007_10_24"; + $type1 = "store"; + + $path2 = $fs1->_getPath($name2,$list1,$date1,$type1); + $this->assertNotNull($path2); + $this->assertIsA($path2, 'string'); + $this->assertNoErrors(); + $path_array2 = explode("/",$path2); + $fname2 = $path_array2[count($path_array2) - 1]; + $this->assertEqual($fname2,"filename_less_than_64_chars"); + $this->assertNotEqual(strlen($fname2),64); + // check path components + $flist2 = $path_array2[count($path_array2) - 3]; + $this->assertEqual($flist2,$list1); + $fdate2 = $path_array2[count($path_array2) - 2]; + $this->assertEqual($fdate2,$date1); + // check regexp + $this->assertWantedPattern($this->_namePattern,$name2); + } + + // case 3: attachment filename with only alphanumeric characters + function test_getPathFileNameWithAlphaNumCharsOnly() { + $fs1 = $this->_getFileStorage($this->_fixture); + $name3 = "Cx2008-requirements"; + $list1 = "gpig-interest"; + $date1 = "2007_10_24"; + $type1 = "store"; + + $path3 = $fs1->_getPath($name3,$list1,$date1,$type1); + $this->assertNotNull($path3); + $this->assertIsA($path3, 'string'); + $this->assertNoErrors(); + $path_array3 = explode("/",$path3); + $fname3 = $path_array3[count($path_array3) - 1]; + $this->assertNoUnwantedPattern($this->_namePattern,$name3); + } + + // case 4: attachment filename is an empty string + function test_getPathFileNameEmpty() { + $fs1 = $this->_getFileStorage($this->_fixture); + $name4 = ""; + $list1 = "gpig-interest"; + $date1 = "2007_10_24"; + $type1 = "store"; + + $path4 = $fs1->_getPath($name4,$list1,$date1,$type1); + $this->assertNoErrors(); + $this->assertNotNull($path4); + $this->assertIsA($path4, 'string'); + $path_array4 = explode("/",$path4); + $fname4 = $path_array4[count($path_array4) - 1]; + $this->assertWantedPattern('/^attachment.*/', $fname4); + } + + // case 5: same attachment name submitted 2 times same day for same list + function testGetPathWithSameFileName() { + $fs = new ForumML_FileStorageTestVersion($this); + $fs->root = $this->_fixture; + $fs->setReturnValueAt(0, 'fileExists', false); + $fs->setReturnValueAt(1, 'fileExists', true); + + $list = "gpig-interest"; + $date = "2007_10_24"; + $type = "store"; + $name = 'Screenshot.jpg'; + + // First file stored that day + $path1 = $fs->_getPath($name,$list,$date,$type); + + // Second file with same name + $path2 = $fs->_getPath($name,$list,$date,$type); + + $this->assertNotEqual($path1, $path2); + } + +} + +?> \ No newline at end of file diff --git a/plugins/coclico/forumml/tests/ForumML_InsertTest.php b/plugins/coclico/forumml/tests/ForumML_InsertTest.php new file mode 100644 index 0000000000..0a6e394609 --- /dev/null +++ b/plugins/coclico/forumml/tests/ForumML_InsertTest.php @@ -0,0 +1,221 @@ +_fixture = dirname(__FILE__).'/_fixtures/samples'; + } + + + function getEmailStructure($path) { + $message = file_get_contents($this->_fixture.'/'.$path); + $args['include_bodies'] = TRUE; + $args['decode_bodies'] = TRUE; + $args['decode_headers'] = TRUE; + $args['crlf'] = "\r\n"; + $decoder = new ForumML_mimeDecode($message, "\r\n"); + $structure = $decoder->decode($args); + return $structure; + } + + /** + * Text only + */ + function testInsertTextOnly() { + $structure = $this->getEmailStructure('pure_text.mbox'); + + $storage = new MockForumML_FileStorage($this); + + $i = new ForumMLInsertTest($this); + $i->setReturnValue('insertMessage', 2); + + $txtBody='Pure text +'; + $i->expectOnce('insertMessage', array('*', $txtBody, 'text/plain; charset=ISO-8859-1; format=flowed')); + $i->expectNever('insertAttachment'); + + $i->storeEmail($structure, $storage); + } + + /** + * Attachment only + */ + function testInsertAttachmentOnly() { + $structure = $this->getEmailStructure('attachment_only.mbox'); + + $storage = new MockForumML_FileStorage($this); + $storage->setReturnValue('store', '/a/b/c'); + + $i = new ForumMLInsertTest($this); + $i->setReturnValue('insertMessage', 2); + + $txtBody=' + +'; + $i->expectOnce('insertMessage', array('*', $txtBody, 'text/plain; charset=ISO-8859-1; format=flowed')); + $i->expectOnce('insertAttachment', array(2, 'lock.png', 'image/png; name="lock.png"', '/a/b/c', '')); + + $i->storeEmail($structure, $storage); + } + + + /** + * Text + attachment + */ + function testInsertTextWithAttachment() { + $structure = $this->getEmailStructure('text_plus_attachment.mbox'); + + $storage = new MockForumML_FileStorage($this); + $storage->setReturnValue('store', '/a/b/c'); + + $i = new ForumMLInsertTest($this); + $i->setReturnValue('insertMessage', 2); + + $txtBody='Some text + +'; + $i->expectOnce('insertMessage', array('*', $txtBody, 'text/plain; charset=ISO-8859-1; format=flowed')); + $i->expectOnce('insertAttachment', array(2, 'lock.png', 'image/png; name="lock.png"', '/a/b/c', '')); + + $i->storeEmail($structure, $storage); + } + + /** + * Pure HTML sent in Text+HTML + */ + function testInsertHTMLInTextHtmlMode() { + $structure = $this->getEmailStructure('pure_html_text_plus_html.mbox'); + + $storage = new MockForumML_FileStorage($this); + $storage->setReturnValue('store', '/a/b/c'); + + $i = new ForumMLInsertTest($this); + $i->setReturnValue('insertMessage', 2); + + $txtBody='My *fault + +* + +'; + $i->expectOnce('insertMessage', array('*', $txtBody, 'text/plain; charset=ISO-8859-1; format=flowed')); + $i->expectOnce('insertAttachment', array(2, 'message_4ACB049C.6020506.html', 'text/html; charset=ISO-8859-1', '/a/b/c', '')); + + $i->storeEmail($structure, $storage); + } + + /** + * Pure HTML sent in HTML Only + */ + function testInsertHTMLInHtmlOnlyMode() { + $structure = $this->getEmailStructure('pure_html_in_html_only.mbox'); + + $storage = new MockForumML_FileStorage($this); + $storage->setReturnValue('store', '/a/b/c'); + + $i = new ForumMLInsertTest($this); + $i->setReturnValue('insertMessage', 2); + + $i->expectOnce('insertMessage', array('*', '*', 'text/html; charset=ISO-8859-1')); + $i->expectNever('insertAttachment'); + + $i->storeEmail($structure, $storage); + } + + /** + * HTML with inline content in Text+HTML mode + */ + function testInsertHtmlWithInlineContentInTextPlusHtml() { + $structure = $this->getEmailStructure('html_with_inline_content_in_text_plus_html.mbox'); + + $storage = new MockForumML_FileStorage($this); + $storage->setReturnValue('store', '/a/b/c'); + + $i = new ForumMLInsertTest($this); + $i->setReturnValue('insertMessage', 2); + + $txtBody='My *test + +* + +'; + $i->expectOnce('insertMessage', array('*', $txtBody, 'text/plain; charset=ISO-8859-1; format=flowed')); + $i->expectAt(0, 'insertAttachment', array(2, '*', 'text/html; charset=ISO-8859-1', '/a/b/c', '')); + $i->expectAt(1, 'insertAttachment', array(2, 'lock.png', 'image/png; name="lock.png"', '/a/b/c', '')); + $i->expectCallCount('insertAttachment', 2); + + $i->storeEmail($structure, $storage); + } + + /** + * HTML with inline content in HTML Only mode + */ + function testInsertHtmlWithInlineContentInHtmlOnly() { + $structure = $this->getEmailStructure('html_with_inline_content_in_html_only.mbox'); + + $storage = new MockForumML_FileStorage($this); + $storage->setReturnValue('store', '/a/b/c'); + + $i = new ForumMLInsertTest($this); + $i->setReturnValue('insertMessage', 2); + + $i->expectOnce('insertMessage', array('*', '*', 'text/html; charset=ISO-8859-1')); + $i->expectOnce('insertAttachment', array(2, 'attachment', 'image/png', '/a/b/c', '')); + + $i->storeEmail($structure, $storage); + } + + function testInsertHtmlWithInlineContentAndAttachmentInTextPlusHtml() { + $structure = $this->getEmailStructure('html_with_inline_content_and_attch_in_text_plus_html.mbox'); + + $storage = new MockForumML_FileStorage($this); + $storage->setReturnValue('store', '/a/b/c'); + + $i = new ForumMLInsertTest($this); + $i->setReturnValue('insertMessage', 2); + + $txtBody='My *test + +* + +'; + $i->expectOnce('insertMessage', array('*', $txtBody, 'text/plain; charset=ISO-8859-1; format=flowed')); + $i->expectAt(0, 'insertAttachment', array(2, '*', 'text/html; charset=ISO-8859-1', '/a/b/c', '')); + $i->expectAt(1, 'insertAttachment', array(2, 'attachment', 'image/png', '/a/b/c', '')); + $i->expectAt(2, 'insertAttachment', array(2, 'new_trk_severity_migr.png', 'image/png; name="new_trk_severity_migr.png"', '/a/b/c', '')); + $i->expectCallCount('insertAttachment', 3); + + $i->storeEmail($structure, $storage); + } + + function testInsertHtmlWithInlineContentAndAttachmentInHtmlOnly() { + $structure = $this->getEmailStructure('html_with_inline_content_and_attch_in_html_only.mbox'); + + $storage = new MockForumML_FileStorage($this); + $storage->setReturnValue('store', '/a/b/c'); + + $i = new ForumMLInsertTest($this); + $i->setReturnValue('insertMessage', 2); + + $i->expectOnce('insertMessage', array('*', '*', 'text/html; charset=ISO-8859-1')); + $i->expectAt(0, 'insertAttachment', array(2, 'attachment', 'image/png', '/a/b/c', '')); + $i->expectAt(1, 'insertAttachment', array(2, 'new_trk_severity_migr.png', 'image/png; name="new_trk_severity_migr.png"', '/a/b/c', '')); + $i->expectCallCount('insertAttachment', 2); + + $i->storeEmail($structure, $storage); + } + + + +} + +?> diff --git a/plugins/coclico/forumml/tests/_fixtures/samples/attachment_only.mbox b/plugins/coclico/forumml/tests/_fixtures/samples/attachment_only.mbox new file mode 100644 index 0000000000..1dedeb7873 --- /dev/null +++ b/plugins/coclico/forumml/tests/_fixtures/samples/attachment_only.mbox @@ -0,0 +1,238 @@ +From john.doh@codendi.org Tue Oct 6 13:14:43 2009 +Return-Path: +X-Original-To: gpig-test@codendi.org +Delivered-To: gpig-test@codendi.org +Received: from alpha.codendi.org (ns2.codendi.org [192.168.1.2]) + by codendi.org (Postfix) with ESMTP id B2FC7AD70A + for ; + Tue, 6 Oct 2009 13:14:43 +0200 (CEST) +Received: from mail2.foobar.org (mail2.foobar.org [192.168.1.3]) + by alpha.codendi.org (FooBar) with ESMTP id 46082AA3 + for ; + Tue, 6 Oct 2009 11:14:43 +0000 (GMT) +Received: from [192.168.1.4] (yoyo.foobar.org [192.168.1.4]) + by mail2.foobar.org (MOS 3.8.7a) + with ESMTP id CTB94911 (AUTH johndoh); + Tue, 6 Oct 2009 13:14:08 +0200 (CEST) +Message-ID: <4ACB26A3.8010602@codendi.org> +Date: Tue, 06 Oct 2009 13:14:43 +0200 +From: Manuel VACELET +User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; + rv:1.8.1.6) Gecko/20070728 Thunderbird/2.0.0.6 Mnenhy/0.7.5.666 +MIME-Version: 1.0 +To: gpig-test@codendi.org +Content-Type: multipart/mixed; boundary="------------080307020605020807030502" +Subject: [Gpig-testsabri] attchement only +X-BeenThere: gpig-test@codendi.org +X-Mailman-Version: 2.1.9 +Precedence: list +List-Id: +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +X-List-Received-Date: Tue, 06 Oct 2009 11:14:43 -0000 + +This is a multi-part message in MIME format. +--------------080307020605020807030502 +Content-Type: text/plain; charset=ISO-8859-1; format=flowed +Content-Transfer-Encoding: 7bit + + + +--------------080307020605020807030502 +Content-Type: image/png; + name="lock.png" +Content-Transfer-Encoding: base64 +Content-Disposition: inline; + filename="lock.png" + +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 +EoQAAAL4YkJQbolQTkcNChoKAAAADUlIRFIAAADHAAABDggCAAAAsveUWQAAAr9JREFUeNrt +0kEJADAMwMDVv+mZCBTKnYI8Mg9qsx3AQa6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucq +eq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLn +Knquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i +5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnqu +oucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6 +rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucq +eq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLn +Knquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i +5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnqu +oucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6 +rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucq +eq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLn +Knquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnofXqoBD6rh +8GQAAAAASUVORK5CYIJIZtRDAAAAAElFTkSuQmCC +--------------080307020605020807030502-- diff --git a/plugins/coclico/forumml/tests/_fixtures/samples/html_with_inline_content_and_attch_in_html_only.mbox b/plugins/coclico/forumml/tests/_fixtures/samples/html_with_inline_content_and_attch_in_html_only.mbox new file mode 100644 index 0000000000..259870d5d9 --- /dev/null +++ b/plugins/coclico/forumml/tests/_fixtures/samples/html_with_inline_content_and_attch_in_html_only.mbox @@ -0,0 +1,391 @@ +From john.doh@codendi.org Tue Oct 6 13:45:32 2009 +Return-Path: +X-Original-To: gpig-test@codendi.org +Delivered-To: gpig-test@codendi.org +Received: from alpha.codendi.org (ns2.codendi.org [192.168.1.2]) + by codendi.org (Postfix) with ESMTP id 469A6AD70A + for ; + Tue, 6 Oct 2009 13:45:32 +0200 (CEST) +Received: from mail2.foobar.org (mail2.foobar.org [192.168.1.3]) + by alpha.codendi.org (FooBar) with ESMTP id 0A2D7AC6 + for ; + Tue, 6 Oct 2009 11:45:32 +0000 (GMT) +Received: from [192.168.1.4] (yoyo.foobar.org [192.168.1.4]) + by mail2.foobar.org (MOS 3.8.7a) + with ESMTP id CTB95761 (AUTH johndoh); + Tue, 6 Oct 2009 13:44:56 +0200 (CEST) +Message-ID: <4ACB2DDC.1090507@codendi.org> +Date: Tue, 06 Oct 2009 13:45:32 +0200 +From: Manuel VACELET +User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; + rv:1.8.1.6) Gecko/20070728 Thunderbird/2.0.0.6 Mnenhy/0.7.5.666 +MIME-Version: 1.0 +To: gpig-test@codendi.org +Content-Type: multipart/mixed; boundary="------------020002020307040308020901" +Subject: [Gpig-testsabri] HTML with inline content and attachment in HTML + only mode +X-BeenThere: gpig-test@codendi.org +X-Mailman-Version: 2.1.9 +Precedence: list +List-Id: +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +X-List-Received-Date: Tue, 06 Oct 2009 11:45:32 -0000 + +This is a multi-part message in MIME format. +--------------020002020307040308020901 +Content-Type: multipart/related; + boundary="------------010008070805010506010307" + + +--------------010008070805010506010307 +Content-Type: text/html; charset=ISO-8859-1 +Content-Transfer-Encoding: 7bit + + + + + + +My test
+
+
+
+ + + +--------------010008070805010506010307 +Content-Type: image/png +Content-Transfer-Encoding: base64 +Content-ID: + +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 +EoQAAAL4YkJQbolQTkcNChoKAAAADUlIRFIAAADHAAABDggCAAAAsveUWQAAAr9JREFUeNrt +0kEJADAMwMDVv+mZCBTKnYI8Mg9qsx3AQa6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucq +eq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLn +Knquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i +5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnqu +oucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6 +rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucq +eq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLn +Knquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i +5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnqu +oucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6 +rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucq +eq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLn +Knquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnofXqoBD6rh +8GQAAAAASUVORK5CYIJIZtRDAAAAAElFTkSuQmCC +--------------010008070805010506010307-- + +--------------020002020307040308020901 +Content-Type: image/png; + name="new_trk_severity_migr.png" +Content-Transfer-Encoding: base64 +Content-Disposition: inline; + filename="new_trk_severity_migr.png" + +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 +--------------020002020307040308020901-- diff --git a/plugins/coclico/forumml/tests/_fixtures/samples/html_with_inline_content_and_attch_in_text_plus_html.mbox b/plugins/coclico/forumml/tests/_fixtures/samples/html_with_inline_content_and_attch_in_text_plus_html.mbox new file mode 100644 index 0000000000..a7d1353208 --- /dev/null +++ b/plugins/coclico/forumml/tests/_fixtures/samples/html_with_inline_content_and_attch_in_text_plus_html.mbox @@ -0,0 +1,406 @@ +From john.doh@codendi.org Tue Oct 6 13:44:25 2009 +Return-Path: +X-Original-To: gpig-test@codendi.org +Delivered-To: gpig-test@codendi.org +Received: from alpha.codendi.org (ns2.codendi.org [192.168.1.2]) + by codendi.org (Postfix) with ESMTP id C1C9CAD70A + for ; + Tue, 6 Oct 2009 13:44:25 +0200 (CEST) +Received: from mail2.foobar.org (mail2.foobar.org [192.168.1.3]) + by alpha.codendi.org (FooBar) with ESMTP id E84AB41E + for ; + Tue, 6 Oct 2009 11:44:24 +0000 (GMT) +Received: from [192.168.1.4] (yoyo.foobar.org [192.168.1.4]) + by mail2.foobar.org (MOS 3.8.7a) + with ESMTP id CTB95731 (AUTH johndoh); + Tue, 6 Oct 2009 13:43:49 +0200 (CEST) +Message-ID: <4ACB2D99.3080203@codendi.org> +Date: Tue, 06 Oct 2009 13:44:25 +0200 +From: Manuel VACELET +User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; + rv:1.8.1.6) Gecko/20070728 Thunderbird/2.0.0.6 Mnenhy/0.7.5.666 +MIME-Version: 1.0 +To: gpig-test@codendi.org +Content-Type: multipart/mixed; boundary="------------040401030508020408000101" +Subject: [Gpig-testsabri] HTML with inline content and attachment in + HTML+Text mode +X-BeenThere: gpig-test@codendi.org +X-Mailman-Version: 2.1.9 +Precedence: list +List-Id: +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +X-List-Received-Date: Tue, 06 Oct 2009 11:44:26 -0000 + +This is a multi-part message in MIME format. +--------------040401030508020408000101 +Content-Type: multipart/alternative; + boundary="------------090705050704060401010401" + + +--------------090705050704060401010401 +Content-Type: text/plain; charset=ISO-8859-1; format=flowed +Content-Transfer-Encoding: 7bit + +My *test + +* + +--------------090705050704060401010401 +Content-Type: multipart/related; + boundary="------------060704030302020603080603" + + +--------------060704030302020603080603 +Content-Type: text/html; charset=ISO-8859-1 +Content-Transfer-Encoding: 7bit + + + + + + +My test
+
+
+
+ + + +--------------060704030302020603080603 +Content-Type: image/png +Content-Transfer-Encoding: base64 +Content-ID: + +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 +EoQAAAL4YkJQbolQTkcNChoKAAAADUlIRFIAAADHAAABDggCAAAAsveUWQAAAr9JREFUeNrt +0kEJADAMwMDVv+mZCBTKnYI8Mg9qsx3AQa6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucq +eq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLn +Knquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i +5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnqu +oucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6 +rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucq +eq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLn +Knquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i +5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnqu +oucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6 +rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucq +eq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLn +Knquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnofXqoBD6rh +8GQAAAAASUVORK5CYIJIZtRDAAAAAElFTkSuQmCC +--------------060704030302020603080603-- + +--------------090705050704060401010401-- + +--------------040401030508020408000101 +Content-Type: image/png; + name="new_trk_severity_migr.png" +Content-Transfer-Encoding: base64 +Content-Disposition: inline; + filename="new_trk_severity_migr.png" + +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 +--------------040401030508020408000101-- diff --git a/plugins/coclico/forumml/tests/_fixtures/samples/html_with_inline_content_in_html_only.mbox b/plugins/coclico/forumml/tests/_fixtures/samples/html_with_inline_content_in_html_only.mbox new file mode 100644 index 0000000000..a83336de75 --- /dev/null +++ b/plugins/coclico/forumml/tests/_fixtures/samples/html_with_inline_content_in_html_only.mbox @@ -0,0 +1,248 @@ +From john.doh@codendi.org Tue Oct 6 13:38:07 2009 +Return-Path: +X-Original-To: gpig-test@codendi.org +Delivered-To: gpig-test@codendi.org +Received: from alpha.codendi.org (ns2.codendi.org [192.168.1.2]) + by codendi.org (Postfix) with ESMTP id ACCA5AD70A + for ; + Tue, 6 Oct 2009 13:38:07 +0200 (CEST) +Received: from mail2.foobar.org (mail2.foobar.org [192.168.1.3]) + by alpha.codendi.org (FooBar) with ESMTP id 51FCDAF5 + for ; + Tue, 6 Oct 2009 11:38:07 +0000 (GMT) +Received: from [192.168.1.4] (yoyo.foobar.org [192.168.1.4]) + by mail2.foobar.org (MOS 3.8.7a) + with ESMTP id CTB95497 (AUTH johndoh); + Tue, 6 Oct 2009 13:37:31 +0200 (CEST) +Message-ID: <4ACB2C1F.8030704@codendi.org> +Date: Tue, 06 Oct 2009 13:38:07 +0200 +From: Manuel VACELET +User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; + rv:1.8.1.6) Gecko/20070728 Thunderbird/2.0.0.6 Mnenhy/0.7.5.666 +MIME-Version: 1.0 +To: gpig-test@codendi.org +Content-Type: multipart/related; + boundary="------------000600080502000100090303" +Subject: [Gpig-testsabri] HTML with inline content in HTML mode +X-BeenThere: gpig-test@codendi.org +X-Mailman-Version: 2.1.9 +Precedence: list +List-Id: +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +X-List-Received-Date: Tue, 06 Oct 2009 11:38:08 -0000 + +This is a multi-part message in MIME format. +--------------000600080502000100090303 +Content-Type: text/html; charset=ISO-8859-1 +Content-Transfer-Encoding: 7bit + + + + + + +My test
+
+
+
+ + + +--------------000600080502000100090303 +Content-Type: image/png +Content-Transfer-Encoding: base64 +Content-ID: + +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 +EoQAAAL4YkJQbolQTkcNChoKAAAADUlIRFIAAADHAAABDggCAAAAsveUWQAAAr9JREFUeNrt +0kEJADAMwMDVv+mZCBTKnYI8Mg9qsx3AQa6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucq +eq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLn +Knquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i +5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnqu +oucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6 +rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucq +eq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLn +Knquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i +5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnqu +oucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6 +rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucq +eq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLn +Knquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnofXqoBD6rh +8GQAAAAASUVORK5CYIJIZtRDAAAAAElFTkSuQmCC +--------------000600080502000100090303-- diff --git a/plugins/coclico/forumml/tests/_fixtures/samples/html_with_inline_content_in_text_plus_html.mbox b/plugins/coclico/forumml/tests/_fixtures/samples/html_with_inline_content_in_text_plus_html.mbox new file mode 100644 index 0000000000..a523504de1 --- /dev/null +++ b/plugins/coclico/forumml/tests/_fixtures/samples/html_with_inline_content_in_text_plus_html.mbox @@ -0,0 +1,265 @@ +From john.doh@codendi.org Tue Oct 6 13:30:52 2009 +Return-Path: +X-Original-To: gpig-test@codendi.org +Delivered-To: gpig-test@codendi.org +Received: from alpha.codendi.org (ns2.codendi.org [192.168.1.2]) + by codendi.org (Postfix) with ESMTP id 6924DAD70A + for ; + Tue, 6 Oct 2009 13:30:52 +0200 (CEST) +Received: from mail2.foobar.org (mail2.foobar.org [192.168.1.3]) + by alpha.codendi.org (FooBar) with ESMTP id 097BEAD2 + for ; + Tue, 6 Oct 2009 11:30:51 +0000 (GMT) +Received: from [192.168.1.4] (yoyo.foobar.org [192.168.1.4]) + by mail2.foobar.org (MOS 3.8.7a) + with ESMTP id CTB95305 (AUTH johndoh); + Tue, 6 Oct 2009 13:30:16 +0200 (CEST) +Message-ID: <4ACB2A6C.10802@codendi.org> +Date: Tue, 06 Oct 2009 13:30:52 +0200 +From: Manuel VACELET +User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; + rv:1.8.1.6) Gecko/20070728 Thunderbird/2.0.0.6 Mnenhy/0.7.5.666 +MIME-Version: 1.0 +To: gpig-test@codendi.org +Content-Type: multipart/alternative; + boundary="------------010203040608090400030709" +Subject: [Gpig-testsabri] HTML with inline content in Text+HTML mode +X-BeenThere: gpig-test@codendi.org +X-Mailman-Version: 2.1.9 +Precedence: list +List-Id: +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +X-List-Received-Date: Tue, 06 Oct 2009 11:30:52 -0000 + +This is a multi-part message in MIME format. +--------------010203040608090400030709 +Content-Type: text/plain; charset=ISO-8859-1; format=flowed +Content-Transfer-Encoding: 7bit + +My *test + +* + +--------------010203040608090400030709 +Content-Type: multipart/related; + boundary="------------090608030705080500080106" + + +--------------090608030705080500080106 +Content-Type: text/html; charset=ISO-8859-1 +Content-Transfer-Encoding: 7bit + + + + + + +My test
+
+
+ + + +--------------090608030705080500080106 +Content-Type: image/png; + name="lock.png" +Content-Transfer-Encoding: base64 +Content-ID: +Content-Disposition: inline; + filename="lock.png" + +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 +EoQAAAL4YkJQbolQTkcNChoKAAAADUlIRFIAAADHAAABDggCAAAAsveUWQAAAr9JREFUeNrt +0kEJADAMwMDVv+mZCBTKnYI8Mg9qsx3AQa6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucq +eq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLn +Knquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i +5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnqu +oucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6 +rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucq +eq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLn +Knquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i +5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnqu +oucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6 +rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucq +eq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLn +Knquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnofXqoBD6rh +8GQAAAAASUVORK5CYIJIZtRDAAAAAElFTkSuQmCC +--------------090608030705080500080106-- + +--------------010203040608090400030709-- diff --git a/plugins/coclico/forumml/tests/_fixtures/samples/pure_html_in_html_only.mbox b/plugins/coclico/forumml/tests/_fixtures/samples/pure_html_in_html_only.mbox new file mode 100644 index 0000000000..40c089cadb --- /dev/null +++ b/plugins/coclico/forumml/tests/_fixtures/samples/pure_html_in_html_only.mbox @@ -0,0 +1,49 @@ +From john.doh@codendi.org Tue Oct 6 13:26:30 2009 +Return-Path: +X-Original-To: gpig-test@codendi.org +Delivered-To: gpig-test@codendi.org +Received: from alpha.codendi.org (ns2.codendi.org [192.168.1.2]) + by codendi.org (Postfix) with ESMTP id 6255FAD70A + for ; + Tue, 6 Oct 2009 13:26:30 +0200 (CEST) +Received: from mail2.foobar.org (mail2.foobar.org [192.168.1.3]) + by alpha.codendi.org (FooBar) with ESMTP id E7A72AC1 + for ; + Tue, 6 Oct 2009 11:26:29 +0000 (GMT) +Received: from [192.168.1.4] (yoyo.foobar.org [192.168.1.4]) + by mail2.foobar.org (MOS 3.8.7a) + with ESMTP id CTB95171 (AUTH johndoh); + Tue, 6 Oct 2009 13:25:54 +0200 (CEST) +Message-ID: <4ACB2965.7050004@codendi.org> +Date: Tue, 06 Oct 2009 13:26:29 +0200 +From: Manuel VACELET +User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; + rv:1.8.1.6) Gecko/20070728 Thunderbird/2.0.0.6 Mnenhy/0.7.5.666 +MIME-Version: 1.0 +To: gpig-test@codendi.org +Content-Type: text/html; charset=ISO-8859-1 +Content-Transfer-Encoding: 7bit +Subject: [Gpig-testsabri] HTML only +X-BeenThere: gpig-test@codendi.org +X-Mailman-Version: 2.1.9 +Precedence: list +List-Id: +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +X-List-Received-Date: Tue, 06 Oct 2009 11:26:30 -0000 + + + + + + +My fault
+
+
+ + diff --git a/plugins/coclico/forumml/tests/_fixtures/samples/pure_html_text_plus_html.mbox b/plugins/coclico/forumml/tests/_fixtures/samples/pure_html_text_plus_html.mbox new file mode 100644 index 0000000000..08e2283d4c --- /dev/null +++ b/plugins/coclico/forumml/tests/_fixtures/samples/pure_html_text_plus_html.mbox @@ -0,0 +1,64 @@ +From john.doh@codendi.org Tue Oct 6 10:49:32 2009 +Return-Path: +X-Original-To: gpig-test@codendi.org +Delivered-To: gpig-test@codendi.org +Received: from zeta.codendi.org (ns2.codendi.org [192.168.1.2]) + by codendi.org (Postfix) with ESMTP id 508FEAD70A + for ; + Tue, 6 Oct 2009 10:49:32 +0200 (CEST) +Received: from mail2.codendi.org (mail2.codendi.org [192.168.1.3]) + by alpha.codendi.org (FooBar) with ESMTP id E53E0841 + for ; + Tue, 6 Oct 2009 08:49:31 +0000 (GMT) +Received: from [192.168.1.5] (toto.codendi.org [192.168.1.4]) + by mail2.codendi.org (MOS 3.8.7a) + with ESMTP id CTB90634 (AUTH johndoh); + Tue, 6 Oct 2009 10:48:56 +0200 (CEST) +Message-ID: <4ACB049C.6020506@codendi.org> +Date: Tue, 06 Oct 2009 10:49:32 +0200 +From: John DOH +User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; + rv:1.8.1.6) Gecko/20070728 Thunderbird/2.0.0.6 Mnenhy/0.7.5.666 +MIME-Version: 1.0 +To: gpig-test@codendi.org +Content-Type: multipart/alternative; + boundary="------------010402000506030002060206" +Subject: [Gpig-test] HTML T+H +X-BeenThere: gpig-test@codendi.org +X-Mailman-Version: 2.1.9 +Precedence: list +List-Id: +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +X-List-Received-Date: Tue, 06 Oct 2009 08:49:32 -0000 + +This is a multi-part message in MIME format. +--------------010402000506030002060206 +Content-Type: text/plain; charset=ISO-8859-1; format=flowed +Content-Transfer-Encoding: 7bit + +My *fault + +* + +--------------010402000506030002060206 +Content-Type: text/html; charset=ISO-8859-1 +Content-Transfer-Encoding: 7bit + + + + + + +My fault
+
+
+ + + +--------------010402000506030002060206-- diff --git a/plugins/coclico/forumml/tests/_fixtures/samples/pure_text.mbox b/plugins/coclico/forumml/tests/_fixtures/samples/pure_text.mbox new file mode 100644 index 0000000000..869405cb75 --- /dev/null +++ b/plugins/coclico/forumml/tests/_fixtures/samples/pure_text.mbox @@ -0,0 +1,40 @@ +From john.doh@codendi.org Tue Oct 6 13:10:02 2009 +Return-Path: +X-Original-To: gpig-test@codendi.org +Delivered-To: gpig-test@codendi.org +Received: from alpha.codendi.org (ns2.codendi.org [192.168.1.2]) + by codendi.org (Postfix) with ESMTP id 052DFAD70A + for ; + Tue, 6 Oct 2009 13:10:01 +0200 (CEST) +Received: from mail2.foobar.org (mail2.foobar.org [192.168.1.3]) + by alpha.codendi.org (FooBar) with ESMTP id 97F4DA9F + for ; + Tue, 6 Oct 2009 11:10:01 +0000 (GMT) +Received: from [192.168.1.4] (yoyo.foobar.org [192.168.1.4]) + by mail2.foobar.org (MOS 3.8.7a) + with ESMTP id CTB94795 (AUTH johndoh); + Tue, 6 Oct 2009 13:09:25 +0200 (CEST) +Message-ID: <4ACB2585.5020501@codendi.org> +Date: Tue, 06 Oct 2009 13:09:57 +0200 +From: Manuel VACELET +User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; + rv:1.8.1.6) Gecko/20070728 Thunderbird/2.0.0.6 Mnenhy/0.7.5.666 +MIME-Version: 1.0 +To: gpig-test@codendi.org +Content-Type: text/plain; charset=ISO-8859-1; format=flowed +Content-Transfer-Encoding: 7bit +Subject: [Gpig-testsabri] Test Pure Text +X-BeenThere: gpig-test@codendi.org +X-Mailman-Version: 2.1.9 +Precedence: list +List-Id: +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +X-List-Received-Date: Tue, 06 Oct 2009 11:10:02 -0000 + +Pure text diff --git a/plugins/coclico/forumml/tests/_fixtures/samples/text_plus_attachment.mbox b/plugins/coclico/forumml/tests/_fixtures/samples/text_plus_attachment.mbox new file mode 100644 index 0000000000..749dfd6a46 --- /dev/null +++ b/plugins/coclico/forumml/tests/_fixtures/samples/text_plus_attachment.mbox @@ -0,0 +1,238 @@ +From john.doh@codendi.org Tue Oct 6 13:22:47 2009 +Return-Path: +X-Original-To: gpig-test@codendi.org +Delivered-To: gpig-test@codendi.org +Received: from alpha.codendi.org (ns2.codendi.org [192.168.1.2]) + by codendi.org (Postfix) with ESMTP id 6C634AD70A + for ; + Tue, 6 Oct 2009 13:22:47 +0200 (CEST) +Received: from mail2.foobar.org (mail2.foobar.org [192.168.1.3]) + by alpha.codendi.org (FooBar) with ESMTP id 0FE67AC3 + for ; + Tue, 6 Oct 2009 11:22:46 +0000 (GMT) +Received: from [192.168.1.4] (yoyo.foobar.org [192.168.1.4]) + by mail2.foobar.org (MOS 3.8.7a) + with ESMTP id CTB95087 (AUTH johndoh); + Tue, 6 Oct 2009 13:22:11 +0200 (CEST) +Message-ID: <4ACB2886.8080300@codendi.org> +Date: Tue, 06 Oct 2009 13:22:46 +0200 +From: Manuel VACELET +User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; + rv:1.8.1.6) Gecko/20070728 Thunderbird/2.0.0.6 Mnenhy/0.7.5.666 +MIME-Version: 1.0 +To: gpig-test@codendi.org +Content-Type: multipart/mixed; boundary="------------000903020203080700000508" +Subject: [Gpig-testsabri] Text + attachment +X-BeenThere: gpig-test@codendi.org +X-Mailman-Version: 2.1.9 +Precedence: list +List-Id: +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +X-List-Received-Date: Tue, 06 Oct 2009 11:22:47 -0000 + +This is a multi-part message in MIME format. +--------------000903020203080700000508 +Content-Type: text/plain; charset=ISO-8859-1; format=flowed +Content-Transfer-Encoding: 7bit + +Some text + +--------------000903020203080700000508 +Content-Type: image/png; + name="lock.png" +Content-Transfer-Encoding: base64 +Content-Disposition: inline; + filename="lock.png" + +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 +EoQAAAL4YkJQbolQTkcNChoKAAAADUlIRFIAAADHAAABDggCAAAAsveUWQAAAr9JREFUeNrt +0kEJADAMwMDVv+mZCBTKnYI8Mg9qsx3AQa6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucq +eq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLn +Knquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i +5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnqu +oucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6 +rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucq +eq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLn +Knquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i +5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnqu +oucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6 +rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucq +eq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLn +Knquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnquoucqeq6i5yp6rqLnKnofXqoBD6rh +8GQAAAAASUVORK5CYIJIZtRDAAAAAElFTkSuQmCC +--------------000903020203080700000508-- diff --git a/plugins/coclico/forumml/translations/en.po b/plugins/coclico/forumml/translations/en.po new file mode 100644 index 0000000000..e69de29bb2 diff --git a/plugins/coclico/forumml/translations/gforge.pot b/plugins/coclico/forumml/translations/gforge.pot new file mode 100644 index 0000000000..e69de29bb2 diff --git a/plugins/coclico/forumml/utils/manage-translations.sh b/plugins/coclico/forumml/utils/manage-translations.sh new file mode 100755 index 0000000000..9902490044 --- /dev/null +++ b/plugins/coclico/forumml/utils/manage-translations.sh @@ -0,0 +1,56 @@ +#! /bin/sh -e + +if [ -e gforge/translations/gforge.pot ] ; then # We're in the parent dir + cd gforge +elif [ -e translations/gforge.pot ] ; then # probably in gforge/ (or a renamed gforge/) + cd . # do nothing, but shell syntax requires an instruction in a then-block +elif [ -e ../gforge/translations/gforge.pot ] ; then # in tools/ or tests/ or something + cd ../gforge +elif [ -e ../translations/gforge.pot ] ; then # In a subdir of gforge/ + cd .. +else + echo "Couldn't find translations directory..." + exit 1 +fi + +locales=$(ls translations/*.po \ + | xargs -n1 -iFILE basename FILE .po \ + | egrep '^[a-z][a-z](_[A-Z][A-Z]$)?' \ + | sort) + +print_stats () { + for l in $(echo $locales | xargs -n 1 | sort) ; do + printf "* %5s: " $l + msgfmt --statistics -o /dev/null translations/$l.po + done +} + +case $1 in + stats) + print_stats + ;; + refresh) + rm translations/gforge.pot + + find -type f -\( -name \*.php -or -name users -or -name projects -\) \ + | grep -v -e {arch} -e svn-base \ + | grep -v ^./plugins/wiki \ + | LANG=C sort \ + | xargs xgettext -d gforge -o translations/gforge.pot -L PHP --from-code=iso-8859-1 + + for l in $locales ; do + echo "Processing $l..." + msgmerge -U translations/$l.po translations/gforge.pot + done + ;; + build) + for l in $locales ; do + mkdir -p locales/$l/LC_MESSAGES + msgfmt -o locales/$l/LC_MESSAGES/gforge.mo translations/$l.po + done + ;; + *) + echo "Unknown operation" + exit 1 + ;; +esac diff --git a/plugins/coclico/forumml/www/forumml_utils.php b/plugins/coclico/forumml/www/forumml_utils.php new file mode 100644 index 0000000000..34768b1f28 --- /dev/null +++ b/plugins/coclico/forumml/www/forumml_utils.php @@ -0,0 +1,742 @@ +getMessageHeaders($id_message)->getRow(); +} + +// Display search results +function plugin_forumml_show_search_results($p,$result,$group_id,$list_id) { + + echo " + + + + + "; + + $idx = 0; + // Build a table full of search results + while ($rows = $result->getRow()) { + $idx++; + if ($idx % 2 == 0) { + $class="boxitemalt bgcolor-white"; + } else { + $class="boxitem bgcolor-grey"; + } + + $res1 = getForumMLDao()->getSpecificMessage($rows['id_message'],$list_id)->getRow(); + $subject = mb_decode_mimeheader($res1['value']); + $res2 = getForumMLDao()->getHeaderValue($rows['id_message'],array(2,3)); + $k = 1; + while ($rows2 =$res2->getRow()) { + $header[$k] = $rows2['value']; + $k++; + } + $from = mb_decode_mimeheader($header[1]); + + // Replace '<' by '<' and '>' by '>'. Otherwise the email adress won't be displayed + // because it will be considered as an xhtml tag. + $from = preg_replace('/\/', '>', $from); + + $date = date("Y-m-d H:i",strtotime($header[2])); + // purify message subject (CODENDI_PURIFIER_FORUMML level) + $hp =& ForumML_HTMLPurifier::instance(); + $subject = $hp->purify($subject,CODENDI_PURIFIER_FORUMML); + + // display the resulting threads in rows + printf (" + + + + "); + } + echo "
". + _('Thread')." + ". + _('Submitted on')." + ". + _('Author')." +
+   + ".$subject." + + ".$date." + + ".$from." +
"; + +} + +// List all threads +function plugin_forumml_show_all_threads($p,$list_id,$list_name,$offset) { + + $chunks = 30; + $request =& HTTPRequest::instance(); + + // all threads + $result = getForumMLDao()->getAllThreadsFromList($list_id,$offset,$chunks); + $nbRowFound = $result->rowCount(); + + // Total number of threads + $nbThreads = 0; +$res = getForumMLDao()->countAllThreadsFromList($list_id); + if ($res && !db_error($res)) { + $row = $res->getRow(); + $nbThreads = $row['nb']; + } + + $start = $offset; + $end = min($start + $chunks - 1, $nbRowFound - 1); + + // all threads to be displayed + $colspan = ""; + $item = _('Thread'); + + if (isset($offset) && $offset != 0) { + $begin = "get('group_id')."&list=".$list_id. + "\">"; + $previous = "get('group_id')."&list=".$list_id."&offset=".($offset - $chunks). + "\">"; + } else { + $begin = "".$p->getThemePath()."/images/ic/resultset_first_disabled.png"; + $previous = ""; + } + + if (($offset + $chunks ) < $nbThreads) { + $next = "get('group_id')."&list=".$list_id."&offset=".($offset + $chunks)."\">"; + $finish = "get('group_id')."&list=".$list_id."&offset=".($chunks * (int) (($nbThreads - 1) / $chunks))."\">"; + } else { + $next = ""; + $finish = ""; + } + + // display page-splitting information, at the top of threads table + echo " + + + + + + + +
". + $begin + ."". + $previous + ."". + _('Threads')." ".($start + 1)." - ".($end + 1)." (".$nbThreads.") + + $next + + $finish +
"; + + if ($nbRowFound > 0) { + + echo " + + + + + + "; + + + + $hp =& ForumML_HTMLPurifier::instance(); + $i = 0; + while (($msg = $result->getRow())) { + $i++; + if ($i % 2 == 0) { + $class="boxitemalt bgcolor-white"; + $headerclass="headerlabelalt"; + } else { + $class="boxitem bgcolor-grey"; + $headerclass="headerlabel"; + } + + // Get the number of messages in thread + // nb of children + message + $count = 1 + plugin_forumml_nb_children(array($msg['id_message'])); + + + // all threads + print " + ". + "". + " + + "; + } + + echo '
".$item.""._('Last updated').""._('Submitted on').""._('Author')."
"; + if ($count > 1) { + print ""; + } + else { + print ""; + } + + // Remove listname from suject + $subject = preg_replace('/^[ ]*\['.$list_name.'\]/i', '', $msg['subject']); + + print " + ".$hp->purify($subject, CODENDI_PURIFIER_CONVERT_HTML)." + (".$count.") + ".strftime("%a, %e %h %G %R",$msg['lastup'])."".strftime("%a, %e %h %G %R",strtotime($msg['date']))."".$hp->purify($msg['sender'], CODENDI_PURIFIER_CONVERT_HTML)."
'; + // display page-splitting information, at the bottom of threads table + echo " + + + + + + + +
". + $begin + ."". + $previous + ."". + _('Threads')." ".($start + 1)." - ".($end + 1)." (".$nbThreads.") + + $next + + $finish +
"; + } + +} + +function plugin_forumml_nb_children($parents) { + if (count($parents) == 0) { + return 0; + } else { + $result = getForumMLDao()->countChildrenFromParents(implode(',',$parents)); + if ($result && !$result->isError()) { + $p = array(); + while (($row = $result->getRow())) { + $p[] = $row['id_message']; + } + $num = $result->rowCount(); + return $num + plugin_forumml_nb_children($p); + } + } +} + +/** + * Extract attachment info from a database result + * + * @see plugin_forumml_build_flattened_thread + */ +function plugin_forumml_new_attach($row) { + if (isset($row['id_attachment']) && $row['id_attachment']) { + return array('id_attachment' => $row['id_attachment'], + 'file_name' => $row['file_name'], + 'file_type' => $row['file_type'], + 'file_size' =>$row['file_size'], + 'file_path' =>$row['file_path'], + 'content_id' =>$row['content_id']); + } else { + return null; + } +} + +/** + * Insert a message in the thread list with a unique date + * + * @see plugin_forumml_build_flattened_thread + */ +function plugin_forumml_insert_in_thread(&$thread, $row) { + $date = strtotime($row['date']); + while (isset($thread[$date])) { + $date++; + } + $thread[$date] = $row; + return $date; +} + +/** + * Insert all messages returned by a SQL query in the thread list with + * the attachments + * + * @see plugin_forumml_build_flattened_thread + */ +function plugin_forumml_insert_msg_attach(&$thread, $result) { + $parents = array(); + $prev = -1; + while ($row = $result->getRow()) { + if ($row['id_message'] != $prev) { + // new message + $parents[] = $row['id_message']; + $curMsg = plugin_forumml_insert_in_thread($thread, $row); + $thread[$curMsg]['attachments'] = array(); + } + + $attch = plugin_forumml_new_attach($row); + if ($attch) { + $thread[$curMsg]['attachments'][] = $attch; + } + $prev = $row['id_message']; + } + return $parents; +} + +/** + * Search all chilrens at a given level of depth + * + * @see plugin_forumml_build_flattened_thread + */ +function plugin_forumml_build_flattened_thread_children(&$thread, $parents) { + if (count($parents) > 0) { + $result = getForumMLDao()->getChildrenFromDepthLevel(implode(',',$parents)); + if ($result && !$result->isError()){ + $p = plugin_forumml_insert_msg_attach($thread, $result); + plugin_forumml_build_flattened_thread_children($thread, $p); + } + } +} + +/** + * Entry point to create a flattened view of a message thread. + * + * In order to display the messages in the right order, we fetch the + * all the messages with the needed hearders and attachments. + * To lower the number of SQL queries, there is 1 query per message + * tree depth level. + * All the messages are stored in an array indexed by the message + * date. If dates conflict we add +1s to the message date. + * Once all the messages are fetched, we just sort the array based on + * the keys values. + * The thread array looks like: + * array ( + * 123342334 => array( + * 'message_id' => '1234', + * 'subject' => 'toto', + * ... + * 'attachments' => array( + * 'id_attachment' => '5678', + * ... + * ) + * ), + * ... + * ); + * + */ +function plugin_forumml_build_flattened_thread($topic) { + $thread = array(); + $result = getForumMLDao()->getFlattenedThread($topic); + if ($result && !$result->isError()) { + $p = plugin_forumml_insert_msg_attach($thread, $result); + plugin_forumml_build_flattened_thread_children($thread, $p); + } + ksort($thread, SORT_NUMERIC); + return $thread; +} + +// List all messages inside a thread +function plugin_forumml_show_thread($p, $list_id, $parentId, $purgeCache) { + $hp = ForumML_HTMLPurifier::instance(); + $thread = plugin_forumml_build_flattened_thread($parentId); + foreach ($thread as $message) { + plugin_forumml_show_message($p, $hp, $message, $parentId, $purgeCache); + } +} + + +// Display a message +function plugin_forumml_show_message($p, $hp, $msg, $id_parent, $purgeCache) { + $body = $msg['body']; + $request = HTTPRequest::instance(); + + // Is "ready to display" body already in cache or not + $bodyIsCached = false; + if (isset($msg['cached_html']) && !$purgeCache) { + $bodyIsCached = true; + } + + if (PEAR::isError($from_info = Mail_RFC822::parseAddressList($msg['sender'], $GLOBALS['sys_default_domain'])) || !isset($from_info[0]) || !$from_info[0]->personal) { + $from_info = $hp->purify($msg['sender'], CODENDI_PURIFIER_CONVERT_HTML); + } else { + $from_info = ''. $hp->purify($from_info[0]->personal, CODENDI_PURIFIER_CONVERT_HTML) .''; + } + + echo '
'; + // specific thread + echo '
'; + echo '
'. $hp->purify($msg['subject'], CODENDI_PURIFIER_CONVERT_HTML) .'
'; + + echo ''; + echo '#'. $msg['id_message'] .''; + echo ''; + + echo ' '. $from_info .''; + echo ' '. _('On ').$msg['date'] .''; + + echo ' '._('Toggle font family (typewriter/normal)').''; + + // get CC + $cc = trim($msg['cc']); + if ($cc) { + if (PEAR::isError($cc_info = Mail_RFC822::parseAddressList($cc, $GLOBALS['sys_default_domain']))) { + $ccs = $hp->purify($cc, CODENDI_PURIFIER_CONVERT_HTML); + } else { + $ccs = array(); + foreach($cc_info as $c) { + if (!$c->personal) { + $ccs[] = $hp->purify($c->mailbox .'@'. $c->host, CODENDI_PURIFIER_CONVERT_HTML); + } else { + $ccs[] = ''. $hp->purify($c->personal, CODENDI_PURIFIER_CONVERT_HTML) .''; + } + } + $ccs = implode(', ', $ccs); + } + print '
'. _('Cc :') .' '. $ccs .'
'; + } + + // Message content + if (strpos($msg['content_type'], 'multipart/') !== false) { + $content_type = $msg['msg_type']; + } else { + $content_type = $msg['content_type']; + } + $is_html = strpos($content_type, "text/html") !== false; + + // get attached files + if (count($msg['attachments'])) { + print '
'; + $first = true; + foreach($msg['attachments'] as $attachment) { + // Special case, this is an HTML email + if (preg_match('/.html$/i',$attachment['file_name'])) { + // By default, the first html attachment replaces the default body (text) + if ($first) { + if (!$bodyIsCached && is_file($attachment['file_path'])) { + $body = file_get_contents($attachment['file_path']); + $is_html = true; + } + continue; + } else { + $flink = $attachment['file_name']; + } + } else { + $flink = $attachment['file_name']; + } + if (!$first) { + echo ',  '; + } + + echo " ".$flink.""; + $first = false; + } + echo '
'; + } + echo '
'; + + print '
'; + $body = str_replace("\r\n","\n", $body); + + // If there is no cached html of if user requested to regenerate the cache, do it, otherwise use cached HTML. + if (!$bodyIsCached) { + // Purify message body, according to the content-type + if ($is_html) { + // Update attachment links + $body = plugin_forumml_replace_attachment($msg['id_message'], $request->get('group_id'), $request->get('list'), $id_parent, $body); + + // Use CODENDI_PURIFIER_FULL for html mails + $msg['cached_html'] = $hp->purify($body,CODENDI_PURIFIER_FULL,$request->get('group_id')); + } else { + // CODENDI_PURIFIER_FORUMML level : no basic html markups, no forms, no javascript, + // Allowed: url + automagic links +
+ $purified_body = $hp->purify($body,CODENDI_PURIFIER_CONVERT_HTML,$request->get('group_id')); + $purified_body = str_replace('>', '>', $purified_body); + $tab_body = ''; + $level = 0; + $current_level = 0; + $search_for_quotes = false; + $maxi = strlen($purified_body); + for($i = 0 ; $i < $maxi ; ++$i) { + if ($search_for_quotes) { + if($purified_body{$i} == ">") { + ++$current_level; + if($level < $current_level) { + $tab_body .= '
'; + ++$level; + } + } else { + $search_for_quotes = false; + if($level > $current_level) { + $tab_body .= '
'; + --$level; + } + if($purified_body{$i} == "\n" && $i < $maxi - 1) { + $search_for_quotes = true; + $current_level = 0; + } + $tab_body .= $purified_body{$i}; + } + } else { + if($purified_body{$i} == "\n" && $i < $maxi - 1) { + $search_for_quotes = true; + $current_level = 0; + } + $tab_body .= $purified_body{$i}; + } + } + $purified_body = str_replace('>', '>', $purified_body); + $msg['cached_html'] = nl2br($tab_body); + } + getForumMLDao()->updateCacheHTML($msg['cached_html'] , $msg['id_message']); + } + echo $msg['cached_html']; + echo '
'; + + // Reply + echo ''; + echo '
'; +} + +// Display the post form under the current post +function plugin_forumml_reply($hp,$subject,$in_reply_to,$id_parent,$body,$author) { + + $request =& HTTPRequest::instance(); + $tab_tmp = explode("\n",$body); + $tab_tmp = array_pad($tab_tmp,-count($tab_tmp)-1,"$author wrote :"); + + echo ''; + echo '
'." +
+ + + + "; + echo '['._('Add cc :').'] + - ['._('Attach :').'] + +
'; + echo "

+

+ + +

+
+
"; +} + +// Search & replace reference to attached content +// This happens for images attached to html messages (multipart/related) +function plugin_forumml_replace_attachment($id_message, $group_id, $list, $id_parent, $body) { + if (preg_match_all('/"cid:([^"]*)"/m', $body, $matches)) { + $search_parts = array(); + $replace_parts = array(); + foreach ($matches[1] as $match) { + $result = getForumMLDao()->getAttachment($id_mesage , $match) ; + if ($res && $res->rowCount() == 1) { + $row = $res->getRow(); + $url = "upload.php?group_id=".$group_id."&list=".$list."&id=".$row['id_attachment']."&topic=".$id_parent; + $search_parts[] = 'cid:'.$match; + $replace_parts[] = $url; + } + } + if (count($replace_parts) > 0) { + $body = str_replace($search_parts, $replace_parts, $body); + } +} +return $body; +} + +// Build Mail headers, and send the mail +function plugin_forumml_process_mail($plug,$reply=false) { + global $feedback; + $request = HTTPRequest::instance(); + $hp = ForumML_HTMLPurifier::instance(); + + // Instantiate a new Mail class + $mail = new Mail(); + + // Build mail headers + $list = new MailmanList($request->get('group_id') , $request->get('list')); + $to = $list->getName()."@".$GLOBALS['sys_lists_host']; + $mail->setTo($to); + + $mail->setFrom(UserManager::instance()->getCurrentUser()->getEmail()); + + $vMsg = new Valid_Text('message'); + if ($request->valid($vMsg)) { + $message = $request->get('message'); + } + + $subject = $request->get('subject'); + $mail->setSubject($subject); + + if ($reply) { + // set In-Reply-To header + $hres = plugin_forumml_get_message_headers($request->get('reply_to')); + $reply_to = $hres['value']; + $mail->addAdditionalHeader("In-Reply-To",$reply_to); + } + $continue = true; + + if ($request->validArray(new Valid_Email('ccs')) && $request->exist('ccs')) { + $cc_array = array(); + $idx = 0; + foreach ($request->get('ccs') as $cc) { + if (trim($cc) != "") { + $cc_array[$idx] = $hp->purify($cc,CODENDI_PURIFIER_FULL); + $idx++; + } + } + // Checks sanity of CC List + $err = ''; + $valid=true; + foreach ($cc_array as $key => $cc) { + $umanager = UserManager::instance(); + $user = $umanager->existEmail($cc); + if (!$user) { + $valid = false; + $err .= $cc.'
'; + } + } + if (!$valid) { + $continue=false; + $feedback .=_('Invalid email ').$err; + } else { + // add list of cc users to mail mime + if (count($cc_array) > 0) { + $cc_list = implode(',',$cc_array); + $mail->setCc($cc_list,true); + } + } + } + + if ($continue) { + // Process attachments + + // Define boundaries as specified in RFC: + // http://www.w3.org/Protocols/rfc1341/7_2_Multipart.html + $boundary = '----=_NextPart'; + $boundaryStart = '--'.$boundary; + $boundaryEnd = '--'.$boundary.'--'; + + // Attachments headers + if (isset($_FILES["files"]) && count($_FILES["files"]['name']) > 0) { + $attachment = ""; + $text = "This is a multi-part message in MIME format.\n"; + $text = "$boundaryStart\n"; + $text .= "Content-Type: text/plain; charset=\"UTF-8\"\n"; + $text .= "Content-Transfer-Encoding: 8bit\n\n"; + $text .= $message; + $text .= "\n\n"; + foreach($_FILES["files"]['name'] as $i => $fileName) { + $attachment .= "$boundaryStart\n"; + $attachment .= "Content-Type:".$_FILES["files"]["type"][$i]."; name=".$fileName."\n"; + $attachment .= "Content-Transfer-Encoding: base64\n"; + $attachment .= "Content-Disposition: attachment; filename=".$fileName."\n\n"; + $attachment .= chunk_split(base64_encode(file_get_contents($_FILES["files"]["tmp_name"][$i]))); + } + $attachment .= "\n$boundaryEnd\n"; + $body = $text.$attachment; + // force MimeType to multipart/mixed as default (when instantiating new Mail object) is text/plain + $mail->setMimeType('multipart/mixed; boundary="'.$boundary.'"'); + $mail->addAdditionalHeader("MIME-Version","1.0"); + } else { + $body = $message; + } + + $mail->setBody($body); + + if ($mail->send()) { + $feedback .= _('Mail successfully sent'); + } else { + $feedback .= _('Sending mail failed'); + $continue = false; + } + } + return $continue; + +} +?> diff --git a/plugins/coclico/forumml/www/index.php b/plugins/coclico/forumml/www/index.php new file mode 100644 index 0000000000..d88b1c261a --- /dev/null +++ b/plugins/coclico/forumml/www/index.php @@ -0,0 +1,137 @@ +getPluginByName('forumml'); +if ($p && $plugin_manager->isPluginAvailable($p) && $p->isAllowed()) { + + $request =& HTTPRequest::instance(); + + if ($request->valid(new Valid_UInt('group_id'))) { + $group_id = $request->get('group_id'); + } else { + $group_id = ""; + } + + // Checks 'list' parameter + if (! $request->valid(new Valid_UInt('list'))) { + exit_error(_('Error'),_('No list specified')); + } else { + $list_id = $request->get('list'); +$list = new MailmanList($group_id,$list_id); + if (!isLogged() || ($list->isPublic()!=1 && !$current_user->isMember($group_id))) { + exit_error(_('error'),_('You are not allowed to access this page')); + } + if ($list->getStatus() !=3) { + exit_error(_('Error'),_('The mailing list does not exist or is inactive')); + } + } + + // If message is posted, send a mail + if ($request->isPost() && $request->get('post')) { + // Checks if mail subject is empty + $vSub = new Valid_String('subject'); + $vSub->required(); + if (! $request->valid($vSub)) { + $feedback .=_('Submit failed you must specify the mail subject.'); + } else { + // process the mail + $return = plugin_forumml_process_mail($p); + if ($return) { + $feedback .=_('There can be some delay before to see the message in the archives.')._(' Redirecting to archive page, please wait ...'); + //htmlRedirect('/plugins/forumml/message.php?'. http_build_query(array( + // 'group_id' => $group_id, + // 'list' => $list_id, + //'topic' => 0 + // ))); + } + } + } + + $params['title'] = 'ForumML'; + $params['group'] = $group_id; + $params['toptab'] = 'mail'; + $params['help'] = "CommunicationServices.html#MailingLists"; + mailman_header($params); + + if ($request->isPost() && $request->get('post') && $request->valid($vSub)) { + if (isset($return) && $return) { + // wait few seconds before redirecting to archives page + echo ""; + } + } + + $list_link = ''.$list->getName().''; + echo '

'._('Mailing List ').$list_link._(' - New Thread').'

+ ['._('Browse Archives').']

+

'._('Submit a new thread').'

'; + + // New thread form + echo ''; + echo "
+ + + + +
"._('Subject').": 
"; + echo ' + +
+

['.('Add cc').'] + - ['._('Attach :').']

+ +
'; + echo " + + + + + + + +
"._('Message :')." 
+
"; + + mail_footer($params); + +} else { + header('Location: '.get_server_url()); +} + +?> diff --git a/plugins/coclico/forumml/www/message.php b/plugins/coclico/forumml/www/message.php new file mode 100644 index 0000000000..7fe7d99c18 --- /dev/null +++ b/plugins/coclico/forumml/www/message.php @@ -0,0 +1,224 @@ +getProject($group_id); +$plugin_manager =& PluginManager::instance(); +$p =& $plugin_manager->getPluginByName('forumml'); +if ($p && $plugin_manager->isPluginAvailable($p) && $p->isAllowed()) { + + $current_user=UserManager::instance()->getCurrentUser(); + $request =& HTTPRequest::instance(); + + $vGrp = new Valid_UInt('group_id'); + $vGrp->required(); + if ($request->valid($vGrp)) { + $group_id = $request->get('group_id'); + } else { + $group_id = ""; + } + + $vTopic = new Valid_UInt('topic'); + $vTopic->required(); + if ($request->valid($vTopic)) { + $topic = $request->get('topic'); + $fmlMessageMgr = new ForumML_MessageManager(); + $topicSubject = $fmlMessageMgr->getHeaderValue($topic, FORUMML_SUBJECT); + } else { + $topic = 0; + $topicSubject = ''; + } + + $vOff = new Valid_UInt('offset'); + $vOff->required(); + if ($request->valid($vOff)) { + $offset = $request->get('offset'); + } else { + $offset = 0; + } + + // Do we need to pure html cache + $vPurge = new Valid_WhiteList('purge_cache', array('true')); + $vPurge->required(); + if ($request->valid($vPurge)) { + $purgeCache = true; + } else { + $purgeCache = false; + } + + // Checks 'list' parameter + $vList = new Valid_UInt('list'); + $vList->required(); + if (! $request->valid($vList)) { + exit_error(_('Error'),_('No list specified')); + } else { + $list_id = $request->get('list'); + $list = new MailmanList($group_id,$list_id); + if (!isLogged() || ($list->isPublic()!=1 && !$current_user->isMember($group_id))) { + exit_error(_('error'),_('You are not allowed to access this page')); + } + if ($list->getStatus() !=3) { + exit_error(_('error'),_('This list is not active')); + } + } + + // If the list is private, search if the current user is a member of that list. If not, permission denied + $list_name = $list->getName(); + if ($list->isPublic()==0) { + exec("{$GLOBALS['mailman_bin_dir']}/list_members ".$list_name , $members); + $user = $current_user->getEmail(); + if (! in_array($user,$members)) { + exit_permission_denied(); + } + } + + // Build the mail to be sent + if ($request->get('send_reply')) { + // process the mail + $ret = plugin_forumml_process_mail($p,true); + if ($ret) { + $feedback .=_('Email succefully sent. It can take some time before being displayed'); + //htmlRedirect('/plugins/forumml/message.php?'. http_build_query(array( + // 'group_id' => $group_id, + // 'list' => $list_id, + // 'topic' => $topic + //))); + echo "ok"; + } + else { echo "erreur"; } + } + + $params['title'] = $Group->getPublicName().' - ForumML - '.$list_name; + if ($topicSubject) { + $params['title'] .= ' - '.$topicSubject; + } + $params['group'] = $group_id; + $params['toptab']='mail'; + $params['help'] = "CommunicationServices.html#MailingLists"; + if ($request->valid(new Valid_Pv('pv'))) { + $params['pv'] = $request->get('pv'); + } + mailman_header($params); + + if ($request->get('send_reply') && $request->valid($vTopic)) { + if (isset($ret) && $ret) { + // wait few seconds before redirecting to archives page + echo ""; + } + } + + $list_link = ''.$list_name.''; + $title = _('Mailing List '.$list_link); + if ($topic) { + $fmlMessageMgr = new ForumML_MessageManager(); + $value = $fmlMessageMgr->getHeaderValue($topic, FORUMML_SUBJECT); + if ($value) { + $title = $value; + } + } else { + $title .= _(' Archives'); + } + echo '

'.$title.'

'; + + if (! $request->exist('pv') || ($request->exist('pv') && $request->get('pv') == 0)) { + echo " + "; + + echo ""; + + echo " + + +
"; + if ($topic) { + echo '['._('Back to the list').'] '; + } else { + echo " [ + "._('Post a new thread')." + ]"; + if ($list->isPublic()==1) { + echo ' ['._('Original Archives').']'; + } else { + echo ' ['._('Original list archives').': '._('Public archives').'/'._('Private Archives').']'; + } + } + echo " + (get('search') : "")."&pv=1'> +  "._('Printer version')." + ) +

"; + } + + $vSrch = new Valid_String('search'); + $vSrch->required(); + if (! $request->valid($vSrch)) { + // Check if there are archives to browse + $res = getForumMLDao()->hasArchives($list_id); + if ($res->rowCount() > 0) { + // Call to show_thread() function to display the archives + if (isset($topic) && $topic != 0) { + // specific thread + plugin_forumml_show_thread($p, $list_id, $topic, $purgeCache); + } else { + plugin_forumml_show_all_threads($p,$list_id,$list_name,$offset); + } + } else { + echo "

"._('Empty archives')."

"; + } + } else { + // search archives + $pattern = "%".$request->get('search')."%"; + $result = getForumMLDao()->searchArchives($list_id,$pattern); + echo "

"._('Search result for ').$request->get('search')." (".$result->rowCount()." "._('Thread(s) found').")

"; + if ($result->rowCount() > 0) { + plugin_forumml_show_search_results($p,$result,$group_id,$list_id); + } + } + + mail_footer($params); + +} else { + header('Location: '.get_server_url()); +} + +?> diff --git a/plugins/coclico/forumml/www/scripts/cc_attach_js.php b/plugins/coclico/forumml/www/scripts/cc_attach_js.php new file mode 100644 index 0000000000..e99acf653f --- /dev/null +++ b/plugins/coclico/forumml/www/scripts/cc_attach_js.php @@ -0,0 +1,71 @@ + + +function addHeader(cc,file,header_type) +{ + var ni = document.getElementById('mail_header'); + var numi = document.getElementById('header_val'); + var num = (document.getElementById('header_val').value -1)+ 2; + numi.value = num; + var divIdName = "mail_header_"+num+"_div"; + var newdiv = document.createElement('div'); + + newdiv.setAttribute("id",divIdName); + if (header_type == 1) { + newdiv.innerHTML += "
\">
"; + } else { + newdiv.innerHTML += "
\">
"; + } + ni.appendChild(newdiv); +} + +function removeHeader(divNum) +{ + var d = document.getElementById('mail_header'); + var olddiv = document.getElementById(divNum); + d.removeChild(olddiv); +} + + diff --git a/plugins/coclico/forumml/www/scripts/forumml.js b/plugins/coclico/forumml/www/scripts/forumml.js new file mode 100644 index 0000000000..46133209ee --- /dev/null +++ b/plugins/coclico/forumml/www/scripts/forumml.js @@ -0,0 +1,53 @@ +/** +* Copyright (c) STMicroelectronics, 2004-2009. All rights reserved +* +* Originally written by Manuel VACELET, 2009 +* +* This file is a part of Codendi. +* +* Codendi is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* Codendi is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with Codendi; if not, write to the Free Software +* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +var codendi = codendi || { }; + +/** + * + */ +codendi.PluginForumml = Class.create({ + initialize: function(element) { + // Toggle mail class name when click on the right button + element.observe('click', function (event) { + var link = Event.element(event); + if (link) { + var msgId = link.id.replace('plugin_forumml_toogle_msg_', ''); + var content = $('plugin_forumml_message_content_'+msgId); + if (content) { + if (content.className == 'plugin_forumml_message_content_pre') { + content.className = 'plugin_forumml_message_content_std'; + } else { + content.className = 'plugin_forumml_message_content_pre'; + } + } + } + event.stop(); + }); + }, +}); + +document.observe('dom:loaded', function() { + $$('.plugin_forumml_toggle_font').each(function (elmt) { + new codendi.PluginForumml(elmt); + }); +}); \ No newline at end of file diff --git a/plugins/coclico/forumml/www/themes/default/css/style.css b/plugins/coclico/forumml/www/themes/default/css/style.css new file mode 100644 index 0000000000..95ada01cb4 --- /dev/null +++ b/plugins/coclico/forumml/www/themes/default/css/style.css @@ -0,0 +1,110 @@ +/* +// Copyright (c) STMicroelectronics, 2007. All Rights Reserved. +// Originally written by Mohamed CHAARI, 2007 +// +// This file is a part of codendi. +// +// codendi is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// codendi is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with codendi; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +*/ + + +/* {{{ ForumML */ +th.forumml { + background-color: #cdcdc1; + text-align: left; + font-size: medium; +} + +.subject {font-size: small;} +.info {font-size: small;} + +blockquote.grep { + color: #848696; + margin: 0; + margin-left: 1em; + padding: 0; + border: 0; +} + +font.headerlabel { + color: #83731a; +} + +font.headerlabelalt { + color: #8a604a +} + +.plugin_forumml_message { + border: 2px solid #cdcdc1; + margin-bottom: 1em; +} +.plugin_forumml_message_header { + color:#999; +} +.plugin_forumml_message_header_subject { + float:right; + padding-right:1em; +} +.plugin_forumml_message_header_cc, +.plugin_forumml_message_header_attachments { + padding-left:20px; +} +.plugin_forumml_message_header_from { + white-space:nowrap; + font-size:1.2em; + font-weight:bold; + color:#666; +} + +.plugin_forumml_toggle_font { + font-size: x-small; +} + +.plugin_forumml_message_content_pre { + padding: 0.5em; + font-family: courier, monospace; +} + +.plugin_forumml_message_content_std { + padding: 0.5em; +} + +.plugin_forumml_message_footer { + border-top: 1px solid #cdcdc1; +} + +.plugin_forumml_message_reply { + padding-left: 1em; +} + + +.plugin_forumml_message_content_std blockquote, .plugin_forumml_message_content_pre blockquote{ + border-left:1px solid blue; + padding-left:1em; + margin-left:0.5em; +} +.plugin_forumml_message_content_std blockquote blockquote { border-color:red; } +.plugin_forumml_message_content_std blockquote blockquote blockquote { border-color:green; } +.plugin_forumml_message_content_std blockquote blockquote blockquote blockquote { border-color:darkorange; } +.plugin_forumml_message_content_std blockquote blockquote blockquote blockquote blockquote { border-color:#8A2BE2; } + +.plugin_forumml_message_content_pre blockquote blockquote { border-color:red; } +.plugin_forumml_message_content_pre blockquote blockquote blockquote { border-color:green; } +.plugin_forumml_message_content_pre blockquote blockquote blockquote blockquote { border-color:darkorange; } +.plugin_forumml_message_content_pre blockquote blockquote blockquote blockquote blockquote { border-color:#8A2BE2; } + + +/* }}} */ diff --git a/plugins/coclico/forumml/www/themes/default/images/ic/attach.png b/plugins/coclico/forumml/www/themes/default/images/ic/attach.png new file mode 100644 index 0000000000000000000000000000000000000000..ea897cc9f18ca49aa0f30bad4e6b67e4afc7f498 GIT binary patch literal 391 zcmV;20eJq2P)`oHYyCmI1nr3DC<^9@PyNudrDc9~P$75b!T6T2tv<*K=EzTZ+r6P_ zRz+%oP}4%P)i2vikyMR~)n*keF9=!Gc_n*K2@qsNT?}H4v4a974 z1ArVJApZ0B-@pGKzWw|E^3%Wn&p!V9|K$C@{}12&`+x7vzyG&i{r!LE6~yrB1;;^# zm?0Y=moxPMSn>r>N00000NkvXX Hu0mjf$^yWL literal 0 HcmV?d00001 diff --git a/plugins/coclico/forumml/www/themes/default/images/ic/comment_add.png b/plugins/coclico/forumml/www/themes/default/images/ic/comment_add.png new file mode 100644 index 0000000000000000000000000000000000000000..75e78dede2c9cc3b789b880e5cfc930e60bf2c91 GIT binary patch literal 530 zcmV+t0`2{YP)~sR==D{nWel_pb&wQ zmrP)tTX!KGk)Sk|wtZaUrliFMw8)@DB*yUg%5WWG5T6(V4-98P2Jan%`$mH2CMxfq z+T@bruYw${Wles0MWFb|;3xR>p5Y`0A6-c}5Tk;D`5i8(NGiA>_&gYcZy8+IQP@fF zZXmTF{tLW(AMNV7m2gb(;iZIqf*k=ah{%H8=`Ai$Cv75^d>yNTn3+NncKU5>gkO-!8JjERGZgNx4o8zwI5pnrkJT^AW7B+k01lLkoCLBu@bfRhnJSkT}{ z5cwz-C?AEk;`Q7|NyO0V@Jst%?>X<@)8|?6hNplZoH}p}R=_wBd4A);huvr*D{8ta zv>weaRZy(zA{a{x)NMK$oUyoq;&Q_jA9Yid>V_!Q3{lkDazCTg+2GL8fKO$yVv7pZ zw#ZdlB3o|B^q?JFdAt+nq80!As0d}1Z|KFR(*lEh^G}{es&~_I}wY;n4d5jAs0d}gj@(+ z%6*K*29I(Myv%_UPWDD&5qS@s3~ZAJGDH vT*SlN0ce3)r#d%-F%SaNZe6;L@E^Vb!Ji3~dec0&00000NkvXXu0mjflI-*P literal 0 HcmV?d00001 diff --git a/plugins/coclico/forumml/www/themes/default/images/ic/msg.png b/plugins/coclico/forumml/www/themes/default/images/ic/msg.png new file mode 100644 index 0000000000000000000000000000000000000000..50cbb6b719c2dff57e754d81b881e3937840be2f GIT binary patch literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^AT|#RGmu>AYB(8483g!*xc>kD|HqFXKpqgBIdkT~ zfdg%AZ4ho~Xef|jX=w@J0!g4^1&?b*Ko(<3kY6x^!?PP{K#o|6YeY$Kep*R+Vo@qX zdS;qYL0-Cok)Da3(c(CFK9~yU{M_8syb=cA#FSKp^30M91$R&1fVx!KsX!G@o-U3d z6}OT-yuG~>5>EX8Z!hliEI#1`fA9Wk@e}_v9-W@RKZR}5e^%DUCue3FH!e|_vA6nr lUVNK~xVU(H+inF02CXf!n;1M3UII;H@O1TaS?83{1OQ9(RLKAU literal 0 HcmV?d00001 diff --git a/plugins/coclico/forumml/www/themes/default/images/ic/resultset_first.png b/plugins/coclico/forumml/www/themes/default/images/ic/resultset_first.png new file mode 100644 index 0000000000000000000000000000000000000000..b03eaf8b5416fa6878165d95116e73003f8445f5 GIT binary patch literal 522 zcmV+l0`>igP)ufs8f5Kzx*fI63}@)AAFXgQp7K#X5)&2^7g z_9O9^7^ARqyc%qAP{1M7?|}io8xW>dotf=a%%ZSXBBI&Rf<-t`#(~H!2g~*8&15{# zVXjXMwHZYVJ6lk!gb6?r$g;SuO>QI;yPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iXG* z2rN0Aw2(0X00EduL_t(I%f*vDOI$$|hToNS6^x>n)fg27Ax)apDbx4^BoMHW*vHm{ zGztj{8Vm$eXrd_EBxq-sBDOY35S1l}>?&&Q*S%-X$4rU^SzWFc7M^bAFwc3Pfs+X# z;4W2zJ65*xu(Gxu0Kj_>RbB7z>wR9?pZu~k9zqxzem(FYC4omzcL&r`KWoY^HD3#FJg#D6(DG&ylFZhP6#3b=L8A4F#GY{i(={M$4+4n^>sO@-jX082Ns26xpZBa9(`FV9xfFM zdk`~ty9FRpeq1?e`Rmxge(7j&_g@iamJSdR{QR|n-+v2LuHP3YUmffpe+&NV@@4LQ a8~+2Oi3*u10+%BI0000eQ51#0H@Z6sk_ajqECPZEqLq!PMf5MQ5gS1i(Owi(ut_CY*w|Psf-Iy6=08Y` zHnsuDs6h)+OwcBqopImX_v1c`5LkrSCWWWFUvW71z%eN$cB714YVYtd`}$X<%JbQ) zM;;CHJDu;#-swg0iul07{S&4s!M>4O+`c|6_tW_i^y+I%|aPsIlEx5K=^ki~8LwqDy-)t}thx1D9 zB6|#ECQ%2a60OQQ<{6-)5|okv)6E>1Xpv+@iIv@MJ8v15 zR{N~1_2z$e&R$WgNhIQelIl1rK}5XruIN#GDZA_4bJqcqID*^mXXFcgt1K5iK7HPL zwLW*@#tu()#Cyd@CHc^75Ul6pYT4PCpSeBE)hh4bY>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iXG* z2rmK#k}B2!00EgvL_t(I%f*vDPgGG5hTpUIDk2|2f}3mtv7j;WM_^%1MMr{ISXmhg zG*&9n*bvz*AVHLmj<6lA@jvh(o0SD&6Rj0?@0>F;=U7}Y8{=IH3Z^^nNuJF6Bx6Dd zxXk2m$%$JZ<;~Bh!H3e==!562`Qlpni>SZPj={{Bdh*a@ZO|1$m|k7qeA^m2Cm1Z` zaqsRh$hzzb%#1rj1=H8t{cK@nWA;2JA}}*V1kHr90oE}>2pH(^!>!()r|*iNJ^}z) z2gd>yMPhBX1LquA6hwsl?S7mz8joJg%w31cfjR9@MC||q5kaGwz!-zULLN~Rjcu#OSs%wI3o+S7z=hcO0TeH(yHD*!+o$JnjZaPa-O3}E2b?~{@4 zuA9)a|NlyCCaLXfafI!?Z>Sv{tuMZRIp);|=TeDnH%P1nGh??>!%_X`+EVe=1OTWg zR23p}K?Nf0?Cs;Y{$pjS^m_6<_v#^%3Rcx@06WIvVg1AM{F}$ExmS;!?JB%_{Cj-n b%CGScFBSevYWJGP00000NkvXXu0mjfL-^~j literal 0 HcmV?d00001 diff --git a/plugins/coclico/forumml/www/themes/default/images/ic/resultset_next.png b/plugins/coclico/forumml/www/themes/default/images/ic/resultset_next.png new file mode 100644 index 0000000000000000000000000000000000000000..e252606d3e68c6da135a9b165996d9da968ef7fc GIT binary patch literal 395 zcmV;60d)R}P)IO8de(|Ml<%@O-40!dwX61{2C5s-llVw2V@@N0oo_PPieZ!0Y2~+R( zk!(QTf=B;X9DnzJ@u9c>OP4(U@7{849!UlyO@H`*;lVfmCvAW6f9CF&{}ZR*{jXDW zb_vl21ozzrYJBy-Vb$aRjjJF3@7nm}zjw#A|58cE9uZ}LbIY~=6ShA8U$XeY|MDdd zfQCH!?_7WRzhvaG%|sbsT7Kz&`}!yUix%Do#>T_{_Ei`DO9UTSBkH=Hg(w4*^UnUS zTk-IJ<+2C=ZObqG7Z2FGlB7VCN;>(!bn*TFHYMl(i+Sx`L~=ArL>~EXU3lidsO!!J pWF;gqzXSh89JkLNxXeT<1_12n>%V}Y6R`jQ002ovPDHLkV1iLCz99er literal 0 HcmV?d00001 diff --git a/plugins/coclico/forumml/www/themes/default/images/ic/resultset_next_disabled.png b/plugins/coclico/forumml/www/themes/default/images/ic/resultset_next_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..bac339e7ce0c7007d5cac364ad228a75c8ffeb44 GIT binary patch literal 419 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPggaW*!bb&W`9q@<3CRJzX3_EKVQ2 zZ0&tGK!p9nf8R}4w_OX0=cv*hG+)~=Y&uE zqGta5Ucud7uSuO~OP&A>*vvBgT0Qf{xj| zmrXw2$T(QI%T$tO^G1g0#R7slr=1r6WV-z>ChVJ+@&2<4OcNAXR6gFxI$XHx>Z!WS zf9rK!7?z66@?XEK{b{Xc8(tN&i@ zH%T)fYQpV#rAr?FpSkE_eXe+_wJd|K3f{{%aMTC(eL? z&YO?2=RWv9b;pbUjjJF3FIss2fAiYM|D{t;5@!?n%vQ}6um-u(1``H~0!(`ViJ zU$yMvf616*#2KJfaGFIu@9Y|n)@%Q3RzCcnHskjH!iD$#iw7MbEf6JRj;ypTzwkeA z{@wqXv+w*Db>B;RG>UocU1Xkp@_*9QTmMBIcK#QL70(Y)*K0-AbW|YuPggaW*!c0Z3Un5eLz!`JY5_^EKVPt z?C*WpLF9<~vF`t~js;Y24EQ3Bah`I(w`DCxv(5e&r7+~s=nf)qpuFACN+DJEK z+iSKnmT@i>kx1@fxo(}9U+v5=BR=x(o@Fh1XHu3Q+|eLl6gSa}J-U1Cv*@k=zHpth z3=uh+pY*dNedXOZA$z8`)v@g_jl3EEZp(e|pl{{||NctXGl;VFt3~=Mv;qT=!PC{x JWt~$(696*luI&H- literal 0 HcmV?d00001 diff --git a/plugins/coclico/forumml/www/themes/default/images/ic/spinner-greenie.gif b/plugins/coclico/forumml/www/themes/default/images/ic/spinner-greenie.gif new file mode 100644 index 0000000000000000000000000000000000000000..9351497e8c4a652a9ca5891a5425172a011b1fc5 GIT binary patch literal 3292 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 literal 0 HcmV?d00001 diff --git a/plugins/coclico/forumml/www/themes/default/images/ic/trash.png b/plugins/coclico/forumml/www/themes/default/images/ic/trash.png new file mode 100644 index 0000000000000000000000000000000000000000..af10be03e07e29aed3a98c634114fa03e1951be5 GIT binary patch literal 778 zcmV+l1NHogP)4Q_K~#9!ZIe$=Q&}8_pWA!y;Zpj?J5Z=a!GCOk5XWF*)S<=@H@Z;A zWRfxNG;Z9O%m)}_T+MpE02x`V_ddyc@*agP5<-~3alZ9B>L5<(mYBp~nH zz9|d2H?p|CBJ;T=`QrIQ`SZmyvVJdwI9vBAU(7>ZuXpP2u|JU#9z1-)^mLr$VuoO# znG5HK*}c0RRrTQUc({D!H-r!eY}-zH0D5|Qrk+mSClcvq|NdU0LnqkN*~t&4iD=S! zJDJ_{#9W-gJ$bdp?D8jy~&BjKFVyVc)G%7hv$JuQS5^s!n{hTRip4x1mP?F{jWRhoK{AlK{+}n6{=hH?A={dXMSX(^yso zUDsG#d{4DnMb|Y32KuN}N)!s#wg|MhxBh-A`V&J#r*Z60T)K1)UyF{EF2lnoab1Uj zfqvH4*C>}a$mI&R06dLCC<;cimjee65$Ozbbnql?p)lc&2)(`im}Y=r(1&RTP}PR* zD_|=~Q#~{pfs8(H` zJ^PRG@qd|_iQ&3#W684C0mx*QSz21fah&asSSnRsrPG;TA3d66SJ02*sgOvdiN_N_ zjd(mkCbLQ`Hcz?yDeAgzik&2c_(cdI0T~PirLOBc{=&LG1Lyc7JSa#7{r~^~07*qo IM6N<$g77getPluginByName('forumml'); +if ($p && $plugin_manager->isPluginAvailable($p) && $p->isAllowed()) { + $request = HTTPRequest::instance(); + $current_user=UserManager::instance()->getCurrentUser(); + $groupId = $request->getValidated('group_id', 'UInt', 0); + + $vList = new Valid_UInt('list'); + $vList->required(); + // Checks 'list' parameter + if (! $request->valid($vList)) { + exit_error('error','No list specified'); + } else { + $list_id = $request->get('list'); + $list = new MailmanList($groupId,$list_id); + if (!isLogged() || ($list->isPublic()!=1 && !$current_user->isMember($groupId))) { + exit_error(_('error'),_('You are not allowed to access this page')); + } + if ($list->getStatus() !=3) { + exit_error(_('error'),_('This list is not active')); + } + } + + // Topic + $vTopic = new Valid_UInt('topic'); + $vTopic->required(); + if ($request->valid($vTopic)) { + $topic = $request->get('topic'); + } else { + $topic = 0; + } + $attchmentId = $request->getValidated('id', 'UInt', 0); + if ($attchmentId) { + $fmlAttch = new ForumML_Attachment(); + $attch = $fmlAttch->getById($attchmentId); +echo $attch['file_path']; + if ( file_exists($attch['file_path'])) { +//if (1==1) { + header('Content-disposition: filename="'.$attch['file_name'].'"'); + header("Content-Type: ".$attch['type']); + header("Content-Transfer-Encoding: ".$attch['type']); + if ($attch['file_size'] > 0) { + header("Content-Length: ".$attch['file_size']); + } + header("Pragma: no-cache"); + header("Cache-Control: must-revalidate, post-check=0, pre-check=0, public"); + header("Expires: 0"); + readfile($attch['file_path']); + exit; + } else { + $feedback.= _('Error : Attachment not found'); + } + } else { + $feedback.= _('Error : Missing parameter '); + } + htmlRedirect('/plugins/forumml/message.php?group_id='.$groupId.'&list='.$list_id.'&topic='.$topic); +} else { + header('Location: '.get_server_url()); +} + +?> diff --git a/plugins/coclico/mailman/www/admin/index.php b/plugins/coclico/mailman/www/admin/index.php index 3db2065806..d4a9974066 100644 --- a/plugins/coclico/mailman/www/admin/index.php +++ b/plugins/coclico/mailman/www/admin/index.php @@ -55,7 +55,7 @@ if ($group_id) { } $mailingList->recreate(); $feedback .=_('List re-created'); - htmlRedirect('index.php?group_id='.$group_id); + htmlRedirect('/plugins/mailman/index.php?group_id='.$group_id); } diff --git a/plugins/coclico/mailman/www/mailman_utils.php b/plugins/coclico/mailman/www/mailman_utils.php index b79ec6c97f..7cc6eb6940 100644 --- a/plugins/coclico/mailman/www/mailman_utils.php +++ b/plugins/coclico/mailman/www/mailman_utils.php @@ -172,7 +172,7 @@ function display_list_admin($currentList) echo ''._('Not activated yet').''; } else{ - echo ''._('Error during creation').' '._('Re-create').''; + echo ''._('Error during creation').' '._('Re-create').''; } echo ''; } else { -- 2.30.2