Closed Bug 1138795 Opened 9 years ago Closed 2 years ago

unixMode from writeAtomic not having an effect. have to follow writeAtomic with setPermissions

Categories

(Toolkit Graveyard :: OS.File, defect)

37 Branch
x86_64
Windows 8.1
defect
Not set
normal

Tracking

(Not tracked)

RESOLVED WONTFIX

People

(Reporter: noitidart, Unassigned)

Details

User Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:37.0) Gecko/20100101 Firefox/37.0
Build ID: 20150223185154

Steps to reproduce:

Run this code which creates a desktop file with unixMode: 0o4777
can copy paste code to scratchpad:

```
function writeDotDesktop(path_toFile, name, exec, path_icon) {
  var deferred_writeDotDesktop = Promise.defer();
  
  exec = Services.dirsvc.get('XREExeF', Ci.nsIFile).path + ' -no-remote -P';
  
  name = 'Firefox - Profile Manager';
  path_icon = OS.Path.join('/home/noit/Desktop/profilist-ff-channel-logos', 'nightly512.png');
  
  var cmdArr = [
    '[Desktop Entry]',
    'Name=' + name,
    'Type=Application',
    'Comment=Web Application',
    'Exec=' + exec,
    'Icon=' + path_icon
  ];
  var cmdStr = cmdArr.join('\n');
  
  path_toFile = OS.Path.join(path_toFile, name + '.desktop');
  
  var promise_writeScript = OS.File.writeAtomic(path_toFile, cmdStr, {encoding:'utf-8', unixMode:0o4777, noOverwrite:false}); // doing unixMode:0o4777 here doesn't work, i have to `OS.File.setPermissions(path_toFile, {unixMode:0o4777})` after the file is made
  promise_writeScript.then(
    function(aVal) {
      console.log('Fullfilled - promise_writeScript - ', aVal);
      // start - do stuff here - promise_writeScript
      deferred_writeDotDesktop.resolve('.desktop file made');
      //doPromiseScriptSetPerm();
      // end - do stuff here - promise_writeScript
    },
    function(aReason) {
      var rejObj = {name:'promise_writeScript', aReason:aReason};
      console.warn('Rejected - promise_writeScript - ', rejObj);
      deferred_writeDotDesktop.reject(rejObj);
    }
  ).catch(
    function(aCaught) {
      var rejObj = {name:'promise_writeScript', aCaught:aCaught};
      console.error('Caught - promise_writeScript - ', rejObj);
      deferred_writeDotDesktop.reject(rejObj);
    }
  );
  
  return deferred_writeDotDesktop.promise;
};

var promise_makeShScpt = writeDotDesktop(OS.Path.join(OS.Constants.Path.desktopDir));
promise_makeShScpt.then(
	function(aVal) {
		console.log('Fullfilled - promise_makeShScpt - ', aVal);
		// start - do stuff here - promise_makeShScpt
		// end - do stuff here - promise_makeShScpt
	},
	function(aReason) {
		var rejObj = {name:'promise_makeShScpt', aReason:aReason};
		console.warn('Rejected - promise_makeShScpt - ', rejObj);
	}
).catch(
	function(aCaught) {
		var rejObj = {name:'promise_makeShScpt', aCaught:aCaught};
		console.error('Caught - promise_makeShScpt - ', rejObj);
	}
);
```


Actual results:

File was created on desktop. Clicking the file threw a popup saying it is from an unidentified developer blah blah. so it wouldnt lauch.


Expected results:

it should have obeyed the unixMode:0o4777

i had to run a setPermissions with unixMode:0o4777 afterwards to get it to work:

copy paste code:

```
function writeDotDesktop(path_toFile, name, exec, path_icon) {
  var deferred_writeDotDesktop = Promise.defer();
  
  exec = Services.dirsvc.get('XREExeF', Ci.nsIFile).path + ' -no-remote -P';
  
  name = 'Firefox - Profile Manager';
  path_icon = OS.Path.join('/home/noit/Desktop/profilist-ff-channel-logos', 'nightly512.png');
  
  var cmdArr = [
    '[Desktop Entry]',
    'Name=' + name,
    'Type=Application',
    'Comment=Web Application',
    'Exec=' + exec,
    'Icon=' + path_icon
  ];
  var cmdStr = cmdArr.join('\n');
  
  path_toFile = OS.Path.join(path_toFile, name + '.desktop');
  
  // start - setup set perms
  var doPromiseScriptSetPerm = function() {
    var promise_setPermsScript = OS.File.setPermissions(path_toFile, {unixMode:0o4777});
    promise_setPermsScript.then(
      function(aVal) {
        console.log('Fullfilled - promise_setPermsScript - ', aVal);
        // start - do stuff here - promise_setPermsScript
        deferred_writeDotDesktop.resolve('.desktop file made and permmed')
        // end - do stuff here - promise_setPermsScript
      },
      function(aReason) {
        var rejObj = {name:'promise_setPermsScript', aReason:aReason};
        console.warn('Rejected - promise_setPermsScript - ', rejObj);
        deferred_writeDotDesktop.reject(rejObj);
      }
    ).catch(
      function(aCaught) {
        var rejObj = {name:'promise_setPermsScript', aCaught:aCaught};
        console.error('Caught - promise_setPermsScript - ', rejObj);
        deferred_writeDotDesktop.reject(rejObj);
      }
    );
  };
  // end - setup set perms
  
  var promise_writeScript = OS.File.writeAtomic(path_toFile, cmdStr, {encoding:'utf-8', /*unixMode:0o4777,*/ noOverwrite:false}); // doing unixMode:0o4777 here doesn't work, i have to `OS.File.setPermissions(path_toFile, {unixMode:0o4777})` after the file is made
  promise_writeScript.then(
    function(aVal) {
      console.log('Fullfilled - promise_writeScript - ', aVal);
      // start - do stuff here - promise_writeScript
      //deferred_writeDotDesktop.resolve('.desktop file made');
      doPromiseScriptSetPerm();
      // end - do stuff here - promise_writeScript
    },
    function(aReason) {
      var rejObj = {name:'promise_writeScript', aReason:aReason};
      console.warn('Rejected - promise_writeScript - ', rejObj);
      deferred_writeDotDesktop.reject(rejObj);
    }
  ).catch(
    function(aCaught) {
      var rejObj = {name:'promise_writeScript', aCaught:aCaught};
      console.error('Caught - promise_writeScript - ', rejObj);
      deferred_writeDotDesktop.reject(rejObj);
    }
  );
  
  return deferred_writeDotDesktop.promise;
};

var promise_makeShScpt = writeDotDesktop(OS.Path.join(OS.Constants.Path.desktopDir));
promise_makeShScpt.then(
	function(aVal) {
		console.log('Fullfilled - promise_makeShScpt - ', aVal);
		// start - do stuff here - promise_makeShScpt
		// end - do stuff here - promise_makeShScpt
	},
	function(aReason) {
		var rejObj = {name:'promise_makeShScpt', aReason:aReason};
		console.warn('Rejected - promise_makeShScpt - ', rejObj);
	}
).catch(
	function(aCaught) {
		var rejObj = {name:'promise_makeShScpt', aCaught:aCaught};
		console.error('Caught - promise_makeShScpt - ', rejObj);
	}
);
```
Component: Untriaged → OS.File
Product: Firefox → Toolkit

OSFIle is being replaced with IOUtils and PathUtils.

Status: UNCONFIRMED → RESOLVED
Closed: 2 years ago
Resolution: --- → WONTFIX
Product: Toolkit → Toolkit Graveyard
You need to log in before you can comment on or make changes to this bug.