gitea/tests/integration/api_packages_arch_test.go

580 lines
34 KiB
Go

// Copyright 2023 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
package integration
import (
"bytes"
"encoding/base64"
"encoding/hex"
"fmt"
"io"
"net/http"
"path"
"testing"
"time"
"bou.ke/monkey"
auth_model "code.gitea.io/gitea/models/auth"
"code.gitea.io/gitea/models/unittest"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/setting"
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/tests"
"github.com/stretchr/testify/assert"
)
func TestPackageArch(t *testing.T) {
const gpgkey = `-----BEGIN PGP PUBLIC KEY BLOCK-----
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
8Iu2wss37Re8PI2n7enU+iNe1UN81ZMojf/V
=5NFR
-----END PGP PUBLIC KEY BLOCK-----`
const firstPackage = `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
smiYikcA2Mk=`
firstPackageData, err := base64.StdEncoding.DecodeString(firstPackage)
assert.NoError(t, err)
const firstPackageSignature = `iQGzBAABCAAdFiEEQ6WNuVKuWHQJqhdSETT46/mKoG8FAmSsBgkACgkQETT46/mKoG+Qsgv/WcrY
nMQ0BH6n+MAc99puw/VEj1o/qwwwrYV1jNIIWfWaMnlZHiTgShxfcfDgnjhMDnJGslia2mIBZoBy
JRUf/KuWye22MH3uzBIK2gz4RFt6qA57ZaU7y3YYrJ6pbwNvwayjuUa9Z8PEDs0t04mEiPhJYJVU
cM0mtWZUuYQt7kdnqm8Oxx0RSMPamQ/c/wC+h6p/DWMngoWgmDKbKwNA9/UjDrQujuwwVU1bUiUk
cX/cACNaTVcsIjSe9wD7xLqvBblCdjvl8fumYRYH2t/oj86HTLiCswEMYqsgf+NQ9ZFBSxd82Bay
vhhZgJPEjDBykHKdhqD/WZdOE97TwlbySg8l5oY9yUBrV0iim+FuqX+bD/X82IzE11597SG2V50z
K1/Xdvx76yOUHSO0t/731d/LyGxEVoD2ITwM5GgJgTYnOByaI4mkr9iz6OeIwHVgcTFYcQ+lMP5c
jMF9gK0ZWKyVAYH5FFhDJAm+lxWpcBu0Fnpj56LGqcaDORsvIVkA`
firstPackageSignatureData, err := base64.StdEncoding.DecodeString(firstPackageSignature)
assert.NoError(t, err)
const firstPackageMetadataSignature = `iQGzBAABCAAdFiEEQ6WNuVKuWHQJqhdSETT46/mKoG8FAmSsMPgACgkQETT46/mKoG948wv+IkNg
3zLDySwDxcBXmuhAtMMgUs4D+rypUp6qZI+N/WAWtV7niWEmZI3RQRzSmHn7NpmXPiQyGIa6ViET
bjfmbVhU/iaFLIQa3UY7dJCT8x0QVQNCvmLEWzAkqQMiY4QKaitetw+nA6gw/MAL9UNWLiRlCj4I
K8ySQdZr1dtSTTw/KK2t6kgFbEVpwLauKZrT6Vw3LVU5biuq76918JG7k49po4wUQ62a8Er7WqOV
4DyhNMKqcbfKd+9/WRVqTMHep7dC2fzbq1/MFx3TNL/vGKl5uMrpePyTN74AmxqfQWNwLDXYPxsD
/y4vPYer/KQdIs8omDpNaxkTrAvsFizKfxsFlPRt6uknu0WKY15SUXRI3fIG+vFXigW1JNVtuynH
KyH0USuoUzrfn7hKPp5ubusdeDTwr5GXDBM7qEpBxGce8YMVNYQUTDdK9D+D25fMMb5DkQa8zKjy
GXcSu4lwxHmarGlD45/DQrYH7tSpVqj2cBaAxtkn/ocpoPawta67`
firstPackageMetadataSignatureData, err := base64.StdEncoding.DecodeString(firstPackageMetadataSignature)
assert.NoError(t, err)
const firstPackageDatabase = `H4sIAAAAAAAA/+ySwY7TMBCGe56nyGWOTcd2PE4QQoQmZSPaBTWUAxfkON626rYbNV6p8PSoXYTY
XlGF0Pa7jMf6JfsbTfB96DbLoRiKUet7N7gARETGmFMlovNKTPL3+XQvJCkaRHSJz5zz2Ae7H9Bf
v3Uu95+Ak2pa3uazEuGPVRgeUv7GSdxtlnGw+/hHHwDwWQwA3+X1s/5LOa+rj7cIYigAsCjrMcJk
ve9DdAxFnXUbu/QAOK6rryVCykIDYPXUEQDOCl0vZgjsRdtmaaqMTlLyJGzD1EonrNOcOAeA9U0u
NZ/SjZAti8TIVElrWSestffGi4aYnWq0UVLphpWV5IVsMs+Zc+auJXbS2hYAF/MpwiqErn81GvmD
3Xb3PnYP29EvvaNQPh/fIDyN5qi/qKZFkX8uEQSnaZZppRgAP+XjD/n7co5Q2N363kaTh+16932z
il63dudWfpmZt3fb3SHuH98A/OsNuHLlykvlZwAAAP//LUzfXwAIAAA=`
firstPackageDatabaseData, err := base64.StdEncoding.DecodeString(firstPackageDatabase)
assert.NoError(t, err)
const secondPackage = `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
vr+IaHkXRTJq3F/slEXDVATl77ij`
secondPackageData, err := base64.StdEncoding.DecodeString(secondPackage)
assert.NoError(t, err)
_ = secondPackageData
const secondPackageSignature = `iQGzBAABCAAdFiEEQ6WNuVKuWHQJqhdSETT46/mKoG8FAmSsBg8ACgkQETT46/mKoG/t4wv8D6jQ
uNLj1vvVUlt3cXJ8dulp1TuR0KQrGxqPm/fhCNoEncffR1+1ehMjd69XlsA5XcGxY55QGjKK/W5z
LOZDXatNLTi6PRx1ApbbA7gCCzx/Tx0gF0sCe75Wu286j9ud8xFx8/ray8yS9iV6K6XpsOZUnVEw
yWC6DKsGb2Tv2VvRkj3yNo9ZdTlJOpmLX/OHjAOlFCTxJpa3Nf4YDc5V2d4xYzG0eeCasJueNHYz
d29ZdB58jZQj4ZUuv2Ln/fc2kmmBA4PIZaoTkc9kFwdYFIQV+c1OM6kTPnt5GJffNg7EgCVyv6ON
TJM9ud9iHaxwz+keBa/yQqEq4PFLNT0+IiCmidTpZI9iFVByqbXNuoKti0bdJ2pjnKRcSYWVV1AO
V8m4OwfXaTgsNr41SW9hZJnPUknJFACgc2LVJtJNVFwfb9iyRMdPCUD0NZ/6z28XL11vcNFbJldG
V2DfzGUB63cabGvZKvYMynHjfaxo8MwKVjUzgvWqMfNL2P5QpQ6S`
secondPackageSignatureData, err := base64.StdEncoding.DecodeString(secondPackageSignature)
assert.NoError(t, err)
_ = secondPackageSignatureData
const secondPackageMetadataSignature = `iQGzBAABCAAdFiEEQ6WNuVKuWHQJqhdSETT46/mKoG8FAmSsMPoACgkQETT46/mKoG/GCQv9Hr4T
DYBG2KpgzEeC3vwy4YvHbrYc+TwZWeRRS5xgpk+mG6xJqRitHhi8K8quP0Z4/PChr8yZE2ZHgKOv
2Oul8fYA9z6xAmGP9vNSVjUJM4T0zWMB9uO6g7ZWh62BTTVoWWA19PRQxlcRg6uonso5ZfXpYbit
RpfNSKRXqo3KgrLNpx1neXMoFZb3fuUW4Nc69qdjpCcJ/UrEVfyN/SD719JrIn9WQiidud0sBtA0
5F/DF456UXgpDSb+LDSkGMlWcHBz8VoTs3XMW+w50dC03IJI4Yji+TLMrjrUNVNeR50D9siAjeRr
ihGI33HB0kTQv7kw6iG+H/me1bI/pI20slA4KabMEmoiyO6a4XCwTObl6/mpcTvpDQqLgvmLHgEQ
+oKANt0BiOrtDlLhGBdIM9NXkVfWQGF0MwZVTn/agH/qB95JNNT8DH1+beEDOna9HjImyOtp9Z13
HkZaMSkzwZmNAopA9pYpm0dIBquFCxaX+hKkoeLma2JMtCOHaV4Y`
secondPackageMetadataSignatureData, err := base64.StdEncoding.DecodeString(secondPackageMetadataSignature)
assert.NoError(t, err)
_ = secondPackageMetadataSignatureData
const secondPackageDatabase = `H4sIAAAAAAAA/+ySQY/TMBCFe55fkcscm47teJwghAhNyka0C2ooBy7Icbxt1U02arJSl1+P2kWI
7RVVCNHvMh7rSfZ7eoPvh263HouxmNS+d6MLQERkjDlNIjqfxMS/zqd7IUlFo4Au8ZlzHvvB7kf0
x2+dm/tHwFkxz2/TRY7wWxXGh5i/cRR2u3U42H34vR8A8IUMAN+l5Yv9S74si4+3CGIsADDLyynC
bLvvh+AoCjrrdnbtAXBaFl9zhJiFBsDieSMAXGS6XC0Q2Iu6TuJYGR3F5EnYiqmWTlinOXIOAMub
VGo+qSshaxaRkbGS1rKOWGvvjRcVMTtVaaOk0hUrK8kLWSWeE+fMXU3spLU1AK6Wc4TNMHT9q8nE
H2zT3fvQPTSTn/aOhtLl9AbhORqw7dMxglUxz7L0c44gOI6TRCvFAPgpnX5I3+dLhMy223sbzB6a
bfu02wSva9u6jV8n5u1d0x7C/vENwN9uwZUrV/5HfgQAAP//SZpudwAIAAA=`
secondPackageDatabaseData, err := base64.StdEncoding.DecodeString(secondPackageDatabase)
assert.NoError(t, err)
_ = secondPackageDatabaseData
assert.NoError(t, unittest.PrepareTestDatabase())
setting.Packages.LimitSizeArch = 99999999999999
user := &user_model.User{
Name: "dancheg97",
Email: "dancheg97@fmnx.su",
Passwd: "password",
}
err = user_model.CreateUser(user)
assert.NoError(t, err)
session := loginUser(t, "dancheg97")
token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeAll)
req := NewRequestWithJSON(t, "POST", "/api/v1/user/gpg_keys?token="+token, api.CreateGPGKeyOption{
ArmoredKey: gpgkey,
})
MakeRequest(t, req, http.StatusCreated)
rootURL := fmt.Sprintf("/api/packages/%s/arch", user.Name)
wayback, err := time.Parse(time.RFC3339, "2023-07-10T19:25:28+03:00")
assert.NoError(t, err)
t.Run("PushFirstPackage", func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
patch := monkey.Patch(time.Now, func() time.Time { return wayback })
req := NewRequest(t, "PUT", path.Join(rootURL, "/push"))
req.Header.Set("filename", "testpkg-1-1-x86_64.pkg.tar.zst")
req.Header.Set("email", "dancheg97@fmnx.su")
req.Header.Set("time", "2023-07-10T19:25:28+03:00")
req.Header.Set("distro", "archlinux")
req.Header.Set("metasign", hex.EncodeToString(firstPackageMetadataSignatureData))
req.Header.Set("pkgsign", hex.EncodeToString(firstPackageSignatureData))
req.Header.Set("Content-Type", "application/octet-stream")
req.Body = io.NopCloser(bytes.NewReader(firstPackageData))
MakeRequest(t, req, http.StatusOK)
patch.Unpatch()
})
t.Run("GetFirstPackage", func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
req := NewRequest(t, "GET", path.Join(rootURL, "/archlinux/x86_64/testpkg-1-1-x86_64.pkg.tar.zst"))
resp := MakeRequest(t, req, http.StatusOK)
assert.Equal(t, resp.Body.Bytes(), firstPackageData)
})
t.Run("GetFirstDatabase", func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
dbname := fmt.Sprintf("%s.%s.db", user.Name, setting.Domain)
req := NewRequest(t, "GET", path.Join(rootURL, "/archlinux/x86_64/"+dbname))
resp := MakeRequest(t, req, http.StatusOK)
assert.Equal(t, resp.Body.Bytes(), firstPackageDatabaseData)
})
t.Run("PushSecond", func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
patch := monkey.Patch(time.Now, func() time.Time { return wayback })
req := NewRequest(t, "PUT", path.Join(rootURL, "/push"))
req.Header.Set("filename", "testpkg-1-1-any.pkg.tar.zst")
req.Header.Set("email", "dancheg97@fmnx.su")
req.Header.Set("time", "2023-07-10T19:25:30+03:00")
req.Header.Set("distro", "archlinux")
req.Header.Set("metasign", hex.EncodeToString(secondPackageMetadataSignatureData))
req.Header.Set("pkgsign", hex.EncodeToString(secondPackageSignatureData))
req.Header.Set("Content-Type", "application/octet-stream")
req.Body = io.NopCloser(bytes.NewReader(secondPackageData))
MakeRequest(t, req, http.StatusOK)
patch.Unpatch()
})
t.Run("GetSecondPackage", func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
req := NewRequest(t, "GET", path.Join(rootURL, "/archlinux/any/testpkg-1-1-any.pkg.tar.zst"))
resp := MakeRequest(t, req, http.StatusOK)
assert.Equal(t, resp.Body.Bytes(), secondPackageData)
})
t.Run("GetSecondDatabase", func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
dbname := fmt.Sprintf("%s.%s.db.tar.gz", user.Name, setting.Domain)
req := NewRequest(t, "GET", path.Join(rootURL, "/archlinux/x86_64/"+dbname))
resp := MakeRequest(t, req, http.StatusOK)
assert.Equal(t, resp.Body.Bytes(), secondPackageDatabaseData)
})
t.Run("RemoveFirst", func(t *testing.T) {
defer tests.PrintCurrentTest(t)()
patch := monkey.Patch(time.Now, func() time.Time { return wayback })
req := NewRequest(t, "DELETE", path.Join(rootURL, "/remove"))
req.Header.Set("username", "dancheg97")
req.Header.Set("email", "dancheg97@fmnx.su")
req.Header.Set("target", "testpkg")
req.Header.Set("time", "2023-07-10T19:25:28+03:00")
req.Header.Set("version", "1-1")
req.Header.Set("Content-Type", "application/octet-stream")
req.Body = io.NopCloser(bytes.NewReader(firstPackageMetadataSignatureData))
MakeRequest(t, req, http.StatusOK)
patch.Unpatch()
})
}