1<?php
2/* Copyright (c) 1998-2016 ILIAS open source, Extended GPL, see docs/LICENSE */
3
4/**
5 * Class ilServicesUserTasks
6 *
7 * @author Maximilian Becker <mbecker@databay.de>
8 * @version $Id$
9 *
10 */
11class ilServicesUserTasks
12{
13    const ANON_FIRSTNAME 		= 'Anonymous';
14    const ANON_LASTNAME  		= 'Exam-User';
15    const ANON_LOGIN_PREFIX 	= 'EX-';
16    const ANON_GENDER			= 'm';
17    const PASSWORD_CHARACTERSET	= 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
18
19    /**
20     * @param ilNode $context
21     * @param array  $params
22     *
23     * @return array
24     */
25    public static function createAnonymousUsers($context, $params)
26    {
27        $input_params = $params[0];
28        $output_params =$params[1];
29
30        // IN: useridlist
31        // OUT: anonaccountlist, userIdList
32
33        $pseudonymousUserMap = array();
34        $discloseMap = array();
35        $usrIdList = array();
36
37        foreach ($input_params['usrIdList'] as $user_id) {
38            $source_user = new ilObjUser($user_id, false);
39            $anon_login = self::getValidLogin();
40            $anon_password = self::generatePassword();
41            $new_id = self::createUser(
42                $anon_login,
43                $anon_password,
44                $source_user->getEmail()
45            );
46
47            $pseudonymousUserMap[] = array(
48                'Original User' => $user_id,
49                'Anonymous User' => $new_id
50            );
51
52            $discloseMap[] = array(
53                'Original User' 			=> $user_id,
54                'Original Login' 			=> $source_user->getLogin(),
55                'Original Firstname' 		=> $source_user->getFirstname(),
56                'Original Lastname' 		=> $source_user->getLastname(),
57                'Original Matriculation' 	=> $source_user->getMatriculation(),
58                'Original Gender' 			=> $source_user->getGender(),
59                'Original EMail' 			=> $source_user->getEmail(),
60                'Anon User' 				=> $new_id,
61                'Anon Login' 				=> $anon_login,
62                'Anon Password' 			=> $anon_password
63            );
64
65            $usrIdList[] = $new_id;
66        }
67
68        return array($output_params[0] => $discloseMap);
69    }
70
71    /**
72     * @return string
73     */
74    protected static function getValidLogin()
75    {
76        $random = new \ilRandom();
77        do {
78            $login = self::ANON_LOGIN_PREFIX . str_pad($random->int(0, 9999999), 7, STR_PAD_LEFT);
79        } while (ilObjUser::_loginExists($login));
80
81        return $login;
82    }
83
84    /**
85     * @param int $length
86     *
87     * @return string
88     */
89    protected static function generatePassword($length = 8)
90    {
91        $random = new \ilRandom();
92        $password = array();
93        $setLength = strlen(self::PASSWORD_CHARACTERSET) - 1;
94
95        for ($i = 0; $i < $length; $i++) {
96            $index = $random->int(0, $setLength);
97            $password[] = self::PASSWORD_CHARACTERSET[$index];
98        }
99
100        return implode($password);
101    }
102
103    /**
104     * @param string $login
105     * @param string $password
106     * @param string $email
107     *
108     * @return int
109     */
110    protected static function createUser($login, $password, $email)
111    {
112        global $DIC;
113        $rbacadmin = $DIC['rbacadmin'];
114
115        $user = new ilObjUser();
116        $user->setTimeLimitUnlimited(true);
117        $user->setFirstname(self::ANON_FIRSTNAME);
118        $user->setLastname(self::ANON_LASTNAME);
119        $user->setEmail($email);
120        $user->setGender(self::ANON_GENDER);
121        $user->setPasswd($password, IL_PASSWD_PLAIN);
122        $user->setLogin($login);
123        $user->setActive(true, 6);
124        $user->create();
125
126        $user->setLastPasswordChangeTS(0);
127        $user->saveAsNew();
128
129        $user->setPref('send_info_mails', 'n');
130        $user->writePrefs();
131
132        $rbacadmin->assignUser(4, $user->getId(), true);
133
134        return $user->getId();
135    }
136
137    /**
138     * @param ilNode $context
139     * @param array  $params
140     */
141    public static function repersonalizeUsers($context, $params)
142    {
143        // IN: discloseMap
144        $input_params = $params[0];
145        $output_params =$params[1];
146
147        foreach ($input_params['discloseMap'] as $disclose_entry) {
148            $anon_user = new ilObjUser($disclose_entry['Anon User'], false);
149            $anon_user->setFirstname($disclose_entry['Original Firstname']);
150            $anon_user->setLastname($disclose_entry['Original Lastname']);
151            $anon_user->setMatriculation($disclose_entry['Original Matriculation']);
152            $anon_user->setGender($disclose_entry['Original Gender']);
153            $anon_user->update();
154        }
155
156        // OUT: void
157    }
158}
159