index 32ae8a21dde9d536b81a00172b9da46d6a323425..60d3ae267b03553aa7034ef2c20e0af2d50fc84f 100644 (file)
class mailgroup extends plugin
{
- /* CLI vars */
- var $cli_summary = "Manage mail groups/shared folders";
- var $cli_description = "Some longer text\nfor help";
- var $cli_parameters = array("eins" => "Eins ist toll", "zwei" => "Zwei ist noch besser");
-
var $uid = ""; // User id
var $cn = ""; // cn
+ var $orig_cn = ""; // cn
var $method = "mailMethod"; // Used Mail method
var $mmethod = ""; // Contains the gosa.conf MAILMETHOD
var $gosaVacationMessage = ""; // Vocation message
var $imapacl = array('anyone' => 'p', // Set acls for everyone
- '%members%' => 'lrsp', // %members% are all group-members
+ '%members%' => 'lrspw', // %members% are all group-members
'' => 'p'); // Every user added gets this right
var $perms = array();
var $gosaMailDeliveryMode = "[L ]"; //
var $gosaMailMaxSize = ""; //
-
+
+ var $remove_folder_from_imap = true;
/* Helper */
var $indexed_acl= array();
var $indexed_user= array();
+ /* Copy & paste */
+ var $CopyPasteVars = array("quotaUsage","imapacl");
+
/* attribute list for save action */
- var $attributes= array( "mail", "gosaMailServer", "gosaMailQuota", "gosaMailMaxSize",
+ var $attributes= array( "mail", "gosaMailServer", "gosaMailQuota", "gosaMailMaxSize",
"gosaMailAlternateAddress", "gosaMailForwardingAddress",
"gosaMailDeliveryMode", "gosaSpamSortLevel", "gosaSpamMailbox",
"acl","gosaSharedFolderTarget", "gosaVacationMessage");
var $objectclasses= array("gosaMailAccount");
+ var $kolabFolderType_SubType = "";
+ var $kolabFolderType_Type = "";
- function mailgroup ($config, $dn= NULL, $ui= NULL)
+ function mailgroup ($config, $dn= NULL, $parent= NULL)
{
/* Initialise all available attributes ... if possible
*/
- plugin::plugin($config, $dn);
+ plugin::plugin($config, $dn, $parent);
+
+ /* Save initial cn */
+ $this->orig_cn = $this->cn;
/* Set mailMethod to the one defined in gosa.conf
*/
$this->uid= $this->attrs['cn'][0];
}
+ /* Get folder type */
+ if(isset($this->config->current['MAILMETHOD'])&&preg_match("/olab/i",$this->config->current['MAILMETHOD'])){
+ if(isset($this->attrs['kolabFolderType'])){
+ $tmp = split("\.",$this->attrs['kolabFolderType'][0]);
+ $this->kolabFolderType_Type = $tmp[0];
+ $this->kolabFolderType_SubType = $tmp[1];
+ }
+ }
/* If this ins't new mailgroup, read all required data from ldap
*/
$method= new $this->method($this->config);
if ($method->connect($this->attrs["gosaMailServer"][0])){
-
- /* get Quota
- */
- $quota= $method->getQuota($this->uid);
+
/* Maybe the entry is not saved in new style, get
permissions from IMAP and convert them to acl attributes */
}
} // ENDE ! isset ($this->attrs['acl'])
+
+ /* Adapt attributes if needed */
+ $method->fixAttributesOnLoad($this);
+
+ /* get Quota */
+ $quota= $method->getQuota($this->uid);
/* Update quota values */
- if ($quota['gosaMailQuota'] == 2147483647){
- $this->quotaUsage= "";
- $this->gosaMailQuota= "";
- } else {
- $this->quotaUsage= $quota['quotaUsage'];
- $this->gosaMailQuota= $quota['gosaMailQuota'];
+ if(is_array($quota)){
+ if ($quota['gosaMailQuota'] == 2147483647){
+ $this->quotaUsage= "";
+ $this->gosaMailQuota= "";
+ } else {
+ $this->quotaUsage= $quota['quotaUsage'];
+ $this->gosaMailQuota= $quota['gosaMailQuota'];
+ }
+ }else{
+ $this->quotaUsage = "";
+ $this->gosaMailQuota = "";
+// print_red(sprintf(_("Can't get quota information for '%s'."),$this->uid));
}
$method->disconnect();
} // ENDE $method->connect($this->attrs["gosaMailServer"][0])){
- /* Adapt attributes if needed */
- $method->fixAttributesOnLoad($this);
-
} // ENDE gosaMailServer
} // ENDE dn != "new"
/* Load permissions */
$tmp = array();
- if(preg_match("/kolab/i",$this->mmethod)){
+ if(preg_match("/olab/i",$this->mmethod)){
$ldap = $this->config->get_ldap_link();
if (isset($this->attrs['acl'])){
}
/* Append an empty entry, for special acl handling */
if(count($this->imapacl)==2){
- $this->imapacl[''] ="";
+ $this->imapacl[''] ="lrsw";
+ $this->indexed_user[] = '';
}
}else{ // Not kolab
}
}
+ /* Load Mailserver
+ */
+ if(isset($this->attrs['gosaMailServer'][0])){
+ $this->gosaMailServer = $this->attrs['gosaMailServer'][0];
+ }
/* Fill translations */
- $this->perms["lrs"]= _("read");
- $this->perms["lrsp"]= _("post");
+ $this->perms["lrsw"]= _("read");
+ $this->perms["lrswp"]= _("post");
$this->perms["p"]= _("external post");
- $this->perms["lrsip"]= _("append");
+ $this->perms["lrswip"]= _("append");
$this->perms["lrswipcd"]= _("write");
+ $this->perms["lrswipcda"]= _("admin");
+ $this->perms[""]= _("none");
}
function execute()
/* Load templating engine */
$smarty= get_smarty();
+ $display = "";
if ($_SESSION['js']==FALSE){
$smarty->assign("javascript", "false");
} else {
/* Do we need to flip is_account state? */
if (isset($_POST['modify_state'])){
- $this->is_account= !$this->is_account;
- }
+ /* Onyl change account state if allowed */
+ if($this->is_account && $this->acl == "#all#"){
+ $this->is_account= !$this->is_account;
+ }elseif(!$this->is_account && chkacl($this->acl,"create") == ""){
+ $this->is_account= !$this->is_account;
+ }
+ }
+
/* Do we represent a valid account? */
if (!$this->is_account && $this->parent == NULL){
- $display= "<img alt=\"\" src=\"images/stop.png\" align=middle> <b>".
+
+ $display.= "<img alt=\"\" src=\"images/stop.png\" align=middle> <b>".
_("This 'dn' has no valid mail extensions.")."</b>";
return ($display);
}
$display= $this->show_header(_("Remove mail account"),
_("This account has mail features enabled. You can disable them by clicking below."));
} else {
- $display= $this->show_header(_("Create mail account"),
+ $display.= $this->show_header(_("Create mail account"),
_("This account has mail features disabled. You can enable them by clicking below."));
+
+ /* Show checkbox that allows us to remove imap entry too*/
+ if($this->initially_was_account){
+
+ $c = "";
+ if($this->remove_folder_from_imap){
+ $c= " checked ";
+ }
+
+ $display .= "<h2>Shared folder delete options</h2>
+ <input class='center' type='checkbox' name='remove_folder_from_imap' value='1' ".$c."
+ title='"._("Remove shared folder from mail server database when entry gets removed in LDAP")."'>";
+ $display .= _("Remove the shared folder and all its contents after saving this account");
+ }
+
return ($display);
}
}
/* Add ACL? */
+ if (isset($_POST["add_acl"])){
+ $this->imapacl[""]= "lrsw";
+ }
foreach ($this->indexed_user as $nr => $user){
- if (isset($_POST["add_$nr"])){
- $this->imapacl[""]= "l";
- }
if (isset($_POST["del_$nr"])){
unset ($this->imapacl[$user]);
}
}
$acl= array($this->config->current['BASE'] => ":all");
- $res= get_list($acl, "(&(objectClass=gosaMailAccount)$filter)", TRUE, $gmailfilter['depselect'], array("sn", "mail", "givenName"), TRUE);
+ $res= get_list("(&(objectClass=gosaMailAccount)$filter)", $acl, $gmailfilter['depselect'],
+ array("sn", "mail", "givenName"), GL_SUBSEARCH | GL_SIZELIMIT);
$ldap->cd($gmailfilter['depselect']);
$ldap->search ("(&(objectClass=gosaMailAccount)$filter)", array("sn", "mail", "givenName"));
error_reporting (0);
"value=\"$user\" $perm></td><td><select size=\"1\" name=\"perm_$nr\" $perm>";
foreach ($this->perms as $key => $value){
if ($acl == $key){
- $tmp.= "<option value=$key selected>$value</option>";
+ $tmp.= "<option value=\"$key\" selected>$value</option>";
} else {
- $tmp.= "<option value=$key>$value</option>";
+ $tmp.= "<option value=\"$key\">$value</option>";
}
}
$tmp.= "</select> ";
if ($nr == $count - 1){
- $tmp.= "<input type=submit value=\""._("Add")."\" ".
- "name=\"add_$nr\" $perm>";
}
- if ($count > 3){
+ if ($count > 2){
$tmp.= "<input type=submit value=\""._("Remove")."\" ".
"name=\"del_$nr\" $perm></td></tr>";
}
$this->indexed_user[$nr]= $user;
$this->indexed_acl[$nr++]= $acl;
}
+ $tmp.= "<tr><td></td><td></td><td><input type=submit value='"._("Add")."' name='add_acl' $perm>";
$smarty->assign("plusattributes", $tmp);
/* Show main page */
$smarty->assign("quotadefined", "false");
}
+ if(isset($this->config->current['MAILMETHOD'])&&preg_match("/olab/i",$this->config->current['MAILMETHOD'])){
+
+ $smarty->assign("kolab", TRUE);
+ $smarty->assign("JS",$_SESSION['js']);
+ $smarty->assign("kolabFolderType_Types", array ( '' => _('Unspecified'), 'mail' => _('Mails'),
+ 'task' => _('Tasks') , 'journal' => _('Journals'),
+ 'calendar' => _('Calendar'), 'contact' => _('Contacts'),
+ 'note' => _('Notes')));
+ if($this->kolabFolderType_Type == "mail"){
+ $smarty->assign("kolabFolderType_SubTypes", array(
+ '' => _('Unspecified'), 'inbox' => _("Inbox") ,
+ 'drafts' => _("Drafts"), 'sentitems' => _("Sent items"),
+ 'junkemail' => _("Junk mail")));
+ }else{
+ $smarty->assign("kolabFolderType_SubTypes", array( 'default' => _("Default")));
+ }
+ $smarty->assign("kolabFolderType_Type", $this->kolabFolderType_Type);
+ $smarty->assign("kolabFolderType_SubType", $this->kolabFolderType_SubType);
+ }else{
+ $smarty->assign("kolab", FALSE);
+ }
+
+
$display.= $smarty->fetch (get_template_path('mail.tpl', TRUE));
return ($display);
}
/* Added these ObjectClass and Attributes, because they were not
removed correctly, only in case of kolab ...
*/
- if(isset($this->config->current['MAILMETHOD'])&&preg_match("/kolab/i",$this->config->current['MAILMETHOD'])){
+ if(isset($this->config->current['MAILMETHOD'])&&preg_match("/olab/i",$this->config->current['MAILMETHOD'])){
$this->attributes[]="acl";
- $this->attributes[]="kolabHomeServer";
$this->objectclasses[] = "kolabSharedFolder";
}
/* include global link_info */
$this->attrs['gosaMailForwardingAddress']= array();
$this->attrs['gosaSharedFolderTarget']= array();
- /* Keep uid */
- unset ($this->attrs['uid']);
- $ldap->cd($this->dn);
- $this->cleanup();
- $ldap->modify ($this->attrs);
-
- show_ldap_error($ldap->get_error());
-
/* Connect to IMAP server for account deletion */
- if ($this->is_account){
+ if ($this->initially_was_account){
+
$method= new $this->method($this->config);
- if ($method->connect($this->attrs["gosaMailServer"][0])){
+ $method->fixAttributesOnRemove($this);
+ if ($method->connect($this->gosaMailServer) && $this->remove_folder_from_imap){
+
/* Remove account from IMAP server */
$method->deleteMailbox($this->uid);
$method->disconnect();
}
- $method->fixAttributesOnRemove($this);
}
+ /* Keep uid */
+ unset ($this->attrs['uid']);
+
+ $ldap->cd($this->dn);
+ $ldap->modify ($this->attrs);
+ show_ldap_error($ldap->get_error(), _("Removing group mail settings failed"));
/* Optionally execute a command after we're done */
$this->handle_post_events("remove");
/* Save data to object */
function save_object()
{
+
+ /* Add special kolab attributes */
+ if(isset($this->config->current['MAILMETHOD'])&&preg_match("/olab/i",$this->config->current['MAILMETHOD'])){
+ if(isset($_POST['kolabFolderType_Type'])){
+ $this->kolabFolderType_Type = get_post("kolabFolderType_Type");
+ $this->kolabFolderType_SubType = get_post("kolabFolderType_SubType");
+ }
+ }
+
+ /* Check if user wants to remove the shared folder from imap too */
+ if($this->initially_was_account && !$this->is_account){
+ if(isset($_POST['remove_folder_from_imap'])){
+ $this->remove_folder_from_imap = true;
+ }else{
+ $this->remove_folder_from_imap = false;
+ }
+ }
+
/* Assemble mail delivery mode
The mode field in ldap consists of values between braces, this must
be called when 'mail' is set, because checkboxes may not be set when
/* Save arrays */
$this->attrs['gosaMailAlternateAddress'] = $this->gosaMailAlternateAddress;
$this->attrs['gosaMailForwardingAddress'] = $this->gosaMailForwardingAddress;
-
- /* Save shared folder target */
- $this->attrs['gosaSharedFolderTarget']= "share+".$this->uid;
-
- if(preg_match("/kolab/i",$this->mmethod)){
- /* Save acl's */
- $this->attrs['acl']= array();
- foreach ($this->imapacl as $user => $acl){
- if ($user == ""){
- continue;
- }
- $ldap->search("(&(objectClass=person)(|(uid=".$user.")(mail=".$user.")))",array("mail"));
- $mail = $ldap->fetch();
- if($mail){
- if(isset($mail['mail'][0])){
- $this->attrs['acl'][]= $mail['mail'][0]." $acl";
- }
- }else{
- $this->attrs['acl'][]= "$user $acl";
- }
- }
- }else{
- /* Save acl's */
- $this->attrs['acl']= array();
- foreach ($this->imapacl as $user => $acl){
- if ($user == ""){
- continue;
- }
- $this->attrs['acl'][]= "$user $acl";
- }
- }
+ $this->attrs['gosaSharedFolderTarget'] = "share+".$this->uid;
/* Only do IMAP actions if we are not a template */
- if(preg_match("/kolab/i",$this->mmethod)){
+ if(preg_match("/olab/i",$this->mmethod)){
if (empty($this->gosaMailServer)||is_array($this->gosaMailServer)){
if(isset($this->attrs['gosaMailServer'][0])){
$this->gosaMailServer = $this->attrs['gosaMailServer'][0];
}
}
+ /* Exchange '%member%' pseudo entry */
+ $memberacl= $this->imapacl['%members%'];
+ foreach ($this->members as $user){
+ if (!isset($this->imapacl[$user])){
+ $this->imapacl[$user]= $memberacl;
+ }
+ }
+
+ /* Prepare kolab attributes to be written */
+ if(preg_match("/olab/i",$this->mmethod)){
+ $this->attrs['acl']= array();
+ if(!empty($this->kolabFolderType_Type)){
+ $this->attrs['kolabFolderType'] = $this->kolabFolderType_Type.".".$this->kolabFolderType_SubType;
+ }else{
+ $this->attrs['kolabFolderType'] = array();
+ }
+ }else{
+ $this->attrs['acl']= array();;
+ unset($this->attrs['acl']);
+ }
+ /* Get naming attribute for mail accounts */
+ $tmp = new $this->method($this->config);
+ $uattrib = $tmp->uattrib;
+
+ /* Create ACL array
+ * In case of kolab also create attrs['acl'] to save acls in ldap.
+ */
+ foreach ($this->imapacl as $user => $acl){
+
+ if (empty($user) || $user == ""){
+ unset($this->imapacl[$user]);
+ }
+
+ /* Skip placeholder */
+ if (empty($user) || $user == "" || preg_match("/%members%/",$user)){
+ continue;
+ }
+
+ /* Check if your is a real GOsa user
+ * If user is a real GOsa user but do not have an email address - SKIP adding acls
+ * If user is a real GOsa user with an emal address - add acls
+ */
+ $ldap->search("(&(objectClass=person)(|(uid=".$user.")(mail=".$user.")))",array("mail","uid"));
+ if($ldap->count()){
+ $attrs = $ldap->fetch();
+
+ /* Has the user a valid mail account? */
+ if(isset($attrs['mail'][0])){
+
+ $name = $attrs[$uattrib][0];
+
+ /* In case of kolab methods add acl attribute too */
+ if(preg_match("/olab/i",$this->mmethod)){
+ $this->attrs['acl'][]= $name." ".$acl;
+ unset($this->imapacl[$user]);
+ }
+ $this->imapacl[$name] = $acl;
+ }else{
+
+ /* User has no mail extension */
+ unset($this->imapacl[$user]);
+ }
+ }else{
+ /* Seems to be a manually added acl */
+
+ /* In case of kolab methods add acl attribute too */
+ if(preg_match("/olab/i",$this->mmethod)){
+ $this->attrs['acl'][]= $user." ".$acl;
+ }
+ $this->imapacl[$user] = $acl;
+ }
+ }
+
if ((!$this->is_template)&&(!empty($this->gosaMailServer))){
$method= new $this->method($this->config);
$method->fixAttributesOnStore($this);
}
}
- /* Exchange '%member%' pseudo entry */
- $memberacl= $this->imapacl['%members%'];
-
- if(empty($memberacl)){
- print_a($this);
- exit();
- }
-
- foreach ($this->members as $user){
- if(preg_match("/kolab/i",$this->mmethod)){
- $ldap->cd($this->config->current['BASE']);
- $ldap->search("(&(objectClass=person)(|(mail=".$user.")(uid=".$user.")))",array("mail"));
- $at = $ldap->fetch();
- if(isset($at['mail'][0])){
- $user = $at['mail'][0];
- }
- }
- if (!isset($this->imapacl[$user])){
- $this->imapacl[$user]= $memberacl;
- }
- }
- $this->attrs['acl'] = array();
- foreach($this->imapacl as $user => $acl){
- if(preg_match("/%members%/",$user) || empty($user)) continue;
-
- $this->attrs['acl'][] = $user." ".$acl;
- }
-
/* Save data to LDAP */
$ldap->cd($this->dn);
$this->cleanup();
$ldap->modify ($this->attrs);
-
- show_ldap_error($ldap->get_error());
+ show_ldap_error($ldap->get_error(), _("Saving group mail settings failed"));
/* Optionally execute a command after we're done */
if ($this->initially_was_account == $this->is_account){
if ($this->is_modified){
- $this->handle_post_events("mofify");
+ $this->handle_post_events("modify");
}
} else {
$this->handle_post_events("add");
{
$ldap= $this->config->get_ldap_link();
- $message= array();
+ /* Call common method to give check the hook */
+ $message= plugin::check();
+
+ if(!$this->is_account) return array();
+
+ //$message[] = $str;
/* must: mail */
if ($this->mail == ""){
}
$ldap->cd($this->config->current['BASE']);
$ldap->search ("(&(!(objectClass=gosaUserTemplate))(objectClass=gosaMailAccount)(|(mail=".$this->mail.")(gosaMailAlternateAddress=".
- $this->mail."))(!(uid=".$this->cn."))(!(cn=".$this->cn.")))");
+ $this->mail."))(!(uid=".$this->orig_cn."))(!(cn=".$this->orig_cn.")))");
if ($ldap->count() != 0){
$message[]= _("The primary address you've entered is already in use.");
}
-
+
/* Check quota */
if ($this->gosaMailQuota != '' && chkacl ($this->acl, "gosaMailQuota") == ""){
if (!is_numeric($this->gosaMailQuota)) {
return ($name);
}
-}
+ function getCopyDialog()
+ {
+ if(!$this->is_account) return("");
+
+ $smarty = get_smarty();
+ $smarty->assign("gosaMailAlternateAddress",$this->gosaMailAlternateAddress);
+ $smarty->assign("gosaMailForwardingAddress",$this->gosaMailForwardingAddress);
+ $smarty->assign("mail",$this->mail);
+ $display= $smarty->fetch (get_template_path('paste_mail.tpl', TRUE));
+ $ret = array();
+ $ret['string'] = $display;
+ $ret['status'] = "";
+ return($ret);
+ }
+
+ function saveCopyDialog()
+ {
+ if(!$this->is_account) return;
+
+ /* Perform ADD / REMOVE ... for mail alternate / mail forwarding addresses
+ */
+ $this->execute();
+ if(isset($_POST['mail'])){
+ $this->mail = $_POST['mail'];
+ }
+ }
+
+ function PrepareForCopyPaste($source)
+ {
+ plugin::PrepareForCopyPaste($source);
+ /* Reset alternate mail addresses */
+ $this->gosaMailAlternateAddress = array();
+ }
+
+
+ /* Remove given ACL for given member (uid,mail) ..
+ */
+ function removeUserAcl($index )
+ {
+ if(isset($this->imapacl[$index])){
+ unset($this->imapacl[$index]);
+ }
+ }
+
+}
// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
?>