diff --git a/services/tiktak/server/server.go b/services/tiktak/server/server.go index b7f2e2d..8a55574 100644 --- a/services/tiktak/server/server.go +++ b/services/tiktak/server/server.go @@ -232,6 +232,19 @@ func (s *Server) handleAccess(c echo.Context) error { key := c.FormValue("token") if keygen.ValidateKey(key, vid) { ctx := context.Background() + + // AddAccess не проверял существование видео, поэтому можно было + // пре-авторизоваться на ещё не созданные id (и на отрицательные). + // Такая строка в access переживает любую последующую ротацию + // токенов: haveAccess() смотрит в таблицу, а не на токен. + v, err := s.db.GetVideo(ctx, vid) + if err != nil || v == nil { + return c.Render(http.StatusUnprocessableEntity, "access", AccessResponse{ + ErrorResponse: ErrorResponse{"no such video"}, + ID: vid, + }) + } + if err := s.db.AddAccess(ctx, vid, ac.GetId()); err != nil { return c.Render(http.StatusServiceUnavailable, "access", AccessResponse{ ErrorResponse: ErrorResponse{"try again later: " + err.Error()},