1
0
mirror of https://github.com/muety/wakapi.git synced 2023-08-10 21:12:56 +03:00

fix: badge endpoint permission fixes (resolve #205)

fix: reference past x days intervals from now instead of start of day
This commit is contained in:
Ferdinand Mütsch 2021-06-11 16:02:28 +02:00
parent fb643571d2
commit f4612fd542
4 changed files with 23 additions and 10 deletions

View File

@ -4,14 +4,13 @@
<p align="center"> <p align="center">
<img src="https://badges.fw-web.space/github/license/muety/wakapi"> <img src="https://badges.fw-web.space/github/license/muety/wakapi">
<a href="https://saythanks.io/to/n1try"><img src="https://badges.fw-web.space/badge/SayThanks.io-%E2%98%BC-1EAEDB.svg"></a>
<a href="https://liberapay.com/muety/"><img src="https://badges.fw-web.space/liberapay/receives/muety.svg?logo=liberapay"></a> <a href="https://liberapay.com/muety/"><img src="https://badges.fw-web.space/liberapay/receives/muety.svg?logo=liberapay"></a>
<img src="https://badges.fw-web.space/endpoint?url=https://wakapi.dev/api/compat/shields/v1/n1try/interval:any/project:wakapi&color=blue&label=wakapi"> <img src="https://badges.fw-web.space/endpoint?url=https://wakapi.dev/api/compat/shields/v1/n1try/interval:any/project:wakapi&color=blue&label=wakapi">
<img src="https://badges.fw-web.space/github/languages/code-size/muety/wakapi">
</p> </p>
<p align="center"> <p align="center">
<a href="https://goreportcard.com/report/github.com/muety/wakapi"><img src="https://goreportcard.com/badge/github.com/muety/wakapi"></a> <a href="https://goreportcard.com/report/github.com/muety/wakapi"><img src="https://goreportcard.com/badge/github.com/muety/wakapi"></a>
<img src="https://badges.fw-web.space/github/languages/code-size/muety/wakapi">
<a href="https://sonarcloud.io/dashboard?id=muety_wakapi"><img src="https://sonarcloud.io/api/project_badges/measure?project=muety_wakapi&metric=sqale_index"></a> <a href="https://sonarcloud.io/dashboard?id=muety_wakapi"><img src="https://sonarcloud.io/api/project_badges/measure?project=muety_wakapi&metric=sqale_index"></a>
<a href="https://sonarcloud.io/dashboard?id=muety_wakapi"><img src="https://sonarcloud.io/api/project_badges/measure?project=muety_wakapi&metric=ncloc"></a> <a href="https://sonarcloud.io/dashboard?id=muety_wakapi"><img src="https://sonarcloud.io/api/project_badges/measure?project=muety_wakapi&metric=ncloc"></a>
</p> </p>

View File

@ -16,7 +16,7 @@ import (
const ( const (
intervalPattern = `interval:([a-z0-9_]+)` intervalPattern = `interval:([a-z0-9_]+)`
entityFilterPattern = `(project|os|editor|language|machine):([_a-zA-Z0-9-]+)` entityFilterPattern = `(project|os|editor|language|machine):([_a-zA-Z0-9-\s]+)`
) )
type BadgeHandler struct { type BadgeHandler struct {
@ -75,7 +75,7 @@ func (h *BadgeHandler) Get(w http.ResponseWriter, r *http.Request) {
} }
_, rangeFrom, rangeTo := utils.ResolveIntervalTZ(interval, user.TZ()) _, rangeFrom, rangeTo := utils.ResolveIntervalTZ(interval, user.TZ())
minStart := utils.StartOfDay(rangeTo.Add(-24 * time.Hour * time.Duration(user.ShareDataMaxDays))) minStart := rangeTo.Add(-24 * time.Hour * time.Duration(user.ShareDataMaxDays))
// negative value means no limit // negative value means no limit
if rangeFrom.Before(minStart) && user.ShareDataMaxDays >= 0 { if rangeFrom.Before(minStart) && user.ShareDataMaxDays >= 0 {
w.WriteHeader(http.StatusForbidden) w.WriteHeader(http.StatusForbidden)
@ -83,22 +83,35 @@ func (h *BadgeHandler) Get(w http.ResponseWriter, r *http.Request) {
return return
} }
var permitEntity bool
var filters *models.Filters var filters *models.Filters
switch filterEntity { switch filterEntity {
case "project": case "project":
permitEntity = user.ShareProjects
filters = models.NewFiltersWith(models.SummaryProject, filterKey) filters = models.NewFiltersWith(models.SummaryProject, filterKey)
case "os": case "os":
permitEntity = user.ShareOSs
filters = models.NewFiltersWith(models.SummaryOS, filterKey) filters = models.NewFiltersWith(models.SummaryOS, filterKey)
case "editor": case "editor":
permitEntity = user.ShareEditors
filters = models.NewFiltersWith(models.SummaryEditor, filterKey) filters = models.NewFiltersWith(models.SummaryEditor, filterKey)
case "language": case "language":
permitEntity = user.ShareLanguages
filters = models.NewFiltersWith(models.SummaryLanguage, filterKey) filters = models.NewFiltersWith(models.SummaryLanguage, filterKey)
case "machine": case "machine":
permitEntity = user.ShareMachines
filters = models.NewFiltersWith(models.SummaryMachine, filterKey) filters = models.NewFiltersWith(models.SummaryMachine, filterKey)
default: default:
permitEntity = true
filters = &models.Filters{} filters = &models.Filters{}
} }
if !permitEntity {
w.WriteHeader(http.StatusForbidden)
w.Write([]byte("user did not opt in to share entity-specific data"))
return
}
cacheKey := fmt.Sprintf("%s_%v_%s_%s", user.ID, *interval, filterEntity, filterKey) cacheKey := fmt.Sprintf("%s_%v_%s_%s", user.ID, *interval, filterEntity, filterKey)
if cacheResult, ok := h.cache.Get(cacheKey); ok { if cacheResult, ok := h.cache.Get(cacheKey); ok {
utils.RespondJSON(w, r, http.StatusOK, cacheResult.(*v1.BadgeData)) utils.RespondJSON(w, r, http.StatusOK, cacheResult.(*v1.BadgeData))

View File

@ -30,7 +30,8 @@ func ResolveIntervalRawTZ(interval string, tz *time.Location) (err error, from,
} }
func ResolveIntervalTZ(interval *models.IntervalKey, tz *time.Location) (err error, from, to time.Time) { func ResolveIntervalTZ(interval *models.IntervalKey, tz *time.Location) (err error, from, to time.Time) {
to = time.Now().In(tz) now := time.Now().In(tz)
to = now
switch interval { switch interval {
case models.IntervalToday: case models.IntervalToday:
@ -51,16 +52,16 @@ func ResolveIntervalTZ(interval *models.IntervalKey, tz *time.Location) (err err
case models.IntervalThisYear: case models.IntervalThisYear:
from = StartOfThisYear(tz) from = StartOfThisYear(tz)
case models.IntervalPast7Days: case models.IntervalPast7Days:
from = StartOfToday(tz).AddDate(0, 0, -7) from = now.AddDate(0, 0, -7)
case models.IntervalPast7DaysYesterday: case models.IntervalPast7DaysYesterday:
from = StartOfToday(tz).AddDate(0, 0, -1).AddDate(0, 0, -7) from = StartOfToday(tz).AddDate(0, 0, -1).AddDate(0, 0, -7)
to = StartOfToday(tz).AddDate(0, 0, -1) to = StartOfToday(tz).AddDate(0, 0, -1)
case models.IntervalPast14Days: case models.IntervalPast14Days:
from = StartOfToday(tz).AddDate(0, 0, -14) from = now.AddDate(0, 0, -14)
case models.IntervalPast30Days: case models.IntervalPast30Days:
from = StartOfToday(tz).AddDate(0, 0, -30) from = now.AddDate(0, 0, -30)
case models.IntervalPast12Months: case models.IntervalPast12Months:
from = StartOfToday(tz).AddDate(0, -12, 0) from = now.AddDate(0, -12, 0)
case models.IntervalAny: case models.IntervalAny:
from = time.Time{} from = time.Time{}
default: default:

View File

@ -1 +1 @@
1.27.3 1.27.4