Skip to content

Commit 5ec1b44

Browse files
committed
support logout
1 parent 5e0fb6b commit 5ec1b44

File tree

8 files changed

+102
-36
lines changed

8 files changed

+102
-36
lines changed

package.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,11 @@
122122
"title": "Login: %TcTerraform.view.login.welcome%",
123123
"category": "TencentCloud Terraform"
124124
},
125+
{
126+
"command": "tcTerraform.logout",
127+
"title": "Logout",
128+
"category": "TencentCloud Terraform"
129+
},
125130
{
126131
"command": "tcTerraform.resourcesExplorer.refresh",
127132
"title": "%TcTerraform.refresh%",

package.nls.json

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
{
22
"TcTerraform.title": "Tencent Cloud Terraform",
3-
"TcTerraform.view.login": "Login Tencent Cloud",
3+
"TcTerraform.view.login": "Log in Tencent Cloud",
4+
"TcTerraform.view.logout": "Log out Tencent Cloud",
5+
"TcTerraform.view.logout.tips": "[Logout Tencent Cloud](command:tcTerraform.logout)",
6+
"TcTerraform.view.logout.confirm": "Are you sure to log out?",
47
"TcTerraform.view.login.welcome": "Please login the Tencent Cloud. [Sign up](https://cloud.tencent.com/register) for a Tencent Cloud account if you do not have one.\n[Sign in Tencent Cloud](command:tcTerraform.login)",
58
"TcTerraform.view.codesnippet": "Code Snippets and Examples",
69
"TcTerraform.view.resource": "Resources Explorer",
@@ -18,8 +21,9 @@
1821
"TcTerraform.pickup.aksk.verify.empty": "{0} can not be empty",
1922
"TcTerraform.welcome": "Welcome to use Tencent Cloud Terraform extension, please wait for the page loading...",
2023
"TcTerraform.msg.aksk.notfound": "Cannot find TENCENTCLOUD_SECRET_ID and TENCENTCLOUD_SECRET_KEY, please sign in first!",
21-
"TcTerraform.logout": "Logout Tencent Cloud ({0})",
2224
"TcTerraform.login": "Login Tencent Cloud...",
23-
"TcTerraform.login.success": "Logged into Tencent Cloud successfully.",
24-
"TcTerraform.login.failed": "Logged failed, please try angin."
25+
"TcTerraform.login.msg.success": "Logged into Tencent Cloud successfully.",
26+
"TcTerraform.login.msg.failed": "Logged failed, please try angin.",
27+
"TcTerraform.common.yes": "Yes",
28+
"TcTerraform.common.no": "No"
2529
}

src/autocomplete/TerraformExampleProvider.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ export class TerraformExampleProvider implements CompletionItemProvider {
3535
command: EXAMPLE_CMD,
3636
arguments: [text],
3737
};
38-
exampleItems.push(c)
38+
exampleItems.push(c);
3939
}
4040

4141
return exampleItems;

src/commons/tencent/commands.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,11 @@ export function registerLoginCmds() {
66

77
commands.registerCommand(command.TENCENT_LOGINOUT, user.loginOut);
88

9-
// commands.registerCommand(command.TENCENT_LOGIN_STATUS, user.loginStatus);
109
}
1110

1211
export namespace command {
1312
// login command
1413
export const TENCENT_LOGIN = "tcTerraform.login";
1514
// logout command
1615
export const TENCENT_LOGINOUT = "tcTerraform.logout";
17-
18-
export const TENCENT_LOGIN_STATUS = "tcTerraform.login.status";
1916
}

src/commons/tencent/user/index.ts

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { AbstractClient } from "tencentcloud-sdk-nodejs/tencentcloud/common/abst
99
import { Credential } from "tencentcloud-sdk-nodejs/tencentcloud/common/interface";
1010
import { LoginProvider } from "../../../views/login/loginExplorer";
1111
import { terraformShellManager } from "../../../client/terminal/terraformShellManager";
12-
import { getStsClient } from "@/connectivity/client";
12+
import { getCamClient, getStsClient } from "@/connectivity/client";
1313
import { StreamingStatistics } from "tencentcloud-sdk-nodejs/tencentcloud/services/dlc/v20210125/dlc_models";
1414

1515
export namespace user {
@@ -22,6 +22,7 @@ export namespace user {
2222
type?: string;
2323
appid?: string;
2424
region?: string;
25+
arn?: string;
2526
}
2627

2728
export const AKSK_TITLE = "TcTerraform.pickup.aksk";
@@ -61,7 +62,7 @@ export namespace user {
6162
process.env.TENCENTCLOUD_SECRET_KEY = secretKey;
6263

6364
// query user info
64-
const resp = await (await getStsClient()).GetCallerIdentity({}).
65+
const stsResp = await (await getStsClient()).GetCallerIdentity().
6566
then(
6667
(result) => {
6768
console.debug('[DEBUG]--------------------------------result:', result);
@@ -77,12 +78,31 @@ export namespace user {
7778
}
7879
);
7980

81+
const camResp = await (await getCamClient()).GetUserAppId().
82+
then(
83+
(result) => {
84+
console.debug('[DEBUG]--------------------------------result:', result);
85+
if (!result) {
86+
throw new Error('[Warn] GetUserAppId result.TotalCount is 0.');
87+
}
88+
return result;
89+
},
90+
(err) => {
91+
console.error('[TencentCloudSDKError] GetUserAppId got a error from SDK.', err.message);
92+
window.showErrorMessage('Login Failed. Reason:' + err.message);
93+
return err;
94+
}
95+
);
96+
8097
// set user info
8198
let userinfo: UserInfo = {
8299
secretId: accessKey,
83100
secretKey: secretKey,
84-
uin: resp.PrincipalId ?? resp.UserId ?? "-",
85-
type: resp.Type ?? "unknow"
101+
uin: stsResp.PrincipalId ?? stsResp.UserId ?? "-",
102+
type: stsResp.Type ?? "unknow",
103+
appid: camResp.AppId ?? "-",
104+
arn: stsResp.Arn,
105+
region: process.env.TENCENTCLOUD_REGION ?? "unknow",
86106
};
87107
setInfo(userinfo);
88108

@@ -94,21 +114,19 @@ export namespace user {
94114
}
95115

96116
export async function loginOut() {
97-
const yes = localize("common.yes");
117+
const yes = localize("TcTerraform.common.yes");
98118
const action = await window.showWarningMessage(
99-
localize("tencent.loginout.title"),
119+
localize("TcTerraform.view.logout"),
100120
{
101121
modal: true,
102-
detail: localize("tencent.loginout.detail"),
122+
detail: localize("TcTerraform.view.logout.confirm"),
103123
},
104-
yes
105124
);
106125
if (action !== yes) {
107126
return;
108127
}
109128

110-
const { secrets } = container.get<ExtensionContext>(Context);
111-
await secrets.delete(USER_INFO);
129+
await clearInfo();
112130

113131
tree.refreshTreeData();
114132
}
@@ -186,6 +204,13 @@ export namespace user {
186204
tree.refreshTreeData();
187205
}
188206

207+
export async function clearInfo() {
208+
const { secrets } = container.get<ExtensionContext>(Context);
209+
210+
await secrets.delete(USER_INFO);
211+
tree.refreshTreeData();
212+
}
213+
189214
export async function getInfo(): Promise<UserInfo | undefined> {
190215
const { secrets } = container.get<ExtensionContext>(Context);
191216
const userinfo = await secrets.get(USER_INFO);

src/connectivity/client.ts

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import * as vscode from "vscode";
55
import { Client as CvmClient } from "tencentcloud-sdk-nodejs-cvm/tencentcloud/services/cvm/v20170312/cvm_client";
66
import { Client as TkeClient } from "tencentcloud-sdk-nodejs-tke/tencentcloud/services/tke/v20180525/tke_client";
7+
import { Client as StsClient } from "tencentcloud-sdk-nodejs-sts/tencentcloud/services/sts/v20180813/sts_client";
8+
import { Client as CamClient } from "tencentcloud-sdk-nodejs-cam/tencentcloud/services/cam/v20190116/cam_client";
79
import { AbstractClient } from "tencentcloud-sdk-nodejs/tencentcloud/common/abstract_client";
810
import * as tencentcloud from "tencentcloud-sdk-nodejs";
911
import { localize } from "vscode-nls-i18n";
@@ -98,15 +100,15 @@ export async function getCommonClient(region?: string): Promise<AbstractClient>
98100
return client;
99101
}
100102

101-
export async function getStsClient(region?: string): Promise<any> {
103+
export async function getStsClient(region?: string): Promise<StsClient> {
102104
const [secretId, secretKey] = settingUtils.getAKSK();
103105

104106
if (secretId === undefined || secretKey === undefined || secretId === null || secretKey === null) {
105107
let msg = localize("TcTerraform.msg.aksk.notfound");
106108
vscode.window.showErrorMessage(msg);
107109
return null;
108110
}
109-
const StsClient = tencentcloud.sts.v20180813.Client;
111+
110112
return new StsClient({
111113
credential: {
112114
secretId: secretId,
@@ -115,3 +117,21 @@ export async function getStsClient(region?: string): Promise<any> {
115117
region: process.env.TENCENTCLOUD_REGION ?? "ap-guangzhou",
116118
});
117119
}
120+
121+
export async function getCamClient(region?: string): Promise<CamClient> {
122+
const [secretId, secretKey] = settingUtils.getAKSK();
123+
124+
if (secretId === undefined || secretKey === undefined || secretId === null || secretKey === null) {
125+
let msg = localize("TcTerraform.msg.aksk.notfound");
126+
vscode.window.showErrorMessage(msg);
127+
return null;
128+
}
129+
130+
return new CamClient({
131+
credential: {
132+
secretId: secretId,
133+
secretKey: secretKey,
134+
},
135+
region: process.env.TENCENTCLOUD_REGION ?? "ap-guangzhou",
136+
});
137+
}

src/views/login/loginExplorer.ts

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { localize } from "vscode-nls-i18n";
2-
import { window } from "vscode";
3-
import { container, tencent, cmds } from "../../commons";
2+
import { window, ThemeIcon } from "vscode";
3+
import { container, tencent } from "../../commons";
44
import { getSecretIdFromEnv, getSecretKeyFromEnv } from "../../utils/settingUtils";
55
import { user } from "../../commons/tencent/user/index";
66
import * as loginMgt from "./loginMgt";
@@ -18,32 +18,37 @@ export class LoginProvider extends tencent.tree.TreeDataProvider {
1818
}
1919

2020
isLoggedIn(): boolean {
21-
if (getSecretIdFromEnv() && getSecretKeyFromEnv()) {
21+
if (getSecretIdFromEnv() && getSecretKeyFromEnv() && user.getInfo()) {
2222
return true;
2323
}
2424
return false;
2525
}
2626

2727
async getChildren(element?: tencent.tree.TreeItem | undefined): Promise<tencent.tree.TreeItem[]> {
28-
let welcome: tencent.tree.TreeItem[] = [];
28+
let items: tencent.tree.TreeItem[] = [];
2929
if (!element) {
3030
if (!this.isLoggedIn()) {
31-
window.showInformationMessage(localize("TcTerraform.login.failed"));
32-
return welcome;
31+
window.showInformationMessage(localize("TcTerraform.login.msg.failed"));
32+
loginMgt.clearStatusBar();
33+
return items;
3334
}
3435

3536
const info = await user.getInfo();
3637
if (info) {
37-
welcome.push(new tencent.tree.TreeItem(
38-
`Welcome to use ` + localize("TcTerraform.title"),
39-
new tencent.tree.TreeItem(
40-
`Current Account: [${info.uin}](${info.type})`
41-
)
42-
));
38+
let welcome = new tencent.tree.TreeItem(`Current Account: [${info.uin}](${info.type})`, {
39+
iconPath: new ThemeIcon("account"),
40+
});
41+
items.push(welcome);
4342
loginMgt.updateStatusBar();
43+
44+
let logout = new tencent.tree.TreeItem(localize("TcTerraform.view.logout"), {
45+
iconPath: new ThemeIcon("log-out"),
46+
command: { command: tencent.command.TENCENT_LOGINOUT, title: "Log Out" },
47+
});
48+
items.push(logout);
4449
}
4550
}
46-
return welcome;
51+
return items;
4752
}
4853

4954
}

src/views/login/loginMgt.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,30 @@ import { user } from "../../commons/tencent/user/index";
33
import { localize } from "vscode-nls-i18n";
44

55
let myStatusBarItem: vscode.StatusBarItem;
6-
const TENCENT_LOGIN_STATUS = 'tcTerraform.login.status';
76

87
export async function updateStatusBar(): Promise<void> {
98
const info = await user.getInfo();
109
if (info) {
11-
myStatusBarItem.text = localize("TcTerraform.title") + `: [${info.uin}](${info.type})`;
10+
myStatusBarItem.text = localize("TcTerraform.title") + ` / APPID: ${info.appid}`;
11+
myStatusBarItem.tooltip =
12+
`User Details:
13+
Uin: [${info.uin}]
14+
User type: [${info.type}]
15+
Region: [${info.region}]
16+
Arn: [${info.arn}]`;
1217
myStatusBarItem.show();
1318
} else {
1419
myStatusBarItem.hide();
1520
}
1621
}
1722

23+
export function clearStatusBar() {
24+
myStatusBarItem.hide();
25+
}
26+
1827
export function createStatusBar(): vscode.StatusBarItem {
1928
myStatusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, 100);
20-
myStatusBarItem.command = TENCENT_LOGIN_STATUS;
29+
myStatusBarItem.backgroundColor = new vscode.ThemeColor("statusBarItem.hoverBackground");
30+
// myStatusBarItem.command = TENCENT_LOGIN_STATUS;
2131
return myStatusBarItem;
2232
}

0 commit comments

Comments
 (0)