Skip to content

Commit d6b326c

Browse files
committed
Handle empty credentials file
Closes node-red#937
1 parent d944298 commit d6b326c

2 files changed

Lines changed: 59 additions & 66 deletions

File tree

red/runtime/locales/en-US/runtime.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -121,11 +121,11 @@
121121
"localfilesystem": {
122122
"user-dir": "User directory : __path__",
123123
"flows-file": "Flows file : __path__",
124-
"create": "Creating new flow file",
125-
"empty": "Existing flow file is empty",
126-
"invalid": "Existing flow file is not valid json",
127-
"restore": "Restoring flow file backup : __path__",
128-
"restore-fail": "Restoring flow file backup failed : __message__"
124+
"create": "Creating new __type__ file",
125+
"empty": "Existing __type__ file is empty",
126+
"invalid": "Existing __type__ file is not valid json",
127+
"restore": "Restoring __type__ file backup : __path__",
128+
"restore-fail": "Restoring __type__ file backup failed : __message__"
129129
}
130130
}
131131
}

red/runtime/storage/localfilesystem.js

Lines changed: 54 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,53 @@ function writeFile(path,content) {
122122
});
123123
}
124124

125+
126+
function readFile(path,backupPath,emptyResponse,type) {
127+
return when.promise(function(resolve) {
128+
fs.readFile(path,'utf8',function(err,data) {
129+
if (!err) {
130+
if (data.length === 0) {
131+
log.warn(log._("storage.localfilesystem.empty",{type:type}));
132+
try {
133+
var backupStat = fs.statSync(backupPath);
134+
if (backupStat.size === 0) {
135+
// Empty flows, empty backup - return empty flow
136+
return resolve(emptyResponse);
137+
}
138+
// Empty flows, restore backup
139+
log.warn(log._("storage.localfilesystem.restore",{path:backupPath,type:type}));
140+
fs.copy(backupPath,path,function(backupCopyErr) {
141+
if (backupCopyErr) {
142+
// Restore backup failed
143+
log.warn(log._("storage.localfilesystem.restore-fail",{message:backupCopyErr.toString(),type:type}));
144+
resolve([]);
145+
} else {
146+
// Loop back in to load the restored backup
147+
resolve(readFile(path,backupPath,emptyResponse,type));
148+
}
149+
});
150+
return;
151+
} catch(backupStatErr) {
152+
// Empty flow file, no back-up file
153+
return resolve(emptyResponse);
154+
}
155+
}
156+
try {
157+
return resolve(JSON.parse(data));
158+
} catch(parseErr) {
159+
log.warn(log._("storage.localfilesystem.invalid",{type:type}));
160+
return resolve(emptyResponse);
161+
}
162+
} else {
163+
if (type === 'flow') {
164+
log.info(log._("storage.localfilesystem.create",{type:type}));
165+
}
166+
resolve(emptyResponse);
167+
}
168+
});
169+
});
170+
}
171+
125172
var localfilesystem = {
126173
init: function(_settings) {
127174
settings = _settings;
@@ -191,52 +238,12 @@ var localfilesystem = {
191238
},
192239

193240
getFlows: function() {
194-
return when.promise(function(resolve) {
195-
if (!initialFlowLoadComplete) {
196-
initialFlowLoadComplete = true;
197-
log.info(log._("storage.localfilesystem.user-dir",{path:settings.userDir}));
198-
log.info(log._("storage.localfilesystem.flows-file",{path:flowsFullPath}));
199-
}
200-
fs.readFile(flowsFullPath,'utf8',function(err,data) {
201-
if (!err) {
202-
if (data.length === 0) {
203-
log.warn(log._("storage.localfilesystem.empty"));
204-
try {
205-
var backupStat = fs.statSync(flowsFileBackup);
206-
if (backupStat.size === 0) {
207-
// Empty flows, empty backup - return empty flow
208-
return resolve([]);
209-
}
210-
// Empty flows, restore backup
211-
log.warn(log._("storage.localfilesystem.restore",{path:flowsFileBackup}));
212-
fs.copy(flowsFileBackup,flowsFullPath,function(backupCopyErr) {
213-
if (backupCopyErr) {
214-
// Restore backup failed
215-
log.warn(log._("storage.localfilesystem.restore-fail",{message:backupCopyErr.toString()}));
216-
resolve([]);
217-
} else {
218-
// Loop back in to load the restored backup
219-
resolve(localfilesystem.getFlows());
220-
}
221-
});
222-
return;
223-
} catch(backupStatErr) {
224-
// Empty flow file, no back-up file
225-
return resolve([]);
226-
}
227-
}
228-
try {
229-
return resolve(JSON.parse(data));
230-
} catch(parseErr) {
231-
log.warn(log._("storage.localfilesystem.invalid"));
232-
return resolve([]);
233-
}
234-
} else {
235-
log.info(log._("storage.localfilesystem.create"));
236-
resolve([]);
237-
}
238-
});
239-
});
241+
if (!initialFlowLoadComplete) {
242+
initialFlowLoadComplete = true;
243+
log.info(log._("storage.localfilesystem.user-dir",{path:settings.userDir}));
244+
log.info(log._("storage.localfilesystem.flows-file",{path:flowsFullPath}));
245+
}
246+
return readFile(flowsFullPath,flowsFileBackup,[],'flow');
240247
},
241248

242249
saveFlows: function(flows) {
@@ -260,21 +267,7 @@ var localfilesystem = {
260267
},
261268

262269
getCredentials: function() {
263-
return when.promise(function(resolve) {
264-
fs.readFile(credentialsFile,'utf8',function(err,data) {
265-
if (!err) {
266-
resolve(JSON.parse(data));
267-
} else {
268-
fs.readFile(oldCredentialsFile,'utf8',function(err,data) {
269-
if (!err) {
270-
resolve(JSON.parse(data));
271-
} else {
272-
resolve({});
273-
}
274-
});
275-
}
276-
});
277-
});
270+
return readFile(credentialsFile,credentialsFileBackup,{},'credentials');
278271
},
279272

280273
saveCredentials: function(credentials) {

0 commit comments

Comments
 (0)