import * as os from 'os'; import User from "./user"; import * as utils from './utils'; export default class DevstarAPIHandler { private devstarDomain: string; constructor() { // 获取domain const devstarDomainFromUserConfig = utils.getDevstarDomain() if (undefined == devstarDomainFromUserConfig || "" == devstarDomainFromUserConfig) { this.devstarDomain = "https://devstar.cn"; } else { this.devstarDomain = devstarDomainFromUserConfig.endsWith('/') ? devstarDomainFromUserConfig.slice(0, -1) : devstarDomainFromUserConfig; } } public async verifyToken(token: string, username: string): Promise { 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解析失败 throw new Error(`HTTP Error: ${response.status} - ${text}`); } const data = await response.json(); 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 } } // 上传公钥 public async uploadUserPublicKey(user: User): Promise { return new Promise(async (resolve) => { // 获取机器名称 const machineName = os.hostname(); // 组成公钥名称 const timestamp = Date.now(); const keyTitle = `${user.getUsernameFromLocal()}-${machineName}-${timestamp}` const postData = { "key": user.getUserPublicKey(), "title": keyTitle } const uploadUrl = this.devstarDomain + `/api/v1/user/keys` // 上传公钥 fetch(uploadUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': 'token ' + user.getUserTokenFromLocal() }, body: JSON.stringify(postData) }) .then(response => { response.json().then(data => { if (response.ok) { console.log("Successfully upload new created public key.\n", data) resolve("ok") } else { throw new Error(`Failed to upload new created public key!\nError: ${data.message}`) } }) }) .catch(error => { console.error(error); }); }) } }