Compare commits
	
		
			7 Commits
		
	
	
		
			main
			...
			b713e4515a
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					b713e4515a | ||
| 
						 | 
					5f38aafeed | ||
| 
						 | 
					9b56dba1e2 | ||
| 
						 | 
					dd106a1ecb | ||
| 
						 | 
					9141d67894 | ||
| 
						 | 
					e6c159520a | ||
| 
						 | 
					00fd73d41b | 
@@ -13,13 +13,10 @@
 | 
			
		||||
            "warn",
 | 
			
		||||
            {
 | 
			
		||||
                "selector": "import",
 | 
			
		||||
                "format": [
 | 
			
		||||
                    "camelCase",
 | 
			
		||||
                    "PascalCase"
 | 
			
		||||
                ]
 | 
			
		||||
                "format": [ "camelCase", "PascalCase" ]
 | 
			
		||||
            }
 | 
			
		||||
        ],
 | 
			
		||||
        "@typescript-eslint/semi": "off", //关闭分号检查
 | 
			
		||||
        "@typescript-eslint/semi": "warn",
 | 
			
		||||
        "curly": "warn",
 | 
			
		||||
        "eqeqeq": "warn",
 | 
			
		||||
        "no-throw-literal": "warn",
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * 第一次打开远程项目
 | 
			
		||||
   * 
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										60
									
								
								src/user.ts
									
									
									
									
									
								
							
							
						
						
									
										60
									
								
								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)
 | 
			
		||||
@@ -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);
 | 
			
		||||
 
 | 
			
		||||
@@ -17,9 +17,6 @@ header("Allow: GET, POST, OPTIONS, PUT, DELETE");
 | 
			
		||||
  <iframe id="embedded-devstar" src="http://localhost:8080/test/home.html" width="100%" height="100%" frameborder="0"
 | 
			
		||||
    style="border: 0; left: 0; right: 0; bottom: 0; top: 0; position:absolute;">
 | 
			
		||||
  </iframe>
 | 
			
		||||
  <!-- <iframe id="embedded-devstar" src="http://localhost:8080/home.html" width="100%" height="100%" frameborder="0"
 | 
			
		||||
    style="border: 0; left: 0; right: 0; bottom: 0; top: 0; position:absolute;">
 | 
			
		||||
  </iframe> -->
 | 
			
		||||
 | 
			
		||||
  <!-- <iframe 
 | 
			
		||||
    id="embedded-devstar"
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user