#!/usr/bin/php
<?php
// checks
if(posix_getuid()!=0 and posix_getuid()!=33){ // root or www-data
    $msg = 'ERROR: 7i4ucs: not root or www-data - stopping.';
    echo $msg."\n";
    system("sapp -l '$msg'");
    return;
}
// call
$function = $argv[1];
$para = (isset($argv[2])) ? $argv[2] : '';
system("sapp -l '7i4ucs $function $para'");
$function($para);
return;
// DEPRECATED /////////////////////////////////////////////////////////////
function udm($inAction = 'auto') { // reset, remove
    echo "7i4ucs udm (deprecated)\n";
}
// ------------------------------------------------------------------------
function postinst($inSolution) {
    Postinst('7i4ucs-'.strtolower($inSolution));
}
// ------------------------------------------------------------------------
function postrm($inSolution) {
    Postrm('7i4ucs-'.strtolower($inSolution));
}
// INSTALLATION ///////////////////////////////////////////////////////////
function PostinstEcho($inPackage) {
    $script = array();
    $script[] = '. /usr/share/univention-lib/all.sh';
    $script[] = '';
    if($inPackage=='7i4ucs-123'){
        $script[] = 'call_joinscript 70iiiiiii4ucs-123.inst';
        $script[] = '';
    }
    $script[] = 'eval "$(7i4ucs UcsWebUnsetEcho '.$inPackage.')"';
    $script[] = 'eval "$(7i4ucs UcsWebSetEcho '.$inPackage.')"';
    $script[] = '';
    $script[] = '/etc/init.d/apache2 reload';
    $script[] = '';
    echo implode("\n", $script);
}
// ------------------------------------------------------------------------
function PrermEcho($inPackage) {
    $script = array();
    $script[] = '. /usr/share/univention-lib/all.sh';
    $script[] = '. /usr/share/univention-join/joinscripthelper.lib';
    $script[] = '';
    $script[] = 'eval "$(7i4ucs UcsWebUnsetEcho '.$inPackage.')"';
    $script[] = '';
    if($inPackage=='7i4ucs-123'){
        $script[] = 'if [ "$1" = "remove" ]; then';
        $script[] = '   cp /usr/lib/univention-uninstall/71iiiiiii4ucs-123-uninstall.uinst /usr/lib/univention-install/';
        $script[] = 'fi';
        $script[] = '';
        $script[] = 'if [ "$1" = "remove" ]; then';
        $script[] = '   call_unjoinscript 71iiiiiii4ucs-123-uninstall.uinst';
        $script[] = 'fi';
        $script[] = '';
    }
    echo implode("\n", $script);
}
// ------------------------------------------------------------------------
function UcsWebSetEcho($inPackage) {
    if(stripos($inPackage, 'common')!==false)
        return;
    $package = (str_replace('7i4ucs-', '', $inPackage));
    $app = strtolower($package);
    $App = (substr($package, 0, 2)=='7i') ? '7i'.ucfirst(substr($package, 2)) : ucfirst($package);
    $App = ($App=='123') ? '1-2-3 Quickstart' : $App;
    $attr = "ucs/web/overview/entries/service/7i4ucs-{$app}";
    $cmd = "univention-config-registry set"
            ." {$attr}/label?'$App'"
            ." {$attr}/label/de?'$App'"
            ." {$attr}/description?'Access to $App'"
            ." {$attr}/description/de?'Zugriff auf $App'"
            ." {$attr}/priority?'33'"
            ." {$attr}/icon?'/icon/7i4ucs-$app.png'"
            ." {$attr}/link?'/site-app/.redirect/ucs/ucsweb.php?app=$app'" // old: {$attr}/link?'/7iapp/home-$app'
            ." >/dev/null 2>&1";
    echo $cmd;
}
// ------------------------------------------------------------------------
function UcsWebUnsetEcho($inPackage) {
    if(stripos($inPackage, 'common')!==false)
        return;
    $package = (str_replace('7i4ucs-', '', $inPackage));
    $app = strtolower($package);
    $attr = "ucs/web/overview/entries/service/7i4ucs-".strtolower($app);
    $cmd = "univention-config-registry unset"
            ." {$attr}/label"
            ." {$attr}/label/de"
            ." {$attr}/description"
            ." {$attr}/description/de"
            ." {$attr}/priority"
            ." {$attr}/icon"
            ." {$attr}/link"
            ." &>/dev/null 2>&1";
    echo $cmd;
}
// ------------------------------------------------------------------------
function UcsServiceAddEcho($inDummy = '') {
    $script = array();
    $script[] = 'ucs_addServiceToLocalhost "7i" "$@"';
    echo __UdmScript2CmdGet($script);
}
// ------------------------------------------------------------------------
function UcsServiceDeleteEcho($inDummy = '') {
    $script = array();
    $script[] = 'ucs_removeServiceFromLocalhost "7i" "$@" || die';
    echo __UdmScript2CmdGet($script);
}
// ------------------------------------------------------------------------
function UcsLdapRegisterEcho($inDummy = '') {
    $script = array();
    $script[] = 'ucs_registerLDAPExtension "$@" --schema /usr/share/7i4ucs-schema/7i4ucs-schema.schema';
    echo __UdmScript2CmdGet($script);
}
// ------------------------------------------------------------------------
// function UcsLdapUnregisterEcho($inDummy = '') { // do not use
//     $script = array();
//     $script[] = 'ucs_unregisterLDAPExtension "$@" --schema 7i4ucs-schema';
//     echo __UdmScript2CmdGet($script);
// }
// ------------------------------------------------------------------------
function UdmContainerCreateEcho($inDummy = '') {
    $script = array();
    $script[] = 'univention-directory-manager container/cn create "$@" --ignore_exists \ ';
    $script[] = '    --position "cn=custom attributes,cn=univention,$ldap_base" \ ';
    $script[] = '    --set name="7i" \ ';
    $script[] = '    --set description="Attributes for 7iApps configuration" \ ';
    $return[] = '    || die \ ';
    $script[] = '';
    $script[] = 'univention-directory-manager container/cn create "$@" --ignore_exists \ ';
    $script[] = '    --position "$ldap_base" \ ';
    $script[] = '    --set name="7i" \ ';
    $return[] = '    || die \ ';
    $script[] = '';
    echo __UdmScript2CmdGet($script);
}
// ------------------------------------------------------------------------
function UdmContainerDeleteEcho($inDummy = '') {
    $script = array();
    $script[] = 'univention-directory-manager container/cn remove "$@" --dn "cn=7i,cn=custom attributes,cn=univention,$ldap_base" \ ';
    $return[] = '|| die \ ';
    $return[] = '';
    echo __UdmScript2CmdGet($script);
}
// ------------------------------------------------------------------------
function UdmFieldResetEcho($inField) {
    echo __UdmScript2CmdGet(__UdmScriptFieldCreateGet($inField));
    echo __UdmScript2CmdGet(__UdmScriptFieldModifyGet($inField));
}
// ------------------------------------------------------------------------
function UdmFieldDeleteEcho($inField) {
    echo __UdmScript2CmdGet(__UdmScriptFieldDeleteGet($inField));
}
// ------------------------------------------------------------------------
function UdmServerRestartEcho($inDummy = '') {
    $script = array();
    $script[] = 'stop_udm_cli_server';
    echo __UdmScript2CmdGet($script);
}
// ------------------------------------------------------------------------
function __UdmScriptFieldCreateGet($id) {
    $short = '';
    $shortDE = '';
    switch($id){
        case 'type':
            $short = 'Type (Warning: *None* will delete user data.)';
            $shortDE = 'Typ (Achtung: *None* löscht alle Benutzer-Daten.)';
            break;
        case 'site-home':
        case 'site-test':
        case 'site-sites':
            $short = substr($id, strpos($id, '-')+1);
            $shortDE = $short;
            break;
        default: // app-*
            $short = ucfirst(substr($id, strpos($id, '-')+1));
            $shortDE = $short;
            break;
    }
    $return = array();
    $return[] = 'univention-directory-manager settings/extended_attribute create "$@" --ignore_exists \ ';
    $return[] = '    --position "cn=7i,cn=custom attributes,cn=univention,$ldap_base" \ ';
    $return[] = '    --set name="iiiiiii4ucs-user-'.$id.'" \ ';
    $return[] = '    --set objectClass="iiiiiii4ucs-user" \ ';
    $return[] = '    --set module="users/user" \ ';
    $return[] = '    --set ldapMapping="iiiiiii4ucs-user-'.$id.'" \ ';
    $return[] = '    --set shortDescription="'.$short.'" \ ';
    $return[] = '    --set translationShortDescription=\'"de_DE" "'.$shortDE.'"\' \ ';
    $return[] = '    || die \ ';
    $return[] = '';
    return $return;
}
// ------------------------------------------------------------------------
function __UdmScriptFieldModifyGet($id) {
    $syntax = 'boolean';
    $hook = '';
    $multivalue = '';
    $default = '';
    $short = '';
    $shortDE = '';
    $grouppos = '';
    $groupname = '';
    $groupnameDE = '';
    $long = '';
    $longDE = '';
    switch($id){
        case 'type':
            $syntax = 'iiiiiii4ucsUserType';
            $hook = 'iiiiiii4ucsUserType';
            $default = 'user';
            $grouppos = '1';
            $groupname = 'User type';
            $groupnameDE = 'Benutzer-Typ';
            $long = 'Select the 7iApps role for this user. Warning: by changing the role to *None* all 7iApps-related user data will get deleted.';
            $longDE = 'Wählt die 7iApps-Rolle für den Benutzer. Achtung: wenn Sie die Rolle *None* wählen, werden alle 7iApps-bezogene Benutzer-Daten gelöscht.';
            break;
        case 'site-home':
        case 'site-test':
        case 'site-sites':
            $syntax = ($id=='site-sites') ? 'string' : $syntax;
            $multivalue = ($id=='site-sites') ? '1' : '';
            $default = ($id=='site-sites') ? '' : '1';
            $grouppos = '3';
            $groupname = 'Access to sites';
            $groupnameDE = 'Zugriff auf Sites';
            $long = 'Has access to the site';
            $longDE = 'Kann auf die Site zugreifen';
            break;
        default: // app-*
            $default = '1';
            $grouppos = '2';
            $groupname = 'Access to apps  (if installed)';
            $groupnameDE = 'Zugriff auf Apps (wenn installiert)';
            $long = 'Has access to the app';
            $longDE = 'Kann auf die App zugreifen';
            break;
    }
    $return = array();
    $return[] = 'univention-directory-manager settings/extended_attribute modify "$@" \ ';
    $return[] = '    --dn "cn=iiiiiii4ucs-user-'.$id.',cn=7i,cn=custom attributes,cn=univention,$ldap_base" \ ';
    $return[] = '    --set tabName="7iApps" \ ';
    $return[] = '    --set mayChange="1" \ ';
    $return[] = '    --set syntax="'.$syntax.'" \ ';
    $return[] = (empty($hook)) ? '' : '    --set hook="'.$hook.'" \ ';
    $return[] = (empty($default)) ? '' : '    --set default="'.$default.'" \ ';
    $return[] = (empty($multivalue)) ? '' : '    --set multivalue="'.$multivalue.'" \ ';
    $return[] = '    --set groupPosition="'.$grouppos.'" \ ';
    $return[] = '    --set groupName="'.$groupname.'" \ ';
    $return[] = '    --set translationGroupName=\'"de_DE" "'.$groupnameDE.'"\' \ ';
    $return[] = '    --set longDescription="'.$long.'" \ ';
    $return[] = '    --set translationLongDescription=\'"de_DE" "'.$longDE.'"\' \ ';
    foreach($return as $id => $val){
        if(empty($val))
            unset($return[$id]);
    }
    $return[] = '    || die \ ';
    $return[] = '';
    return $return;
}
// ------------------------------------------------------------------------
function __UdmScriptFieldDeleteGet($id) {
    $return = array();
    $return[] = 'univention-directory-manager settings/extended_attribute remove "$@" --dn "cn=iiiiiii4ucs-user-'.$id.',cn=7i,cn=custom attributes,cn=univention,$ldap_base" \ ';
    $return[] = '    || die \ ';
    $return[] = '';
    return $return;
}
// ------------------------------------------------------------------------
function __UdmScript2CmdGet($inArray = array()) {
    $return = '';
    foreach($inArray as $id => $val)
        $return .= trim($val)."\n";
    return $return;
}
// LISTENER ///////////////////////////////////////////////////////////////
function Listener($inFilename) {
    echo $inFilename;
    if(!file_exists($inFilename)){
        $msg = "ERROR: 7i4ucs: file missing: $inFilename";
        echo $msg."\n";
        return;
    }
    // Read input file
    $data = array();
    foreach(explode("\n", file_get_contents($inFilename)) as $line){
        if(empty($line))
            continue;
        $line = trim($line);
        $group = substr($line, 0, 3);
        $line = substr($line, 4);
        $pos = strpos($line, '=');
        $var = substr($line, 0, $pos);
        $value = substr($line, $pos+1);
        $data[$group][$var][] = $value;
    }
    // UserReset & UserDelete
    if(isset($data['new'])){
        if($data['new']['iiiiiii4ucs-user-type'][0]=='none'){
            __ListenerUserDelete($data['new']);
        }else{
            __ListenerUserReset($data['new']);
        }
        unlink($inFilename);
    }elseif(isset($data['old'])){
        __ListenerUserDelete($data['old']);
        unlink($inFilename);
    }else{
        echo "7i4ucs: ERROR: no new or old variable";
    }
}
// ------------------------------------------------------------------------
function __ListenerUserReset($inData) {
    $user = $inData['uid'][0];
    system("sapp -l '7i4ucs listener-userreset($user)'");
    $pwd = '';
    $role = ($inData['iiiiiii4ucs-user-type'][0]=='admin') ? 'admin' : 'user'; // Contact => User
    $role = ($user=='Administrator') ? 'admin' : $role; // Administrator => admin
    // apps
    $apps = __ListenerAppArrayGet(); // installed apps
    foreach($apps as $app => $dummy){
        $apps[$app] = (@$inData['iiiiiii4ucs-user-app-'.$app][0]=='1') ? '1' : '0';
        if($app=='123'){
            $apps[$app] = ($role=='admin') ? '1' : '0';
        }
    }
    $appstr = '';
    foreach($apps as $app => $appaccess)
        $appstr .= ($appaccess=='1') ? "$app;" : '';
    // sites
    $sitestr = '';
    $sitestr .= (@$inData['iiiiiii4ucs-user-site-home'][0]=='1') ? 'home;' : '';
    $sitestr .= (@$inData['iiiiiii4ucs-user-site-test'][0]=='1') ? 'test;' : '';
    if(isset($inData['iiiiiii4ucs-user-site-sites'])){
        foreach($inData['iiiiiii4ucs-user-site-sites'] as $val)
            $sitestr .= "$val;";
    }
    // execute
    $event = 'user-app-site-resetdelete';
    system("sapp -E 'event={$event}, site=({$sitestr}), app=({$appstr}), user={$user}, password={$pwd}, role={$role}'");
}
// ------------------------------------------------------------------------
function __ListenerUserDelete($inData) {
    $user = $inData['uid'][0];
    system("sapp -l '7i4ucs listener-userdelete($user)'");
    system("sapp -E 'event=user-delete, user={$user}'");
}
// ------------------------------------------------------------------------
function __ListenerAppArrayGet() {
    $return = array();
    ob_start();
    system("dpkg --get-selections | grep '\binstall\b' | awk '{print $1}'");
    $str = ob_get_clean();
    foreach(explode("\n", $str) as $val){
        if(substr($val, 0, strlen('7i4ucs-common'))=='7i4ucs-common')
            continue;
        if(substr($val, 0, strlen('7i4ucs-'))!='7i4ucs-')
            continue;
        $id = substr($val, strlen('7i4ucs-'));
        $return[$id] = '';
    }
    return $return;
}
// ------------------------------------------------------------------------
?>