+ // default post action - upload a photo
+ Hook::callAll('photo_post_init', $request);
+
+ // Determine the album to use
+ $album = trim($request['album'] ?? '');
+ $newalbum = trim($request['newalbum'] ?? '');
+
+ $this->logger->debug('album= ' . $album . ' newalbum= ' . $newalbum);
+
+ $album = $album ?: $newalbum ?: DateTimeFormat::localNow('Y');
+
+ /*
+ * We create a wall item for every photo, but we don't want to
+ * overwhelm the data stream with a hundred newly uploaded photos.
+ * So we will make the first photo uploaded to this album in the last several hours
+ * visible by default, the rest will become visible over time when and if
+ * they acquire comments, likes, dislikes, and/or tags
+ */
+
+ $r = Photo::selectToArray([], ['`album` = ? AND `uid` = ? AND `created` > ?', $album, $this->owner['uid'], DateTimeFormat::utc('now - 3 hours')]);
+ if (!$r || ($album == $this->t(Photo::PROFILE_PHOTOS))) {
+ $visible = 1;
+ } else {
+ $visible = 0;
+ }
+
+ if (!empty($request['not_visible']) && $request['not_visible'] !== 'false') {
+ $visible = 0;
+ }
+
+ $ret = ['src' => '', 'filename' => '', 'filesize' => 0, 'type' => ''];
+
+ Hook::callAll('photo_post_file', $ret);
+
+ if (!empty($ret['src']) && !empty($ret['filesize'])) {
+ $src = $ret['src'];
+ $filename = $ret['filename'];
+ $filesize = $ret['filesize'];
+ $type = $ret['type'];
+ $error = UPLOAD_ERR_OK;
+ } elseif (!empty($_FILES['userfile'])) {
+ $src = $_FILES['userfile']['tmp_name'];
+ $filename = basename($_FILES['userfile']['name']);
+ $filesize = intval($_FILES['userfile']['size']);
+ $type = $_FILES['userfile']['type'];
+ $error = $_FILES['userfile']['error'];
+ } else {
+ $error = UPLOAD_ERR_NO_FILE;
+ }
+
+ if ($error !== UPLOAD_ERR_OK) {
+ switch ($error) {
+ case UPLOAD_ERR_INI_SIZE:
+ $this->systemMessages->addNotice($this->t('Image exceeds size limit of %s', ini_get('upload_max_filesize')));
+ break;
+ case UPLOAD_ERR_FORM_SIZE:
+ $this->systemMessages->addNotice($this->t('Image exceeds size limit of %s', Strings::formatBytes($request['MAX_FILE_SIZE'] ?? 0)));
+ break;
+ case UPLOAD_ERR_PARTIAL:
+ $this->systemMessages->addNotice($this->t('Image upload didn\'t complete, please try again'));
+ break;
+ case UPLOAD_ERR_NO_FILE:
+ $this->systemMessages->addNotice($this->t('Image file is missing'));
+ break;
+ case UPLOAD_ERR_NO_TMP_DIR:
+ case UPLOAD_ERR_CANT_WRITE:
+ case UPLOAD_ERR_EXTENSION:
+ $this->systemMessages->addNotice($this->t('Server can\'t accept new file upload at this time, please contact your administrator'));
+ break;
+ }
+ @unlink($src);
+ $foo = 0;
+ Hook::callAll('photo_post_end', $foo);
+ return;
+ }
+
+ $type = Images::getMimeTypeBySource($src, $filename, $type);
+
+ $this->logger->info('photos: upload: received file: ' . $filename . ' as ' . $src . ' ('. $type . ') ' . $filesize . ' bytes');
+
+ $maximagesize = Strings::getBytesFromShorthand($this->config->get('system', 'maximagesize'));
+
+ if ($maximagesize && ($filesize > $maximagesize)) {
+ $this->systemMessages->addNotice($this->t('Image exceeds size limit of %s', Strings::formatBytes($maximagesize)));
+ @unlink($src);
+ $foo = 0;
+ Hook::callAll('photo_post_end', $foo);
+ return;
+ }
+
+ if (!$filesize) {
+ $this->systemMessages->addNotice($this->t('Image file is empty.'));
+ @unlink($src);
+ $foo = 0;
+ Hook::callAll('photo_post_end', $foo);
+ return;
+ }
+
+ $this->logger->debug('loading contents', ['src' => $src]);
+
+ $imagedata = @file_get_contents($src);
+
+ $image = new Image($imagedata, $type);
+
+ if (!$image->isValid()) {
+ $this->logger->notice('unable to process image');
+ $this->systemMessages->addNotice($this->t('Unable to process image.'));
+ @unlink($src);
+ $foo = 0;
+ Hook::callAll('photo_post_end',$foo);
+ return;
+ }
+
+ $exif = $image->orient($src);
+ @unlink($src);
+
+ $max_length = $this->config->get('system', 'max_image_length');
+ if ($max_length > 0) {
+ $image->scaleDown($max_length);
+ }
+
+ $width = $image->getWidth();
+ $height = $image->getHeight();
+
+ $smallest = 0;
+
+ $resource_id = Photo::newResource();
+
+ $r = Photo::store($image, $this->owner['uid'], 0, $resource_id, $filename, $album, 0 , Photo::DEFAULT, $str_contact_allow, $str_group_allow, $str_contact_deny, $str_group_deny);
+
+ if (!$r) {
+ $this->logger->warning('image store failed');
+ $this->systemMessages->addNotice($this->t('Image upload failed.'));
+ return;