Compare commits

7 Commits

4 changed files with 145 additions and 51 deletions

View File

@@ -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
}
}
// 上传公钥

View File

@@ -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()

View File

@@ -16,6 +16,10 @@ export default class RemoteContainer {
this.user = user
}
public setUser(user: User) {
this.user = user
}
/**
* 第一次打开远程项目
*

View File

@@ -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);