*/ GalleryCoreApi::requireOnce(dirname(__FILE__) . '/classes/G1MigrateMap.class'); /** * @package Migrate * @subpackage UserInterface */ class ConfirmImportController extends GalleryController { /** * @see GalleryController::handleRequest() */ function handleRequest($form) { global $gallery; list($ret, $module) = GalleryCoreApi::loadPlugin('module', 'migrate'); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } $platform = $gallery->getPlatform(); $slash = $platform->getDirectorySeparator(); /* * If we want to check the connection status at each operation * ignore_user_abort(true); */ list ($ret, $moduleStatusList) = GalleryCoreApi::fetchPluginStatus('module'); if ($ret->isError()) { return $this->failWithStatus($ret->wrap(__FILE__, __LINE__)); } if (!empty($moduleStatusList['comment']['active'])) { $importComments = true; } else { $importComments = false; } if (!empty($moduleStatusList['customfield']['active'])) { $importCustomFields = true; } else { $importCustomFields = false; } if (false && $importCustomFields) { list ($ret, $customFieldInterface) = GalleryCoreApi::newFactoryInstance('CustomFieldInterface_1_0', 'CustomFieldHelper'); if ($ret->isError() || !isset($customFieldInterface)) { print $ret->getAsHtml(); return array($ret->wrap(__FILE__, __LINE__), null); } } /* * owner => core.all (which also gives comment.all) * * canRead => core.view,core.viewResizes * canViewFullImages => core.viewSource * canViewComments => * comment.view,comment.search * canAddComments => comment.add * canChangeText => core.edit * canAddTo => core.addDataItem * canWrite => core.edit * canDeleteFrom => core.delete * canCreateSubAlbum => core.addAlbumItem * */ $permissionTranslation = array('canRead' => array('core.view', 'core.viewResizes' ), 'canViewFullImages' => array('core.viewSource'), 'canChangeText' => array('core.edit'), 'canAddTo' => array('core.addDataItem'), 'canWrite' => array('core.edit'), 'canDeleteFrom' => array('core.delete'), 'canCreateSubAlbum' => array('core.addAlbumItem') ); if ($importComments) { $permissionTranslation['canAddComments'] = array('comment.add'); $permissionTranslation['canViewComments'] = array('comment.view', 'comment.search'); } else { $permissionTranslation['canAddComments'] = array(); $permissionTranslation['canViewComments'] = array(); } /* Get GroupIds for "everybody" and "all users" */ list ($ret, $everybodyGroupId) = GalleryCoreApi::getPluginParameter('module', 'core', 'id.everybodyGroup'); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } list ($ret, $allUsersGroupId) = GalleryCoreApi::getPluginParameter('module', 'core', 'id.allUserGroup'); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } list ($ret, $adminUsersGroupId) = GalleryCoreApi::getPluginParameter('module', 'core', 'id.adminGroup'); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } list ($ret, $guestUserId) = GalleryCoreApi::getPluginParameter('module', 'core', 'id.anonymousUser'); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } /* Verify that active user is an admin */ $ret = GalleryCoreApi::assertUserIsSiteAdministrator(); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } $albumsPath = GalleryUtilities::getRequestVariables('albumsPath'); /* build framework for error and status arrays */ $error = array(); $status = array('userImportFailure'=>array(), 'userImportSuccess'=>array(), 'albumImportFailure'=>array(), 'albumImportSuccess'=>array(), 'urlRedirect' => isset($form['urlRedirect']) ); $finishedAlbums = array(); $albumPosition = array(); if (!isset($form['sourceEncoding'])) { $form['sourceEncoding']='UTF-8'; } $sourceEncoding = $form['sourceEncoding']; if (isset($form['action']['cancel'])) { $redirect['view'] = 'core:SiteAdmin'; $redirect['subView'] = 'migrate:SelectGallery'; } else if (isset($form['action']['import'])) { /* We reuse this instance all the way through */ list ($ret, $immediateView) = $this->getImmediateStatusView(); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } $ret = $immediateView->doLoadImmediateTemplate(); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } /* This flushes all buffers and outputs the header directly to the browser */ $ret = $immediateView->renderHeader($module->translate('Migration Status'), '', ''); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } $itemsCreated = array(); /* Get list of userids in advance */ require_once(dirname(__FILE__) . '/classes/Gallery1DataParser.class'); list($ret, $albumList) = Gallery1DataParser::getAlbumList($albumsPath); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null, null); } list ($ret, $uidMap) = Gallery1DataParser::getUserUids($albumsPath); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } /* If no users were selected, create an empty array to avoid later php warnings */ if (!isset($form['migrateUser'])) { $form['migrateUser']=array(); } /* go through the list of chosen users */ $totalUsersToImport = count($form['migrateUser']); $numberOfUsersImported = 0; foreach (array_keys($form['migrateUser']) as $uid) { /* convert from uid to username */ list ($ret, $fields) = Gallery1DataParser::getUserFieldsByUid($albumsPath, $uid); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } $userName = Gallery1DataParser::convertString($fields['username'], $sourceEncoding); $ret = $immediateView->renderStatusMessage( $module->translate('Importing Users'), $userName, $numberOfUsersImported / $totalUsersToImport); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } /* Go ahead and create the user instance */ list ($ret, $user) = GalleryCoreApi::newFactoryInstance('GalleryEntity', 'GalleryUser'); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } /* Verify that the user was created successfully */ if (!isset($user)) { return array(GalleryStatus::error(ERROR_MISSING_OBJECT, __FILE__, __LINE__), null); } /* * Turn the instance into a real boy/girl * This is where the user is actually created, everything * before this was simply building the framework. */ $ret = $user->create($userName); /* Was there an error? */ if ($ret->isError()) { /* * ERROR_COLLISION is when you try to create something that * already exists. */ if (!($ret->getErrorCode() & ERROR_COLLISION)) { return array($ret->wrap(__FILE__, __LINE__), null); } /* Other errors are apparently okay. Note them and continue */ $status['userImportFailure'][$userName] = 1; } else { /* * Apparently the creation was successful. Now we can start * setting the various metadata associated with the user */ $user->setEmail($fields['email']); $user->setHashedPassword($fields['password']); $user->setFullName( Gallery1DataParser::convertString($fields['fullname'], $sourceEncoding)); /* * $fields['canCreateAlbums'] if they have that perm, give them "core.addAlbumItem" * permission on the root album */ /* Save this user to the database */ $ret = $user->save(); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } if (isset($fields['isAdmin']) && $fields['isAdmin']) { /* Add her to the admin group */ $ret = GalleryCoreApi::addUserToGroup($user->getId(), $adminUsersGroupId); if ($ret->isError()) { return $ret->wrap(__FILE__, __LINE__); } } /* Set a positive note for later. Hooray! */ $status['userImportSuccess'][$userName] = 1; $user = null; } $uid = null; $numberOfUsersImported++; } /* * Import Any Selected Albums * * First initialize the $form['sourceAlbums'] array to avoid php * warnings */ if (!isset($form['sourceAlbums'])) { $form['sourceAlbums']=array(); } /* * Check to see if the user selected a destination. If not, * default to the root album of the new gallery install. */ if (!isset($form['destinationAlbumID'])) { list ($ret, $rootId) = GalleryCoreApi::getPluginParameter('module', 'core', 'id.rootAlbum'); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } $form['destinationAlbumID']=$rootId; } /* Convert the form variable into a local temporary variable */ $destinationAlbumID = $form['destinationAlbumID']; /* Go through the list of selected gallery1 albums to import */ $totalItemsToImport = 0; foreach (array_keys ($form['sourceAlbums']) as $sourceAlbumName) { /* * attempt to load the metadata from the selected album into a * local cache for later manipulation */ $sourceAlbumName = urldecode($sourceAlbumName); if (!in_array($sourceAlbumName,array_keys($albumList))) { return array(GalleryStatus::error(ERROR_BAD_PARAMETER, __FILE__, __LINE__), null); } list ($ret, $albumfields[$sourceAlbumName]) = Gallery1DataParser::loadAlbumFields($albumsPath . $sourceAlbumName); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } list ($ret, $photos) = Gallery1DataParser::getPhotos($albumsPath . $sourceAlbumName); $totalItemsToImport += count($photos); } $i=0; /* First initialize the $albumfields array to avoid php warnings */ if(!isset($albumfields)){ $albumfields = array(); } $albumHighlight = array(); /* * Go through the array of albums' metadata one album at a time. * We limit the number of passes through this list to n^2 times to * avoid an infinite loop. This allows us to make sure that we add * parent albums first by taking albums out of the list as they are * handled. */ $numberOfItemsImported = 0; while ($albumfields && $i < count($form['sourceAlbums'])^2 && !connection_aborted()) { $album = array_shift($albumfields); /* * if the album's parent is not in the list of sourcealbums, * load it into the targeted G2 top album as set in * $destinationAlbumID */ $targetAlbumID = false; $newAlbumInstanceId = false; if (!in_array(urlencode($album['parentAlbumName']),array_keys($form['sourceAlbums']))) { $targetAlbumID = $destinationAlbumID; } else if (in_array($album['parentAlbumName'],array_keys($finishedAlbums))){ /* * if the album's parent has already been imported, import * it into the parent */ $targetAlbumID = $finishedAlbums[$album['parentAlbumName']]; } else { $albumfields[$album['name']] = $album; $album = null; } if ($targetAlbumID && $album) { /* * We definitely need notices before each album. */ $ret = $immediateView->renderStatusMessage( $module->translate('Importing photos'), $album['name'], $numberOfItemsImported / $totalItemsToImport); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } list($ret, $parent) = GalleryCoreApi::loadEntitiesById($targetAlbumID); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } list($ret, $parentPath) = $parent->fetchPath(); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } $desiredname = $platform->legalizePathComponent($album['name']); $k = 0; $invalidName = true; while($invalidName) { list ($ret, $existingAlbumId) = GalleryCoreApi::fetchChildIdByPathComponent($targetAlbumID, $desiredname); if ($ret->isError()) { if (!$ret->getErrorCode() & ERROR_MISSING_OBJECT) { return array($ret->wrap(__FILE__, __LINE__), null); } else { $invalidName = false; } } else { $desiredname = $album['name'] . '_' . $k++; } } if ($targetAlbumID) { /* Make sure we have permission to edit the target item */ $ret = GalleryCoreApi::assertHasItemPermission($targetAlbumID, 'core.addAlbumItem'); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } /* Try to load targeted parent */ list ($ret, $targetAlbumObject) = GalleryCoreApi::loadEntitiesById($targetAlbumID); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } /* Get a lock on said parent */ list ($ret, $importLockIds[]) = GalleryCoreApi::acquireReadLock($targetAlbumObject->getId()); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } /* * Check the new album's path component to see if it is valid on the * local filesystem */ $platform = $gallery->getPlatform(); if (empty($desiredname)) { $error[] = 'form[error][pathComponent][missing]'; } else if (!$platform->isLegalPathComponent($desiredname)) { $error[] = 'form[error][pathComponent][invalid]'; } /* * If everything is good so far, we create a new instance to be our new * album */ if (empty($error)) { list ($ret, $newAlbumInstance) = GalleryCoreApi::newFactoryInstance('GalleryEntity', 'GalleryAlbumItem'); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } if (!isset($newAlbumInstance)) { return array(GalleryStatus::error(ERROR_MISSING_OBJECT, __FILE__, __LINE__), null); } /* this is where the album is actually created */ $ret = $newAlbumInstance->create($targetAlbumID, $desiredname); if ($ret->isError()) { if ($ret->getErrorCode() & ERROR_COLLISION) { $error[] = 'form[error][pathComponent][collision]'; } return array($ret->wrap(__FILE__, __LINE__), null); } if (isset($form['urlRedirect'])) { $ret = $this->createG1ToG2Mapping( $newAlbumInstance->getId(), $album['name']); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } } if (empty($error)) { $newAlbumInstanceId = $newAlbumInstance->getId(); /* load up the album with metadata from the old album */ if (isset($album['title'])) { $newAlbumInstance->setTitle( $this->convertHtmlToBbcode($album['title'], $sourceEncoding)); } if (isset($album['summary'])) { $newAlbumInstance->setDescription( $this->convertHtmlToBbcode($album['summary'], $sourceEncoding)); } $newAlbumInstance->setKeywords(''); if (isset($album['description'])) { $newAlbumInstance->setSummary( $this->convertHtmlToBbcode($album['description'], $sourceEncoding)); } // $newAlbumInstance->settheme if (isset($album['last_mod_time']) && $album['last_mod_time']) { if (isset($album['clicks_date']) && $album['clicks_date'] > 0 && $album['clicks_date']<$album['last_mod_time']){ $newAlbumInstance->setCreationTimestamp($album['clicks_date']); $newAlbumInstance->setOriginationTimestamp($album['clicks_date']); } else { $newAlbumInstance->setCreationTimestamp($album['last_mod_time']); $newAlbumInstance->setOriginationTimestamp($album['last_mod_time']); } } if (isset($album['clicks_date']) && $album['clicks_date']>0) { $newAlbumInstance->setviewedSinceTimestamp($album['clicks_date']); } /* $newAlbumInstance->setorderBy */ /* $newAlbumInstance->setorderDirection */ /* Set album owner */ if (isset($album['owner'])) { $validUID = Gallery1DataParser::isValidUid($albumsPath, $album['owner']); if ($validUID) { list($ret, $albumUserFields) = Gallery1DataParser::getUserFieldsByUid($albumsPath, $album['owner']); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } list($ret, $owner) = GalleryCoreApi::fetchUserByUsername( Gallery1DataParser::convertString( $albumUserFields['username'], $sourceEncoding)); if ($ret->isError()) { if ($ret->getErrorCode() & ERROR_MISSING_OBJECT) { $owner = $gallery->getActiveUser(); } else { return array($ret->wrap(__FILE__, __LINE__), null); } } $newAlbumInstance->setOwnerId($owner->getId()); } } /* Save the new album */ $ret = $newAlbumInstance->save(); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } /* * $album->fields["extra_fields"] * * list ($ret, $duplicates) = * $customFieldInterface->createCustomFields(array('Photographer', * 'Location', 'One'), $this->_album->getId()); * if ($ret->isError()) { * return return array($ret->wrap(__FILE__, __LINE__), null); * } * */ $itemsCreated[] = $newAlbumInstance->getId(); // Set order weight if (isset($albumPosition[$album['name']])) { $weight = $albumPosition[$album['name']]; } else { list ($ret, $weight) = GalleryCoreApi::fetchExtremeChildWeight($targetAlbumID, HIGHER_WEIGHT); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } $weight += 1000; } $ret = GalleryCoreApi::setItemOrderWeight($newAlbumInstance->getId(), $weight); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } $ret = GalleryCoreApi::removeItemPermissions($newAlbumInstance->getId()); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } if ($adminUsersGroupId) { $ret = GalleryCoreApi::addGroupPermission($newAlbumInstance->getId(), $adminUsersGroupId, 'core.all', FALSE ); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } } // Set album owner permissions $validUID = Gallery1DataParser::isValidUid($albumsPath, $album['owner']); if ($validUID) { list($ret, $albumUserFields) = Gallery1DataParser::getUserFieldsByUid($albumsPath, $album['owner']); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } list($ret, $owner) = GalleryCoreApi::fetchUserByUsername(Gallery1DataParser::convertString($albumUserFields['username'], $sourceEncoding)); if ($ret->isError()) { if ($ret->getErrorCode() & ERROR_MISSING_OBJECT) { $owner = $gallery->getActiveUser(); } else { return array($ret->wrap(__FILE__, __LINE__), null); } } $ret = GalleryCoreApi::addUserPermission($newAlbumInstance->getId(), $owner->getId(), 'core.all', true ); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } } if (isset($album['perms'])) { foreach($album['perms'] as $tmpperm => $tmpusers) { foreach($permissionTranslation[$tmpperm] as $tmpTranslatedPerm) { foreach(array_keys($tmpusers) as $tmpuser) { switch ($tmpuser) { case 'Logged In': if ($allUsersGroupId) { $ret = GalleryCoreApi::addGroupPermission($newAlbumInstance->getId(), $allUsersGroupId, $tmpTranslatedPerm, FALSE ); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } } break; case 'everybody': if ($everybodyGroupId) { $ret = GalleryCoreApi::addGroupPermission($newAlbumInstance->getId(), $everybodyGroupId, $tmpTranslatedPerm, FALSE ); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } } break; case 'Nobody': break; case 'admin': break; default: $validPermUID = Gallery1DataParser::isValidUid($albumsPath, $tmpuser); if ($validPermUID) { list($ret, $permsUserFields) = Gallery1DataParser::getUserFieldsByUid($albumsPath, $tmpuser); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } $permUsername = $permsUserFields['username']; list($ret, $permUser) = GalleryCoreApi::fetchUserByUsername(Gallery1DataParser::convertString($permUsername, $sourceEncoding)); if ($ret->isError() && !($ret->getErrorCode() & ERROR_MISSING_OBJECT)) { return array($ret->wrap(__FILE__, __LINE__), null); } if ($permUser) { $ret = GalleryCoreApi::addUserPermission($newAlbumInstance->getId(), $permUser->getId(), $tmpTranslatedPerm, FALSE ); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } } } } } } } } /* * Click counts must be set after the item is * first saved */ if (isset($album['clicks'])) { $ret = GalleryCoreApi::setItemViewCount($newAlbumInstanceId, $album['clicks']); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } } /* Delete existing derivative preferences */ $ret = GalleryCoreApi::removeDerivativePreferencesForItem($newAlbumInstanceId); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } /* Add the thumbnail size back in */ if (isset($album['thumb_size'])) { $ret = GalleryCoreApi::addDerivativePreference(0, $newAlbumInstanceId, DERIVATIVE_TYPE_IMAGE_THUMBNAIL, 'thumbnail|' . $album['thumb_size']); } if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } if (isset($album['resize_size']) && strcmp($album['resize_size'], 'off')) { $ret = GalleryCoreApi::addDerivativePreference(1, $newAlbumInstanceId, DERIVATIVE_TYPE_IMAGE_RESIZE, 'scale|' . $album['resize_size']); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } } list ($ret, $layoutId) = GalleryCoreApi::fetchLayoutId($newAlbumInstance); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } list ($ret, $layout) = GalleryCoreApi::loadPlugin('layout', $layoutId); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } list ($ret, $settings) = $layout->getSettings($newAlbumInstanceId); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } $ret = $layout->setParameter('rows', $album['rows'], $newAlbumInstanceId); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } $ret = $layout->setParameter('columns', $album['cols'], $newAlbumInstanceId); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } if (isset($newAlbumInstanceId)) { $finishedAlbums[$album['name']] = $newAlbumInstanceId; $status['albumImportSuccess'][$album['name']] = $newAlbumInstanceId; } else { return array($ret->wrap(__FILE__, __LINE__), null); } } } /* * we can let the parent album (and anything else that we might * have tied up) be edited by others now */ $ret = GalleryCoreApi::releaseLocks($importLockIds); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } else { $importLockIds = array(); } unset($photos); list ($ret, $photos) = Gallery1DataParser::getPhotos($albumsPath . $album['name']); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } if (!isset($photos)) { $photos = array(); } $albumHighlight[$newAlbumInstanceId] = false; list ($ret, $item) = GalleryCoreApi::loadEntitiesById($newAlbumInstanceId); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } list ($ret, $importLockIds[]) = GalleryCoreApi::acquireReadLock($item->getId()); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } list ($ret, $thumbnailTable) = GalleryCoreApi::fetchThumbnailsByItemIds(array($item->getId())); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } $albumNeedsThumbnail = empty($thumbnailTable) ? true : false; foreach($photos as $j => $importAlbumItem) { if (isset($importAlbumItem->isAlbumName) && $importAlbumItem->isAlbumName) { if ($importAlbumItem->highlight == 1) { $albumHighlight[$newAlbumInstanceId]=$importAlbumItem->isAlbumName; } list ($ret, $weight) = GalleryCoreApi::fetchExtremeChildWeight( $newAlbumInstanceId, HIGHER_WEIGHT); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } $albumPosition[$importAlbumItem->isAlbumName] = $weight + 100 + $j; $importAlbumItem = null; } else { $dir = $albumsPath . $album['name'] . $slash; $filename = $importAlbumItem->image->name . '.' . $importAlbumItem->image->type; $filepath = $dir . $filename; $ret = $immediateView->renderStatusMessage( $module->translate('Importing photos'), $album['name'] . ' ' . $filename, $numberOfItemsImported / $totalItemsToImport); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } list ($base, $extension) = GalleryUtilities::getFileNameComponents($filename); $mimeType = GalleryCoreApi::convertExtensionToMime($extension); $convertedCaption = $this->convertHtmlToBbcode( $importAlbumItem->caption, $sourceEncoding); $data = array('title' => '', 'summary' => '', 'description' => ''); foreach (array_keys($data) as $field) { switch ($form['set'][$field]) { case 'filename': $data[$field] = $base; break; case 'caption': $data[$field] = $convertedCaption; break; case 'custom': $customField = $form['customfield'][$field]; if (isset($importAlbumItem->extraFields[$customField])) { $data[$field] = $this->convertHtmlToBbcode( $importAlbumItem->extraFields[$customField], $sourceEncoding); } else if ($field == 'description' && isset($form['set']['defaultDescription'])) { $data[$field] = $data['summary']; } } } list ($ret, $newItem) = GalleryCoreApi::addItemToAlbum( $filepath, $filename, $data['title'], $data['summary'], $data['description'], $mimeType, $item->getId()); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } $itemsCreated[] = $newItem->getId(); $numberOfItemsImported++; if (isset($form['urlRedirect'])) { $ret = $this->createG1ToG2Mapping($newItem->getId(), $album['name'], $importAlbumItem->image->name); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } } $itemLockIds = array(); list ($ret, $itemLockIds[]) = GalleryCoreApi::acquireWriteLock($newItem->getId()); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } $newItem->setKeywords(Gallery1DataParser::convertString( $importAlbumItem->keywords, $sourceEncoding)); /* if (isset($importAlbumItem->itemCaptureDate[0])){ $newItem->setcreationTimestamp($importAlbumItem->itemCaptureDate[0]); } */ if (isset($importAlbumItem->uploadDate)){ $newItem->setCreationTimestamp($importAlbumItem->uploadDate); $newItem->setOriginationTimestamp($importAlbumItem->uploadDate); } if (isset($album['clicks_date']) && $album['clicks_date']>0) { $newItem->setviewedSinceTimestamp($album['clicks_date']); } if (isset($importAlbumItem->clicks) && $importAlbumItem->clicks > 0) { $ret = GalleryCoreApi::setItemViewCount($newItem->getId(), $importAlbumItem->clicks); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } } if (isset($importAlbumItem->image->thumb_x) && isset($importAlbumItem->image->thumb_y) && isset($importAlbumItem->image->thumb_width) && isset($importAlbumItem->image->thumb_height) && $importAlbumItem->image->thumb_width > 0 && $importAlbumItem->image->thumb_height > 0){ /* Load the thumbnail */ $thumbnails = array(); list ($ret, $thumbnails) = GalleryCoreApi::fetchThumbnailsByItemIds(array($newItem->getId())); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } if (!empty($thumbnails)) { $thumbnail = $thumbnails[$newItem->getId()]; list ($ret, $lock) = GalleryCoreApi::acquireWriteLock($thumbnail->getId()); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } list ($ret, $thumbnail) = $thumbnail->refresh(); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } $width = $importAlbumItem->image->raw_width; $height = $importAlbumItem->image->raw_height; $xPerc = round($importAlbumItem->image->thumb_x * 100 / $width, 3); $yPerc = round($importAlbumItem->image->thumb_y * 100 / $height, 3); $widthPerc = round($importAlbumItem->image->thumb_width * 100 / $width, 3); $heightPerc = round($importAlbumItem->image->thumb_height * 100 / $height, 3); list ($ret, $operations) = GalleryCoreApi::mergeDerivativeOperations($thumbnail->getDerivativeOperations(), sprintf('crop|%s,%s,%s,%s', $xPerc, $yPerc, $widthPerc, $heightPerc), true); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } $thumbnail->setDerivativeOperations($operations); $thumbnail->setWidth(0); $thumbnail->setHeight(0); $ret = $thumbnail->save(); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } $ret = GalleryCoreApi::releaseLocks($lock); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } /* * Changing the crop size causes our * derivative dimensions to change, * which affects all our dependent * derivatives also. */ $ret = GalleryCoreApi::invalidateDerivativeDimensionsBySourceIds( array($thumbnail->getId())); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } } } $validItemUID = false; $itemUID = false; $defaultToAlbumUID = true; if (isset($importAlbumItem->owner)) { if (!strcmp('everybody', $importAlbumItem->owner) || !strcmp('nobody', $importAlbumItem->owner) ) { $defaultToAlbumUID = false; $newItem->setownerId($guestUserId); } else if (strcmp('logged-in', $importAlbumItem->owner)) { $validItemUID = Gallery1DataParser::isValidUid($albumsPath, $importAlbumItem->owner); if ($validItemUID) { $defaultToAlbumUID = false; $itemUID = $importAlbumItem->owner; } } } if ($defaultToAlbumUID) { $validItemUID = Gallery1DataParser::isValidUid($albumsPath, $album['owner']); if ($validItemUID) { $itemUID = $album['owner']; } } if ($validItemUID && $itemUID) { list($ret, $albumItemUserFields) = Gallery1DataParser::getUserFieldsByUid($albumsPath, $itemUID); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } list($ret, $itemOwner) = GalleryCoreApi::fetchUserByUsername(Gallery1DataParser::convertString($albumItemUserFields['username'], $sourceEncoding)); if ($ret->isError() && !($ret->getErrorCode() & ERROR_MISSING_OBJECT)) { return array($ret->wrap(__FILE__, __LINE__), null); } if ($itemOwner) { $newItem->setownerId($itemOwner->getId()); } } if (isset($importAlbumItem->hidden) && $importAlbumItem->hidden) { /* delete group perm actions */ $allPerms = array('core.view', 'core.viewSource', 'core.viewResizes'); foreach ($allPerms as $perm) { $ret = GalleryCoreApi::removeGroupPermission($newItem->getId(), $everybodyGroupId, $perm, FALSE); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } $ret = GalleryCoreApi::removeGroupPermission($newItem->getId(), $allUsersGroupId, $perm, FALSE); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } } } $ret = $newItem->save(); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } /* * * // Set field values.. * $ret = * $customFieldInterface->setCustomFieldValues($this->_item->getId(),array('Photographer' * => 'Me', 'Location' => 'Here')); * if ($ret->isError()) { * return return array($ret->wrap(__FILE__, __LINE__), null); * } */ if ($importComments && isset($importAlbumItem->comments) && count($importAlbumItem->comments)>0) { foreach ($importAlbumItem->comments AS $importCommentId => $importComment) { if (strcmp($importComment->UID, 'everybody')) { $validCommentUid = Gallery1DataParser::isValidUid($albumsPath, $album['owner']); if ($validCommentUid){ list($ret, $commentG1User) = Gallery1DataParser::getUserFieldsByUid($albumsPath, $album['owner']); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } list($ret, $commentG2User) = GalleryCoreApi::fetchUserByUsername(Gallery1DataParser::convertString($commentG1User['username'], $sourceEncoding)); if ($ret->isError()) { if (!($ret->getErrorCode() & ERROR_MISSING_OBJECT)) { return array($ret->wrap(__FILE__, __LINE__), null); } else { $commenterId = $guestUserId; } } else { $commenterId = $commentG2User->getId(); } } } else { $commenterId = $guestUserId; } /* Add the comment */ list ($ret, $comment) = GalleryCoreApi::newFactoryInstance('GalleryEntity', 'GalleryComment'); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } if (!isset($comment)) { return array(GalleryStatus::error(ERROR_MISSING_OBJECT, __FILE__, __LINE__), null); } $ret = $comment->create($newItem->getId()); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } $comment->setCommenterId($commenterId); $comment->setHost(empty($importComment->IPNumber) ? 'unknown' : $importComment->IPNumber); if ($commenterId == $guestUserId) { $comment->setSubject($importComment->name); } else { $comment->setSubject(''); } $comment->setComment(ConfirmImportController::convertHtmlToBbcode($importComment->commentText, $sourceEncoding)); $comment->setDate($importComment->datePosted); $ret = $comment->save(); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } } } $ret = GalleryCoreApi::releaseLocks($itemLockIds); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } else { $itemLockIds = array(); } /* Click counts must be set after the item is firstsaved */ //$ret = GalleryCoreApi::setItemViewCount($newItem->getId(), $importAlbumItem->clicks); //if ($ret->isError()) { // return $this->failWithStatus($ret->wrap(__FILE__, __LINE__)); //} $status['addFromLocalServer'][] = array('fileName' => $filename, 'id' => $newItem->getId()); if (($albumNeedsThumbnail || $importAlbumItem->highlight == 1)) { $toolkit = null; list ($ret, $toolkit, $outputMimeType) = GalleryCoreApi::getToolkitByOperation($newItem->getMimeType(), 'thumbnail'); if ($ret->isError()) { return $ret->wrap(__FILE__, __LINE__); } if (isset($toolkit)) { list ($ret, $success) = GalleryCoreApi::setThumbnailFromItem($item->getId(), $newItem->getId()); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } $albumNeedsThumbnail = false; } } } } } $album = null; /* $i keeps track of how many passes we make over the data */ $i++; } } //$albumHighlight[$newAlbumInstanceId]=$importAlbumItem->isAlbumName; //$finishedAlbums[$album['name']] = $newAlbumInstanceId; foreach ($albumHighlight as $highlightRecipientId => $nameOfAlbumToHighlight) { if (isset ($finishedAlbums[$nameOfAlbumToHighlight]) && $finishedAlbums[$nameOfAlbumToHighlight]) { list ($ret, $item) = GalleryCoreApi::loadEntitiesById($highlightRecipientId); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } list ($ret, $importLockIds[]) = GalleryCoreApi::acquireReadLock($item->getId()); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } list ($ret, $success) = GalleryCoreApi::setThumbnailFromItem($item->getId(), $finishedAlbums[$nameOfAlbumToHighlight]); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } } } if (!empty($form['generateThumbnails']) && !connection_aborted()) { /* * Get the thumbnails for all of the items we created, in 20 item * increments so that we don't consume too much memory. * * Note: this destroys the $itemsCreated array! */ $itemsCreatedCount = count($itemsCreated); $thumbsCreated = 0; while (!empty($itemsCreated)) { $chunk = array_splice($itemsCreated, 0, 20); list ($ret, $thumbTable) = GalleryCoreApi::fetchThumbnailsByItemIds($chunk); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } foreach ($thumbTable as $thumbnail) { list ($ret, $newThumbnail, $wasRebuilt) = GalleryCoreApi::rebuildDerivativeCacheIfNotCurrent($thumbnail->getId()); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } $thumbsCreated++; $ret = $immediateView->renderStatusMessage( $module->translate('Creating thumbnails'), $module->translate(array('text' => 'Thumbnail %d of %d', 'arg1' => $thumbsCreated, 'arg2' => $itemsCreatedCount)), $thumbsCreated / $itemsCreatedCount); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } } GalleryDataCache::reset(); } } $ret = $immediateView->renderStatusMessage( $module->translate('Import complete'), '', 100); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } $redirect['view'] = 'core:SiteAdmin'; $redirect['subView'] = 'migrate:ImportResults'; } if (isset($importLockIds)) { $ret = GalleryCoreApi::releaseLocks($importLockIds); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } else { $importLockIds = array(); } } $results['status'] = $status; $results['error'] = $error; if (!empty($redirect)) { $results['redirect'] = $redirect; if (isset($immediateView)) { $results['sendLateRedirect'] = $immediateView; } } else { $results['delegate']['view'] = 'core:SiteAdmin'; $results['delegate']['subView'] = 'migrate:ConfirmImport'; } return array(GalleryStatus::success(), $results); } /** * Inform the caller if this controller would make use of an immediate * status view * * @return array object GalleryStatus a status code * boolean Can we use an immediate status view? * @static */ function canUseImmediateView() { return true; } /** * * Converts HTML to BBCode * * @param string $item item to convert * @return string */ function convertHtmlToBbcode($item, $sourceEncoding='UTF-8') { $item = Gallery1DataParser::convertString($item, $sourceEncoding); $item = preg_replace('//i', "\n", $item); $item = preg_replace('//i', '[b]', $item); $item = preg_replace('/<\/strong>/i', '[/b]', $item); $item = preg_replace('//i', '[i]', $item); $item = preg_replace('/<\/em>/i', '[/i]', $item); $item = preg_replace('//i', '[b]', $item); $item = preg_replace('/<\/b>/i', '[/b]', $item); $item = preg_replace('//i', '[i]', $item); $item = preg_replace('/<\/i>/i', '[/i]', $item); $item = preg_replace('/
    /i', '[list]', $item); $item = preg_replace('/<\/ul>/i', '[/list]', $item); $item = preg_replace('/
  • /i', '[*]', $item); $item = preg_replace('/<\/li>/i', '', $item); $item = preg_replace('/]*)?\s*src\s*=\s*["\']{0,1}([^\s\'">]*)["\']{0,1}([^>]*)>/is', '[img]$2[/img]', $item); $item = preg_replace('/]*)?\s*href\s*=\s*["\']{0,1}([^\s\'">]*)["\']{0,1}([^>]*)>(.*?)?<\/a>/is', '[url=$2]$4[/url]', $item); $item = strip_tags($item); GalleryUtilities::sanitizeInputValues($item); return $item; } /** * Create the G1->G2 map entries so that Gallery1 links * can be redirected to Gallery2 links. * @param int item id * @param string G1 album name * @param string (optional) G1 item name * @return object GalleryStatus a status code * @author Joseph Elwell */ function createG1ToG2Mapping($itemId, $g1AlbumName, $g1ItemName=null) { $ret = G1MigrateMap::addMapEntry( array('itemId' => $itemId, 'g1album' => $g1AlbumName, 'g1item' => $g1ItemName) ); if ($ret->isError()) { return $ret->wrap(__FILE__, __LINE__); } return GalleryStatus::success(); } } /** * @package Migrate * @subpackage UserInterface */ class ConfirmImportView extends GalleryView { /** * @see GalleryView::loadTemplate */ function loadTemplate(&$template, &$form) { global $gallery; $platform = $gallery->getPlatform(); $illegalAlbumNames = array(); $existingAlbums = array(); $albumValidOwner = array(); $urlDecoded = array(); $albumOwnerUserName = array(); $albumOwnerUid = array(); $titles = array(); if (!isset($form['sourceAlbums'])) { $form['sourceAlbums']=array(); } if (!isset($form['sourceEncoding'])) { $form['sourceEncoding']='ISO-8859-1'; } $albumsPath = GalleryUtilities::getRequestVariables('albumsPath'); $destinationAlbumID = $form['destinationAlbumID']; list ($ret, $uids) = Gallery1DataParser::getUserUids($albumsPath); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } list ($ret, $albums) = Gallery1DataParser::getAlbumList($albumsPath); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } list ($ret, $targetAlbum) = GalleryCoreApi::loadEntitiesById($destinationAlbumID); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } foreach ($form['sourceAlbums'] as $sourceAlbumName) { $urlDecoded[$sourceAlbumName] = urldecode($sourceAlbumName); if (!in_array($urlDecoded[$sourceAlbumName],array_keys($albums))) { return array(GalleryStatus::error(ERROR_BAD_PARAMETER, __FILE__, __LINE__), null); } list ($ret, $albumfields[$sourceAlbumName]) = Gallery1DataParser::loadAlbumFields($albumsPath.$urlDecoded[$sourceAlbumName]); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } } $i=0; if(!isset($albumfields)){ $albumfields = array(); } while ($albumfields) { $existingAlbumId = false; $album = array_shift($albumfields); $encodedName = urlencode($album['name']); if (!in_array($album['parentAlbumName'], $form['sourceAlbums'])) { list ($ret, $existingAlbumId) = GalleryCoreApi::fetchChildIdByPathComponent($destinationAlbumID, $album['name']); } if ($ret->isError()) { if (!$ret->getErrorCode() & ERROR_MISSING_OBJECT) { return array($ret->wrap(__FILE__, __LINE__), null); } $existingAlbums[$encodedName] = false; } else { $existingAlbums[$encodedName] = $existingAlbumId; } $titles[$encodedName] = $album['title']; if (!$platform->isLegalPathComponent($album['name'])){ $illegalAlbumNames[$encodedName] = $platform->legalizePathComponent($album['name']); } else { $illegalAlbumNames[$encodedName] = false; } $validUid = Gallery1DataParser::isValidUid($albumsPath, $album['owner']); if ($validUid){ list($ret, $testUser) = Gallery1DataParser::getUserFieldsByUid($albumsPath, $album['owner']); if ($ret->isError()) { return array($ret->wrap(__FILE__, __LINE__), null); } $albumOwnerUserName[$encodedName] = $testUser['username']; $albumOwnerUid[$encodedName] = $album['owner']; list($ret, $owner) = GalleryCoreApi::fetchUserByUsername( Gallery1DataParser::convertString($testUser['username'], $form['sourceEncoding'])); if ($ret->isError() && !($ret->getErrorCode() & ERROR_MISSING_OBJECT)) { return array($ret->wrap(__FILE__, __LINE__), null); } if (isset($form['migrateUser'][$album['owner']])) { $importingOwner = true; } else { $importingOwner = false; } if ($owner || $importingOwner) { $albumValidOwner[$encodedName] = true; } else { $albumValidOwner[$encodedName] = false; } } else { $albumValidOwner[$encodedName] = true; $albumOwnerUserName[$encodedName] = 'admin'; $albumOwnerUid[$encodedName] = null; } $i++; } $ConfirmImport = array(); $ConfirmImport['uids'] = $uids; $ConfirmImport['albums'] = $albums; $ConfirmImport['albumsPath'] = $albumsPath; $ConfirmImport['existingAlbums'] = $existingAlbums; $ConfirmImport['illegalAlbumNames'] = $illegalAlbumNames; $ConfirmImport['destinationAlbumID'] = $destinationAlbumID; $ConfirmImport['albumValidOwner'] = $albumValidOwner; $ConfirmImport['albumOwnerUserName'] = $albumOwnerUserName; $ConfirmImport['albumOwnerUid'] = $albumOwnerUid; $ConfirmImport['targetAlbum'] = $targetAlbum->getMemberData(); $ConfirmImport['urlDecoded'] = $urlDecoded; $ConfirmImport['titles'] = $titles; $template->setVariable('controller', 'migrate:ConfirmImport'); $template->setVariable('ConfirmImport', $ConfirmImport); return array(GalleryStatus::success(), array('body' => 'modules/migrate/templates/ConfirmImport.tpl')); } } ?>