Skip to content

Commit ff82288

Browse files
committed
Merge branch 'open-project-fixes' into 'main'
fixing open project to clean up after itself on an error See merge request weblogic-cloud/weblogic-toolkit-ui!247
2 parents d15320e + 4f3346e commit ff82288

File tree

4 files changed

+69
-32
lines changed

4 files changed

+69
-32
lines changed

electron/.eslintrc.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
},
77
"extends": "eslint:recommended",
88
"parserOptions": {
9-
"ecmaVersion": 12
9+
"ecmaVersion": 2022
1010
},
1111
"rules": {
1212
"indent": [

electron/app/js/credentialManager.js

+14-3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
/**
22
* @license
3-
* Copyright (c) 2021, Oracle and/or its affiliates.
3+
* Copyright (c) 2021, 2023, Oracle and/or its affiliates.
44
* Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
55
*/
66
const CredentialEncryptor = require('./credentialEncryptor');
77
const { getJsonPathReference } = require('./jsonPath');
88
const { getLogger } = require('./wktLogging');
99

10+
const DECRYPTION_FAILED_STRING = 'Unsupported state or unable to authenticate data';
11+
1012
/* global Buffer */
1113
class CredentialManager {
1214
constructor(credentialStorePolicy) {
@@ -113,6 +115,8 @@ class CredentialStoreManager extends CredentialManager {
113115
}
114116

115117
class EncryptedCredentialManager extends CredentialManager {
118+
static BAD_PASSPHRASE_KEY = 'Incorrect passphrase';
119+
116120
constructor(passphrase) {
117121
super('passphrase');
118122
super.credentialManager = this;
@@ -149,9 +153,16 @@ class EncryptedCredentialManager extends CredentialManager {
149153
async loadCredential(jsonPath, cipherText) {
150154
return new Promise((resolve, reject) => {
151155
try {
152-
return resolve(this.credentialEncryptor.getDecryptedText(cipherText));
156+
const decryptedText = this.credentialEncryptor.getDecryptedText(cipherText);
157+
return resolve(decryptedText);
153158
} catch (err) {
154-
reject(err);
159+
let message = `Failed to load credential for ${jsonPath}: `;
160+
if (err?.message === DECRYPTION_FAILED_STRING) {
161+
message += EncryptedCredentialManager.BAD_PASSPHRASE_KEY;
162+
} else {
163+
message += err;
164+
}
165+
reject(new Error(message));
155166
}
156167
});
157168
}

electron/app/js/project.js

+46-28
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/**
22
* @license
3-
* Copyright (c) 2021, 2022, Oracle and/or its affiliates.
3+
* Copyright (c) 2021, 2023, Oracle and/or its affiliates.
44
* Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
55
*/
66
const {app, dialog} = require('electron');
@@ -142,29 +142,18 @@ async function openProjectFile(targetWindow, projectFile, isDirty) {
142142
const existingProjectWindow = _getOpenWindowForProject(projectFile);
143143
if (existingProjectWindow) {
144144
showExistingProjectWindow(existingProjectWindow);
145-
resolve();
145+
return resolve();
146146
} else {
147-
_createOrReplace(targetWindow, isDirty)
148-
.then(projectWindow => {
149-
if (!projectWindow) {
150-
return resolve();
151-
}
152-
_openProjectFile(projectWindow, projectFile)
153-
.then(() => {
154-
resolve();
155-
})
156-
.catch(err => reject(err));
157-
})
158-
.catch(err => reject(err));
147+
_createOrReplace(targetWindow, isDirty).then(projectWindow => {
148+
if (!projectWindow) {
149+
return resolve();
150+
}
151+
_openProjectFile(projectWindow, projectFile).then(() => {
152+
return resolve();
153+
}).catch(err => reject(err));
154+
}).catch(err => reject(err));
159155
}
160-
})
161-
.catch(err => {
162-
dialog.showErrorBox(
163-
i18n.t('dialog-openProjectFileErrorTitle'),
164-
i18n.t('dialog-openProjectFileErrorMessage', { projectFileName: projectFile, err: errorUtils.getErrorMessage(err) }),
165-
);
166-
getLogger().error('Failed to open project file %s: %s', projectFile, err);
167-
});
156+
});
168157
}
169158

170159
// request the existing project file, prompting the user if needed.
@@ -438,7 +427,7 @@ function _generateProjectUuid() {
438427
//
439428
async function _openProjectFile(targetWindow, projectFileName) {
440429
if (targetWindow.isReady) {
441-
return new Promise((resolve, reject) => {
430+
return new Promise((resolve) => {
442431
readFile(projectFileName, { encoding: 'utf8' }).then(data => {
443432
let jsonContent;
444433
try {
@@ -466,12 +455,27 @@ async function _openProjectFile(targetWindow, projectFileName) {
466455
getLogger().debug('_openProjectFile adding %s to recent documents', projectFileName);
467456
app.addRecentDocument(projectFileName);
468457
resolve();
469-
}).catch(err => reject(err));
470-
}).catch(err => reject(err));
471-
}).catch(err => reject(err));
458+
}).catch(err => {
459+
dialog.showErrorBox(i18n.t('dialog-openProjectFileSendToWindowErrorTitleErrorTitle'),
460+
i18n.t('dialog-openProjectFileSendToWindowErrorMessage', { projectFileName, err }));
461+
closeProject(targetWindow, true);
462+
resolve();
463+
});
464+
}).catch(err => {
465+
_show_load_credentials_error(projectFileName, err);
466+
openProjects.delete(targetWindow);
467+
resolve();
468+
});
469+
}).catch(err => {
470+
dialog.showErrorBox(i18n.t('dialog-openProjectFileCredentialManagerErrorTitle'),
471+
i18n.t('dialog-openProjectFileCredentialManagerErrorMessage', { projectFileName, err }));
472+
getLogger().error('Failed to open project %s due to error while creating the credential manager: %s',
473+
projectFileName, err);
474+
openProjects.delete(targetWindow);
475+
resolve();
476+
});
472477
}).catch(err => {
473-
dialog.showErrorBox(
474-
i18n.t('dialog-openProjectFileReadErrorTitle'),
478+
dialog.showErrorBox(i18n.t('dialog-openProjectFileReadErrorTitle'),
475479
i18n.t('dialog-openProjectFileReadErrorMessage', { projectFileName: projectFileName, err: err }),
476480
);
477481
resolve();
@@ -999,6 +1003,20 @@ function downloadFile(targetWindow, lines, fileType, format, formatName) {
9991003
});
10001004
}
10011005

1006+
function _show_load_credentials_error(projectFileName, err) {
1007+
let logMessage;
1008+
if (err?.message?.endsWith(EncryptedCredentialManager.BAD_PASSPHRASE_KEY)) {
1009+
logMessage = 'Failed to open project %s due to invalid passphrase: %s';
1010+
dialog.showErrorBox(i18n.t('dialog-openProjectFileBadPassphraseErrorTitle'),
1011+
i18n.t('dialog-openProjectFileBadPassphraseErrorMessage', { projectFileName, err }));
1012+
} else {
1013+
logMessage = 'Failed to open project %s due to an error while loading credentials: %s';
1014+
dialog.showErrorBox(i18n.t('dialog-openProjectFileLoadCredentialsErrorTitle'),
1015+
i18n.t('dialog-openProjectFileLoadCredentialsErrorTitle', { projectFileName, err }));
1016+
}
1017+
getLogger().error(logMessage, projectFileName, err);
1018+
}
1019+
10021020
module.exports = {
10031021
chooseArchiveFile,
10041022
chooseModelFile,

electron/app/locales/en/electron.json

+8
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,14 @@
159159
"dialog-openProjectFileParseErrorMessage": "Unable to read the project file {{projectFileName}} as JSON: {{err}}",
160160
"dialog-openProjectFileReadErrorTitle": "Failed to Read Project File",
161161
"dialog-openProjectFileReadErrorMessage": "Unable to read the project file {{projectFileName}}: {{err}}",
162+
"dialog-openProjectFileBadPassphraseErrorTitle": "Failed to Decrypt Project Credentials",
163+
"dialog-openProjectFileBadPassphraseErrorMessage": "Unable to decrypt credentials in project file {{projectFileName}} due to a bad passphrase: {{err}}",
164+
"dialog-openProjectFileLoadCredentialsErrorTitle": "Failed to Load Project Credentials",
165+
"dialog-openProjectFileLoadCredentialsErrorMessage": "Unable to load credentials for project file {{projectFileName}} due to an error: {{err}}",
166+
"dialog-openProjectFileCredentialManagerErrorTitle": "Failed to Create Credential Manager",
167+
"dialog-openProjectFileCredentialManagerErrorMessage": "Unable to create credential manager for project file {{projectFileName}} due to an error: {{error}}",
168+
"dialog-openProjectFileSendToWindowErrorTitleErrorTitle": "Failed to Open Project",
169+
"dialog-openProjectFileSendToWindowErrorTitleErrorMessage": "Unable to open project file {{projectFileName}} due to an error initializing the project window: {{err}}",
162170
"dialog-createNewProjectTitle": "Create WebLogic Kubernetes Toolkit Project",
163171
"dialog-projectSaveFileLocationNotWritableTitle": "Project Directory Not Writable",
164172
"dialog-projectSaveFileLocationNotWritableError": "The {{projectFileDirectory}} directory chosen to write the new project file is not writable by the current process.",

0 commit comments

Comments
 (0)