mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-24 06:20:56 +01:00
Consolidate handling of special properties for newly uploaded files
Summary: Fixes T5849. When a new file is created, we might have to actually write the data to a storage engine, or we might be able to just point at data which is already there. Currently, these two paths handle `$params` with different code and mild behavioral differences. Instead, have them call the same code so they get the same behavior. Test Plan: - Uploaded the same file multiple times to home page. - Uploaded the same file multiple times as profile picture. - Generated files via Diffusion. - All the files got the expected properties, whether they were reusing data or not. Reviewers: btrahan, 20after4 Reviewed By: 20after4 Subscribers: epriestley Maniphest Tasks: T5849 Differential Revision: https://secure.phabricator.com/D10216
This commit is contained in:
parent
a9f2c07345
commit
eb9dcd6fba
1 changed files with 67 additions and 37 deletions
|
@ -1,5 +1,21 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parameters
|
||||||
|
* ==========
|
||||||
|
*
|
||||||
|
* When creating a new file using a method like @{method:newFromFileData}, these
|
||||||
|
* parameters are supported:
|
||||||
|
*
|
||||||
|
* | name | Human readable filename.
|
||||||
|
* | authorPHID | User PHID of uploader.
|
||||||
|
* | ttl | Temporary file lifetime, in seconds.
|
||||||
|
* | viewPolicy | File visibility policy.
|
||||||
|
* | isExplicitUpload | Used to show users files they explicitly uploaded.
|
||||||
|
* | canCDN | Allows the file to be cached and delivered over a CDN.
|
||||||
|
* | mime-type | Optional, explicit file MIME type.
|
||||||
|
*
|
||||||
|
*/
|
||||||
final class PhabricatorFile extends PhabricatorFileDAO
|
final class PhabricatorFile extends PhabricatorFileDAO
|
||||||
implements
|
implements
|
||||||
PhabricatorTokenReceiverInterface,
|
PhabricatorTokenReceiverInterface,
|
||||||
|
@ -159,10 +175,11 @@ final class PhabricatorFile extends PhabricatorFileDAO
|
||||||
return $file;
|
return $file;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function newFileFromContentHash($hash, $params) {
|
public static function newFileFromContentHash($hash, array $params) {
|
||||||
// Check to see if a file with same contentHash exist
|
// Check to see if a file with same contentHash exist
|
||||||
$file = id(new PhabricatorFile())->loadOneWhere(
|
$file = id(new PhabricatorFile())->loadOneWhere(
|
||||||
'contentHash = %s LIMIT 1', $hash);
|
'contentHash = %s LIMIT 1',
|
||||||
|
$hash);
|
||||||
|
|
||||||
if ($file) {
|
if ($file) {
|
||||||
// copy storageEngine, storageHandle, storageFormat
|
// copy storageEngine, storageHandle, storageFormat
|
||||||
|
@ -172,21 +189,9 @@ final class PhabricatorFile extends PhabricatorFileDAO
|
||||||
$copy_of_byteSize = $file->getByteSize();
|
$copy_of_byteSize = $file->getByteSize();
|
||||||
$copy_of_mimeType = $file->getMimeType();
|
$copy_of_mimeType = $file->getMimeType();
|
||||||
|
|
||||||
$file_name = idx($params, 'name');
|
|
||||||
$file_name = self::normalizeFileName($file_name);
|
|
||||||
$file_ttl = idx($params, 'ttl');
|
|
||||||
$authorPHID = idx($params, 'authorPHID');
|
|
||||||
|
|
||||||
$new_file = new PhabricatorFile();
|
$new_file = new PhabricatorFile();
|
||||||
|
|
||||||
$new_file->setName($file_name);
|
|
||||||
$new_file->setByteSize($copy_of_byteSize);
|
$new_file->setByteSize($copy_of_byteSize);
|
||||||
$new_file->setAuthorPHID($authorPHID);
|
|
||||||
$new_file->setTtl($file_ttl);
|
|
||||||
|
|
||||||
if (idx($params, 'viewPolicy')) {
|
|
||||||
$new_file->setViewPolicy($params['viewPolicy']);
|
|
||||||
}
|
|
||||||
|
|
||||||
$new_file->setContentHash($hash);
|
$new_file->setContentHash($hash);
|
||||||
$new_file->setStorageEngine($copy_of_storage_engine);
|
$new_file->setStorageEngine($copy_of_storage_engine);
|
||||||
|
@ -195,6 +200,8 @@ final class PhabricatorFile extends PhabricatorFileDAO
|
||||||
$new_file->setMimeType($copy_of_mimeType);
|
$new_file->setMimeType($copy_of_mimeType);
|
||||||
$new_file->copyDimensions($file);
|
$new_file->copyDimensions($file);
|
||||||
|
|
||||||
|
$new_file->readPropertiesFromParameters($params);
|
||||||
|
|
||||||
$new_file->save();
|
$new_file->save();
|
||||||
|
|
||||||
return $new_file;
|
return $new_file;
|
||||||
|
@ -253,39 +260,19 @@ final class PhabricatorFile extends PhabricatorFileDAO
|
||||||
$exceptions);
|
$exceptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
$file_name = idx($params, 'name');
|
|
||||||
$file_name = self::normalizeFileName($file_name);
|
|
||||||
$file_ttl = idx($params, 'ttl');
|
|
||||||
|
|
||||||
// If for whatever reason, authorPHID isn't passed as a param
|
|
||||||
// (always the case with newFromFileDownload()), store a ''
|
|
||||||
$authorPHID = idx($params, 'authorPHID');
|
|
||||||
|
|
||||||
$file->setName($file_name);
|
|
||||||
$file->setByteSize(strlen($data));
|
$file->setByteSize(strlen($data));
|
||||||
$file->setAuthorPHID($authorPHID);
|
|
||||||
$file->setTtl($file_ttl);
|
|
||||||
$file->setContentHash(self::hashFileContent($data));
|
$file->setContentHash(self::hashFileContent($data));
|
||||||
|
|
||||||
if (idx($params, 'viewPolicy')) {
|
|
||||||
$file->setViewPolicy($params['viewPolicy']);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (idx($params, 'canCDN')) {
|
|
||||||
$file->setCanCDN(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
$file->setStorageEngine($engine_identifier);
|
$file->setStorageEngine($engine_identifier);
|
||||||
$file->setStorageHandle($data_handle);
|
$file->setStorageHandle($data_handle);
|
||||||
|
|
||||||
// TODO: This is probably YAGNI, but allows for us to do encryption or
|
// TODO: This is probably YAGNI, but allows for us to do encryption or
|
||||||
// compression later if we want.
|
// compression later if we want.
|
||||||
$file->setStorageFormat(self::STORAGE_FORMAT_RAW);
|
$file->setStorageFormat(self::STORAGE_FORMAT_RAW);
|
||||||
$file->setIsExplicitUpload(idx($params, 'isExplicitUpload') ? 1 : 0);
|
|
||||||
|
|
||||||
if (isset($params['mime-type'])) {
|
$file->readPropertiesFromParameters($params);
|
||||||
$file->setMimeType($params['mime-type']);
|
|
||||||
} else {
|
if (!$file->getMimeType()) {
|
||||||
$tmp = new TempFile();
|
$tmp = new TempFile();
|
||||||
Filesystem::writeFile($tmp, $data);
|
Filesystem::writeFile($tmp, $data);
|
||||||
$file->setMimeType(Filesystem::getMimeType($tmp));
|
$file->setMimeType(Filesystem::getMimeType($tmp));
|
||||||
|
@ -936,6 +923,49 @@ final class PhabricatorFile extends PhabricatorFileDAO
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configure a newly created file object according to specified parameters.
|
||||||
|
*
|
||||||
|
* This method is called both when creating a file from fresh data, and
|
||||||
|
* when creating a new file which reuses existing storage.
|
||||||
|
*
|
||||||
|
* @param map<string, wild> Bag of parameters, see @{class:PhabricatorFile}
|
||||||
|
* for documentation.
|
||||||
|
* @return this
|
||||||
|
*/
|
||||||
|
private function readPropertiesFromParameters(array $params) {
|
||||||
|
$file_name = idx($params, 'name');
|
||||||
|
$file_name = self::normalizeFileName($file_name);
|
||||||
|
$this->setName($file_name);
|
||||||
|
|
||||||
|
$author_phid = idx($params, 'authorPHID');
|
||||||
|
$this->setAuthorPHID($author_phid);
|
||||||
|
|
||||||
|
$file_ttl = idx($params, 'ttl');
|
||||||
|
$this->setTtl($file_ttl);
|
||||||
|
|
||||||
|
$view_policy = idx($params, 'viewPolicy');
|
||||||
|
if ($view_policy) {
|
||||||
|
$this->setViewPolicy($params['viewPolicy']);
|
||||||
|
}
|
||||||
|
|
||||||
|
$is_explicit = (idx($params, 'isExplicitUpload') ? 1 : 0);
|
||||||
|
$this->setIsExplicitUpload($is_explicit);
|
||||||
|
|
||||||
|
$can_cdn = idx($params, 'canCDN');
|
||||||
|
if ($can_cdn) {
|
||||||
|
$this->setCanCDN(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
$mime_type = idx($params, 'mime-type');
|
||||||
|
if ($mime_type) {
|
||||||
|
$this->setMimeType($mime_type);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* -( PhabricatorPolicyInterface Implementation )-------------------------- */
|
/* -( PhabricatorPolicyInterface Implementation )-------------------------- */
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue