00001 <?php
00002
00016
00017
00018
00019 import('xml.XMLParser');
00020
00021 class UserXMLParser {
00022
00024 var $parser;
00025
00027 var $usersToImport;
00028
00030 var $importedUsers;
00031
00033 var $errors;
00034
00036 var $journalId;
00037
00042 function UserXMLParser($journalId) {
00043 $this->parser = &new XMLParser();
00044 $this->journalId = $journalId;
00045 }
00046
00052 function &parseData($file) {
00053 $roleDao = &DAORegistry::getDAO('RoleDAO');
00054
00055 $success = true;
00056 $this->usersToImport = array();
00057 $tree = $this->parser->parse($file);
00058
00059 $journalDao = &DAORegistry::getDAO('JournalDAO');
00060 $journal = &$journalDao->getJournal($this->journalId);
00061 $journalPrimaryLocale = Locale::getPrimaryLocale();
00062
00063 $site = &Request::getSite();
00064 $siteSupportedLocales = $site->getSupportedLocales();
00065
00066 if ($tree !== false) {
00067 foreach ($tree->getChildren() as $user) {
00068 if ($user->getName() == 'user') {
00069
00070 $newUser = &new ImportedUser();
00071
00072 foreach ($user->getChildren() as $attrib) {
00073 switch ($attrib->getName()) {
00074 case 'username':
00075
00076 $newUser->setUsername(strtolower($attrib->getValue()));
00077 break;
00078 case 'password':
00079 $newUser->setMustChangePassword($attrib->getAttribute('change') == 'true'?1:0);
00080 $encrypted = $attrib->getAttribute('encrypted');
00081 if (isset($encrypted) && $encrypted !== 'plaintext') {
00082 $ojsEncryptionScheme = Config::getVar('security', 'encryption');
00083 if ($encrypted != $ojsEncryptionScheme) {
00084 $this->errors[] = Locale::translate('plugins.importexport.users.import.encryptionMismatch', array('importHash' => $encrypted, 'ojsHash' => $ojsEncryptionScheme));
00085 }
00086 $newUser->setPassword($attrib->getValue());
00087 } else {
00088 $newUser->setUnencryptedPassword($attrib->getValue());
00089 }
00090 break;
00091 case 'salutation':
00092 $newUser->setSalutation($attrib->getValue());
00093 break;
00094 case 'first_name':
00095 $newUser->setFirstName($attrib->getValue());
00096 break;
00097 case 'middle_name':
00098 $newUser->setMiddleName($attrib->getValue());
00099 break;
00100 case 'last_name':
00101 $newUser->setLastName($attrib->getValue());
00102 break;
00103 case 'initials':
00104 $newUser->setInitials($attrib->getValue());
00105 break;
00106 case 'gender':
00107 $newUser->setGender($attrib->getValue());
00108 break;
00109 case 'affiliation':
00110 $newUser->setAffiliation($attrib->getValue());
00111 break;
00112 case 'email':
00113 $newUser->setEmail($attrib->getValue());
00114 break;
00115 case 'url':
00116 $newUser->setUrl($attrib->getValue());
00117 break;
00118 case 'phone':
00119 $newUser->setPhone($attrib->getValue());
00120 break;
00121 case 'fax':
00122 $newUser->setFax($attrib->getValue());
00123 break;
00124 case 'mailing_address':
00125 $newUser->setMailingAddress($attrib->getValue());
00126 break;
00127 case 'country':
00128 $newUser->setCountry($attrib->getValue());
00129 break;
00130 case 'signature':
00131 $locale = $attrib->getAttribute('locale');
00132 if (empty($locale)) $locale = $journalPrimaryLocale;
00133 $newUser->setInterests($attrib->getValue(), $locale);
00134 break;
00135 case 'interests':
00136 $locale = $attrib->getAttribute('locale');
00137 if (empty($locale)) $locale = $journalPrimaryLocale;
00138 $newUser->setInterests($attrib->getValue(), $locale);
00139 break;
00140 case 'biography':
00141 $locale = $attrib->getAttribute('locale');
00142 if (empty($locale)) $locale = $journalPrimaryLocale;
00143 $newUser->setBiography($attrib->getValue(), $locale);
00144 break;
00145 case 'locales':
00146 $locales = array();
00147 foreach (explode(':', $attrib->getValue()) as $locale) {
00148 if (Locale::isLocaleValid($locale) && in_array($locale, $siteSupportedLocales)) {
00149 array_push($locales, $locale);
00150 }
00151 }
00152 $newUser->setLocales($locales);
00153 break;
00154 case 'role':
00155 $roleType = $attrib->getAttribute('type');
00156 if ($this->validRole($roleType)) {
00157 $role = &new Role();
00158 $role->setRoleId($roleDao->getRoleIdFromPath($roleType));
00159 $newUser->addRole($role);
00160 }
00161 break;
00162 }
00163 }
00164 array_push($this->usersToImport, $newUser);
00165 }
00166 }
00167 }
00168
00169 return $this->usersToImport;
00170 }
00171
00178 function importUsers($sendNotify = false, $continueOnError = false) {
00179 $success = true;
00180 $this->importedUsers = array();
00181 $this->errors = array();
00182
00183 $userDao = &DAORegistry::getDAO('UserDAO');
00184 $roleDao = &DAORegistry::getDAO('RoleDAO');
00185
00186 if ($sendNotify) {
00187
00188 import('mail.MailTemplate');
00189 $mail = &new MailTemplate('USER_REGISTER');
00190
00191 $journalDao = &DAORegistry::getDAO('JournalDAO');
00192 $journal = &$journalDao->getJournal($this->journalId);
00193 $mail->setFrom($journal->getSetting('contactEmail'), $journal->getSetting('contactName'));
00194 }
00195
00196 for ($i=0, $count=count($this->usersToImport); $i < $count; $i++) {
00197 $user = &$this->usersToImport[$i];
00198
00199
00200 if ($user->getEmail() != null) {
00201 $emailExists = $userDao->getUserByEmail($user->getEmail(), true);
00202 if ($emailExists != null) {
00203 $user->setUsername($emailExists->getUsername());
00204 }
00205 }
00206 if ($user->getUsername() == null) {
00207 $newUsername = true;
00208 $this->generateUsername($user);
00209 } else {
00210 $newUsername = false;
00211 }
00212 if ($user->getUnencryptedPassword() != null) {
00213 $user->setPassword(Validation::encryptCredentials($user->getUsername(), $user->getUnencryptedPassword()));
00214 } else if ($user->getPassword() == null) {
00215 $this->generatePassword($user);
00216 }
00217
00218 if (!$newUsername) {
00219
00220 $userExists = $userDao->getUserByUsername($user->getUsername(), true);
00221 if ($userExists != null) {
00222 $user->setUserId($userExists->getUserId());
00223 }
00224 } else {
00225 $userExists = false;
00226 }
00227
00228 if ($newUsername || !$userExists) {
00229
00230
00231
00232 if (!$userDao->insertUser($user)) {
00233
00234 $this->errors[] = sprintf('%s: %s (%s)',
00235 Locale::translate('manager.people.importUsers.failedToImportUser'),
00236 $user->getFullName(), $user->getUsername());
00237
00238 if ($continueOnError) {
00239
00240 $success = false;
00241 continue;
00242 } else {
00243 return false;
00244 }
00245 }
00246 }
00247
00248
00249
00250 foreach ($user->getRoles() as $role) {
00251 $role->setUserId($user->getUserId());
00252 $role->setJournalId($this->journalId);
00253 if (!$roleDao->roleExists($role->getJournalId(), $role->getUserId(), $role->getRoleId())) {
00254 if (!$roleDao->insertRole($role)) {
00255
00256 $this->errors[] = sprintf('%s: %s - %s (%s)',
00257 Locale::translate('manager.people.importUsers.failedToImportRole'),
00258 $role->getRoleName(),
00259 $user->getFullName(), $user->getUsername());
00260
00261 if ($continueOnError) {
00262
00263 $success = false;
00264 continue;
00265 } else {
00266 return false;
00267 }
00268 }
00269 }
00270 }
00271
00272 if ($sendNotify && !$userExists) {
00273
00274 $mail->addRecipient($user->getEmail(), $user->getFullName());
00275 $mail->sendWithParams(array(
00276 'username' => $user->getUsername(),
00277 'password' => $user->getUnencryptedPassword() == null ? '-' : $user->getUnencryptedPassword(),
00278 'userFullName' => $user->getFullName()
00279 ));
00280 $mail->clearRecipients();
00281 }
00282
00283 array_push($this->importedUsers, $user);
00284 }
00285
00286 return $success;
00287 }
00288
00293 function &getUsersToImport() {
00294 return $this->usersToImport;
00295 }
00296
00301 function setUsersToImport($users) {
00302 $this->usersToImport = $users;
00303 }
00304
00309 function &getImportedUsers() {
00310 return $this->importedUsers;
00311 }
00312
00317 function &getErrors() {
00318 return $this->errors;
00319 }
00320
00327 function validRole($roleType) {
00328 return isset($roleType) && in_array($roleType, array('manager', 'editor', 'sectionEditor', 'layoutEditor', 'reviewer', 'copyeditor', 'proofreader', 'author', 'reader', 'subscriptionManager'));
00329 }
00330
00335 function generateUsername(&$user) {
00336 $userDao = &DAORegistry::getDAO('UserDAO');
00337 $baseUsername = String::regexp_replace('/[^A-Z0-9]/i', '', $user->getLastName());
00338 if (empty($baseUsername)) {
00339 $baseUsername = String::regexp_replace('/[^A-Z0-9]/i', '', $user->getFirstName());
00340 }
00341 if (empty($username)) {
00342
00343 $baseUsername = 'user';
00344 }
00345
00346 for ($username = $baseUsername, $i=1; $userDao->userExistsByUsername($username, true); $i++) {
00347 $username = $baseUsername . $i;
00348 }
00349 $user->setUsername($username);
00350 }
00351
00356 function generatePassword(&$user) {
00357 $password = Validation::generatePassword();
00358 $user->setUnencryptedPassword($password);
00359 $user->setPassword(Validation::encryptCredentials($user->getUsername(), $password));
00360 }
00361
00362 }
00363
00364
00368 import('user.User');
00369 class ImportedUser extends User {
00370
00372 var $roles;
00373
00377 function ImportedUser() {
00378 $this->roles = array();
00379 parent::User();
00380 }
00381
00386 function setUnencryptedPassword($unencryptedPassword) {
00387 $this->setData('unencryptedPassword', $unencryptedPassword);
00388 }
00389
00394 function getUnencryptedPassword() {
00395 return $this->getData('unencryptedPassword');
00396 }
00397
00402 function addRole(&$role) {
00403 array_push($this->roles, $role);
00404 }
00405
00410 function &getRoles() {
00411 return $this->roles;
00412 }
00413
00414 }
00415
00416 ?>