@ -8,14 +8,13 @@ import widgets from "widgets/widgets";
const INFO _ENDPOINT = "{url}/webapi/query.cgi?api=SYNO.API.Info&version=1&method=query" ;
const AUTH _ENDPOINT =
"{url}/webapi/{path}?api=SYNO.API.Auth&version={maxVersion}& session=DownloadStation&format=cookie&method=login&{authParams} ";
"{url}/webapi/{path}?api=SYNO.API.Auth&version={maxVersion}& method=login&account={username}&passwd={password}& session=DownloadStation&format=cookie";
const AUTH _API _NAME = "SYNO.API.Auth" ;
const proxyName = "synologyProxyHandler" ;
const logger = createLogger ( proxyName ) ;
async function login ( loginUrl ) {
logger . debug ( "Attempting login via %s" , loginUrl ) ;
const [ status , contentType , data ] = await httpProxy ( loginUrl ) ;
if ( status !== 200 ) {
return [ status , contentType , data ] ;
@ -33,8 +32,8 @@ async function login(loginUrl) {
404 Failed to authenticate 2 - step verification code
* /
let message = "Authentication failed." ;
if ( json ? . error ? . code && parseInt ( json ? . error ? . code , 10 ) >= 403 ) message += " 2FA enabled." ;
logger . error ( "Unable to login. Code: %d" , json ? . error ? . code ) ;
if ( json ? . error ? . code >= 403 ) message += " 2FA enabled." ;
logger . warn ( "Unable to login. Code: %d" , json ? . error ? . code ) ;
return [ 401 , "application/json" , JSON . stringify ( { code : json ? . error ? . code , message } ) ] ;
}
@ -51,7 +50,6 @@ async function getApiInfo(serviceWidget, apiName, serviceName) {
const infoUrl = formatApiCall ( INFO _ENDPOINT , serviceWidget ) ;
// eslint-disable-next-line no-unused-vars
const [ status , contentType , data ] = await httpProxy ( infoUrl ) ;
logger . debug ( "Received %d from Info endpoint %s" , status , infoUrl ) ;
if ( status === 200 ) {
try {
@ -74,16 +72,12 @@ async function getApiInfo(serviceWidget, apiName, serviceName) {
}
async function handleUnsuccessfulResponse ( serviceWidget , url , serviceName ) {
logger . debug ( ` Attempting login to ${ serviceWidget . type } ` ) ;
// eslint-disable-next-line no-unused-vars
const [ apiPath , maxVersion ] = await getApiInfo ( serviceWidget , AUTH _API _NAME , serviceName ) ;
const authParams = new URLSearchParams ( { account : serviceWidget . username , passwd : serviceWidget . password } ) ;
const authArgs = {
path : apiPath ? ? "entry.cgi" ,
maxVersion : maxVersion ? ? 7 ,
url : serviceWidget . url ,
authParams : authParams . toString ( ) ,
} ;
const authArgs = { path : apiPath ? ? "entry.cgi" , maxVersion : maxVersion ? ? 7 , ... serviceWidget } ;
const loginUrl = formatApiCall ( AUTH _ENDPOINT , authArgs ) ;
const [ status , contentType , data ] = await login ( loginUrl ) ;
@ -132,7 +126,7 @@ function toError(url, synologyError) {
error . error = synologyError . message ? ? "Unknown error." ;
break ;
}
logger . error ( ` Unable to call ${ url } . code: ${ code } , error: ${ error . error } . ` ) ;
logger . warn ( ` Unable to call ${ url } . code: ${ code } , error: ${ error . error } . ` ) ;
return error ;
}
@ -160,7 +154,7 @@ export default async function synologyProxyHandler(req, res) {
apiMethod : mapping . apiMethod ,
cgiPath ,
maxVersion ,
url : serviceWidget . url ,
... serviceWidget ,
} ) ;
let [ status , contentType , data ] = await httpProxy ( url ) ;
if ( status !== 200 ) {
@ -170,7 +164,7 @@ export default async function synologyProxyHandler(req, res) {
let json = asJson ( data ) ;
if ( json ? . success !== true ) {
logger . debug ( ` Request failed. Attempting login to ${ serviceWidget . type } ` ) ;
logger . debug ( ` Attempting login to ${ serviceWidget . type } ` ) ;
[ status , contentType , data ] = await handleUnsuccessfulResponse ( serviceWidget , url , service ) ;
json = asJson ( data ) ;
}