attrs['uid'][0])){
$this->uid = $this->attrs['uid'][0];
}
/* Pull arrays */
foreach(array("kolabDelegate", "kolabInvitationPolicy") as $attr){
if (isset($this->attrs["$attr"]["count"])){
$tmp = array();
for ($i= 0; $i<$this->attrs["$attr"]["count"]; $i++){
$tmp[]=$this->attrs["$attr"][$i];
}
$this->$attr = $tmp;
}
}
/* If this one is empty, preset with ACT_MANUAL for anonymous users */
if (count ($this->kolabInvitationPolicy) == 0){
$this->kolabInvitationPolicy= array("ACT_MANUAL");
}
/* Check is account state */
$this->is_account = false;
if(count($this->kolabDelegate)){
$this->is_account = true;
}
foreach(array("calFBURL","unrestrictedMailSize") as $attr){
if(!empty($this->$attr)){
$this->is_account = true;
}
}
/* Transfer account states for this union */
if (isset($this->parent->by_object['mailAccount']) && $this->parent->by_object['mailAccount']->is_account){
$this->mail_Account = true;
}elseif( isset($this->attrs) && isset($this->attrs['kolabHomeServer'])){
$this->mail_Account= true;
}else{
$this->is_account = false;
$this->mail_Account = false;
}
}
function execute()
{
/* Call parent execute */
plugin::execute();
/* Log view */
if($this->is_account && !$this->view_logged){
$this->view_logged = TRUE;
new log("view","users/".get_class($this),$this->dn);
}
/* Show tab dialog headers */
$display= "";
/* Show main page */
$smarty= get_smarty();
/* Load attributes */
foreach($this->attributes as $val){
$smarty->assign("$val", $this->$val);
}
$tmp = $this->plInfo();
foreach($tmp['plProvidedAcls'] as $acl => $description){
$smarty->assign($acl."ACL",$this->getacl($acl,$this->ReadOnly));
$smarty->assign($acl."_W", $this->acl_is_writeable($acl,$this->ReadOnly));
}
$smarty->assign("is_account" , $this->is_account);
if($this->ReadOnly){
$smarty->assign("is_removeable",false);
$smarty->assign("is_createable",false);
}else{
$smarty->assign("is_removeable",$this->acl_is_removeable());
$smarty->assign("is_createable",$this->acl_is_createable());
}
/* Check for invitation action */
$nr= 0;
while (isset($_POST["policy$nr"])){
if (isset($_POST["add$nr"])){
$this->kolabInvitationPolicy[]= ": ACT_MANUAL";
}
if (isset($_POST["remove$nr"])){
$new= array();
foreach ($this->kolabInvitationPolicy as $entry){
if (!preg_match("/^".$this->imapping[$nr].":/", $entry)){
$new[]= $entry;
}
}
$this->kolabInvitationPolicy= $new;
}
$nr++;
}
/* Unify addresses */
$new= array();
foreach($this->kolabInvitationPolicy as $value){
$address= preg_replace('/^([^:]+:).*$/', '\1', $value);
$new[$address]= $value;
}
$this->kolabInvitationPolicy= array();
foreach($new as $value){
$this->kolabInvitationPolicy[]= $value;
}
/* Add delegation */
if (isset($_POST['add_delegation'])){
if ($_POST['delegate_address'] != ""){
/* Valid email address specified? */
$address= $_POST['delegate_address'];
$valid= FALSE;
if (!is_email($address)){
if (!is_email($address, TRUE)){
print_red (_("You're trying to add an invalid email address to the list of delegations."));
}
} else {
$ldap= $this->config->get_ldap_link();
$ldap->cd ($this->config->current['BASE']);
$ldap->search('(mail='.$address.')',array("mail"));
if ($ldap->count() == 0){
print_red (_("The mail address you're trying to add is no primary mail address of an existing user."));
} else {
$valid= TRUE;
}
}
if ($valid){
/* Add it */
if ($this->acl_is_writeable("kolabDelegate")){
$this->addDelegate ($address);
$this->is_modified= TRUE;
}
}
}
}
/* Delete forward email addresses */
if ((isset($_POST['delete_delegation'])) && (isset($_POST['delegate_list']))){
if (count($_POST['delegate_list']) && $this->acl_is_writeable("kolabDelegate")){
$this->delDelegate ($_POST['delegate_list']);
}
}
/* Assemble policies */
$policies= array( 'ACT_ALWAYS_ACCEPT' => _("Always accept"),
'ACT_ALWAYS_REJECT' => _("Always reject"),
'ACT_REJECT_IF_CONFLICTS' => _("Reject if conflicts"),
'ACT_MANUAL_IF_CONFLICTS' => _("Manual if conflicts"),
'ACT_MANUAL' => _("Manual"));
$smarty->assign('policies', $policies);
/* Adjust checkbox */
if ($this->unrestrictedMailSize){
$smarty->assign('unrestrictedMailSizeState', "checked");
} else {
$smarty->assign('unrestrictedMailSizeState', "");
}
/* Transfer delegation list */
if (!count($this->kolabDelegate)){
/* Smarty will produce and tidy don't like that, so tell smarty to create no option (array();)*/
$smarty->assign("kolabDelegate", array());
} else {
$smarty->assign("kolabDelegate", $this->kolabDelegate);
}
$smarty->assign("mail_account",$this->mail_Account);
/* Create InvitationPolicy table */
$invitation= "";
$this->imapping= array();
$nr= 0;
$changeState = "";
foreach ($this->kolabInvitationPolicy as $entry){
if($this->acl_is_writeable("kolabInvitationPolicy")){
$changeState .= "changeState('address".$nr."'); \n changeState('policy".$nr."'); \n
changeState('add".$nr."'); \n changeState('remove".$nr."'); \n";
}
if(!$this->acl_is_writeable("kolabInvitationPolicy")){
$dis = " disabled ";
}else{
if($this->is_account){
$dis = " ";
}else{
$dis = " disabled ";
}
}
$invitation.= "
";
if(!$this->acl_is_readable("kolabInvitationPolicy")) {
}
/* The default entry does not have colons... */
if (!preg_match('/:/', $entry)){
$invitation.= _("Anonymous");
$name= "";
$mode= $entry;
} else {
$name= preg_replace('/:.*$/', '', $entry);
$mode= preg_replace('/^[^:]*: */', '', $entry);
if(!$this->acl_is_readable("kolabInvitationPolicy")){
$name='';
}
$invitation.= "";
}
$invitation.= " | ";
/* Add mode switch */
$invitation.= " $button |
\n";
$this->imapping[$nr]= $name;
$nr++;
}
$smarty->assign("invitation", $invitation);
$smarty->assign("changeState", $changeState);
$smarty->assign("kolabState",$this->is_account);
$display.= $smarty->fetch (get_template_path('kolab.tpl', TRUE, dirname(__FILE__)));
return ($display);
}
function remove_from_parent()
{
if(!$this->initially_was_account){
return;
}
/* Optionally execute a command after we're done */
plugin::remove_from_parent();
if(!in_array("kolabInetOrgPerson",$this->attrs['objectClass'])){
$this->attrs['objectClass'][] = "kolabInetOrgPerson";
}
$ldap = $this->config->get_ldap_linK();
$ldap->cd($this->config->current['BASE']);
$ldap->cd ($this->dn);
$ldap->modify($this->attrs);
/* Log last action */
new log("remove","users/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
$this->handle_post_events('remove',array("uid" => $this->uid));
show_ldap_error($ldap->get_error(), sprintf(_("Removing of user/kolab account with dn '%s' failed."),$this->dn));
}
function check()
{
/* Call common method to give check the hook */
$message= plugin::check();
/* FBFuture is in days... */
if ($this->kolabFreeBusyFuture != "" && !preg_match('/^[0-9]+$/', $this->kolabFreeBusyFuture)){
$message[]= _("The value specified as Free Busy future needs to be an integer.");
}
/* Check for URL scheme... */
if(!empty($this->calFBURL) && !preg_match("/http+(s)*:\/\//",$this->calFBURL)){
$message[]= _("The value specified as Free Busy Information URL is invalid.");
}
/* Check invitation policy for existing mail addresses */
foreach($this->kolabInvitationPolicy as $policy){
/* Ignore anonymous string */
if (!preg_match('/:/', $policy)){
continue;
}
$address= preg_replace('/^([^:]+).*$/', '\1', $policy);
if (!is_email($address)){
if (!is_email($address, TRUE)){
$message[]= sprintf(_("The invitation policy entry for address '%s' is not valid."), $address);
}
} else {
$ldap= $this->config->get_ldap_link();
$ldap->cd ($this->config->current['BASE']);
$ldap->search('(mail='.$address.')',array("mail"));
if ($ldap->count() == 0){
$message[]= sprintf(_("There's no mail user with address '%s' for your invitation policy!"), $address);
} else {
$valid= TRUE;
}
}
}
return ($message);
}
/* Save data to object */
function save_object()
{
/* Do we need to flip is_account state? */
if (isset($_POST['connectivityTab'])){
if(isset($_POST["kolabState"])){
if($this->acl_is_createable()){
$this->is_account = true;
}
}else{
if($this->acl_is_removeable()){
$this->is_account = false;
}
}
if ($this->acl_is_writeable("unrestrictedMailSize")){
if (isset($_POST['unrestrictedMailSize']) && $_POST['unrestrictedMailSize'] == 1){
$this->unrestrictedMailSize= 1;
} else {
$this->unrestrictedMailSize= 0;
}
}
}
plugin::save_object();
/* Save changes done in invitation policies */
if($this->acl_is_writeable("kolabInvitationPolicy")){
$nr= 0;
$this->kolabInvitationPolicy= array();
while (isset($_POST["policy$nr"])){
/* Anonymous? */
if (!isset($_POST["address$nr"])){
$this->kolabInvitationPolicy[]= $_POST["policy$nr"];
} else {
$this->kolabInvitationPolicy[]= $_POST["address$nr"].": ".$_POST["policy$nr"];
}
$nr++;
}
/* If this one is empty, preset with ACT_MANUAL for anonymous users */
if (count ($this->kolabInvitationPolicy) == 0){
$this->kolabInvitationPolicy= array("ACT_MANUAL");
}
}
}
/* Save to LDAP */
function save()
{
/* Check mailmethod before doing something useful */
plugin::save();
/* Transfer arrays */
$this->attrs['kolabDelegate']= $this->kolabDelegate;
$this->attrs['kolabInvitationPolicy']= $this->kolabInvitationPolicy;
/* unrestrictedMailSize is boolean */
if($this->attrs['unrestrictedMailSize']){
$this->attrs['unrestrictedMailSize'] = "TRUE";
}else{
$this->attrs['unrestrictedMailSize'] = "FALSE";
}
/* Write back to ldap */
$ldap= $this->config->get_ldap_link();
$ldap->cd($this->dn);
$this->cleanup();
$ldap->modify ($this->attrs);
/* Log last action */
if($this->initially_was_account){
new log("modify","users/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
}else{
new log("create","users/".get_class($this),$this->dn,array_keys($this->attrs),$ldap->get_error());
}
show_ldap_error($ldap->get_error(), sprintf(_("Saving of user/kolab account with dn '%s' failed."),$this->dn));
/* Optionally execute a command after we're done */
if ($this->initially_was_account == $this->is_account){
if ($this->is_modified){
$this->handle_post_events("modify",array("uid" => $this->uid));
}
} else {
$this->handle_post_events("add",array("uid" => $this->uid));
}
}
/* Add entry to delegation list */
function addDelegate($address)
{
$this->kolabDelegate[]= $address;
$this->kolabDelegate= array_unique ($this->kolabDelegate);
sort ($this->kolabDelegate);
reset ($this->kolabDelegate);
$this->is_modified= TRUE;
}
function delDelegate($addresses)
{
$this->kolabDelegate= array_remove_entries ($addresses, $this->kolabDelegate);
$this->is_modified= TRUE;
}
/* Return plugin informations for acl handling */
function plInfo()
{
return (array(
"plShortName" => _("Kolab"),
"plDescription" => _("Kolab account settings")." : "._("Connectivity addon")."",
"plSelfModify" => TRUE,
"plDepends" => array("user"),
"plPriority" => 20, // Position in tabs
"plSection" => array("personal" => _("My account")),
"plCategory" => array("users"),
"plOptions" => array(),
"plProvidedAcls" => array(
"kolabFreeBusyFuture" => _("Free busy future"),
"unrestrictedMailSize" => _("Mail size restriction"),
"calFBURL" => _("Free busy information"),
"kolabDelegate" => _("Delegations"),
"kolabInvitationPolicy" => _("Invitation policy"))
));
}
}
// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
?>