\documentclass{article}
\usepackage{ulem}
\pagestyle{headings}
\begin{document}
\part{ Removing User Data}
Starting with version 5.1.5, Horde includes a \texttt{horde-remove-user-data} script that can be run on the command line.

\section{ Modifying the default script to remove interactivity}
You may want to call the \texttt{horde-remove-user-data} script from another script, providing a user to delete as an argument.\newline
In order to do this, you need to use a modified version of the script.\newline
\begin{verbatim}
#!/usr/bin/env php
<?php
/**
 * This script will delete all user data for a given user.
 *
 * Copyright 2013 Horde LLC (http://www.horde.org/)
 *
 * See the enclosed file COPYING for license information (LGPL-2). If you
 * did not receive this file, see http://www.horde.org/licenses/lgpl.
 *
 * @author    Michael Slusarz <slusarz@horde.org>
 * @category  Horde
 * @copyright 2013 Horde LLC
 * @license   http://www.horde.org/licenses/lgpl LGPL-2
 * @package   Horde
 */

$baseFile = __DIR__ . '/../lib/Application.php';
if (file_exists($baseFile)) {
    require_once $baseFile;
} else {
    require_once 'PEAR/Config.php';
    require_once PEAR_Config::singleton()
        ->get('horde_dir', null, 'pear.horde.org') . '/lib/Application.php';
}
Horde_Registry::appInit('horde', array(
    'authentication' => 'none',
    'cli' => true,
    'user_admin' => true
));

$config=getopt("u");
$user=$config["u"];
$app = null;

$cli->writeln();

try {
    $registry->removeUserData($user, $app);
    $cli->message('Data removed.', 'cli.success');
} catch (Horde_Exception $e) {
    $cli->fatal($e->getMessage());
}
\end{verbatim}

You would call the script like this:\newline
\texttt{horde-remove-user-data user@domain.com}

Colortext: NIThe examples below are for older Horde versions.Colortext: NI

\section{ Using the removeUserData APIs of Horde 5}
\begin{verbatim}
#!/usr/bin/env php
<?php

if (file_exists(__DIR__ . '/../lib/Application.php')) {
    $baseDir = __DIR__;
} else {
    require_once 'PEAR/Config.php';
    $baseDir = PEAR_Config::singleton()
        ->get('horde_dir', null, 'pear.horde.org') . '/kronolith/';
}
require_once  $baseDir . '/lib/Application.php';

Horde_Registry::appInit('horde', array('cli' => true, 'user_admin' => true));

/* remove single user
$value = '<user>';
$cli->writeln('Remove user data of ' . $value);
$registry->removeUserData($value);*/

// remove users on command line
for($i = 1; $i < $argc; ++$i) {
    $value = $argv[$i];
    $cli->writeln('Remove user data of ' . $value);
    $registry->removeUserData($value);
}
\end{verbatim}

\section{ Using the removeUserData APIs}
From dom.lalot at gmail com

\begin{verbatim}
#!/usr/bin/env php
<?php
@define('AUTH_HANDLER', true);
@define('HORDE_BASE', dirname(__FILE__));
# require_once HORDE_BASE . '/lib/base.php';
// Do CLI checks and environment setup first.
require_once HORDE_BASE . '/lib/core.php';
require_once 'Horde/CLI.php';
// Make sure no one runs this from the web.
if (!Horde_CLI::runningFromCLI()) {
    exit("Must be run from the command line\n");
}
// Load the CLI environment - make sure there's no time limit, init some
// variables, etc.
$cli = &Horde_CLI::singleton();
$cli->init();
// Include needed libraries.
require_once HORDE_BASE . '/lib/base.php';
// Authenticate as administrator.
if (!count($conf['auth']['admins'])) {
    exit("You must have at least one administrator configured to run the alarms.php script.\n");
}
$auth = &Auth::singleton($conf['auth']['driver']);
$auth->setAuth($conf['auth']['admins'][0], array());
require_once HORDE_BASE . '/lib/Horde/Auth.php';
global $conf;
require_once 'DB.php';
$db = &DB::connect($conf['sql']);
if (is_a($db, 'PEAR_Error')) {
    Horde::fatal($db, __FILE__, __LINE__);
}
$validusers=$auth->listUsers();
$valides=count($validusers);
if ($valides==0){
   echo "Can't list users, your auth driver has no listusers capability\n";
   exit;
}
echo "$valides valid users found\n";
$valides=array();
foreach($validusers as $value){
   $valides[$value]=1;
}
// Looking at prefs to get most of old user data
$db->setOption('portability', DB_PORTABILITY_LOWERCASE | DB_PORTABILITY_ERRORS);
$result = $db->query('SELECT pref_uid FROM horde_prefs WHERE 1');
if (is_a($result, 'PEAR_Error')) {
   $cli->message($result->toString(), 'cli.error');
   exit;
}

$uid = array();
while ($row = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
   $login=$row['pref_uid'];
    $uid[$login] = $login;
}
$total=count($uid);
echo "$total data user found\n";
echo "Exit without removing data, change the script please\n";
exit; # Drop this line if you want to remove data

//now compare valid and data found and purge
foreach ($uid as $value) {
   if (!array_key_exists($value,$valides)){
      echo "Not Found $value\n";
      Auth::removeUserData($value);
      $supp++;
   }
}
echo "suppressed $supp\n";
?>
\end{verbatim}

\end{document}
