11import { field , logger } from "@coder/logger"
22import * as http from "http"
33import * as net from "net"
4- import * as querystring from "querystring"
54import * as ws from "ws"
6- import { ApplicationsResponse , ClientMessage , FilesResponse , LoginResponse , ServerMessage } from "../../common/api"
5+ import {
6+ ApplicationsResponse ,
7+ ClientMessage ,
8+ FilesResponse ,
9+ LoginRequest ,
10+ LoginResponse ,
11+ ServerMessage ,
12+ } from "../../common/api"
713import { ApiEndpoint , HttpCode } from "../../common/http"
8- import { HttpProvider , HttpProviderOptions , HttpResponse , HttpServer , PostData } from "../http"
14+ import { normalize } from "../../common/util"
15+ import { HttpProvider , HttpProviderOptions , HttpResponse , HttpServer , Route } from "../http"
916import { hash } from "../util"
1017
11- interface LoginPayload extends PostData {
12- password ?: string | string [ ]
13- }
14-
1518/**
1619 * API HTTP provider.
1720 */
@@ -22,13 +25,8 @@ export class ApiHttpProvider extends HttpProvider {
2225 super ( options )
2326 }
2427
25- public async handleRequest (
26- base : string ,
27- _requestPath : string ,
28- _query : querystring . ParsedUrlQuery ,
29- request : http . IncomingMessage
30- ) : Promise < HttpResponse | undefined > {
31- switch ( base ) {
28+ public async handleRequest ( route : Route , request : http . IncomingMessage ) : Promise < HttpResponse | undefined > {
29+ switch ( route . base ) {
3230 case ApiEndpoint . login :
3331 if ( request . method === "POST" ) {
3432 return this . login ( request )
@@ -38,7 +36,7 @@ export class ApiHttpProvider extends HttpProvider {
3836 if ( ! this . authenticated ( request ) ) {
3937 return { code : HttpCode . Unauthorized }
4038 }
41- switch ( base ) {
39+ switch ( route . base ) {
4240 case ApiEndpoint . applications :
4341 return this . applications ( )
4442 case ApiEndpoint . files :
@@ -49,9 +47,7 @@ export class ApiHttpProvider extends HttpProvider {
4947 }
5048
5149 public async handleWebSocket (
52- _base : string ,
53- _requestPath : string ,
54- _query : querystring . ParsedUrlQuery ,
50+ _route : Route ,
5551 request : http . IncomingMessage ,
5652 socket : net . Socket ,
5753 head : Buffer
@@ -93,39 +89,45 @@ export class ApiHttpProvider extends HttpProvider {
9389 * unauthorized.
9490 */
9591 private async login ( request : http . IncomingMessage ) : Promise < HttpResponse < LoginResponse > > {
96- const ok = ( password : string | true ) : HttpResponse < LoginResponse > => {
97- return {
98- content : {
99- success : true ,
100- } ,
101- cookie : typeof password === "string" ? { key : "key" , value : password } : undefined ,
102- }
103- }
104-
10592 // Already authenticated via cookies?
10693 const providedPassword = this . authenticated ( request )
10794 if ( providedPassword ) {
108- return ok ( providedPassword )
95+ return { code : HttpCode . Ok }
10996 }
11097
11198 const data = await this . getData ( request )
112- const payload : LoginPayload = data ? querystring . parse ( data ) : { }
99+ const payload : LoginRequest = data ? JSON . parse ( data ) : { }
113100 const password = this . authenticated ( request , {
114101 key : typeof payload . password === "string" ? [ hash ( payload . password ) ] : undefined ,
115102 } )
116103 if ( password ) {
117- return ok ( password )
104+ return {
105+ content : {
106+ success : true ,
107+ } ,
108+ cookie :
109+ typeof password === "string"
110+ ? {
111+ key : "key" ,
112+ value : password ,
113+ path : normalize ( payload . basePath ) ,
114+ }
115+ : undefined ,
116+ }
118117 }
119118
120- console . error (
121- "Failed login attempt" ,
122- JSON . stringify ( {
123- xForwardedFor : request . headers [ "x-forwarded-for" ] ,
124- remoteAddress : request . connection . remoteAddress ,
125- userAgent : request . headers [ "user-agent" ] ,
126- timestamp : Math . floor ( new Date ( ) . getTime ( ) / 1000 ) ,
127- } )
128- )
119+ // Only log if it was an actual login attempt.
120+ if ( payload && payload . password ) {
121+ console . error (
122+ "Failed login attempt" ,
123+ JSON . stringify ( {
124+ xForwardedFor : request . headers [ "x-forwarded-for" ] ,
125+ remoteAddress : request . connection . remoteAddress ,
126+ userAgent : request . headers [ "user-agent" ] ,
127+ timestamp : Math . floor ( new Date ( ) . getTime ( ) / 1000 ) ,
128+ } )
129+ )
130+ }
129131
130132 return { code : HttpCode . Unauthorized }
131133 }
0 commit comments