diff --git a/admin/fixuserpix.php b/admin/fixuserpix.php
new file mode 100755
index 000000000000..e556023190f9
--- /dev/null
+++ b/admin/fixuserpix.php
@@ -0,0 +1,275 @@
+'; // Character used to break lines
+
+// Argument arrays: 0=>short name, 1=>long name
+$arguments = array(
+ array('short'=>'u', 'long'=>'username', 'help' => 'Your moodle username', 'type'=>'STRING', 'default' => ''),
+ array('short'=>'pw', 'long'=>'password', 'help' => 'Your moodle password', 'type'=>'STRING', 'default' => ''),
+ array('short'=>'v', 'long' => 'verbose', 'help' => 'Display extra information about the process')
+);
+
+// Building the USAGE output of the command line version
+if (isset($argv) && isset($argc)) {
+ $help = "Moodle User Pix Fix. Restores user profile images that were not properly moved during 1.8.2 upgrade to newer versions.\n\n"
+ . "Usage: {$argv[0]}; [OPTION] ...\n"
+ . "Options:\n"
+ . " -h, -?, -help, --help This output\n";
+
+ foreach ($arguments as $arg_array) {
+ $equal = '';
+ if (!empty($arg_array['type'])) {
+ $equal = "={$arg_array['type']}";
+ }
+
+ $padding1 = 5 - strlen($arg_array['short']);
+ $padding2 = 30 - (strlen($arg_array['long']) + strlen($equal));
+ $paddingstr1 = '';
+ for ($i = 0; $i < $padding1; $i++) {
+ $paddingstr1 .= ' ';
+ }
+ $paddingstr2 = '';
+ for ($i = 0; $i < $padding2; $i++) {
+ $paddingstr2 .= ' ';
+ }
+
+ $help .= " -{$arg_array['short']},$paddingstr1--{$arg_array['long']}$equal$paddingstr2{$arg_array['help']}\n";
+ }
+
+ $help .= "\nEmail nicolasconnault@gmail.com for any suggestions or bug reports.\n";
+
+ if ($argc == 1 || in_array($argv[1], array('--help', '-help', '-h', '-?'))) {
+ echo $help;
+ die();
+
+ } else {
+
+ $settings['eolchar'] = "\n";
+ $argv = arguments($argv);
+ $argscount = 0;
+
+ foreach ($arguments as $arg_array) {
+ $value = null;
+ if (in_array($arg_array['short'], array_keys($argv))) {
+ $value = $argv[$arg_array['short']];
+ unset($argv[$arg_array['short']]);
+ } elseif (in_array($arg_array['long'], array_keys($argv))) {
+ $value = $argv[$arg_array['long']];
+ unset($argv[$arg_array['long']]);
+ }
+ if (!is_null($value)) {
+ $settings[$arg_array['long']] = $value;
+ $argscount++;
+ }
+ }
+
+ // If some params are left in argv, it means they are not supported
+ if ($argscount == 0 || count($argv) > 0) {
+ echo $help;
+ die();
+ }
+ }
+}
+
+/**
+ * SCRIPT SETUP
+ */
+require_once($CFG->libdir . '/formslib.php');
+require_once($CFG->dirroot .'/course/lib.php');
+verbose("Loading libraries...");
+$systemcontext = get_context_instance(CONTEXT_SYSTEM);
+
+/**
+ * WEB INTERFACE FORM
+ */
+
+class pixfix_form extends moodleform {
+ function definition() {
+ global $arguments;
+ $mform =& $this->_form;
+
+ foreach ($arguments as $arg_array) {
+ $type = 'advcheckbox';
+
+ $label = ucfirst(str_replace('-', ' ', $arg_array['long']));
+ if (!empty($arg_array['type'])) {
+ $type = 'text';
+ }
+
+ if ($arg_array['long'] == 'password' || $arg_array['long'] == 'username') {
+ continue;
+ }
+
+ $mform->addElement($type, $arg_array['long'], $label);
+
+ if (isset($arg_array['default'])) {
+ $mform->setDefault($arg_array['long'], $arg_array['default']);
+ }
+ }
+ $this->add_action_buttons(false, 'Restore Images');
+ }
+
+ function definition_after_data() {
+
+ }
+}
+
+$run_script = true;
+$web_interface = false;
+
+// If eolchar is still
, load the web interface
+if ($settings['eolchar'] == '
') {
+ print_header("User Pix-Fix");
+ print_heading("User Pix-Fix");
+ $mform = new pixfix_form();
+
+ if ($data = $mform->get_data(false)) {
+ foreach ($arguments as $arg_array) {
+ if (!empty($data->{$arg_array['long']})) {
+ $settings[$arg_array['long']] = $data->{$arg_array['long']};
+ }
+ }
+ } else {
+ $run_script = false;
+ }
+
+ if (!has_capability('moodle/site:doanything', $systemcontext)) {
+ // If not logged in, give link to login page for current site
+ notify("You must be logged in as administrator before using this script.");
+ require_login();
+ } else {
+ $mform->display();
+ }
+
+ $web_interface = true;
+}
+
+if ($run_script) {
+
+ // User authentication
+ if (!$web_interface) {
+ if (empty($settings['username'])) {
+ echo "You must enter a valid username for a moodle administrator account on this site.{$settings['eolchar']}";
+ die();
+ } elseif (empty($settings['password'])) {
+ echo "You must enter a valid password for a moodle administrator account on this site.{$settings['eolchar']}";
+ die();
+ } else {
+ if (!$user = authenticate_user_login($settings['username'], $settings['password'])) {
+ echo "Invalid username or password!{$settings['eolchar']}";
+ die();
+ }
+ $USER = complete_user_login($user);
+ if (!has_capability('moodle/site:doanything', $systemcontext)) {
+ echo "You do not have administration privileges on this Moodle site. These are required for running the restore script.{$settings['eolchar']}";
+ die();
+ }
+ }
+ }
+
+ // Script code here
+
+ // Look for old moodledata/users directory
+ $oldusersdir = $CFG->dataroot . '/users';
+
+ if (!file_exists($oldusersdir)) {
+ notify('The old directory for user profile images ('.$oldusersdir.') does not exist. Pictures cannot be restored!');
+ } else {
+ // Find user profile images that are not yet in the new directory
+ $folders = get_directory_list($oldusersdir, '', false, true, false);
+
+ $restored_count = 0;
+
+ foreach ($folders as $userid) {
+ $olddir = $oldusersdir . '/' . $userid;
+ $files = get_directory_list($olddir);
+
+ if (empty($files)) {
+ continue;
+ }
+
+ // Create new user directory
+ if (!$newdir = make_user_directory($userid)) {
+ // some weird directory - do not stop the upgrade, just ignore it
+ continue;
+ }
+
+ // Move contents of old directory to new one
+ if (file_exists($olddir) && file_exists($newdir)) {
+ $restored = false;
+
+ foreach ($files as $file) {
+ if (!file_exists($newdir . '/' . $file)) {
+ copy($olddir . '/' . $file, $newdir . '/' . $file);
+ verbose("Moved $olddir/$file into $newdir/$file");
+ $restored = true;
+ }
+ }
+
+ if ($restored) {
+ $restored_count++;
+ }
+ } else {
+ notify("Could not move the contents of $olddir into $newdir!");
+ $result = false;
+ break;
+ }
+ }
+
+ if ($settings['eolchar'] == '
') {
+ print_box_start('generalbox centerpara');
+ }
+ if ($restored_count > 0) {
+ echo "Successfully restored profile images for $restored_count users!" . $settings['eolchar'];
+ } else {
+ echo "Did not find any user profile images in need of restoring." . $settings['eolchar'];
+ }
+ if ($settings['eolchar'] == '
') {
+ print_box_end();
+ }
+ }
+}
+
+if ($settings['eolchar'] == '
') {
+ print_footer();
+}
+
+/**
+ * Converts the standard $argv into an associative array taking var=val arguments into account
+ * @param array $argv
+ * @return array $_ARG
+ */
+function arguments($argv) {
+ $_ARG = array();
+ foreach ($argv as $arg) {
+ if (ereg('--?([^=]+)=(.*)',$arg,$reg)) {
+ $_ARG[$reg[1]] = $reg[2];
+ } elseif(ereg('-([a-zA-Z0-9]+)',$arg,$reg)) {
+ $_ARG[$reg[1]] = 'true';
+ }
+ }
+ return $_ARG;
+}
+
+/**
+ * If verbose is switched on, prints a string terminated by the global eolchar string.
+ * @param string $string The string to STDOUT
+ */
+function verbose($string) {
+ global $settings;
+ if ($settings['verbose'] && !$settings['quiet']) {
+ echo $string . $settings['eolchar'];
+ }
+}
+
+?>