Skip to content
This repository has been archived by the owner on Nov 25, 2020. It is now read-only.

Commit

Permalink
Handle custom RW permissions for remote users.
Browse files Browse the repository at this point in the history
  • Loading branch information
cdujeu committed Feb 27, 2016
1 parent 723cc5f commit 7b2299d
Show file tree
Hide file tree
Showing 5 changed files with 169 additions and 39 deletions.
3 changes: 2 additions & 1 deletion core/src/plugins/action.share/class.ShareLink.php
Expand Up @@ -192,7 +192,8 @@ public function getJsonData($publicAccessManager, $messages){
"public" => $minisiteIsPublic?"true":"false",
"disable_download" => $dlDisabled,
"hash" => $this->getHash(),
"hash_is_shorten" => isSet($shareMeta["short_form_url"])
"hash_is_shorten" => isSet($shareMeta["short_form_url"]),
"internal_user_id" => (isSet($storedData["PRELOG_USER"]) ? $storedData["PRELOG_USER"] : $storedData["PRESET_LOGIN"])
);

if(!isSet($storedData["TARGET"]) || $storedData["TARGET"] == "public"){
Expand Down
20 changes: 19 additions & 1 deletion core/src/plugins/action.share/res/react-share-form.css
Expand Up @@ -170,6 +170,22 @@ div#react_share_form div.user-badge {
margin-left: 50px;
margin-right: 11px;
padding-top: 1px;
display: -webkit-box;
display: -webkit-flex;
display: flex;
-webkit-box-orient: horizontal;
-webkit-box-direction: normal;
-webkit-flex-direction: row;
flex-direction: row;
}
div#react_share_form div.user-badge .user-badge-label {
-webkit-box-flex: 5;
-webkit-flex: 5;
flex: 5;
padding: 13px 0;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
div#react_share_form div.user-badge:last-of-type {
border-bottom: 0;
Expand Down Expand Up @@ -210,7 +226,6 @@ div#react_share_form div.user-badge img {
width: 32px;
}
div#react_share_form div.user-badge div.user-badge-menu-box {
float: right;
font-size: 13px;
position: relative;
}
Expand Down Expand Up @@ -265,6 +280,9 @@ div#react_share_form a.revert-button {
div.react-autosuggest {
padding-left: 4px;
}
div.react-autosuggest li.react-autosuggest__suggestion .user-badge {
display: block !important;
}
div.react-autosuggest .react-autosuggest__suggestion--focused {
background-color: aliceblue;
}
Expand Down
15 changes: 14 additions & 1 deletion core/src/plugins/action.share/res/react-share-form.less
Expand Up @@ -197,6 +197,15 @@ div#react_share_form {
margin-left: 50px;
margin-right: 11px;
padding-top: 1px;
display: flex;
flex-direction: row;
.user-badge-label {
flex: 5;
padding: 13px 0;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
&:last-of-type {
border-bottom: 0;
}
Expand Down Expand Up @@ -240,7 +249,6 @@ div#react_share_form {
width: @width2;
}
div.user-badge-menu-box {
float: right;
font-size: 13px;
position: relative;
div.mui-menu.mui-visible {
Expand Down Expand Up @@ -297,6 +305,11 @@ div#react_share_form {

div.react-autosuggest {
padding-left: 4px;
li.react-autosuggest__suggestion{
.user-badge{
display: block !important;
}
}
.react-autosuggest__suggestion--focused {
background-color: aliceblue;
}
Expand Down
108 changes: 82 additions & 26 deletions core/src/plugins/action.share/res/react/ShareDialog.js
Expand Up @@ -248,7 +248,10 @@
onUserUpdate={this.onUserUpdate}
saveSelectionAsTeam={PydioUsers.Client.saveSelectionSupported()?this.onSaveSelection:null}
/>
<RemoteUsers shareModel={this.props.shareModel}/>
<RemoteUsers
shareModel={this.props.shareModel}
onUserUpdate={this.onUserUpdate}
/>
</div>
);
}
Expand Down Expand Up @@ -341,10 +344,10 @@
var menu = this.renderMenu();
return (
<div className={"user-badge user-type-" + this.props.type}>
{menu}
{avatar}
<span className="user-badge-label">{this.props.label}</span>
{this.props.children}
{menu}
</div>
);
}
Expand Down Expand Up @@ -468,7 +471,8 @@
var RemoteUsers = React.createClass({

propTypes:{
shareModel: React.PropTypes.instanceOf(ReactModel.Share)
shareModel: React.PropTypes.instanceOf(ReactModel.Share),
onUserUpdate:React.PropTypes.func.isRequired
},

getInitialState: function(){
Expand All @@ -494,30 +498,12 @@
render: function(){

var inv = this.props.shareModel.getOcsLinks().map(function(link){
var rem = function(){
this.removeUser(link.hash);
}.bind(this);
var status;
if(!link.invitation){
status = 'not sent';
}else {
if(link.invitation.STATUS == 1){
status = 'pending';
}else if(link.invitation.STATUS == 2){
status = 'accepted';
}else if(link.invitation.STATUS == 4){
status = 'rejected';
}
}
var menuItems = [{text:'Remove', callback:rem}];
var host = link.HOST || link.invitation.HOST;
var user = link.USER || link.invitation.USER;
return (
<UserBadge
label={user + " @ " + host + " (" + status + ")"}
avatar={null}
type={"remote_user"}
menus={menuItems}
<RemoteUserEntry
shareModel={this.props.shareModel}
linkData={link}
onRemoveUser={this.removeUser}
onUserUpdate={this.props.onUserUpdate}
/>
);
}.bind(this));
Expand All @@ -536,6 +522,76 @@
}
});

var RemoteUserEntry = React.createClass({

propTypes:{
shareModel:React.PropTypes.instanceOf(ReactModel.Share),
linkData:React.PropTypes.object.isRequired,
onRemoveUser:React.PropTypes.func.isRequired,
onUserUpdate:React.PropTypes.func.isRequired
},

getInitialState(){
return {
internalUser: this.props.shareModel.getSharedUser(this.props.linkData['internal_user_id'])
};
},

componentWillReceiveProps(newProps, oldProps){
this.setState({
internalUser:newProps.shareModel.getSharedUser(newProps.linkData['internal_user_id'])
});
},

buildLabel: function(){
var link = this.props.linkData;

var status;
if(!link.invitation){
status = 'not sent';
}else {
if(link.invitation.STATUS == 1){
status = 'pending';
}else if(link.invitation.STATUS == 2){
status = 'accepted';
}else if(link.invitation.STATUS == 4){
status = 'rejected';
}
}

var host = link.HOST || link.invitation.HOST;
var user = link.USER || link.invitation.USER;
return user + " @ " + host + " (" + status + ")";
},

removeUser: function(){
this.props.onRemoveUser(this.props.linkData['hash']);
},

onUpdateRight:function(event){
var target = event.target;
this.props.onUserUpdate('update_right', this.state.internalUser.ID, {right:target.name, add:target.checked});
},

render: function(){
var menuItems = [{text:'Remove', callback:this.removeUser}];
return (
<UserBadge
label={this.buildLabel()}
avatar={null}
type={"remote_user"}
menus={menuItems}
>
<span className="user-badge-rights-container">
<input type="checkbox" name="read" checked={this.state.internalUser.RIGHT.indexOf('r') !== -1} onChange={this.onUpdateRight}/>
<input type="checkbox" name="write" checked={this.state.internalUser.RIGHT.indexOf('w') !== -1} onChange={this.onUpdateRight}/>
</span>
</UserBadge>
);
}

});

/**************************/
/* PUBLIC LINK PANEL
/**************************/
Expand Down
62 changes: 52 additions & 10 deletions core/src/plugins/action.share/res/react/model/ShareModel.js
Expand Up @@ -108,6 +108,21 @@
return sharedData;
}

getSharedUser(userId){
var data = [], user = null;
if(this._pendingData['entries']){
data = this._pendingData['entries'];
}else if(this._data['entries']){
data = this._data['entries'];
}
data.map(function(entry){
if(entry['ID'] == userId) {
user = entry;
}
});
return user;
}

getSharedUsersAsObjects(){
var map = {};
this.getSharedUsers().map(function(uData){
Expand Down Expand Up @@ -275,6 +290,25 @@
return result;
}

userEntryForLink(linkId){
var linkData;
if(this._pendingData["ocs_links"] && this._pendingData["ocs_links"][linkId]){
linkData = this._pendingData["ocs_links"][linkId];
}else{
for(var key in this._data['links']){
if(!this._data['links'].hasOwnProperty(key)) continue;
if(this._data['links'][key]['hash'] == linkId){
linkData = this._data['links'][key];
}
}
}
if(linkData && linkData['internal_user_id']){
return this.getSharedUser(linkData['internal_user_id']);
}
return false;
}


findPendingKeyForLink(linkId, key){
var result;
try{
Expand Down Expand Up @@ -356,20 +390,26 @@
if(permissions && permissions[name] !== undefined){
return permissions[name];
}
var userEntry = this.userEntryForLink(linkId);
var current;
var defaults = {
read : (!this._previewEditors || this._previewEditors.length > 0),
download: true,
write:false
};
if(this._data['links'] && this._data['links'][linkId]){
var json = this._data;
var json;
if(this._data['ocs_links'] && this._data['ocs_links'][linkId]) {
json = this._data['ocs_links'][linkId];
}else if(this._data['links'] && this._data['links'][linkId]){
json = this._data['links'][linkId];
}
if(json){
if(name == 'download'){
current = ! json['links'][linkId]['disable_download'];
current = ! json['disable_download'];
}else if(name == 'read'){
current = (json.entries[0].RIGHT.indexOf('r') !== -1 && json['links'][linkId]['minisite_layout']!='ajxp_unique_dl');
current = (userEntry.RIGHT.indexOf('r') !== -1 && json['minisite_layout']!='ajxp_unique_dl');
}else if(name == 'write'){
current = (json.entries[0].RIGHT.indexOf('w') !== -1);
current = (userEntry.RIGHT.indexOf('w') !== -1);
}
}else{
current = defaults[name];
Expand All @@ -389,11 +429,12 @@
this._setStatus('modified');
}

_permissionsToParameters(linkId, params){
_permissionsToParameters(linkId, params, isSharedLink = false){
console.log(linkId);
if(this.getPublicLinkPermission(linkId, 'read')){
params['simple_right_read'] = 'on';
}
if(this.getPublicLinkPermission(linkId, 'download')){
if(!isSharedLink && this.getPublicLinkPermission(linkId, 'download')){
params['simple_right_download'] = 'on';
}
if(this.getPublicLinkPermission(linkId, 'write')){
Expand Down Expand Up @@ -454,7 +495,7 @@
HOST:host,
USER:user
};
this._setStatus("modified");
this.save();
}

removeRemoteLink(linkId){
Expand Down Expand Up @@ -482,7 +523,7 @@
}
this.getOcsLinks().map(function(link){
var pLinkId = link.hash;
this._permissionsToParameters(pLinkId, link);
this._permissionsToParameters(pLinkId, link, true);
this._expirationsToParameters(pLinkId, link);
this._passwordAsParameter(pLinkId, link);
this._templateToParameter(pLinkId, link);
Expand Down Expand Up @@ -556,7 +597,8 @@
var publicLinks = this.getPublicLinks();
if(publicLinks.length){
var pLinkId = publicLinks[0]['hash'];
params['guest_user_id'] = this._data.entries[0].ID;
var userEntry = this.userEntryForLink(pLinkId);
params['guest_user_id'] = userEntry['internal_user_id'];
params['hash'] = pLinkId;
// PUBLIC LINKS
this._permissionsToParameters(pLinkId, params);
Expand Down

0 comments on commit 7b2299d

Please sign in to comment.