166 lines
4.8 KiB
PHP
Executable File
166 lines
4.8 KiB
PHP
Executable File
#!/usr/bin/env php
|
|
<?php
|
|
|
|
$root = dirname(dirname(__FILE__));
|
|
require_once $root.'/scripts/__init_script__.php';
|
|
require_once 'storage.php';
|
|
require_once 'adapt.php';
|
|
require_once 'phab.php';
|
|
|
|
/* code */
|
|
|
|
function isValidTimezoneId($timezoneId)
|
|
{
|
|
@$tz=timezone_open($timezoneId);
|
|
return $tz!==FALSE;
|
|
}
|
|
|
|
$musers = unserialize(file_get_contents("dump/users"));
|
|
$importedusers = array();
|
|
$usedemails = array();
|
|
|
|
foreach ($musers as $muser)
|
|
{
|
|
$username = $muser->name;
|
|
$userid = $muser->id;
|
|
$realname = trim($muser->realname);
|
|
$email = $muser->email;
|
|
$date = $muser->date;
|
|
$timezone = $muser->timezone;
|
|
|
|
$email = "_tmpdisabledemail_" . $email . "_tmpdisabledemail_";
|
|
|
|
/* skip duplicate users */
|
|
if(array_key_exists($username, $migrate_dedup_users))
|
|
continue;
|
|
|
|
/* log imported users */
|
|
$importeduser = new MigrateImportedUser();
|
|
$importeduser->name = $username;
|
|
$importeduser->email = $email;
|
|
|
|
/* detect spam */
|
|
$isspam = false;
|
|
|
|
foreach($spammails as $spam)
|
|
if(endsWith($email, $spam))
|
|
$isspam = true;
|
|
|
|
if(!$isspam && strlen($realname) > 4) {
|
|
if(substr($realname, 0, strlen($realname)-2) == $username . " " . $username) {
|
|
if(ctype_upper(substr($realname, strlen($realname)-2, 2))) {
|
|
$isspam = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($isspam) {
|
|
$importeduser->isspam = true;
|
|
$importedusers[$username] = $importeduser;
|
|
continue;
|
|
}
|
|
|
|
/* fix timezones */
|
|
if (!isValidTimezoneId($timezone)) {
|
|
switch($timezone) {
|
|
case "China/Beijing": $timezone = "Asia/Shanghai"; break;
|
|
case "China/Shanghai": $timezone = "Asia/Shanghai"; break;
|
|
case "-1": $timezone = "GMT"; break;
|
|
case "-2": $timezone = "GMT"; break;
|
|
case "-3": $timezone = "GMT"; break;
|
|
case "0": $timezone = "GMT"; break;
|
|
case "1": $timezone = "GMT"; break;
|
|
case "2": $timezone = "GMT"; break;
|
|
case "3": $timezone = "GMT"; break;
|
|
case "Asia/Beijing": $timezone = "Asia/Shanghai"; break;
|
|
case "Asia/Riyadh87": $timezone = "Asia/Riyadh"; break;
|
|
case "Asia/Riyadh88": $timezone = "Asia/Riyadh"; break;
|
|
case "Asia/Riyadh89": $timezone = "Asia/Riyadh"; break;
|
|
case "Mideast/Riyadh87": $timezone = "Asia/Riyadh"; break;
|
|
case "Mideast/Riyadh88": $timezone = "Asia/Riyadh"; break;
|
|
case "Mideast/Riyadh89": $timezone = "Asia/Riyadh"; break;
|
|
}
|
|
}
|
|
|
|
if (!isValidTimezoneId($timezone)) {
|
|
echo "ERROR: invalid timezone " . $timezone . ", changed to GMT\n";
|
|
$timezone = "GMT";
|
|
}
|
|
|
|
/* check existing user and email */
|
|
$existing_user = id(new PhabricatorUser())->loadOneWhere('username = %s', $username);
|
|
if ($existing_user) {
|
|
echo 'ERROR: ' . $username . " already exists.\n";
|
|
}
|
|
|
|
$existing_email = id(new PhabricatorUserEmail())->loadOneWhere('address = %s', $email);
|
|
if ($existing_email) {
|
|
echo 'ERROR: ' . $email . " already exists for user " . $username . ".\n";
|
|
}
|
|
|
|
if ($existing_email || $existing_user) {
|
|
$importedusers[$username] = $importeduser;
|
|
continue;
|
|
}
|
|
|
|
/* create user */
|
|
$user = new PhabricatorUser();
|
|
$user->setUsername($username);
|
|
$user->setRealname($realname);
|
|
$user->setOverrideDate($date);
|
|
$user->setOverrideID($userid);
|
|
$user->setTimezoneIdentifier($timezone);
|
|
|
|
if(in_array($username, $admins))
|
|
$user->setIsAdmin(true);
|
|
|
|
$email_object = id(new PhabricatorUserEmail())
|
|
->setAddress($email)
|
|
->setIsVerified(1);
|
|
|
|
id(new PhabricatorUserEditor())
|
|
->setActor($user)
|
|
->createNewUser($user, $email_object);
|
|
|
|
/* profile */
|
|
$profile = $user->loadUserProfile();
|
|
$profile->setTitle('');
|
|
$profile->setBlurb('');
|
|
$user->save();
|
|
|
|
/* set password */
|
|
$envelope = new PhutilOpaqueEnvelope($muser->password);
|
|
id(new PhabricatorUserEditor())
|
|
->setActor($user)
|
|
->changePassword($user, $envelope, true);
|
|
|
|
/* set unix password */
|
|
$htaccess_hash = $muser->unix_password;
|
|
|
|
if($htaccess_hash) {
|
|
$field_list = PhabricatorCustomField::getObjectFields(
|
|
$user,
|
|
PhabricatorCustomField::ROLE_APPLICATIONTRANSACTIONS);
|
|
|
|
$fields = $field_list->getFields();
|
|
$htaccess_field = idx($fields, 'std:user:htaccess_password_hash');
|
|
$old_value = $htaccess_field->getOldValueForApplicationTransactions();
|
|
$xaction = id(new PhabricatorUserTransaction())
|
|
->setTransactionType(PhabricatorTransactions::TYPE_CUSTOMFIELD)
|
|
->setMetadataValue('customfield:key', $htaccess_field->getFieldKey())
|
|
->setOldValue($old_value)
|
|
->setNewValue($htaccess_hash);
|
|
$editor = id(new PhabricatorUserProfileEditor())
|
|
->setActor($user)
|
|
->setContentSource($xaction->getContentSource());
|
|
$editor->applyTransactions($user, array($xaction));
|
|
}
|
|
|
|
/* log imported user */
|
|
$importedusers[$username] = $importeduser;
|
|
$usedemails[strtolower($email)] = $username;
|
|
}
|
|
|
|
file_put_contents('dump/importedusers', serialize($importedusers));
|
|
|