Merge pull request #18586 from owncloud/ie8-uploadavatar
Fix uploading avatar and root certs in IE8
This commit is contained in:
commit
18ad60380c
8 changed files with 111 additions and 34 deletions
|
@ -140,12 +140,21 @@ class AvatarController extends Controller {
|
|||
$userId = $this->userSession->getUser()->getUID();
|
||||
$files = $this->request->getUploadedFile('files');
|
||||
|
||||
$headers = [];
|
||||
if ($this->request->isUserAgent([\OC\AppFramework\Http\Request::USER_AGENT_IE_8])) {
|
||||
// due to upload iframe workaround, need to set content-type to text/plain
|
||||
$headers['Content-Type'] = 'text/plain';
|
||||
}
|
||||
|
||||
if (isset($path)) {
|
||||
$path = stripslashes($path);
|
||||
$node = $this->userFolder->get($path);
|
||||
if ($node->getSize() > 20*1024*1024) {
|
||||
return new DataResponse(['data' => ['message' => $this->l->t('File is too big')]],
|
||||
Http::STATUS_BAD_REQUEST);
|
||||
return new DataResponse(
|
||||
['data' => ['message' => $this->l->t('File is too big')]],
|
||||
Http::STATUS_BAD_REQUEST,
|
||||
$headers
|
||||
);
|
||||
}
|
||||
$content = $node->getContent();
|
||||
} elseif (!is_null($files)) {
|
||||
|
@ -155,20 +164,29 @@ class AvatarController extends Controller {
|
|||
!\OC\Files\Filesystem::isFileBlacklisted($files['tmp_name'][0])
|
||||
) {
|
||||
if ($files['size'][0] > 20*1024*1024) {
|
||||
return new DataResponse(['data' => ['message' => $this->l->t('File is too big')]],
|
||||
Http::STATUS_BAD_REQUEST);
|
||||
return new DataResponse(
|
||||
['data' => ['message' => $this->l->t('File is too big')]],
|
||||
Http::STATUS_BAD_REQUEST,
|
||||
$headers
|
||||
);
|
||||
}
|
||||
$this->cache->set('avatar_upload', file_get_contents($files['tmp_name'][0]), 7200);
|
||||
$content = $this->cache->get('avatar_upload');
|
||||
unlink($files['tmp_name'][0]);
|
||||
} else {
|
||||
return new DataResponse(['data' => ['message' => $this->l->t('Invalid file provided')]],
|
||||
Http::STATUS_BAD_REQUEST);
|
||||
return new DataResponse(
|
||||
['data' => ['message' => $this->l->t('Invalid file provided')]],
|
||||
Http::STATUS_BAD_REQUEST,
|
||||
$headers
|
||||
);
|
||||
}
|
||||
} else {
|
||||
//Add imgfile
|
||||
return new DataResponse(['data' => ['message' => $this->l->t('No image or file provided')]],
|
||||
Http::STATUS_BAD_REQUEST);
|
||||
return new DataResponse(
|
||||
['data' => ['message' => $this->l->t('No image or file provided')]],
|
||||
Http::STATUS_BAD_REQUEST,
|
||||
$headers
|
||||
);
|
||||
}
|
||||
|
||||
try {
|
||||
|
@ -179,16 +197,32 @@ class AvatarController extends Controller {
|
|||
if ($image->valid()) {
|
||||
$mimeType = $image->mimeType();
|
||||
if ($mimeType !== 'image/jpeg' && $mimeType !== 'image/png') {
|
||||
return new DataResponse(['data' => ['message' => $this->l->t('Unknown filetype')]]);
|
||||
return new DataResponse(
|
||||
['data' => ['message' => $this->l->t('Unknown filetype')]],
|
||||
Http::STATUS_OK,
|
||||
$headers
|
||||
);
|
||||
}
|
||||
|
||||
$this->cache->set('tmpAvatar', $image->data(), 7200);
|
||||
return new DataResponse(['data' => 'notsquare']);
|
||||
return new DataResponse(
|
||||
['data' => 'notsquare'],
|
||||
Http::STATUS_OK,
|
||||
$headers
|
||||
);
|
||||
} else {
|
||||
return new DataResponse(['data' => ['message' => $this->l->t('Invalid image')]]);
|
||||
return new DataResponse(
|
||||
['data' => ['message' => $this->l->t('Invalid image')]],
|
||||
Http::STATUS_OK,
|
||||
$headers
|
||||
);
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
return new DataResponse(['data' => ['message' => $e->getMessage()]]);
|
||||
return new DataResponse(
|
||||
['data' => ['message' => $e->getMessage()]],
|
||||
Http::STATUS_OK,
|
||||
$headers
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -85,6 +85,7 @@ var OC={
|
|||
appConfig: window.oc_appconfig || {},
|
||||
theme: window.oc_defaults || {},
|
||||
coreApps:['', 'admin','log','core/search','settings','core','3rdparty'],
|
||||
requestToken: oc_requesttoken,
|
||||
menuSpeed: 50,
|
||||
|
||||
/**
|
||||
|
|
|
@ -43,6 +43,7 @@ use OCP\Security\ISecureRandom;
|
|||
class Request implements \ArrayAccess, \Countable, IRequest {
|
||||
|
||||
const USER_AGENT_IE = '/MSIE/';
|
||||
const USER_AGENT_IE_8 = '/MSIE 8.0/';
|
||||
// Android Chrome user agent: https://developers.google.com/chrome/mobile/docs/user-agent
|
||||
const USER_AGENT_ANDROID_MOBILE_CHROME = '#Android.*Chrome/[.0-9]*#';
|
||||
const USER_AGENT_FREEBOX = '#^Mozilla/5\.0$#';
|
||||
|
|
|
@ -83,7 +83,13 @@ abstract class Controller {
|
|||
$data->getData(),
|
||||
$data->getStatus()
|
||||
);
|
||||
$response->setHeaders(array_merge($data->getHeaders(), $response->getHeaders()));
|
||||
$dataHeaders = $data->getHeaders();
|
||||
$headers = $response->getHeaders();
|
||||
// do not overwrite Content-Type if it already exists
|
||||
if (isset($dataHeaders['Content-Type'])) {
|
||||
unset($headers['Content-Type']);
|
||||
}
|
||||
$response->setHeaders(array_merge($dataHeaders, $headers));
|
||||
return $response;
|
||||
} else {
|
||||
return new JSONResponse($data);
|
||||
|
|
|
@ -68,19 +68,25 @@ class CertificateController extends Controller {
|
|||
* @return array
|
||||
*/
|
||||
public function addPersonalRootCertificate() {
|
||||
$headers = [];
|
||||
if ($this->request->isUserAgent([\OC\AppFramework\Http\Request::USER_AGENT_IE_8])) {
|
||||
// due to upload iframe workaround, need to set content-type to text/plain
|
||||
$headers['Content-Type'] = 'text/plain';
|
||||
}
|
||||
|
||||
if ($this->isCertificateImportAllowed() === false) {
|
||||
return new DataResponse('Individual certificate management disabled', Http::STATUS_FORBIDDEN);
|
||||
return new DataResponse(['message' => 'Individual certificate management disabled'], Http::STATUS_FORBIDDEN, $headers);
|
||||
}
|
||||
|
||||
$file = $this->request->getUploadedFile('rootcert_import');
|
||||
if(empty($file)) {
|
||||
return new DataResponse(['message' => 'No file uploaded'], Http::STATUS_UNPROCESSABLE_ENTITY);
|
||||
return new DataResponse(['message' => 'No file uploaded'], Http::STATUS_UNPROCESSABLE_ENTITY, $headers);
|
||||
}
|
||||
|
||||
try {
|
||||
$certificate = $this->certificateManager->addCertificate(file_get_contents($file['tmp_name']), $file['name']);
|
||||
return new DataResponse([
|
||||
return new DataResponse(
|
||||
[
|
||||
'name' => $certificate->getName(),
|
||||
'commonName' => $certificate->getCommonName(),
|
||||
'organization' => $certificate->getOrganization(),
|
||||
|
@ -90,9 +96,12 @@ class CertificateController extends Controller {
|
|||
'validTillString' => $this->l10n->l('date', $certificate->getExpireDate()),
|
||||
'issuer' => $certificate->getIssuerName(),
|
||||
'issuerOrganization' => $certificate->getIssuerOrganization(),
|
||||
]);
|
||||
],
|
||||
Http::STATUS_OK,
|
||||
$headers
|
||||
);
|
||||
} catch (\Exception $e) {
|
||||
return new DataResponse('An error occurred.', Http::STATUS_UNPROCESSABLE_ENTITY);
|
||||
return new DataResponse('An error occurred.', Http::STATUS_UNPROCESSABLE_ENTITY, $headers);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -5,8 +5,6 @@
|
|||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
/* global OC, t */
|
||||
|
||||
/**
|
||||
* The callback will be fired as soon as enter is pressed by the
|
||||
* user or 1 second after the last data entry
|
||||
|
@ -156,6 +154,9 @@ function cleanCropper () {
|
|||
}
|
||||
|
||||
function avatarResponseHandler (data) {
|
||||
if (typeof data === 'string') {
|
||||
data = $.parseJSON(data);
|
||||
}
|
||||
var $warning = $('#avatar .warning');
|
||||
$warning.hide();
|
||||
if (data.status === "success") {
|
||||
|
@ -233,7 +234,21 @@ $(document).ready(function () {
|
|||
|
||||
var uploadparms = {
|
||||
done: function (e, data) {
|
||||
avatarResponseHandler(data.result);
|
||||
var response = data;
|
||||
if (typeof data.result === 'string') {
|
||||
response = $.parseJSON(data.result);
|
||||
} else if (data.result && data.result.length) {
|
||||
// fetch response from iframe
|
||||
response = $.parseJSON(data.result[0].body.innerText);
|
||||
} else {
|
||||
response = data.result;
|
||||
}
|
||||
avatarResponseHandler(response);
|
||||
},
|
||||
submit: function(e, data) {
|
||||
data.formData = _.extend(data.formData || {}, {
|
||||
requesttoken: OC.requestToken
|
||||
});
|
||||
},
|
||||
fail: function (e, data){
|
||||
var msg = data.jqXHR.statusText + ' (' + data.jqXHR.status + ')';
|
||||
|
@ -251,10 +266,6 @@ $(document).ready(function () {
|
|||
}
|
||||
};
|
||||
|
||||
$('#uploadavatarbutton').click(function () {
|
||||
$('#uploadavatar').click();
|
||||
});
|
||||
|
||||
$('#uploadavatar').fileupload(uploadparms);
|
||||
|
||||
$('#selectavatar').click(function () {
|
||||
|
@ -344,7 +355,24 @@ $(document).ready(function () {
|
|||
$('#sslCertificate tr > td').tipsy({gravity: 'n', live: true});
|
||||
|
||||
$('#rootcert_import').fileupload({
|
||||
submit: function(e, data) {
|
||||
data.formData = _.extend(data.formData || {}, {
|
||||
requesttoken: OC.requestToken
|
||||
});
|
||||
},
|
||||
success: function (data) {
|
||||
if (typeof data === 'string') {
|
||||
data = $.parseJSON(data);
|
||||
} else if (data && data.length) {
|
||||
// fetch response from iframe
|
||||
data = $.parseJSON(data[0].body.innerText);
|
||||
}
|
||||
if (!data || typeof(data) === 'string') {
|
||||
// IE8 iframe workaround comes here instead of fail()
|
||||
OC.Notification.showTemporary(
|
||||
t('settings', 'An error occurred. Please upload an ASCII-encoded PEM certificate.'));
|
||||
return;
|
||||
}
|
||||
var issueDate = new Date(data.validFrom * 1000);
|
||||
var expireDate = new Date(data.validTill * 1000);
|
||||
var now = new Date();
|
||||
|
@ -374,10 +402,6 @@ $(document).ready(function () {
|
|||
}
|
||||
});
|
||||
|
||||
$('#rootcert_import_button').click(function () {
|
||||
$('#rootcert_import').click();
|
||||
});
|
||||
|
||||
if ($('#sslCertificate > tbody > tr').length === 0) {
|
||||
$('#sslCertificate').hide();
|
||||
}
|
||||
|
|
|
@ -46,6 +46,7 @@ OC_Util::addScript( 'settings', 'personal' );
|
|||
OC_Util::addStyle( 'settings', 'settings' );
|
||||
\OC_Util::addVendorScript('strengthify/jquery.strengthify');
|
||||
\OC_Util::addVendorStyle('strengthify/strengthify');
|
||||
\OC_Util::addScript('files', 'jquery.iframe-transport');
|
||||
\OC_Util::addScript('files', 'jquery.fileupload');
|
||||
if ($config->getSystemValue('enable_avatars', true) === true) {
|
||||
\OC_Util::addVendorScript('jcrop/js/jquery.Jcrop');
|
||||
|
|
|
@ -155,10 +155,11 @@ if($_['passwordChangeSupported']) {
|
|||
<div class="avatardiv"></div><br>
|
||||
<div class="warning hidden"></div>
|
||||
<?php if ($_['avatarChangeSupported']): ?>
|
||||
<div class="inlineblock button" id="uploadavatarbutton"><?php p($l->t('Upload new')); ?></div>
|
||||
<input type="file" class="hidden" name="files[]" id="uploadavatar">
|
||||
<label for="uploadavatar" class="inlineblock button" id="uploadavatarbutton"><?php p($l->t('Upload new')); ?></label>
|
||||
<div class="inlineblock button" id="selectavatar"><?php p($l->t('Select new from Files')); ?></div>
|
||||
<div class="inlineblock button" id="removeavatar"><?php p($l->t('Remove image')); ?></div><br>
|
||||
<div class="inlineblock button" id="removeavatar"><?php p($l->t('Remove image')); ?></div>
|
||||
<input type="file" name="files[]" id="uploadavatar" class="hiddenuploadfield">
|
||||
<br>
|
||||
<?php p($l->t('Either png or jpg. Ideally square but you will be able to crop it. The file is not allowed to exceed the maximum size of 20 MB.')); ?>
|
||||
<?php else: ?>
|
||||
<?php p($l->t('Your avatar is provided by your original account.')); ?>
|
||||
|
@ -239,8 +240,8 @@ if($_['passwordChangeSupported']) {
|
|||
</tbody>
|
||||
</table>
|
||||
<form class="uploadButton" method="post" action="<?php p($_['urlGenerator']->linkToRoute('settings.Certificate.addPersonalRootCertificate')); ?>" target="certUploadFrame">
|
||||
<input type="file" id="rootcert_import" name="rootcert_import" class="hidden">
|
||||
<input type="button" id="rootcert_import_button" value="<?php p($l->t('Import root certificate')); ?>"/>
|
||||
<label for="rootcert_import" class="inlineblock button" id="rootcert_import_button"><?php p($l->t('Import root certificate')); ?></label>
|
||||
<input type="file" id="rootcert_import" name="rootcert_import" class="hiddenuploadfield">
|
||||
</form>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
|
Loading…
Reference in a new issue