Skip to content

Commit

Permalink
add temporary mincliversioncheck
Browse files Browse the repository at this point in the history
  • Loading branch information
Runar Kristoffersen committed Aug 29, 2022
1 parent 4281c2e commit 5371975
Show file tree
Hide file tree
Showing 8 changed files with 120 additions and 27 deletions.
10 changes: 5 additions & 5 deletions frontend/src/apiTypes.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -665,6 +665,11 @@ declare namespace ApiDef {
* Date of build
*/
build_date?: string; // date-time
/**
* The minimum version of skiver-cli that can be used with this server.
* The is [semver](https://semver.org/)-compatible, but has a leading `v`, like `v1.2.3`
*/
cli_version_contraints?: string;
/**
* Size of database.
*/
Expand All @@ -684,11 +689,6 @@ declare namespace ApiDef {
instance?: string;
latest_cli_release?: ReleaseInfo;
latest_release?: ReleaseInfo;
/**
* The minimum version of skiver-cli that can be used with this server.
* The is [semver](https://semver.org/)-compatible, but has a leading `v`, like `v1.2.3`
*/
min_cli_version?: string;
/**
* When the server was started
*/
Expand Down
7 changes: 5 additions & 2 deletions handlers/apiHandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,11 @@ func EndpointsHandler(
) http.HandlerFunc {

return func(rw http.ResponseWriter, r *http.Request) {
if r.Method == http.MethodDelete {
return
switch r.Method {
case http.MethodPost, http.MethodDelete, http.MethodPut, http.MethodPatch:
if err := ValidateClientVersion(rw, r); err != nil {
return
}
}
AddAccessControl(r, rw)

Expand Down
71 changes: 71 additions & 0 deletions handlers/getClientVersion.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package handlers

import (
"encoding/json"
"fmt"
"net/http"

"github.com/Masterminds/semver/v3"
"github.com/runar-rkmedia/skiver/utils"
)

type CallingClient struct {
Name string
Version string
GitHash string
Semver *semver.Version
}

func GetClientVersionFromRequest(r *http.Request) (client CallingClient, found bool) {
client.Name = r.Header.Get("Client_App")
found = client.Name != ""
client.GitHash = r.Header.Get("Client_Hash")
client.Version = r.Header.Get("Client_version")
if client.Version != "" {
if v, err := semver.NewVersion(client.Version); err == nil {
client.Semver = v
}
}

return
}

var mincliversion = utils.Must(semver.NewConstraint(">= 0.6.0"))

// temporary check for clients before they upgrade to a version of
func ValidateClientVersion(rw http.ResponseWriter, r *http.Request) error {
client, found := GetClientVersionFromRequest(r)
if !found {
// a client which is not reporting their versioning.
// we have not control over them, and do not wish to interfere
return nil
}
// This is temporary
var err error
var details []any
if client.Version == "" {
err = fmt.Errorf("client %s detected, missing version-number. Please upgrade.", client.Name)
} else if client.Semver == nil {
err = fmt.Errorf("client %s with version '%s' is outdated. Please upgrade", client.Name, client.Version)
} else {
switch client.Name {
case "skiver-cli":
if ok, errs := mincliversion.Validate(client.Semver); !ok {
err = fmt.Errorf("client '%s' with version '%s' (%s) is outdated. Please upgrade", client.Name, client.Version, client.Semver.String())
details = append(details, errs)
}

}
}
if err == nil {
return nil
}
json, jerr := json.Marshal(NewApiErr(err, http.StatusConflict, "ErrOutdatedClient", details...))
if jerr != nil {
panic(err)
}
rw.Header().Set("Content-Type", "application/json")
rw.WriteHeader(http.StatusConflict)
rw.Write([]byte(json))
return err
}
26 changes: 17 additions & 9 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -602,13 +602,13 @@ func main() {
sync.RWMutex
}{
types.ServerInfo{
ServerStartedAt: serverStartTime,
GitHash: commit,
Version: version,
BuildDate: buildDate,
MinCliVersion: "v0.6.0",
Instance: getInstanceHash(),
HostHash: gethostNameHash(),
ServerStartedAt: serverStartTime,
GitHash: commit,
Version: version,
BuildDate: buildDate,
CliVersionConstraints: ">=v0.6.0",
Instance: getInstanceHash(),
HostHash: gethostNameHash(),
},
sync.RWMutex{},
}
Expand Down Expand Up @@ -802,6 +802,13 @@ func main() {
return func(rw http.ResponseWriter, r *http.Request, p httprouter.Params) {
startTime := time.Now()
debug := l.HasDebug()
switch r.Method {

case http.MethodPost, http.MethodDelete, http.MethodPut, http.MethodPatch:
if err := handlers.ValidateClientVersion(rw, r); err != nil {
return
}
}
var err error
defer func() {
since := time.Since(startTime)
Expand Down Expand Up @@ -972,12 +979,13 @@ func main() {
return nil
}}))
router.GET("/api/translation/", pipeline("GetTranslation", handlers.GetTranslations()))
router.GET("/api/serverInfo/", pipeline("GetServerInfo", handlers.GetServerInfo(&db, func() *types.ServerInfo {
serverInfoRetriever := func() *types.ServerInfo {
info.RLock()
defer info.RUnlock()
return &info.ServerInfo

})))
}
router.GET("/api/serverInfo/", pipeline("GetServerInfo", handlers.GetServerInfo(&db, serverInfoRetriever)))
router.POST("/api/project/snapshot/", pipeline("PostSnapshot", handlers.PostSnapshot(uploaders), routeOptions{sessionRole: func(s types.Session, _ *http.Request) error {
if !s.User.CanUpdateProjects {
return fmt.Errorf("You are not authorized to create snapshots")
Expand Down
8 changes: 4 additions & 4 deletions models/server_info.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 6 additions & 6 deletions swagger.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1159,6 +1159,12 @@ definitions:
format: date-time
type: string
x-go-name: BuildDate
cli_version_contraints:
description: |-
The minimum version of skiver-cli that can be used with this server.
The is [semver](https://semver.org/)-compatible, but has a leading `v`, like `v1.2.3`
type: string
x-go-name: CliVersionConstraints
database_size:
description: Size of database.
format: int64
Expand All @@ -1183,12 +1189,6 @@ definitions:
$ref: '#/definitions/ReleaseInfo'
latest_release:
$ref: '#/definitions/ReleaseInfo'
min_cli_version:
description: |-
The minimum version of skiver-cli that can be used with this server.
The is [semver](https://semver.org/)-compatible, but has a leading `v`, like `v1.2.3`
type: string
x-go-name: MinCliVersion
server_started_at:
description: When the server was started
format: date-time
Expand Down
2 changes: 1 addition & 1 deletion types/serverInfo.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ type ServerInfo struct {
LatestReleaseCLI *ReleaseInfo `json:"latest_cli_release"`
// The minimum version of skiver-cli that can be used with this server.
// The is [semver](https://semver.org/)-compatible, but has a leading `v`, like `v1.2.3`
MinCliVersion string `json:"min_cli_version"`
CliVersionConstraints string `json:"cli_version_contraints,omitempty"`
}

// Server info
Expand Down
11 changes: 11 additions & 0 deletions utils/must.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package utils

// unwraps the first value, panics if err
func Must[T any](t T, err error) T {

if err != nil {
panic(err)
}
return t

}

0 comments on commit 5371975

Please sign in to comment.