2021-05-29 18:36:54 +01:00
/ *
GoToSocial
2021-12-20 17:42:19 +00:00
Copyright ( C ) 2021 - 2022 GoToSocial Authors admin @ gotosocial . org
2021-05-29 18:36:54 +01:00
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/>.
* /
2022-05-30 15:19:52 +01:00
package dereferencing
2021-05-29 18:36:54 +01:00
import (
"context"
"encoding/json"
"errors"
"fmt"
"net/url"
"strings"
apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model"
2022-05-30 15:19:52 +01:00
"github.com/superseriousbusiness/gotosocial/internal/transport"
2021-05-29 18:36:54 +01:00
)
2022-05-30 15:19:52 +01:00
func ( d * deref ) fingerRemoteAccount ( ctx context . Context , t transport . Transport , targetUsername string , targetDomain string ) ( * url . URL , error ) {
2021-10-04 14:24:19 +01:00
b , err := t . Finger ( ctx , targetUsername , targetDomain )
2021-05-29 18:36:54 +01:00
if err != nil {
2022-05-30 15:19:52 +01:00
return nil , fmt . Errorf ( "FingerRemoteAccount: error fingering @%s@%s: %s" , targetUsername , targetDomain , err )
2021-05-29 18:36:54 +01:00
}
2021-06-24 13:26:08 +01:00
resp := & apimodel . WellKnownResponse { }
2021-05-29 18:36:54 +01:00
if err := json . Unmarshal ( b , resp ) ; err != nil {
2022-05-30 15:19:52 +01:00
return nil , fmt . Errorf ( "FingerRemoteAccount: could not unmarshal server response as WebfingerAccountResponse while dereferencing @%s@%s: %s" , targetUsername , targetDomain , err )
2021-05-29 18:36:54 +01:00
}
if len ( resp . Links ) == 0 {
return nil , fmt . Errorf ( "FingerRemoteAccount: no links found in webfinger response %s" , string ( b ) )
}
// look through the links for the first one that matches "application/activity+json", this is what we need
for _ , l := range resp . Links {
if strings . EqualFold ( l . Type , "application/activity+json" ) {
if l . Href == "" || l . Rel != "self" {
continue
}
accountURI , err := url . Parse ( l . Href )
if err != nil {
return nil , fmt . Errorf ( "FingerRemoteAccount: couldn't parse url %s: %s" , l . Href , err )
}
// found it!
return accountURI , nil
}
}
return nil , errors . New ( "FingerRemoteAccount: no match found in webfinger response" )
}