bedrocktool/utils/auth.go

117 lines
2.0 KiB
Go
Raw Permalink Normal View History

2022-09-04 14:26:32 +00:00
package utils
2022-08-17 18:04:13 +00:00
import (
"encoding/json"
2023-02-12 21:22:44 +00:00
"fmt"
"io"
2022-08-17 18:04:13 +00:00
"os"
"github.com/sandertv/gophertunnel/minecraft/auth"
2022-08-23 19:06:08 +00:00
"github.com/sandertv/gophertunnel/minecraft/realms"
2022-08-17 18:04:13 +00:00
"golang.org/x/oauth2"
)
2023-01-29 21:20:13 +00:00
const TokenFile = "token.json"
2022-09-04 14:26:32 +00:00
type authsrv struct {
t *oauth2.Token
src oauth2.TokenSource
2022-08-17 18:04:13 +00:00
LoginWithMicrosoftCallback func(io.Reader)
2022-08-17 18:04:13 +00:00
}
var Auth authsrv
2023-02-12 21:22:44 +00:00
func (a *authsrv) HaveToken() bool {
_, err := os.Stat(TokenFile)
return err == nil
}
2022-08-17 18:04:13 +00:00
func (a *authsrv) Refresh() error {
a.src = auth.RefreshTokenSource(a.t)
return nil
2022-08-17 18:04:13 +00:00
}
func (a *authsrv) writeToken() error {
f, err := os.Create(TokenFile)
2022-08-17 18:04:13 +00:00
if err != nil {
return err
2022-08-17 18:04:13 +00:00
}
defer f.Close()
e := json.NewEncoder(f)
return e.Encode(a.t)
2022-08-17 18:04:13 +00:00
}
func (a *authsrv) readToken() error {
2022-08-17 18:04:13 +00:00
var token oauth2.Token
f, err := os.Open(TokenFile)
if err != nil {
return err
}
defer f.Close()
e := json.NewDecoder(f)
err = e.Decode(&token)
if err != nil {
return err
}
a.t = &token
return nil
}
func (a *authsrv) GetTokenSource() (src oauth2.TokenSource, err error) {
if a.src != nil {
return a.src, nil
}
if !a.HaveToken() {
// request a new token
r, w := io.Pipe()
go a.LoginWithMicrosoftCallback(r)
a.t, err = auth.RequestLiveTokenWriter(w)
2022-08-17 18:04:13 +00:00
if err != nil {
return nil, err
2022-08-17 18:04:13 +00:00
}
err := a.writeToken()
if err != nil {
return nil, err
2022-08-17 18:04:13 +00:00
}
} else {
// read the existing token
err := a.readToken()
2022-08-17 18:04:13 +00:00
if err != nil {
return nil, err
2022-08-17 18:04:13 +00:00
}
}
// refresh the token if necessary
err = a.Refresh()
if err != nil {
return nil, err
}
// if the old token isnt valid save the new one
if !a.t.Valid() {
newToken, err := a.src.Token()
if err != nil {
return nil, err
}
a.t = newToken
err = a.writeToken()
if err != nil {
return nil, err
}
}
return a.src, nil
}
var RealmsEnv string
var gRealmsAPI *realms.Client
func GetRealmsAPI() *realms.Client {
if gRealmsAPI == nil {
if RealmsEnv != "" {
realms.RealmsAPIBase = fmt.Sprintf("https://pocket-%s.realms.minecraft.net/", RealmsEnv)
}
gRealmsAPI = realms.NewClient(Auth.src)
}
return gRealmsAPI
2022-08-17 18:04:13 +00:00
}