1
1
import { field , logger } from "@coder/logger"
2
2
import * as http from "http"
3
3
import * as net from "net"
4
- import * as querystring from "querystring"
5
4
import * 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"
7
13
import { 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"
9
16
import { hash } from "../util"
10
17
11
- interface LoginPayload extends PostData {
12
- password ?: string | string [ ]
13
- }
14
-
15
18
/**
16
19
* API HTTP provider.
17
20
*/
@@ -22,13 +25,8 @@ export class ApiHttpProvider extends HttpProvider {
22
25
super ( options )
23
26
}
24
27
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 ) {
32
30
case ApiEndpoint . login :
33
31
if ( request . method === "POST" ) {
34
32
return this . login ( request )
@@ -38,7 +36,7 @@ export class ApiHttpProvider extends HttpProvider {
38
36
if ( ! this . authenticated ( request ) ) {
39
37
return { code : HttpCode . Unauthorized }
40
38
}
41
- switch ( base ) {
39
+ switch ( route . base ) {
42
40
case ApiEndpoint . applications :
43
41
return this . applications ( )
44
42
case ApiEndpoint . files :
@@ -49,9 +47,7 @@ export class ApiHttpProvider extends HttpProvider {
49
47
}
50
48
51
49
public async handleWebSocket (
52
- _base : string ,
53
- _requestPath : string ,
54
- _query : querystring . ParsedUrlQuery ,
50
+ _route : Route ,
55
51
request : http . IncomingMessage ,
56
52
socket : net . Socket ,
57
53
head : Buffer
@@ -93,39 +89,45 @@ export class ApiHttpProvider extends HttpProvider {
93
89
* unauthorized.
94
90
*/
95
91
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
-
105
92
// Already authenticated via cookies?
106
93
const providedPassword = this . authenticated ( request )
107
94
if ( providedPassword ) {
108
- return ok ( providedPassword )
95
+ return { code : HttpCode . Ok }
109
96
}
110
97
111
98
const data = await this . getData ( request )
112
- const payload : LoginPayload = data ? querystring . parse ( data ) : { }
99
+ const payload : LoginRequest = data ? JSON . parse ( data ) : { }
113
100
const password = this . authenticated ( request , {
114
101
key : typeof payload . password === "string" ? [ hash ( payload . password ) ] : undefined ,
115
102
} )
116
103
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
+ }
118
117
}
119
118
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
+ }
129
131
130
132
return { code : HttpCode . Unauthorized }
131
133
}
0 commit comments