5050use OCP \IUserManager ;
5151use OCP \IUserSession ;
5252use OCP \L10N \IFactory ;
53+ use OCP \Security \ISecureRandom ;
5354
5455class UsersController extends OCSController {
5556
@@ -73,6 +74,8 @@ class UsersController extends OCSController {
7374 private $ newUserMailHelper ;
7475 /** @var FederatedFileSharingFactory */
7576 private $ federatedFileSharingFactory ;
77+ /** @var ISecureRandom */
78+ private $ secureRandom ;
7679
7780 /**
7881 * @param string $appName
@@ -87,6 +90,7 @@ class UsersController extends OCSController {
8790 * @param IFactory $l10nFactory
8891 * @param NewUserMailHelper $newUserMailHelper
8992 * @param FederatedFileSharingFactory $federatedFileSharingFactory
93+ * @param ISecureRandom $secureRandom
9094 */
9195 public function __construct (string $ appName ,
9296 IRequest $ request ,
@@ -99,7 +103,8 @@ public function __construct(string $appName,
99103 ILogger $ logger ,
100104 IFactory $ l10nFactory ,
101105 NewUserMailHelper $ newUserMailHelper ,
102- FederatedFileSharingFactory $ federatedFileSharingFactory ) {
106+ FederatedFileSharingFactory $ federatedFileSharingFactory ,
107+ ISecureRandom $ secureRandom ) {
103108 parent ::__construct ($ appName , $ request );
104109
105110 $ this ->userManager = $ userManager ;
@@ -112,6 +117,7 @@ public function __construct(string $appName,
112117 $ this ->l10nFactory = $ l10nFactory ;
113118 $ this ->newUserMailHelper = $ newUserMailHelper ;
114119 $ this ->federatedFileSharingFactory = $ federatedFileSharingFactory ;
120+ $ this ->secureRandom = $ secureRandom ;
115121 }
116122
117123 /**
@@ -164,11 +170,12 @@ public function getUsers(string $search = '', $limit = null, $offset = null): Da
164170 *
165171 * @param string $userid
166172 * @param string $password
173+ * @param string $email
167174 * @param array $groups
168175 * @return DataResponse
169176 * @throws OCSException
170177 */
171- public function addUser (string $ userid , string $ password , array $ groups = []): DataResponse {
178+ public function addUser (string $ userid , string $ password = '' , $ email = '' , array $ groups = []): DataResponse {
172179 $ user = $ this ->userSession ->getUser ();
173180 $ isAdmin = $ this ->groupManager ->isAdmin ($ user ->getUID ());
174181 $ subAdminManager = $ this ->groupManager ->getSubAdmin ();
@@ -193,6 +200,18 @@ public function addUser(string $userid, string $password, array $groups = []): D
193200 }
194201 }
195202
203+ $ generatePasswordResetToken = false ;
204+ if ($ password === '' ) {
205+ if ($ email === '' ) {
206+ throw new OCSException ('To send a password link to the user an email address is required. ' , 108 );
207+ }
208+
209+ $ password = $ this ->secureRandom ->generate (30 );
210+ // Make sure we pass the password_policy
211+ $ password .= $ this ->secureRandom ->generate (2 , '$!.,;:-~+*[]{}() ' );
212+ $ generatePasswordResetToken = true ;
213+ }
214+
196215 try {
197216 $ newUser = $ this ->userManager ->createUser ($ userid , $ password );
198217 $ this ->logger ->info ('Successful addUser call with userid: ' . $ userid , ['app ' => 'ocs_api ' ]);
@@ -202,7 +221,24 @@ public function addUser(string $userid, string $password, array $groups = []): D
202221 $ this ->logger ->info ('Added userid ' . $ userid . ' to group ' . $ group , ['app ' => 'ocs_api ' ]);
203222 }
204223
224+ // Send new user mail only if a mail is set
225+ if ($ email !== '' ) {
226+ $ newUser ->setEMailAddress ($ email );
227+ try {
228+ $ emailTemplate = $ this ->newUserMailHelper ->generateTemplate ($ newUser , $ generatePasswordResetToken );
229+ $ this ->newUserMailHelper ->sendMail ($ newUser , $ emailTemplate );
230+ } catch (\Exception $ e ) {
231+ $ this ->logger ->logException ($ e , [
232+ 'message ' => "Can't send new user mail to $ email " ,
233+ 'level ' => \OCP \Util::ERROR ,
234+ 'app ' => 'ocs_api ' ,
235+ ]);
236+ throw new OCSException ('Unable to send the invitation mail ' , 109 );
237+ }
238+ }
239+
205240 return new DataResponse ();
241+
206242 } catch (HintException $ e ) {
207243 $ this ->logger ->logException ($ e , [
208244 'message ' => 'Failed addUser attempt with hint exception. ' ,
0 commit comments