Skip to content

"Writer" for private groups #281

Description

@VVD

Private groups: only who have Writer bit can write emails to group.
Public groups: not affected.
checked.png: checked
unchecked.png: unchecked

diff -ur vexim.orig/admingroupchange.php vexim/admingroupchange.php
--- vexim.orig/admingroupchange.php
+++ vexim/admingroupchange.php
@@ -76,7 +76,7 @@
         <tr>
           <td colspan="2">
             <?php
-              $query = "SELECT u.realname, u.localpart, u.enabled, c.member_id
+              $query = "SELECT u.realname, u.localpart, u.enabled, c.member_id, c.writer
                 FROM users u, group_contents c
                 WHERE u.user_id=c.member_id and c.group_id=:group_id
                 ORDER BY u.enabled desc, u.realname asc";
@@ -86,6 +86,7 @@
             ?>
             <table align="center">
               <tr>
+                <th><?php echo _('Writer'); ?></th>
                 <th>&nbsp;</th>
                 <th><?php echo _('Real name'); ?></th>
                 <th><?php echo _('Email Address'); ?></th>
@@ -95,11 +96,42 @@
                 while ($row = $sth->fetch()) {
               ?>
               <tr>
+                <td>
+                  <div align="center">
+                  <?php
+                    if($row['writer']=='1') {
+                  ?>
+                  <a href="admingroupwritersubmit.php?group_id=<?php echo htmlspecialchars($_GET['group_id']);
+                                        ?>&member_id=<?php echo $row['member_id'];
+                                        ?>&localpart=<?php echo $grouplocalpart;
+                                        ?>&writer=0">
+                    <img
+                      title="Disable writer permissions <?php echo $row['realname']
+                      . ' from group ' . $grouplocalpart; ?>"
+                      src="images/checked.png" alt="disable">
+                  </a>
+                  <?php
+                    } else {
+                  ?>
+                  <a href="admingroupwritersubmit.php?group_id=<?php echo htmlspecialchars($_GET['group_id']);
+                                        ?>&member_id=<?php echo $row['member_id'];
+                                        ?>&localpart=<?php echo $grouplocalpart;
+                                        ?>&writer=1">
+                    <img
+                      title="Enable writer permissions <?php echo $row['realname']
+                      . ' from group ' . $grouplocalpart; ?>"
+                      src="images/unchecked.png" alt="enable">
+                  </a>
+                  <?php
+                    }
+                  ?>
+                  </div>
+                </td>
                 <td class="trash">
                   <a href="admingroupcontentdeletesubmit.php?group_id=<?php echo htmlspecialchars($_GET['group_id']);
-                                       ?>&member_id=<?php echo $row['member_id'];
-                                       ?>&localpart=<?php echo $grouplocalpart;
-                                       ?>">
+                                        ?>&member_id=<?php echo $row['member_id'];
+                                        ?>&localpart=<?php echo $grouplocalpart;
+                                        ?>">
                     <img class="trash"
                       title="Remove member <?php echo $row['realname']
                       . ' from group ' . $grouplocalpart; ?>"
@@ -112,7 +144,7 @@
                   <?php
                     if($row['enabled']=='1') {
                   ?>
-                  <img class="check" src="images/check.gif">
+                  <div align="center"><img class="check" src="images/check.gif"></div>
                   <?php
                     }
                   ?>
@@ -135,7 +167,7 @@
           <form method="post" action="admingroupcontentaddsubmit.php"
             name="groupcontentadd">
           <tr>
-            <td><?php echo _('Add Member'); ?></td>
+            <td><?php echo _('Add Member'); ?><br/>&nbsp;</td>
             <td>
               <input name="group_id" type="hidden"
                 value="<?php echo htmlspecialchars($_GET['group_id']); ?>" class="textfield">
@@ -158,6 +190,7 @@
                   }
                 ?>
               </select>
+              <br><?php echo _('Writer'); ?>: <input name="writer" type="checkbox" class="textfield" />
             </td>
           </tr>
           <tr>
diff -ur vexim.orig/admingroupcontentaddsubmit.php vexim/admingroupcontentaddsubmit.php
--- vexim.orig/admingroupcontentaddsubmit.php
+++ vexim/admingroupcontentaddsubmit.php
@@ -17,9 +17,13 @@
     header("Location: admingroup.php?badname={$_POST['usertoadd']}");
     die;
   }
-  $query = "INSERT INTO group_contents (group_id, member_id) VALUES (:group_id, :usertoadd)";
+  $query = "INSERT INTO group_contents (group_id, member_id, writer) VALUES (:group_id, :usertoadd, :writer)";
   $sth = $dbh->prepare($query);
-  $success = $sth->execute(array(':group_id'=>$_POST['group_id'], ':usertoadd'=>$_POST['usertoadd']));
+  try {
+    $success = $sth->execute(array(':group_id'=>$_POST['group_id'], ':usertoadd'=>$_POST['usertoadd'], ':writer'=>isset($_POST['writer']) ? 1 : 0));
+  } catch (PDOException $e) {
+    $success = 0;
+  }
   if ($success) {
     header ("Location: admingroupchange.php?group_id={$_POST['group_id']}&group_updated={$_POST['localpart']}");
   } else {
Only in vexim/images: checked.png
Only in vexim/images: unchecked.png
diff -ur vexim.orig/locale/ru/LC_MESSAGES/ru.po vexim/locale/ru/LC_MESSAGES/ru.po
--- vexim.orig/locale/ru/LC_MESSAGES/ru.po
+++ vexim/locale/ru/LC_MESSAGES/ru.po
@@ -357,11 +357,15 @@
 msgid "Edit group"
 msgstr "Редактировать группу"

-#: admingroupchange.php:89
+#: admingroupchange.php:89 admingroupchange.php:193
+msgid "Writer"
+msgstr "Писатель"
+
+#: admingroupchange.php:91
 msgid "Real name"
 msgstr "Настоящее имя"

-#: admingroupchange.php:90 adminuserchange.php:79 userchange.php:40
+#: admingroupchange.php:92 adminuserchange.php:79 userchange.php:40
 msgid "Email Address"
 msgstr "Почтвый адрес"

diff -ur vexim.orig/locale/template.pot vexim/locale/template.pot
--- vexim.orig/locale/template.pot
+++ vexim/locale/template.pot
@@ -346,11 +346,15 @@
 msgid "Edit group"
 msgstr ""

-#: admingroupchange.php:89
+#: admingroupchange.php:89 admingroupchange.php:193
+msgid "Writer"
+msgstr ""
+
+#: admingroupchange.php:91
 msgid "Real name"
 msgstr ""

-#: admingroupchange.php:90 adminuserchange.php:79 userchange.php:40
+#: admingroupchange.php:92 adminuserchange.php:79 userchange.php:40
 msgid "Email Address"
 msgstr ""

diff -ur docs.orig/debian-conf.d/router/250_vexim_virtual_domains docs/debian-conf.d/router/250_vexim_virtual_domains
--- docs.orig/debian-conf.d/router/250_vexim_virtual_domains
+++ docs/debian-conf.d/router/250_vexim_virtual_domains
@@ -82,20 +82,30 @@
   allow_fail
   senders = ${if eq{Y}{${lookup mysql{select g.is_public \
                                       from groups g, domains d \
-                                      where d.enabled = '1' and d.domain = '${quote_mysql:$domain}' and \
-                                            d.domain_id = g.domain_id and g.enabled = '1' and \
+                                      where d.enabled = 1 and d.domain = '${quote_mysql:$domain}' and \
+                                            d.domain_id = g.domain_id and g.enabled = 1 and \
                                             g.name = '${quote_mysql:$local_part}'}}} \
                  {$sender_address} \
-                 {${lookup mysql{select concat_ws('@', u.localpart, d.domain) \
+                 {${lookup mysql{select u.username \
                                  from domains d, groups g, group_contents c, users u \
-                                 where d.enabled = '1' and d.domain = '${quote_mysql:$domain}' and \
+                                 where d.enabled = 1 and d.domain = '${quote_mysql:$domain}' and \
                                        d.domain_id = g.domain_id and g.name = '${quote_mysql:$local_part}' and \
-                                       g.enabled = '1' and \
-                                       g.is_public = 'N' and c.member_id = u.user_id and \
-                                       d.domain_id = u.domain_id and u.enabled = '1' \
-                                       and u.username = '${quote_mysql:$sender_address}' limit 1}}}}
+                                       g.enabled = 1 and g.id = c.group_id and \
+                                       g.is_public = 'N' and c.writer = 1 and c.member_id = u.user_id and \
+                                       d.domain_id = u.domain_id and u.enabled = 1 and \
+                                       u.username = '${quote_mysql:$sender_address}' \
+                                 union \
+                                 select a.username \
+                                 from domains d, groups g, group_contents c, users u, users a \
+                                 where d.enabled = 1 and d.domain = '${quote_mysql:$domain}' and \
+                                       d.domain_id = g.domain_id and g.name = '${quote_mysql:$local_part}' and \
+                                       g.enabled = 1 and g.id = c.group_id and \
+                                       g.is_public = 'N' and c.writer = 1 and c.member_id = u.user_id and \
+                                       d.domain_id = u.domain_id and u.enabled = 1 and a.enabled = 1 and \
+                                       a.type = 'alias' and a.username = '${quote_mysql:$sender_address}' and \
+                                       a.smtp = u.username }}}}
   data = ${lookup mysql{ \
-            select concat_ws('@', u.localpart, d.domain) \
+            select u.username \
             from domains d, groups g, group_contents c, users u \
             where d.enabled     = '1'           and \
                   d.domain      = '${quote_mysql:$domain}'   and \
diff -urN setup.orig/migrations/vexim_2.3_to_2.3.1_mysql.sql setup/migrations/vexim_2.3_to_2.3.1_mysql.sql
--- setup.orig/migrations/vexim_2.3_to_2.3.1_mysql.sql
+++ setup/migrations/vexim_2.3_to_2.3.1_mysql.sql
@@ -0,0 +1,5 @@
+--
+-- MySQL script to upgrade Vexim database schema from Vexim 2.3 to Vexim 2.3.1
+--
+
+ALTER TABLE `group_contents` ADD COLUMN `writer` tinyint(1) NOT NULL DEFAULT '1';
diff -urN setup.orig/mysql.sql setup/mysql.sql
--- setup.orig/mysql.sql
+++ setup/mysql.sql
@@ -177,6 +177,7 @@
 CREATE TABLE `group_contents` (
   `group_id` int(10) unsigned NOT NULL,
   `member_id` int(10) unsigned NOT NULL,
+  `writer` tinyint(1) NOT NULL DEFAULT '1',
   PRIMARY KEY (`group_id`, `member_id`),
   INDEX `fk_group_contents_group_id_idx` (`group_id`),
   INDEX `fk_group_contents_member_id_idx` (`member_id`),
diff -urN setup.orig/pgsql.sql setup/pgsql.sql
--- setup.orig/pgsql.sql
+++ setup/pgsql.sql
@@ -189,6 +189,7 @@
 CREATE TABLE "group_contents" (
   "group_id" int NOT NULL,
   "member_id" int NOT NULL,
+  "writer" smallint NOT NULL DEFAULT '1' CHECK("smallint" BETWEEN 0 AND 1),
   PRIMARY KEY ("group_id","member_id"));
 CREATE INDEX "fk_group_contents_group_id_idx" ON "group_contents" ("group_id");
 CREATE INDEX "fk_group_contents_member_id_idx" ON "group_contents" ("member_id");

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions