This file is indexed.

/usr/share/xul-ext/google-tasks-sync/chrome/content/fileio_bridge.js is in xul-ext-google-tasks-sync 0.5.1-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/*
    Google Tasks sync for Mozilla Thunderbird
*/

//hardcoded to overwrite data.json in <profile dir>/google_tasks_sync/ with dataToWrite
gt_tasks_sync.writeToFile = function(dataToWrite, successCallback)
{		
	var file = FileUtils.getFile("ProfD", ["google_tasks_sync", "data.json"]);
	file = gt_tasks_sync.FileIO.open(file.path);
	
	if(!file) {
		gt_tasks_sync.handleReturnedError("Unable to open file data.json for writing");
		return;
	}
	 
	var success = gt_tasks_sync.FileIO.write(file,dataToWrite,'w',"UTF-8");
	
	if(!success) {
		gt_tasks_sync.handleReturnedError("Error while writing to file data.json");
		return;
	}
	
	if(successCallback)
		successCallback();
}

//writes the gt_tasks_sync.queuedMoves "global var" to disk
gt_tasks_sync.saveQueuedMoves = function(successCallback) {
	var file = FileUtils.getFile("ProfD", ["google_tasks_sync", "queuedMoves.json"]);
	file = gt_tasks_sync.FileIO.open(file.path);
	
	if(!file) {
		gt_tasks_sync.handleReturnedError("Unable to open file queuedMoves.json for writing");
		return;
	}
	
	var dataToWrite = JSON.stringify(gt_tasks_sync.queuedMoves);
	var success = gt_tasks_sync.FileIO.write(file,dataToWrite,'w',"UTF-8");
	
	if(!success) {
		gt_tasks_sync.handleReturnedError("Error while writing to file queuedMoves.json");
		return;
	}
	
	if(successCallback)
		successCallback();
}

//hardcoded to read everything from data.json in <profile dir>/google_tasks_sync/
//also reads queued moves from queuedMoves.json
gt_tasks_sync.readFromFile = function(successCallback)
{
	//data.json
	var file = FileUtils.getFile("ProfD", ["google_tasks_sync", "data.json"]);
	file = gt_tasks_sync.FileIO.open(file.path);
	if(!file) {
		gt_tasks_sync.handleReturnedError("Unable to open file data.json for reading");
		return;
	}
	var localData = gt_tasks_sync.FileIO.read(file, "UTF-8");
	
	//queuedMoves.json - not passed to callback, instead loaded directly into a global var
	//TODO: make all file I/O functions work directly with global vars and not pass data as arguments
	var file = FileUtils.getFile("ProfD", ["google_tasks_sync", "queuedMoves.json"]);
	file = gt_tasks_sync.FileIO.open(file.path);
	if(!file) {
		gt_tasks_sync.handleReturnedError("Unable to open file queuedMoves.json for reading");
		return;
	}
	var parseThis = gt_tasks_sync.FileIO.read(file, "UTF-8");
	try {
		gt_tasks_sync.queuedMoves = JSON.parse(parseThis);
	} catch(e) {
		gt_tasks_sync.queuedMoves = new Object();
	}

	successCallback(localData);
}

//create backup by copying data.json
gt_tasks_sync.createBackup = function(callback)
{	
	var backupDir = FileUtils.getDir("ProfD", ["google_tasks_sync", "backup"]);

	var backupDirContents = backupDir.directoryEntries;
	var oldestFile;
	var fileCount = 0;
	while(backupDirContents.hasMoreElements()) { //TODO: some error handling here might be a good idea
		var currentFile = backupDirContents.getNext().QueryInterface(Components.interfaces.nsIFile);
		fileCount++;
		if(!oldestFile)
			oldestFile = currentFile;
		else if (oldestFile.lastModifiedTime > currentFile.lastModifiedTime)
			oldestFile = currentFile;
	}
	if(fileCount >= 10)
		oldestFile.remove(0); //if there are too many backups, axe the oldest one
	
	//copy data.json to create a new backup file
	var processedPath = FileUtils.getFile("ProfD", ["google_tasks_sync", "data.json"]).path;
	var currentDataFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
	currentDataFile.initWithPath(processedPath);
	var newFilename = new Date().toISOString();
	newFilename = newFilename.replace(new RegExp(/:/g), "-") + ".json";
	currentDataFile.copyTo(backupDir, newFilename);
	
	callback();
}

gt_tasks_sync.ensureFilesExist = function() {
	var backupDir = FileUtils.getDir("ProfD", ["google_tasks_sync", "backup"]);
	if(!backupDir.exists()) {
		backupDir.create(1, 0775); //create a directory, will create parent dirs as needed
	}
	
	var file = FileUtils.getFile("ProfD", ["google_tasks_sync", "data.json"]);
	if(!file.exists()) {
		file.create(0, 0664); //create a file
	}
	
	var file = FileUtils.getFile("ProfD", ["google_tasks_sync", "queuedMoves.json"]);
	if(!file.exists()) {
		file.create(0, 0664);
	}
		
}