@@ -34,6 +34,12 @@ app.get('/', (req, res) => {
3434 res . sendFile ( __dirname + '/public/index.html' ) ;
3535} ) ;
3636
37+ let lookup ;
38+ async function checkURL ( url ) {
39+ if ( ! lookup ) lookup = require ( 'safe-browse-url-lookup' ) ( { apiKey : config . SAFE_BROWSING_APIKEY } ) ;
40+ return await lookup . checkSingle ( url )
41+ }
42+
3743function generateCode ( ) {
3844 const buffer = crypto . randomBytes ( 1 ) ;
3945 const hex = buffer . toString ( 'hex' ) ;
@@ -120,18 +126,24 @@ app.get("/s/:code", async (req, res) => {
120126 if ( password ) {
121127 let hashPass = SHA256 ( password ) . toString ( ) ;
122128 if ( hashPass === db [ code ] . password ) {
123- res . redirect ( db [ code ] . link ) ;
129+ let isSafe = ! ( await checkURL ( db [ code ] . link ) ) ;
130+ if ( isSafe ) res . redirect ( db [ code ] . link ) ;
131+ else res . redirect ( `/warning?link=${ Base64 . encode ( db [ code ] . link ) } ` ) ;
124132 } else {
125133 res . redirect ( `/s/${ code } ` )
126134 }
127135 } else {
128136 res . sendFile ( __dirname + '/public/password.html' ) ;
129137 }
130138 } else {
131- res . redirect ( db [ code ] . link ) ;
139+ let isSafe = ! ( await checkURL ( db [ code ] . link ) ) ;
140+ if ( isSafe ) res . redirect ( db [ code ] . link ) ;
141+ else res . redirect ( `/warning?link=${ Base64 . encode ( db [ code ] . link ) } ` ) ;
132142 }
133143 } else {
134- res . redirect ( db [ code ] ) ;
144+ let isSafe = ! ( await checkURL ( db [ code ] ) ) ;
145+ if ( isSafe ) res . redirect ( db [ code ] ) ;
146+ else res . redirect ( `/warning?link=${ Base64 . encode ( db [ code ] ) } ` ) ;
135147 }
136148 } else if ( isMongoDB ) {
137149 await client . connect ( ) ;
@@ -152,15 +164,19 @@ app.get("/s/:code", async (req, res) => {
152164 if ( password ) {
153165 let hashPass = SHA256 ( password ) . toString ( ) ;
154166 if ( hashPass === filtered [ 0 ] . password ) {
155- res . redirect ( filtered [ 0 ] . link ) ;
167+ let isSafe = ! ( await checkURL ( filtered [ 0 ] . link ) ) ;
168+ if ( isSafe ) res . redirect ( filtered [ 0 ] . link ) ;
169+ else res . redirect ( `/warning?link=${ Base64 . encode ( filtered [ 0 ] . link ) } ` ) ;
156170 } else {
157171 res . redirect ( `/s/${ code } ` )
158172 }
159173 } else {
160174 res . sendFile ( __dirname + '/public/password.html' ) ;
161175 }
162176 } else {
163- res . redirect ( filtered [ 0 ] . link ) ;
177+ let isSafe = ! ( await checkURL ( filtered [ 0 ] . link ) ) ;
178+ if ( isSafe ) res . redirect ( filtered [ 0 ] . link ) ;
179+ else res . redirect ( `/warning?link=${ Base64 . encode ( filtered [ 0 ] . link ) } ` ) ;
164180 }
165181 }
166182} ) ;
@@ -188,18 +204,21 @@ app.get("/api/s/:code", async (req, res) => {
188204 if ( password ) {
189205 let hashPass = SHA256 ( password ) . toString ( ) ;
190206 if ( hashPass === db [ code ] . password ) {
191- res . json ( { status : 200 , data : { original : db [ code ] . link , shorten : `${ config . DOMAIN } /s/${ code } ` } } ) ;
207+ let isSafe = ! ( await checkURL ( db [ code ] . link ) ) ;
208+ res . json ( { status : 200 , data : { original : db [ code ] . link , shorten : `${ config . DOMAIN } /s/${ code } ` , safe : isSafe } } ) ;
192209 } else {
193210 res . json ( { status : 401 , data : { original : "Error: Unauthorized" , shorten : `${ config . DOMAIN } /s/${ code } ` } } )
194211 }
195212 } else {
196213 res . json ( { status : 401 , data : { original : "Error: Unauthorized" , shorten : `${ config . DOMAIN } /s/${ code } ` } } )
197214 }
198215 } else {
199- res . json ( { status : 200 , data : { original : db [ code ] . link , shorten : `${ config . DOMAIN } /s/${ code } ` } } ) ;
216+ let isSafe = ! ( await checkURL ( db [ code ] . link ) ) ;
217+ res . json ( { status : 200 , data : { original : db [ code ] . link , shorten : `${ config . DOMAIN } /s/${ code } ` , safe : isSafe } } ) ;
200218 }
201219 } else {
202- res . json ( { status : 200 , data : { original : db [ code ] , shorten : `${ config . DOMAIN } /s/${ code } ` } } ) ;
220+ let isSafe = ! ( await checkURL ( db [ code ] ) ) ;
221+ res . json ( { status : 200 , data : { original : db [ code ] , shorten : `${ config . DOMAIN } /s/${ code } ` , safe : isSafe } } ) ;
203222 }
204223 } else if ( isMongoDB ) {
205224 await client . connect ( ) ;
@@ -241,6 +260,10 @@ app.get("/generated", (req, res) => {
241260 res . sendFile ( __dirname + '/public/generated.html' ) ;
242261} )
243262
263+ app . get ( "/warning" , ( req , res ) => {
264+ res . sendFile ( __dirname + '/public/warning.html' ) ;
265+ } ) ;
266+
244267app . listen ( process . env . PORT || config . PORT , async ( ) => {
245268 if ( isJSON ) {
246269 if ( ! config . DB_JSON_PATH ) {
0 commit comments