2022-09-29 12:02:41 +02:00
/ *
GoToSocial
Copyright ( C ) 2021 - 2022 GoToSocial Authors admin @ gotosocial . org
This program is free software : you can redistribute it and / or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation , either version 3 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU Affero General Public License for more details .
You should have received a copy of the GNU Affero General Public License
along with this program . If not , see < http : //www.gnu.org/licenses/>.
* /
"use strict" ;
const Promise = require ( "bluebird" ) ;
const { OAUTHError , AuthenticationError } = require ( "../errors" ) ;
const oauth = require ( "../../redux/reducers/oauth" ) . actions ;
const temporary = require ( "../../redux/reducers/temporary" ) . actions ;
const admin = require ( "../../redux/reducers/admin" ) . actions ;
module . exports = function oauthAPI ( { apiCall , getCurrentUrl } ) {
return {
register : function register ( scopes = [ ] ) {
return function ( dispatch , _getState ) {
return Promise . try ( ( ) => {
return dispatch ( apiCall ( "POST" , "/api/v1/apps" , {
client _name : "GoToSocial Settings" ,
scopes : scopes . join ( " " ) ,
redirect _uris : getCurrentUrl ( ) ,
website : getCurrentUrl ( )
} ) ) ;
} ) . then ( ( json ) => {
json . scopes = scopes ;
dispatch ( oauth . setRegistration ( json ) ) ;
} ) ;
} ;
} ,
authorize : function authorize ( ) {
return function ( dispatch , getState ) {
let state = getState ( ) ;
let reg = state . oauth . registration ;
let base = new URL ( state . oauth . instance ) ;
base . pathname = "/oauth/authorize" ;
base . searchParams . set ( "client_id" , reg . client _id ) ;
base . searchParams . set ( "redirect_uri" , getCurrentUrl ( ) ) ;
base . searchParams . set ( "response_type" , "code" ) ;
base . searchParams . set ( "scope" , reg . scopes . join ( " " ) ) ;
dispatch ( oauth . setLoginState ( "callback" ) ) ;
dispatch ( temporary . setStatus ( "Redirecting to instance login..." ) ) ;
// send user to instance's login flow
window . location . assign ( base . href ) ;
} ;
} ,
tokenize : function tokenize ( code ) {
return function ( dispatch , getState ) {
let reg = getState ( ) . oauth . registration ;
return Promise . try ( ( ) => {
if ( reg == undefined || reg . client _id == undefined ) {
throw new OAUTHError ( "Callback code present, but no client registration is available from localStorage. \nNote: localStorage is unavailable in Private Browsing." ) ;
}
return dispatch ( apiCall ( "POST" , "/oauth/token" , {
client _id : reg . client _id ,
client _secret : reg . client _secret ,
redirect _uri : getCurrentUrl ( ) ,
grant _type : "authorization_code" ,
code : code
} ) ) ;
} ) . then ( ( json ) => {
window . history . replaceState ( { } , document . title , window . location . pathname ) ;
return dispatch ( oauth . login ( json ) ) ;
} ) ;
} ;
} ,
checkIfAdmin : function checkIfAdmin ( ) {
return function ( dispatch , getState ) {
const state = getState ( ) ;
let stored = state . oauth . isAdmin ;
if ( stored != undefined ) {
return stored ;
}
// newer GoToSocial version will include a `role` in the Account data, check that first
2022-11-23 16:10:02 +01:00
if ( state . user . profile . role == "admin" ) {
dispatch ( oauth . setAdmin ( true ) ) ;
return true ;
}
2022-09-29 12:02:41 +02:00
// no role info, try fetching an admin-only route and see if we get an error
return Promise . try ( ( ) => {
return dispatch ( apiCall ( "GET" , "/api/v1/admin/domain_blocks" ) ) ;
} ) . then ( ( data ) => {
return Promise . all ( [
dispatch ( oauth . setAdmin ( true ) ) ,
dispatch ( admin . setBlockedInstances ( data ) )
] ) ;
} ) . catch ( AuthenticationError , ( ) => {
return dispatch ( oauth . setAdmin ( false ) ) ;
} ) ;
} ;
} ,
logout : function logout ( ) {
return function ( dispatch , _getState ) {
// TODO: GoToSocial does not have a logout API route yet
return dispatch ( oauth . remove ( ) ) ;
} ;
}
} ;
} ;