function import_submit(Pieform $form, $values) { global $SESSION; $date = time(); $nicedate = date('Y/m/d h:i:s', $date); $uploaddir = get_config('dataroot') . 'import/test-' . $date . '/'; $filename = $uploaddir . $values['file']['name']; check_dir_exists($uploaddir); move_uploaded_file($values['file']['tmp_name'], $filename); if ($values['file']['type'] == 'application/zip') { // Unzip here $command = sprintf('%s %s %s %s', escapeshellcmd(get_config('pathtounzip')), escapeshellarg($filename), get_config('unzipdirarg'), escapeshellarg($uploaddir)); $output = array(); exec($command, $output, $returnvar); if ($returnvar != 0) { $SESSION->add_error_msg('Unable to unzip the file'); redirect('/import/'); } $filename = $uploaddir . 'leap2a.xml'; if (!is_file($filename)) { $SESSION->add_error_msg('No leap2a.xml file detected - please check your export file again'); redirect('/import/'); } } // Create dummy user $user = (object) array('username' => 'import_' . $date, 'password' => 'import1', 'firstname' => 'Imported', 'lastname' => 'User (' . $nicedate . ')', 'email' => '*****@*****.**'); $userid = create_user($user); // And we're good to go echo '<pre>'; $filename = substr($filename, strlen(get_config('dataroot'))); require_once dirname(dirname(__FILE__)) . '/import/lib.php'; safe_require('import', 'leap'); db_begin(); $importer = PluginImport::create_importer(null, (object) array('token' => '', 'usr' => $userid, 'queue' => (int) (!PluginImport::import_immediately_allowed()), 'ready' => 0, 'expirytime' => db_format_timestamp(time() + 60 * 60 * 24), 'format' => 'leap', 'data' => array('filename' => $filename), 'loglevel' => PluginImportLeap::LOG_LEVEL_VERBOSE, 'logtargets' => LOG_TARGET_STDOUT, 'profile' => true)); $importer->process(); // Now done, delete the temporary e-mail address if there's a new one // A bit sucky, presumes only one email in the import $email = artefact_instance_from_id(get_field('artefact', 'id', 'title', '*****@*****.**', 'artefacttype', 'email', 'owner', $userid)); $email->delete(); execute_sql('UPDATE {artefact_internal_profile_email} SET principal = 1 WHERE "owner" = ?', array($userid)); db_commit(); echo "\n\n"; echo 'Done. You can <a href="' . get_config('wwwroot') . '/admin/users/changeuser.php?id=' . $userid . '">change to this user</a> to inspect the result, '; echo 'or <a href="' . get_config('wwwroot') . 'import/">try importing again</a>'; echo '</pre>'; exit; }
function do_import() { global $SESSION, $USER, $TRANSPORTER, $IMPORTER; safe_require('import', 'leap'); // Get $TRANSPORTER and $IMPORTER from $SESSION $importrecord = (object) array('data' => array('importid' => $SESSION->get('importid'), 'extracted' => $SESSION->get('extracted'), 'mimetype' => $SESSION->get('mimetype'))); $TRANSPORTER = new LocalImporterTransport($importrecord); $importdata = (object) array('token' => '', 'usr' => $USER->get('id'), 'queue' => (int) false, 'ready' => 0, 'expirytime' => db_format_timestamp(time() + 60 * 60 * 24), 'format' => 'leap', 'loglevel' => PluginImportLeap::LOG_LEVEL_STANDARD, 'logtargets' => LOG_TARGET_FILE, 'profile' => true); $IMPORTER = PluginImport::create_importer(null, $TRANSPORTER, $importdata); try { $result = $IMPORTER->do_import_from_requests(); } catch (ImportException $e) { log_info("Leap2A import failed: " . $e->getMessage()); die_info(get_string('importfailed', 'import')); } $smarty = smarty(); $smarty->assign('PAGEHEADING', get_string('importresult', 'import')); $smarty->assign('form', $result); $smarty->display('form.tpl'); }
function adduser_submit(Pieform $form, $values) { global $USER, $SESSION, $TRANSPORTER; db_begin(); raise_time_limit(180); // Create user $user = (object) array('authinstance' => $values['authinstance'], 'username' => $values['username'], 'firstname' => $values['firstname'] ? $values['firstname'] : 'Imported', 'lastname' => $values['lastname'] ? $values['lastname'] : 'User', 'email' => $values['email'], 'password' => $values['password'], 'passwordchange' => 1); if ($USER->get('admin')) { // Not editable by institutional admins $user->staff = (int) ($values['staff'] == 'on'); $user->admin = (int) ($values['admin'] == 'on'); } if ($USER->get('admin') || get_config_plugin('artefact', 'file', 'institutionaloverride')) { $user->quota = $values['quota']; } $authinstance = get_record('auth_instance', 'id', $values['authinstance']); $remoteauth = false; if ($authinstance->authname != 'internal') { $remoteauth = true; } if (!isset($values['remoteusername'])) { $values['remoteusername'] = null; } $user->id = create_user($user, array(), $authinstance->institution, $remoteauth, $values['remoteusername'], $values); if (isset($user->admin) && $user->admin) { require_once 'activity.php'; activity_add_admin_defaults(array($user->id)); } if ($values['institutionadmin']) { set_field('usr_institution', 'admin', 1, 'usr', $user->id, 'institution', $authinstance->institution); } if (isset($values['leap2afile'])) { // And we're good to go $importdata = (object) array('token' => '', 'usr' => $user->id, 'queue' => (int) (!PluginImport::import_immediately_allowed()), 'ready' => 0, 'expirytime' => db_format_timestamp(time() + 60 * 60 * 24), 'format' => 'leap', 'loglevel' => PluginImportLeap::LOG_LEVEL_VERBOSE, 'logtargets' => LOG_TARGET_FILE, 'profile' => true); $importer = PluginImport::create_importer(null, $TRANSPORTER, $importdata); try { $importer->process(); log_info("Imported user account {$user->id} from Leap2A file, see " . $importer->get('logfile') . ' for a full log'); } catch (ImportException $e) { log_info("Leap2A import failed: " . $e->getMessage()); die_info(get_string('leap2aimportfailed', 'admin')); } // Reload the user details, as various fields are changed by the // importer when importing (e.g. firstname/lastname) $user = get_record('usr', 'id', $user->id); } db_commit(); if (!empty($user->email)) { try { email_user($user, $USER, get_string('accountcreated', 'mahara', get_config('sitename')), get_string('accountcreatedchangepasswordtext', 'mahara', $user->firstname, get_config('sitename'), $user->username, $values['password'], get_config('wwwroot'), get_config('sitename')), get_string('accountcreatedchangepasswordhtml', 'mahara', $user->firstname, get_config('wwwroot'), get_config('sitename'), $user->username, $values['password'], get_config('wwwroot'), get_config('wwwroot'), get_config('sitename'))); } catch (EmailException $e) { $SESSION->add_error_msg(get_string('newuseremailnotsent', 'admin')); } } $SESSION->add_ok_msg(get_string('newusercreated', 'admin')); redirect('/admin/users/edit.php?id=' . $user->id); }
function import_next_user($filename, $username, $authinstance) { global $ADDEDUSERS, $FAILEDUSERS; log_debug('adding user ' . $username . ' from ' . $filename); $authobj = get_record('auth_instance', 'id', $authinstance); $institution = new Institution($authobj->institution); $date = time(); $nicedate = date('Y/m/d h:i:s', $date); $niceuser = preg_replace('/[^a-zA-Z0-9_-]/', '-', $username); $uploaddir = get_config('dataroot') . 'import/' . $niceuser . '-' . $date . '/'; check_dir_exists($uploaddir); // Unzip the file $archive = new ZipArchive(); if ($archive->open($filename) && $archive->extractTo($uploaddir)) { // successfully extracted $archive->close(); } else { $FAILEDUSERS[$username] = get_string('unzipfailed', 'admin', hsc($filename)); return; } $leap2afilename = $uploaddir . 'leap2a.xml'; if (!is_file($leap2afilename)) { $FAILEDUSERS[$username] = get_string('noleap2axmlfiledetected', 'admin'); log_debug($FAILEDUSERS[$username]); return; } // If the username is already taken, append something to the end while (get_record('usr', 'username', $username)) { $username .= "_"; } $user = (object) array('authinstance' => $authinstance, 'username' => $username, 'firstname' => 'Imported', 'lastname' => 'User', 'password' => get_random_key(6), 'passwordchange' => 1); db_begin(); try { $user->id = create_user($user, array(), $institution, $authobj); } catch (EmailException $e) { // Suppress any emails (e.g. new institution membership) sent out // during user creation, becuase the user doesn't have an email // address until we've imported them from the Leap2A file. log_debug("Failed sending email during user import"); } $niceuser = preg_replace('/[^a-zA-Z0-9_-]/', '-', $user->username); $record = (object) array('token' => '', 'usr' => $user->id, 'queue' => (int) (!PluginImport::import_immediately_allowed()), 'ready' => 0, 'expirytime' => db_format_timestamp(time() + 60 * 60 * 24), 'format' => 'leap', 'data' => array('importfile' => $filename, 'importfilename' => $filename, 'importid' => $niceuser . time(), 'mimetype' => file_mime_type($filename)), 'loglevel' => PluginImportLeap::LOG_LEVEL_VERBOSE, 'logtargets' => LOG_TARGET_FILE, 'profile' => true); $tr = new LocalImporterTransport($record); $tr->extract_file(); $importer = PluginImport::create_importer(null, $tr, $record); unset($record, $tr); try { $importer->process(); log_info("Imported user account {$user->id} from Leap2A file, see" . $importer->get('logfile') . 'for a full log'); } catch (ImportException $e) { log_info("Leap2A import failed: " . $e->getMessage()); $FAILEDUSERS[$username] = get_string("leap2aimportfailed"); db_rollback(); } db_commit(); if (empty($FAILEDUSERS[$username])) { // Reload the user details, as various fields are changed by the // importer when importing (e.g. firstname/lastname) $newuser = get_record('usr', 'id', $user->id); $newuser->clearpasswd = $user->password; $ADDEDUSERS[] = $newuser; } return; }
function send_content_ready($token, $username, $format, $importdata, $fetchnow = false) { global $REMOTEWWWROOT; require_once get_config('docroot') . 'import/lib.php'; list($user, $authinstance) = find_remote_user($username, $REMOTEWWWROOT); if (!$user) { throw new ImportException(null, "Could not find user {$username} for {$REMOTEWWWROOT}"); } // go verify the token if (!($queue = get_record('import_queue', 'token', $token, 'host', $REMOTEWWWROOT))) { throw new ImportException(null, "Could not find queue record with given token for username {$username} for {$REMOTEWWWROOT}"); } if (strtotime($queue->expirytime) < time()) { throw new ImportException(null, "Queue record has expired"); } $class = null; try { $class = PluginImport::class_from_format($format); } catch (Exception $e) { throw new ImportException(null, "Invalid format {$format}"); } $queue->format = $format; if ($class == 'PluginImportLeap') { // don't import persondata over mnet // because it will just silently overwrite stuff // which is not really desirable. $queue->loglevel = get_config('leapovermnetloglevel'); $importdata['skippersondata'] = true; } $queue->data = serialize($importdata); update_record('import_queue', $queue); $tr = new MnetImporterTransport($queue); try { $tr->validate_import_data(); } catch (Exception $e) { throw new ImportException(null, 'Invalid importdata: ' . $e->getMessage()); } if (!array_key_exists('totalsize', $importdata)) { throw new ImportException(null, 'Invalid importdata: missing totalsize'); } if (!$user->quota_allowed($importdata['totalsize'])) { $e = new ImportException(null, 'Exceeded user quota'); $e->set_log_off(); throw $e; } $result = new StdClass(); if ($fetchnow && PluginImport::import_immediately_allowed()) { // either immediately spawn a curl request to go fetch the file $importer = PluginImport::create_importer($queue->id, $tr, $queue); $importer->prepare(); try { $importer->validate_transported_data($tr); } catch (Exception $e) { throw new ImportException(null, 'Invalid importdata: ' . $e->getMessage()); } $importer->process(); $importer->cleanup(); delete_records('import_queue', 'id', $queue->id); $result->status = true; $result->type = 'complete'; $returndata = $importer->get_return_data(); $result->querystring = '?'; foreach ($importer->get_return_data() as $k => $v) { $result->querystring .= $k . '=' . $v . '&'; } $importer->get('importertransport')->cleanup(); } else { // or set ready to 1 for the next cronjob to go fetch it. $result->status = set_field('import_queue', 'ready', 1, 'id', $queue->id); $result->type = 'queued'; } return $result; }
/** * cron job to process the queue and wake up and finish imports */ function import_process_queue() { if (!($ready = get_records_select_array('import_queue', 'ready = ? OR expirytime < ?', array(1, db_format_timestamp(time())), '', '*,' . db_format_tsfield('expirytime', 'ex')))) { return true; } $now = time(); $processed = array(); foreach ($ready as $item) { if ($item->ex < $now) { log_debug('deleting expired import record', $item); $processed[] = $item->id; continue; } $tr = null; if (!empty($item->host)) { $tr = new MnetImporterTransport($item); } else { $tr = new LocalImporterTransport($item); } $importer = PluginImport::create_importer($item->id, $tr, $item); try { $importer->prepare(); $importer->process(); $importer->cleanup(); $processed[] = $item->id; } catch (Exception $e) { log_debug('an error occurred on import: ' . $e->getMessage()); $importer->get('importertransport')->cleanup(); } } if (empty($processed)) { return true; } delete_records_select('import_queue', 'id IN ( ' . implode(',', db_array_to_ph($processed)) . ')', $processed); }
function import_next_user() { global $SESSION, $ADDEDUSERS, $FAILEDUSERS, $LEAP2AFILES, $AUTHINSTANCE; require_once get_config('docroot') . 'import/lib.php'; safe_require('import', 'leap'); // Pop the last element off of the LEAP2AFILES array $filename = end($LEAP2AFILES); $username = key($LEAP2AFILES); unset($LEAP2AFILES[$username]); log_debug('adding user ' . $username . ' from ' . $filename); $authobj = get_record('auth_instance', 'id', $AUTHINSTANCE); $institution = new Institution($authobj->institution); $date = time(); $nicedate = date('Y/m/d h:i:s', $date); $niceuser = preg_replace('/[^a-zA-Z0-9_-]/', '-', $username); $uploaddir = get_config('dataroot') . 'import/' . $niceuser . '-' . $date . '/'; check_dir_exists($uploaddir); // Unzip the file $command = sprintf('%s %s %s %s', escapeshellcmd(get_config('pathtounzip')), escapeshellarg($filename), get_config('unzipdirarg'), escapeshellarg($uploaddir)); $output = array(); exec($command, $output, $returnvar); if ($returnvar != 0) { $FAILEDUSERS[$username] = get_string('unzipfailed', 'admin', hsc($filename)); log_debug("unzip command failed with return value {$returnvar}"); continue; } $leap2afilename = $uploaddir . 'leap2a.xml'; if (!is_file($leap2afilename)) { $FAILEDUSERS[$username] = get_string('noleap2axmlfiledetected', 'admin'); log_debug($FAILEDUSERS[$username]); continue; } // If the username is already taken, append something to the end while (get_record('usr', 'username', $username)) { $username .= "_"; } $user = (object) array('authinstance' => $AUTHINSTANCE, 'username' => $username, 'firstname' => 'Imported', 'lastname' => 'User', 'password' => get_random_key(6), 'passwordchange' => 1); db_begin(); try { $user->id = create_user($user, array(), $institution, $authobj); } catch (EmailException $e) { // Suppress any emails (e.g. new institution membership) sent out // during user creation, becuase the user doesn't have an email // address until we've imported them from the Leap2A file. log_debug("Failed sending email during user import"); } $importerfilename = substr($leap2afilename, strlen(get_config('dataroot'))); $logfile = dirname($leap2afilename) . '/import.log'; $importer = PluginImport::create_importer(null, (object) array('token' => '', 'usr' => $user->id, 'queue' => (int) (!PluginImport::import_immediately_allowed()), 'ready' => 0, 'expirytime' => db_format_timestamp(time() + 60 * 60 * 24), 'format' => 'leap', 'data' => array('filename' => $importerfilename), 'loglevel' => PluginImportLeap::LOG_LEVEL_VERBOSE, 'logtargets' => LOG_TARGET_FILE, 'logfile' => $logfile, 'profile' => true)); try { $importer->process(); log_info("Imported user account {$user->id} from Leap2A file, see {$logfile} for a full log"); } catch (ImportException $e) { log_info("Leap2A import failed: " . $e->getMessage()); $FAILEDUSERS[$username] = get_string("leap2aimportfailed"); db_rollback(); continue; } db_commit(); // Reload the user details, as various fields are changed by the // importer when importing (e.g. firstname/lastname) $ADDEDUSERS[] = get_record('usr', 'id', $user->id); $SESSION->set('bulkimport_leap2afiles', $LEAP2AFILES); $SESSION->set('bulkimport_addedusers', $ADDEDUSERS); $SESSION->set('bulkimport_failedusers', $FAILEDUSERS); meta_redirect(); }
function import_submit(Pieform $form, $values) { global $USER, $TRANSPORTER, $IMPORTER; safe_require('import', 'leap'); $importdata = (object) array('token' => '', 'usr' => $USER->get('id'), 'queue' => (int) false, 'ready' => 0, 'expirytime' => db_format_timestamp(time() + 60 * 60 * 24), 'format' => 'leap', 'loglevel' => PluginImportLeap::LOG_LEVEL_STANDARD, 'logtargets' => LOG_TARGET_FILE, 'profile' => true); $IMPORTER = PluginImport::create_importer(null, $TRANSPORTER, $importdata); try { $IMPORTER->process(PluginImport::STEP_INTERACTIVE_IMPORT_FORM); } catch (ImportException $e) { log_info("Leap2A import failed: " . $e->getMessage()); die_info(get_string('importfailed', 'import')); } set_importer_to_session(); redirect('/import/index.php?action=' . PRINTIMPORTITEMSFORM_ACT); }