mirror of
https://gitea.com/gitea/tea.git
synced 2026-10-26 11:01:25 +01:00
fix(doctor): check the account when the instance requires sign-in to view
Signed-off-by: bircni <bircni@icloud.com>
This commit is contained in:
1 file changed
+18
-6
+18
-6
@@ -7,6 +7,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -15,6 +16,7 @@ import (
|
|||||||
"gitea.dev/tea/internal/services"
|
"gitea.dev/tea/internal/services"
|
||||||
"gitea.dev/tea/internal/settings"
|
"gitea.dev/tea/internal/settings"
|
||||||
"gitea.dev/tea/internal/terminal"
|
"gitea.dev/tea/internal/terminal"
|
||||||
|
"gitea.dev/tea/internal/transport"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -102,9 +104,13 @@ func (a *application) diagnose(ctx context.Context) doctorReport {
|
|||||||
add(a.gitCheck(ctx, ""))
|
add(a.gitCheck(ctx, ""))
|
||||||
return report
|
return report
|
||||||
}
|
}
|
||||||
instance := a.instanceCheck(ctx, t)
|
|
||||||
add(instance)
|
|
||||||
authenticated, accountErr := a.resolveTarget(ctx, t.Repo != "", true)
|
authenticated, accountErr := a.resolveTarget(ctx, t.Repo != "", true)
|
||||||
|
client := a.deps.Client(t.Host, "", t.host.Insecure)
|
||||||
|
if accountErr == nil {
|
||||||
|
client = authenticated.client
|
||||||
|
}
|
||||||
|
instance := a.instanceCheck(ctx, t, client)
|
||||||
|
add(instance)
|
||||||
switch {
|
switch {
|
||||||
case instance.Status == checkFailed:
|
case instance.Status == checkFailed:
|
||||||
accountErr = errors.New("instance does not answer")
|
accountErr = errors.New("instance does not answer")
|
||||||
@@ -138,17 +144,23 @@ func (a *application) diagnose(ctx context.Context) doctorReport {
|
|||||||
return report
|
return report
|
||||||
}
|
}
|
||||||
|
|
||||||
// instanceCheck asks the instance for its version.
|
// instanceCheck asks the instance for its version with client, the account's when it has one:
|
||||||
func (a *application) instanceCheck(ctx context.Context, t target) doctorCheck {
|
// instances with [service] REQUIRE_SIGNIN_VIEW refuse every anonymous API request.
|
||||||
|
func (a *application) instanceCheck(ctx context.Context, t target, client *transport.Client) doctorCheck {
|
||||||
ctx, cancel := context.WithTimeout(ctx, doctorTimeout)
|
ctx, cancel := context.WithTimeout(ctx, doctorTimeout)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
start := time.Now()
|
start := time.Now()
|
||||||
version, err := services.ServerVersion(ctx, a.deps.Client(t.Host, "", t.host.Insecure))
|
version, err := services.ServerVersion(ctx, client)
|
||||||
where := t.Host + " (" + describeSource(t.HostSource) + ")"
|
where := t.Host + " (" + describeSource(t.HostSource) + ")"
|
||||||
|
latency := max(time.Since(start).Milliseconds(), 1)
|
||||||
|
if refused, ok := errors.AsType[*transport.APIError](err); ok && (refused.Status == http.StatusUnauthorized || refused.Status == http.StatusForbidden) {
|
||||||
|
// The instance answers; the account check reports why the credential is refused.
|
||||||
|
return doctorCheck{"Instance", checkPassed, fmt.Sprintf("%s · answers signed-in requests only · %dms", where, latency), ""}
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return doctorCheck{"Instance", checkFailed, where + ": " + Explain(ctx, a.deps, err).Error(), "check --host, the instance URL and your network"}
|
return doctorCheck{"Instance", checkFailed, where + ": " + Explain(ctx, a.deps, err).Error(), "check --host, the instance URL and your network"}
|
||||||
}
|
}
|
||||||
return doctorCheck{"Instance", checkPassed, fmt.Sprintf("%s · Gitea %s · %dms", where, version, max(time.Since(start).Milliseconds(), 1)), ""}
|
return doctorCheck{"Instance", checkPassed, fmt.Sprintf("%s · Gitea %s · %dms", where, version, latency), ""}
|
||||||
}
|
}
|
||||||
|
|
||||||
// accountCheck reports whether the account authenticates, and the scopes of its token.
|
// accountCheck reports whether the account authenticates, and the scopes of its token.
|
||||||
|
|||||||
Reference in new issue
Block a user