Handle encryption state in web interfacetags/v13.0.0beta2
@@ -950,7 +950,8 @@ | |||
type: $el.attr('data-type'), | |||
etag: $el.attr('data-etag'), | |||
permissions: parseInt($el.attr('data-permissions'), 10), | |||
hasPreview: $el.attr('data-has-preview') === 'true' | |||
hasPreview: $el.attr('data-has-preview') === 'true', | |||
isEncrypted: $el.attr('data-e2eencrypted') === 'true' | |||
}; | |||
var size = $el.attr('data-size'); | |||
if (size) { | |||
@@ -1152,7 +1153,10 @@ | |||
if (type === 'dir') { | |||
mime = mime || 'httpd/unix-directory'; | |||
if (fileData.mountType && fileData.mountType.indexOf('external') === 0) { | |||
if (fileData.isEncrypted) { | |||
icon = OC.MimeType.getIconUrl('dir-encrypted'); | |||
dataIcon = icon; | |||
} else if (fileData.mountType && fileData.mountType.indexOf('external') === 0) { | |||
icon = OC.MimeType.getIconUrl('dir-external'); | |||
dataIcon = icon; | |||
} | |||
@@ -1173,7 +1177,8 @@ | |||
"data-mtime": mtime, | |||
"data-etag": fileData.etag, | |||
"data-permissions": permissions, | |||
"data-has-preview": fileData.hasPreview !== false | |||
"data-has-preview": fileData.hasPreview !== false, | |||
"data-e2eencrypted": fileData.isEncrypted === true | |||
}); | |||
if (dataIcon) { | |||
@@ -1444,7 +1449,9 @@ | |||
path = fileData.path || this.getCurrentDirectory(), | |||
permissions = parseInt(fileData.permissions, 10) || 0; | |||
if (fileData.isShareMountPoint) { | |||
var isEndToEndEncrypted = (type === 'dir' && fileData.isEncrypted); | |||
if (!isEndToEndEncrypted && fileData.isShareMountPoint) { | |||
permissions = permissions | OC.PERMISSION_UPDATE; | |||
} | |||
@@ -217,6 +217,7 @@ describe('OCA.Files.FileList tests', function() { | |||
expect($tr.attr('data-permissions')).toEqual('31'); | |||
expect($tr.attr('data-mime')).toEqual('text/plain'); | |||
expect($tr.attr('data-mtime')).toEqual('123456'); | |||
expect($tr.attr('data-e2eencrypted')).toEqual('false'); | |||
expect($tr.find('a.name').attr('href')) | |||
.toEqual(OC.webroot + '/remote.php/webdav/subdir/testName.txt'); | |||
expect($tr.find('.nametext').text().trim()).toEqual('testName.txt'); | |||
@@ -246,6 +247,7 @@ describe('OCA.Files.FileList tests', function() { | |||
expect($tr.attr('data-permissions')).toEqual('31'); | |||
expect($tr.attr('data-mime')).toEqual('httpd/unix-directory'); | |||
expect($tr.attr('data-mtime')).toEqual('123456'); | |||
expect($tr.attr('data-e2eencrypted')).toEqual('false'); | |||
expect($tr.find('.filesize').text()).toEqual('1 KB'); | |||
expect($tr.find('.date').text()).not.toEqual('?'); | |||
@@ -271,6 +273,7 @@ describe('OCA.Files.FileList tests', function() { | |||
expect($tr.attr('data-permissions')).toEqual('31'); | |||
expect($tr.attr('data-mime')).toBeUndefined(); | |||
expect($tr.attr('data-mtime')).toEqual('123456'); | |||
expect($tr.attr('data-e2eencrypted')).toEqual('false'); | |||
expect($tr.find('.filesize').text()).toEqual('Pending'); | |||
expect($tr.find('.date').text()).not.toEqual('?'); | |||
@@ -293,10 +296,20 @@ describe('OCA.Files.FileList tests', function() { | |||
expect($tr.attr('data-permissions')).toEqual('31'); | |||
expect($tr.attr('data-mime')).toEqual('httpd/unix-directory'); | |||
expect($tr.attr('data-mtime')).toEqual('123456'); | |||
expect($tr.attr('data-e2eencrypted')).toEqual('false'); | |||
expect($tr.find('.filesize').text()).toEqual('Pending'); | |||
expect($tr.find('.date').text()).not.toEqual('?'); | |||
}); | |||
it('generates dir element with true e2eencrypted attribute when calling add() with minimal data including isEncrypted', function() { | |||
var fileData = { | |||
type: 'dir', | |||
name: 'testFolder', | |||
isEncrypted: true | |||
}; | |||
var $tr = fileList.add(fileData); | |||
expect($tr.attr('data-e2eencrypted')).toEqual('true'); | |||
}); | |||
it('generates file element with no permissions when permissions are explicitly none', function() { | |||
var fileData = { | |||
type: 'dir', | |||
@@ -1442,6 +1455,32 @@ describe('OCA.Files.FileList tests', function() { | |||
expect(OC.TestUtil.getImageUrl($td.find('.thumbnail'))).toEqual(OC.webroot + '/core/img/filetypes/folder.svg'); | |||
expect(previewLoadStub.notCalled).toEqual(true); | |||
}); | |||
it('render encrypted folder icon for encrypted root', function() { | |||
var fileData = { | |||
type: 'dir', | |||
mimetype: 'httpd/unix-directory', | |||
name: 'test dir', | |||
isEncrypted: true | |||
}; | |||
var $tr = fileList.add(fileData); | |||
var $td = $tr.find('td.filename'); | |||
expect(OC.TestUtil.getImageUrl($td.find('.thumbnail'))).toEqual(OC.webroot + '/core/img/filetypes/folder-encrypted.svg'); | |||
expect(previewLoadStub.notCalled).toEqual(true); | |||
}); | |||
it('render encrypted folder icon for encrypted subdir', function() { | |||
var fileData = { | |||
type: 'dir', | |||
mimetype: 'httpd/unix-directory', | |||
name: 'test dir', | |||
isEncrypted: true | |||
}; | |||
var $tr = fileList.add(fileData); | |||
var $td = $tr.find('td.filename'); | |||
expect(OC.TestUtil.getImageUrl($td.find('.thumbnail'))).toEqual(OC.webroot + '/core/img/filetypes/folder-encrypted.svg'); | |||
expect(previewLoadStub.notCalled).toEqual(true); | |||
// default icon override | |||
expect($tr.attr('data-icon')).toEqual(OC.webroot + '/core/img/filetypes/folder-encrypted.svg'); | |||
}); | |||
it('render external storage icon for external storage root', function() { | |||
var fileData = { | |||
type: 'dir', | |||
@@ -2086,7 +2125,8 @@ describe('OCA.Files.FileList tests', function() { | |||
size: 12, | |||
etag: 'abc', | |||
permissions: OC.PERMISSION_ALL, | |||
hasPreview: true | |||
hasPreview: true, | |||
isEncrypted: false | |||
}); | |||
expect(files[1]).toEqual({ | |||
id: 3, | |||
@@ -2097,7 +2137,8 @@ describe('OCA.Files.FileList tests', function() { | |||
size: 58009, | |||
etag: '123', | |||
permissions: OC.PERMISSION_ALL, | |||
hasPreview: true | |||
hasPreview: true, | |||
isEncrypted: false | |||
}); | |||
expect(files[2]).toEqual({ | |||
id: 4, | |||
@@ -2108,7 +2149,8 @@ describe('OCA.Files.FileList tests', function() { | |||
size: 250, | |||
etag: '456', | |||
permissions: OC.PERMISSION_ALL, | |||
hasPreview: true | |||
hasPreview: true, | |||
isEncrypted: false | |||
}); | |||
expect(files[0].id).toEqual(1); | |||
expect(files[0].name).toEqual('One.txt'); | |||
@@ -2130,7 +2172,8 @@ describe('OCA.Files.FileList tests', function() { | |||
size: 12, | |||
etag: 'abc', | |||
permissions: OC.PERMISSION_ALL, | |||
hasPreview: true | |||
hasPreview: true, | |||
isEncrypted: false | |||
}); | |||
expect(files[1]).toEqual({ | |||
id: 4, | |||
@@ -2141,7 +2184,8 @@ describe('OCA.Files.FileList tests', function() { | |||
size: 250, | |||
etag: '456', | |||
permissions: OC.PERMISSION_ALL, | |||
hasPreview: true | |||
hasPreview: true, | |||
isEncrypted: false | |||
}); | |||
}); | |||
describe('Download', function() { | |||
@@ -3231,6 +3275,16 @@ describe('OCA.Files.FileList tests', function() { | |||
expect(fileInfo.mimetype).toEqual('text/plain'); | |||
expect(fileInfo.type).toEqual('file'); | |||
expect(fileInfo.path).not.toBeDefined(); | |||
expect(fileInfo.isEncrypted).toEqual(false); | |||
}); | |||
it('sets isEncrypted attribute if data includes true e2eencrypted', function() { | |||
testFiles[3].isEncrypted = true; | |||
fileList.setFiles(testFiles); | |||
$tr = fileList.findFileEl('somedir'); | |||
var fileInfo = fileList.elementToFile($tr); | |||
expect(fileInfo.isEncrypted).toEqual(true); | |||
}); | |||
it('adds path attribute if available', function() { | |||
$tr.attr('data-path', '/subdir'); |
@@ -0,0 +1 @@ | |||
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1"><path fill-rule="evenodd" fill="#0082c9" d="m1.4609 2c-0.25 0-0.4609 0.2109-0.4609 0.4609v11.078c0 0.258 0.2029 0.461 0.4609 0.461h13.078c0.258 0 0.461-0.203 0.461-0.461v-9.0761c0-0.25-0.211-0.4649-0.461-0.4649h-6.539l-2-1.998h-4.5391zm6.5391 3.8008c0.8836 0 1.5996 0.7159 1.5996 1.5996v0.7988h0.4004v2.8008h-4v-2.8008h0.4004v-0.7988c0-0.8837 0.716-1.5996 1.5996-1.5996zm0 0.7988c-0.4419 0-0.8008 0.3589-0.8008 0.8008v0.7988h1.6016v-0.7988c0-0.4419-0.3589-0.8008-0.8008-0.8008z"/></svg> |
@@ -74,6 +74,7 @@ | |||
Client.PROPERTY_PERMISSIONS = '{' + Client.NS_OWNCLOUD + '}permissions'; | |||
Client.PROPERTY_SIZE = '{' + Client.NS_OWNCLOUD + '}size'; | |||
Client.PROPERTY_GETCONTENTLENGTH = '{' + Client.NS_DAV + '}getcontentlength'; | |||
Client.PROPERTY_ISENCRYPTED = '{' + Client.NS_DAV + '}is-encrypted'; | |||
Client.PROTOCOL_HTTP = 'http'; | |||
Client.PROTOCOL_HTTPS = 'https'; | |||
@@ -120,6 +121,10 @@ | |||
* Mount type | |||
*/ | |||
[Client.NS_NEXTCLOUD, 'mount-type'], | |||
/** | |||
* Encryption state | |||
*/ | |||
[Client.NS_NEXTCLOUD, 'is-encrypted'], | |||
]; | |||
/** | |||
@@ -305,6 +310,13 @@ | |||
data.hasPreview = true; | |||
} | |||
var isEncryptedProp = props['{' + Client.NS_NEXTCLOUD + '}is-encrypted']; | |||
if (!_.isUndefined(isEncryptedProp)) { | |||
data.isEncrypted = isEncryptedProp === '1'; | |||
} else { | |||
data.isEncrypted = false; | |||
} | |||
var contentType = props[Client.PROPERTY_GETCONTENTTYPE]; | |||
if (!_.isUndefined(contentType)) { | |||
data.mimetype = contentType; |
@@ -44,6 +44,8 @@ OC.MimeType = { | |||
// Generate path | |||
if (mimeType === 'dir' && $.inArray('folder', files) !== -1) { | |||
return 'folder'; | |||
} else if (mimeType === 'dir-encrypted' && $.inArray('folder-encrypted', files) !== -1) { | |||
return 'folder-encrypted'; | |||
} else if (mimeType === 'dir-shared' && $.inArray('folder-shared', files) !== -1) { | |||
return 'folder-shared'; | |||
} else if (mimeType === 'dir-public' && $.inArray('folder-public', files) !== -1) { |
@@ -104,6 +104,7 @@ OC.MimeTypeList={ | |||
"file", | |||
"folder", | |||
"folder-drag-accept", | |||
"folder-encrypted", | |||
"folder-external", | |||
"folder-public", | |||
"folder-shared", |
@@ -281,10 +281,14 @@ OC.Share = _.extend(OC.Share || {}, { | |||
$tr.find('.filename .thumbnail').css('background-image', 'url(' + shareFolderIcon + ')'); | |||
$tr.attr('data-icon', shareFolderIcon); | |||
} else if (type === 'dir') { | |||
var isEncrypted = $tr.attr('data-e2eencrypted'); | |||
var mountType = $tr.attr('data-mounttype'); | |||
// FIXME: duplicate of FileList._createRow logic for external folder, | |||
// need to refactor the icon logic into a single code path eventually | |||
if (mountType && mountType.indexOf('external') === 0) { | |||
if (isEncrypted === 'true') { | |||
shareFolderIcon = OC.MimeType.getIconUrl('dir-encrypted'); | |||
$tr.attr('data-icon', shareFolderIcon); | |||
} else if (mountType && mountType.indexOf('external') === 0) { | |||
shareFolderIcon = OC.MimeType.getIconUrl('dir-external'); | |||
$tr.attr('data-icon', shareFolderIcon); | |||
} else { |
@@ -224,6 +224,7 @@ describe('OC.Files.Client tests', function() { | |||
expect(props).toContain('{http://owncloud.org/ns}fileid'); | |||
expect(props).toContain('{http://owncloud.org/ns}size'); | |||
expect(props).toContain('{http://owncloud.org/ns}permissions'); | |||
expect(props).toContain('{http://nextcloud.org/ns}is-encrypted'); | |||
}); | |||
it('sends PROPFIND to base url when empty path given', function() { | |||
client.getFolderContents(''); | |||
@@ -262,6 +263,7 @@ describe('OC.Files.Client tests', function() { | |||
expect(info.mtime).toEqual(1436535485000); | |||
expect(info.mimetype).toEqual('text/plain'); | |||
expect(info.etag).toEqual('559fcabd79a38'); | |||
expect(info.isEncrypted).toEqual(false); | |||
// sub entry | |||
info = response[1]; | |||
@@ -274,6 +276,7 @@ describe('OC.Files.Client tests', function() { | |||
expect(info.mtime).toEqual(1436536800000); | |||
expect(info.mimetype).toEqual('httpd/unix-directory'); | |||
expect(info.etag).toEqual('66cfcabd79abb'); | |||
expect(info.isEncrypted).toEqual(false); | |||
}); | |||
}); | |||
it('returns parent node in result if specified', function() { | |||
@@ -303,6 +306,7 @@ describe('OC.Files.Client tests', function() { | |||
expect(info.mtime).toEqual(1436522405000); | |||
expect(info.mimetype).toEqual('httpd/unix-directory'); | |||
expect(info.etag).toEqual('56cfcabd79abb'); | |||
expect(info.isEncrypted).toEqual(false); | |||
// the two other entries follow | |||
expect(response[1].id).toEqual(51); | |||
@@ -422,6 +426,7 @@ describe('OC.Files.Client tests', function() { | |||
expect(props).toContain('{http://owncloud.org/ns}fileid'); | |||
expect(props).toContain('{http://owncloud.org/ns}size'); | |||
expect(props).toContain('{http://owncloud.org/ns}permissions'); | |||
expect(props).toContain('{http://nextcloud.org/ns}is-encrypted'); | |||
}); | |||
it('parses the result list into a FileInfo array', function() { | |||
var promise = client.getFilteredFiles({ | |||
@@ -473,7 +478,7 @@ describe('OC.Files.Client tests', function() { | |||
describe('file info', function() { | |||
var responseXml = dav.Client.prototype.parseMultiStatus( | |||
'<?xml version="1.0" encoding="utf-8"?>' + | |||
'<d:multistatus xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns" xmlns:oc="http://owncloud.org/ns">' + | |||
'<d:multistatus xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns" xmlns:oc="http://owncloud.org/ns" xmlns:nc="http://nextcloud.org/ns">' + | |||
makeResponseBlock( | |||
'/owncloud/remote.php/webdav/path/to%20space/%E6%96%87%E4%BB%B6%E5%A4%B9/', | |||
{ | |||
@@ -483,7 +488,8 @@ describe('OC.Files.Client tests', function() { | |||
'oc:id': '00000011oc2d13a6a068', | |||
'oc:fileid': '11', | |||
'oc:permissions': 'GRDNVCK', | |||
'oc:size': '120' | |||
'oc:size': '120', | |||
'nc:is-encrypted': '1' | |||
}, | |||
[ | |||
'd:getcontenttype', | |||
@@ -510,6 +516,7 @@ describe('OC.Files.Client tests', function() { | |||
expect(props).toContain('{http://owncloud.org/ns}fileid'); | |||
expect(props).toContain('{http://owncloud.org/ns}size'); | |||
expect(props).toContain('{http://owncloud.org/ns}permissions'); | |||
expect(props).toContain('{http://nextcloud.org/ns}is-encrypted'); | |||
}); | |||
it('parses the result into a FileInfo', function() { | |||
var promise = client.getFileInfo('path/to space/文件夹'); | |||
@@ -535,6 +542,7 @@ describe('OC.Files.Client tests', function() { | |||
expect(info.mtime).toEqual(1436522405000); | |||
expect(info.mimetype).toEqual('httpd/unix-directory'); | |||
expect(info.etag).toEqual('56cfcabd79abb'); | |||
expect(info.isEncrypted).toEqual(true); | |||
}); | |||
}); | |||
it('properly parses entry inside root', function() { | |||
@@ -583,6 +591,7 @@ describe('OC.Files.Client tests', function() { | |||
expect(info.mtime).toEqual(1436522405000); | |||
expect(info.mimetype).toEqual('httpd/unix-directory'); | |||
expect(info.etag).toEqual('56cfcabd79abb'); | |||
expect(info.isEncrypted).toEqual(false); | |||
}); | |||
}); | |||
it('rejects promise when an error occurred', function() { |
@@ -151,6 +151,13 @@ describe('OC.Share tests', function() { | |||
checkIcon('filetypes/folder-external'); | |||
}); | |||
it('shows encrypted icon if encrypted folder', function() { | |||
$file.attr('data-type', 'dir'); | |||
$file.attr('data-e2eencrypted', true); | |||
OC.Share.markFileAsShared($file, false, false); | |||
checkIcon('filetypes/folder-encrypted'); | |||
}); | |||
}); | |||
describe('displaying the recipients', function() { |