Compare commits
7 Commits
main
...
b713e4515a
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b713e4515a | ||
|
|
5f38aafeed | ||
|
|
9b56dba1e2 | ||
|
|
dd106a1ecb | ||
|
|
9141d67894 | ||
|
|
e6c159520a | ||
|
|
00fd73d41b |
@@ -7,52 +7,68 @@ export default class DevstarAPIHandler {
|
||||
|
||||
private devstarDomain: string;
|
||||
|
||||
constructor() {
|
||||
// 获取domain
|
||||
const devstarDomainFromUserConfig = utils.devstarDomain()
|
||||
if (undefined == devstarDomainFromUserConfig || "" == devstarDomainFromUserConfig) {
|
||||
this.devstarDomain = "https://devstar.cn";
|
||||
/**
|
||||
* domain使用用户配置
|
||||
*/
|
||||
constructor();
|
||||
|
||||
/**
|
||||
* open with vscode链接传入devstarDomain
|
||||
* @param devstarDomainURL
|
||||
*/
|
||||
constructor(devstarDomainURL: string);
|
||||
|
||||
constructor(devstarDomainURL?: string) {
|
||||
if (devstarDomainURL == undefined || devstarDomainURL == "") {
|
||||
// 获取domain
|
||||
const devstarDomainFromUserConfig = utils.devstarDomain()
|
||||
if (undefined == devstarDomainFromUserConfig || "" == devstarDomainFromUserConfig) {
|
||||
this.devstarDomain = "https://devstar.cn";
|
||||
} else {
|
||||
this.devstarDomain = devstarDomainFromUserConfig.endsWith('/') ? devstarDomainFromUserConfig.slice(0, -1) : devstarDomainFromUserConfig;
|
||||
}
|
||||
} else {
|
||||
this.devstarDomain = devstarDomainFromUserConfig.endsWith('/') ? devstarDomainFromUserConfig.slice(0, -1) : devstarDomainFromUserConfig;
|
||||
// open with vscode传入
|
||||
this.devstarDomain = devstarDomainURL
|
||||
}
|
||||
}
|
||||
|
||||
public async verifyToken(token: string, username: string): Promise<boolean> {
|
||||
try {
|
||||
const response = await fetch(this.devstarDomain + `/api/devcontainer/user`, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Authorization': 'token ' + token
|
||||
}
|
||||
});
|
||||
|
||||
// 处理非200响应状态码
|
||||
if (!response.ok) {
|
||||
const text = await response.text(); // 先读取文本防止json解析失败
|
||||
if (response.status == 401) {
|
||||
throw new Error('Token错误')
|
||||
} else {
|
||||
throw new Error(`HTTP Error: ${response.status} - ${text}`);
|
||||
}
|
||||
const response = await fetch(this.devstarDomain + `/api/devcontainer/user`, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Authorization': 'token ' + token
|
||||
}
|
||||
});
|
||||
|
||||
const responseData = await response.json();
|
||||
const data = responseData.data
|
||||
if (data.username == undefined || data.username == "") {
|
||||
throw new Error('Token对应用户不存在')
|
||||
// 处理非200响应状态码
|
||||
if (!response.ok) {
|
||||
const text = await response.text(); // 先读取文本防止json解析失败
|
||||
if (response.status == 401) {
|
||||
throw new Error('Token错误')
|
||||
} else {
|
||||
// 验证用户名匹配
|
||||
if (data.username !== username) {
|
||||
throw new Error('Token与用户名不符');
|
||||
}
|
||||
throw new Error(`HTTP Error: ${response.status} - ${text}`);
|
||||
}
|
||||
|
||||
return true;
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
return false
|
||||
}
|
||||
|
||||
const responseData = await response.json();
|
||||
const data = responseData.data
|
||||
if (data.username == undefined || data.username == "") {
|
||||
throw new Error('Token对应用户不存在')
|
||||
} else {
|
||||
// 验证用户名匹配
|
||||
if (data.username !== username) {
|
||||
throw new Error('Token与用户名不符');
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
// 上传公钥
|
||||
|
||||
44
src/home.ts
44
src/home.ts
@@ -11,12 +11,33 @@ export default class DSHome {
|
||||
private devstarHomePageUrl: string;
|
||||
private devstarDomain: string | undefined
|
||||
|
||||
constructor(context: vscode.ExtensionContext, user: User) {
|
||||
|
||||
/**
|
||||
* 配置项提供devstarDomain
|
||||
* @param context
|
||||
* @param user
|
||||
*/
|
||||
constructor(context: vscode.ExtensionContext, user: User)
|
||||
|
||||
/**
|
||||
* open with vscode链接提供devstarDomain
|
||||
* @param context
|
||||
* @param user
|
||||
* @param devstarDomain
|
||||
*/
|
||||
constructor(context: vscode.ExtensionContext, user: User, devstarDomain: string)
|
||||
|
||||
constructor(context: vscode.ExtensionContext, user: User, devstarDomain?: string) {
|
||||
this.context = context;
|
||||
this.user = user;
|
||||
this.remoteContainer = new RemoteContainer(user);
|
||||
|
||||
this.devstarDomain = utils.devstarDomain()
|
||||
if (devstarDomain != undefined && devstarDomain != "") {
|
||||
this.devstarDomain = devstarDomain
|
||||
} else {
|
||||
this.devstarDomain = utils.devstarDomain()
|
||||
}
|
||||
|
||||
if (undefined == this.devstarDomain || "" == this.devstarDomain) {
|
||||
this.devstarHomePageUrl = "https://devstar.cn/devstar-home"
|
||||
} else {
|
||||
@@ -24,6 +45,23 @@ export default class DSHome {
|
||||
}
|
||||
}
|
||||
|
||||
setUser(user: User) {
|
||||
this.user = user
|
||||
}
|
||||
|
||||
setRemoteContainer(remoteContainer: RemoteContainer) {
|
||||
this.remoteContainer = remoteContainer
|
||||
}
|
||||
|
||||
setDevstarDomain(devstarDomain: string) {
|
||||
if (undefined == devstarDomain || "" == devstarDomain) {
|
||||
this.devstarDomain = devstarDomain
|
||||
this.devstarHomePageUrl = "https://devstar.cn/devstar-home"
|
||||
} else {
|
||||
this.devstarHomePageUrl = devstarDomain.endsWith('/') ? this.devstarDomain + "devstar-home" : devstarDomain + "/devstar-home"
|
||||
}
|
||||
}
|
||||
|
||||
async toggle(devstarHomePageUrl: string = this.devstarHomePageUrl) {
|
||||
const panel = vscode.window.createWebviewPanel(
|
||||
'homeWebview',
|
||||
@@ -49,7 +87,7 @@ export default class DSHome {
|
||||
const config = {
|
||||
language: vscode.env.language
|
||||
}
|
||||
panel.webview.postMessage({command: 'getHomeConfig', data: {homeConfig: config}})
|
||||
panel.webview.postMessage({ command: 'getHomeConfig', data: { homeConfig: config } })
|
||||
break;
|
||||
case 'getUserToken':
|
||||
const userToken = this.user.getUserTokenFromLocal()
|
||||
|
||||
@@ -16,6 +16,10 @@ export default class RemoteContainer {
|
||||
this.user = user
|
||||
}
|
||||
|
||||
public setUser(user: User) {
|
||||
this.user = user
|
||||
}
|
||||
|
||||
/**
|
||||
* 第一次打开远程项目
|
||||
*
|
||||
|
||||
62
src/user.ts
62
src/user.ts
@@ -16,26 +16,62 @@ export default class User {
|
||||
private userToken: string | undefined;
|
||||
private usernameKey: string = 'devstarUsername'
|
||||
private userTokenKey: string = 'devstarUserToken'
|
||||
private localUserPrivateKeyPath: string = ''
|
||||
private devstarDomain: string;
|
||||
private devstarHostname: string;
|
||||
|
||||
constructor(context: vscode.ExtensionContext) {
|
||||
/**
|
||||
* devstarDomain由配置项提供
|
||||
* @param context
|
||||
*/
|
||||
constructor(context: vscode.ExtensionContext);
|
||||
|
||||
/**
|
||||
* devstarDomain由open with vscode链接提供
|
||||
* @param context
|
||||
* @param devstarDomain
|
||||
*/
|
||||
constructor(context: vscode.ExtensionContext, devstarDomain: string);
|
||||
|
||||
constructor(context: vscode.ExtensionContext, devstarDomain?: string) {
|
||||
this.context = context;
|
||||
this.username = this.context.globalState.get(this.usernameKey);
|
||||
this.userToken = this.context.globalState.get(this.userTokenKey);
|
||||
|
||||
// 提取devstar domain的主域名,用于本地ssh key的命名
|
||||
let devstarDomainFromConfig: string | undefined;
|
||||
let devstarDomainURL: string;
|
||||
devstarDomainFromConfig = vscode.workspace.getConfiguration('devstar').get('devstarDomain')
|
||||
// 如果没有配置devstar domain,则默认domain为https://devstar.cn
|
||||
devstarDomainURL = (devstarDomainFromConfig === undefined || devstarDomainFromConfig === "") ? 'https://devstar.cn' : devstarDomainFromConfig;
|
||||
let parsedUrl = new URL(devstarDomainURL);
|
||||
this.devstarHostname = parsedUrl.hostname.replace(/\./g, '_'); //提取hostname,并用下划线替换.
|
||||
if (devstarDomain != undefined && devstarDomain != "") {
|
||||
// open with vscode链接提供域名
|
||||
this.devstarDomain = devstarDomain
|
||||
let parsedUrl = new URL(devstarDomain);
|
||||
this.devstarHostname = parsedUrl.hostname.replace(/\./g, '_'); //提取hostname,并用下划线替换.
|
||||
} else {
|
||||
// 用户配置项提供域名
|
||||
let devstarDomainFromConfig: string | undefined;
|
||||
let devstarDomainURL: string;
|
||||
devstarDomainFromConfig = vscode.workspace.getConfiguration('devstar').get('devstarDomain')
|
||||
// 如果没有配置devstar domain,则默认domain为https://devstar.cn
|
||||
devstarDomainURL = (devstarDomainFromConfig === undefined || devstarDomainFromConfig === "") ? 'https://devstar.cn' : devstarDomainFromConfig;
|
||||
this.devstarDomain = devstarDomainURL
|
||||
let parsedUrl = new URL(devstarDomainURL);
|
||||
this.devstarHostname = parsedUrl.hostname.replace(/\./g, '_'); //提取hostname,并用下划线替换.
|
||||
}
|
||||
}
|
||||
|
||||
public async login(token: string, username: string) {
|
||||
const devstarAPIHandler = new DevstarAPIHandler()
|
||||
setDevstarDomainAndHostname(devstarDomain: string) {
|
||||
if (devstarDomain != "") {
|
||||
this.devstarDomain = devstarDomain
|
||||
const parsedUrl = new URL(devstarDomain)
|
||||
this.devstarHostname = parsedUrl.hostname.replace(/\./g, '_');
|
||||
} else {
|
||||
console.error(vscode.l10n.t("devstar domain is null"))
|
||||
}
|
||||
}
|
||||
|
||||
getDevstarDomain(): string {
|
||||
return this.devstarDomain
|
||||
}
|
||||
|
||||
public async login(token: string, username: string): Promise<string> {
|
||||
const devstarAPIHandler = new DevstarAPIHandler(this.devstarDomain)
|
||||
|
||||
try {
|
||||
const res = await devstarAPIHandler.verifyToken(token, username)
|
||||
@@ -58,7 +94,7 @@ export default class User {
|
||||
throw new Error('Upload user public key failed')
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
vscode.window.showInformationMessage(vscode.l10n.t('User login successfully!'))
|
||||
return 'ok'
|
||||
} catch (error) {
|
||||
@@ -196,7 +232,7 @@ export default class User {
|
||||
if (!fs.existsSync(publicKeyDir)) {
|
||||
console.log(`Directory ${publicKeyDir} does not exist, creating it...`);
|
||||
// 公钥与私钥的目录一样,所以只用创建一次
|
||||
fs.mkdirSync(publicKeyDir, {recursive: true})
|
||||
fs.mkdirSync(publicKeyDir, { recursive: true })
|
||||
}
|
||||
|
||||
fs.writeFileSync(this.getUserPublicKeyPath(), publicKeyStr);
|
||||
|
||||
Reference in New Issue
Block a user