Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore(act): rebase api changes test merge #55

Merged
merged 43 commits into from
Jun 7, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
8645aca
chore: bump protobuf version to 1.33.0 (#4613) (#4688)
martinconic May 20, 2024
5fe82a6
fix: save stamp issuer after failed uploads (#4684)
istae May 27, 2024
de7eccc
chore: pre-release updates (#4675)
istae May 28, 2024
ca9e74a
chore: bump go ethereum version to 1.14.3 (#4661) (#4689)
martinconic May 28, 2024
68cde4a
fix: allow maxMultiplexForwards to be set to zero (#4682)
ldeffenb May 28, 2024
97e7ee6
chore: bump go version to 1.22 (#4590) (#4687)
martinconic May 28, 2024
79a7991
feat: remove debug api (#4674)
acha-bill May 29, 2024
8c61408
feat: remove auth (#4679)
acha-bill May 31, 2024
fa8315d
feat: add act.go with TODOs
Feb 19, 2024
c4883d0
Diffie-Hellman (#3)
ferencsarai Mar 13, 2024
3b02370
Acces Logic (#8)
aranyia Mar 13, 2024
9b1d4d7
Added context & details to use cases (#6)
aranyia Mar 13, 2024
ade71b0
Add grantee management (#10)
Kexort Mar 14, 2024
e53fc7e
(refactor): from `Get` to `Lookup` to improve clarity and consistency…
ferencsarai Mar 19, 2024
273eea3
Act params rename doc (#14)
ferencsarai Mar 19, 2024
67c4bb4
Move and refactor ACT diffieHellman to Session. Add Key and NewFromKe…
bosi95 Mar 19, 2024
8f35034
Act swarm address (#15)
ferencsarai Mar 19, 2024
2ddeb48
(rename): defaultAct to inMemoryAct (#17)
ferencsarai Mar 19, 2024
64d4b90
(refactor): Update controller_test.go to use NewInMemoryAct, modify S…
ferencsarai Mar 20, 2024
a244177
Act access logic merge (#19)
rolandlor Mar 21, 2024
56430a5
Act kvs merge (#22)
ferencsarai Mar 22, 2024
294f2d4
Session refactor (#24)
bosi95 Mar 26, 2024
64471a0
Access logic refactor (#25)
rolandlor Mar 26, 2024
ce2353c
(refactor:) PR comments (#23)
ferencsarai Mar 27, 2024
4a12e29
Add referenced mock kvs (#26)
Kexort Mar 28, 2024
fee9296
Act kvs test (#27)
ferencsarai Mar 28, 2024
0d45187
Small refactor + al test (#28)
Kexort Apr 2, 2024
f7563b3
Persist grantee list on swarm (#30)
bosi95 Apr 3, 2024
d84fca5
Update package imports to use the v2 version of the modules (#33)
ferencsarai Apr 4, 2024
1056212
chore(mantaray): merge mantaray fix for rebase
LevilkTheReal Apr 9, 2024
f6fc3c4
chore: rebase router after API auth changes
bosi95 Apr 19, 2024
96d4a4e
Act refactor api and ctrl (#36)
bosi95 Apr 19, 2024
2707884
ACT grantee management (#37)
Kexort May 13, 2024
943b219
Start refactoring for new linter rules (#39)
kopi-solarpunk May 16, 2024
272ffcb
refactor(act): typos & docs (#40)
aranyia May 16, 2024
6d805ae
refactor(act): naming and fix remaining PR comments (#42)
bosi95 May 16, 2024
f5d8cb1
Refactor accesslogic.AddGrantee and parallelize tests (#43)
bosi95 May 17, 2024
b80c899
docs(act): following changes to openapi with debug API removal
aranyia May 22, 2024
5e377cc
refactor(act): chunk download and granteelist handling (#46)
bosi95 May 23, 2024
755e038
refactor(act): controller logic (#47)
bosi95 May 24, 2024
4faf2fc
test(act): controller add, revoke and get with history + fix typos (#48)
bosi95 May 29, 2024
370ebf1
Merge branch 'refs/heads/act' into act-rebase-api-changes
aranyia Jun 6, 2024
15a5eb8
Merge branch 'refs/heads/act' into act-rebase-api-changes
aranyia Jun 7, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
chore: rebase router after API auth changes
  • Loading branch information
bosi95 authored and aranyia committed Jun 6, 2024
commit f6fc3c48519a0085efa13c6e0cfab62a7ae0682e
7 changes: 6 additions & 1 deletion cmd/bee/cmd/start.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import (
chaincfg "github.com/ethersphere/bee/v2/pkg/config"
"github.com/ethersphere/bee/v2/pkg/crypto"
"github.com/ethersphere/bee/v2/pkg/crypto/clef"
"github.com/ethersphere/bee/v2/pkg/dynamicaccess"
"github.com/ethersphere/bee/v2/pkg/keystore"
filekeystore "github.com/ethersphere/bee/v2/pkg/keystore/file"
memkeystore "github.com/ethersphere/bee/v2/pkg/keystore/mem"
Expand Down Expand Up @@ -287,7 +288,7 @@ func buildBeeNode(ctx context.Context, c *command, cmd *cobra.Command, logger lo
neighborhoodSuggester = c.config.GetString(optionNameNeighborhoodSuggester)
}

b, err := node.NewBee(ctx, c.config.GetString(optionNameP2PAddr), signerConfig.publicKey, signerConfig.signer, networkID, logger, signerConfig.libp2pPrivateKey, signerConfig.pssPrivateKey, &node.Options{
b, err := node.NewBee(ctx, c.config.GetString(optionNameP2PAddr), signerConfig.publicKey, signerConfig.signer, networkID, logger, signerConfig.libp2pPrivateKey, signerConfig.pssPrivateKey, signerConfig.session, &node.Options{
DataDir: c.config.GetString(optionNameDataDir),
CacheCapacity: c.config.GetUint64(optionNameCacheCapacity),
DBOpenFilesLimit: c.config.GetUint64(optionNameDBOpenFilesLimit),
Expand Down Expand Up @@ -363,6 +364,7 @@ type signerConfig struct {
publicKey *ecdsa.PublicKey
libp2pPrivateKey *ecdsa.PrivateKey
pssPrivateKey *ecdsa.PrivateKey
session dynamicaccess.Session
}

func waitForClef(logger log.Logger, maxRetries uint64, endpoint string) (externalSigner *external.ExternalSigner, err error) {
Expand Down Expand Up @@ -393,6 +395,7 @@ func (c *command) configureSigner(cmd *cobra.Command, logger log.Logger) (config
var signer crypto.Signer
var password string
var publicKey *ecdsa.PublicKey
var session dynamicaccess.Session
if p := c.config.GetString(optionNamePassword); p != "" {
password = p
} else if pf := c.config.GetString(optionNamePasswordFile); pf != "" {
Expand Down Expand Up @@ -465,6 +468,7 @@ func (c *command) configureSigner(cmd *cobra.Command, logger log.Logger) (config
}
signer = crypto.NewDefaultSigner(swarmPrivateKey)
publicKey = &swarmPrivateKey.PublicKey
session = dynamicaccess.NewDefaultSession(swarmPrivateKey)
}

logger.Info("swarm public key", "public_key", hex.EncodeToString(crypto.EncodeSecp256k1PublicKey(publicKey)))
Expand Down Expand Up @@ -503,6 +507,7 @@ func (c *command) configureSigner(cmd *cobra.Command, logger log.Logger) (config
publicKey: publicKey,
libp2pPrivateKey: libp2pPrivateKey,
pssPrivateKey: pssPrivateKey,
session: session,
}, nil
}

Expand Down
10 changes: 10 additions & 0 deletions pkg/api/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import (
"github.com/ethereum/go-ethereum/common"
"github.com/ethersphere/bee/v2/pkg/accounting"
"github.com/ethersphere/bee/v2/pkg/crypto"
"github.com/ethersphere/bee/v2/pkg/dynamicaccess"
"github.com/ethersphere/bee/v2/pkg/feeds"
"github.com/ethersphere/bee/v2/pkg/file/pipeline"
"github.com/ethersphere/bee/v2/pkg/file/pipeline/builder"
Expand Down Expand Up @@ -83,6 +84,10 @@ const (
SwarmRedundancyFallbackModeHeader = "Swarm-Redundancy-Fallback-Mode"
SwarmChunkRetrievalTimeoutHeader = "Swarm-Chunk-Retrieval-Timeout"
SwarmLookAheadBufferSizeHeader = "Swarm-Lookahead-Buffer-Size"
SwarmActHeader = "Swarm-Act"
SwarmActTimestampHeader = "Swarm-Act-Timestamp"
SwarmActPublisherHeader = "Swarm-Act-Publisher"
SwarmActHistoryAddressHeader = "Swarm-Act-History-Address"

ImmutableHeader = "Immutable"
GasPriceHeader = "Gas-Price"
Expand Down Expand Up @@ -115,6 +120,8 @@ var (
errBatchUnusable = errors.New("batch not usable")
errUnsupportedDevNodeOperation = errors.New("operation not supported in dev mode")
errOperationSupportedOnlyInFullMode = errors.New("operation is supported only in full mode")
errActDownload = errors.New("act download failed")
errActUpload = errors.New("act upload failed")
)

// Storer interface provides the functionality required from the local storage
Expand Down Expand Up @@ -144,6 +151,7 @@ type Service struct {
feedFactory feeds.Factory
signer crypto.Signer
post postage.Service
dac dynamicaccess.Service
postageContract postagecontract.Interface
probe *Probe
metricsRegistry *prometheus.Registry
Expand Down Expand Up @@ -240,6 +248,7 @@ type ExtraOptions struct {
Pss pss.Interface
FeedFactory feeds.Factory
Post postage.Service
Dac dynamicaccess.Service
PostageContract postagecontract.Interface
Staking staking.Contract
Steward steward.Interface
Expand Down Expand Up @@ -322,6 +331,7 @@ func (s *Service) Configure(signer crypto.Signer, tracer *tracing.Tracer, o Opti
s.pss = e.Pss
s.feedFactory = e.FeedFactory
s.post = e.Post
s.dac = e.Dac
s.postageContract = e.PostageContract
s.steward = e.Steward
s.stakingContract = e.Staking
Expand Down
7 changes: 7 additions & 0 deletions pkg/api/api_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ import (
accountingmock "github.com/ethersphere/bee/v2/pkg/accounting/mock"
"github.com/ethersphere/bee/v2/pkg/api"
"github.com/ethersphere/bee/v2/pkg/crypto"
"github.com/ethersphere/bee/v2/pkg/dynamicaccess"
mockdac "github.com/ethersphere/bee/v2/pkg/dynamicaccess/mock"
"github.com/ethersphere/bee/v2/pkg/feeds"
"github.com/ethersphere/bee/v2/pkg/file/pipeline"
"github.com/ethersphere/bee/v2/pkg/file/pipeline/builder"
Expand Down Expand Up @@ -100,6 +102,7 @@ type testServerOptions struct {
PostageContract postagecontract.Interface
StakingContract staking.Contract
Post postage.Service
Dac dynamicaccess.Service
Steward steward.Interface
WsHeaders http.Header
DirectUpload bool
Expand Down Expand Up @@ -147,6 +150,9 @@ func newTestServer(t *testing.T, o testServerOptions) (*http.Client, *websocket.
if o.Post == nil {
o.Post = mockpost.New()
}
if o.Dac == nil {
o.Dac = mockdac.New()
}
if o.BatchStore == nil {
o.BatchStore = mockbatchstore.New(mockbatchstore.WithAcceptAllExistsFunc()) // default is with accept-all Exists() func
}
Expand Down Expand Up @@ -187,6 +193,7 @@ func newTestServer(t *testing.T, o testServerOptions) (*http.Client, *websocket.
Pss: o.Pss,
FeedFactory: o.Feeds,
Post: o.Post,
Dac: o.Dac,
PostageContract: o.PostageContract,
Steward: o.Steward,
SyncStatus: o.SyncStatus,
Expand Down
47 changes: 34 additions & 13 deletions pkg/api/bytes.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,14 @@ func (s *Service) bytesUploadHandler(w http.ResponseWriter, r *http.Request) {
defer span.Finish()

headers := struct {
BatchID []byte `map:"Swarm-Postage-Batch-Id" validate:"required"`
SwarmTag uint64 `map:"Swarm-Tag"`
Pin bool `map:"Swarm-Pin"`
Deferred *bool `map:"Swarm-Deferred-Upload"`
Encrypt bool `map:"Swarm-Encrypt"`
RLevel redundancy.Level `map:"Swarm-Redundancy-Level"`
BatchID []byte `map:"Swarm-Postage-Batch-Id" validate:"required"`
SwarmTag uint64 `map:"Swarm-Tag"`
Pin bool `map:"Swarm-Pin"`
Deferred *bool `map:"Swarm-Deferred-Upload"`
Encrypt bool `map:"Swarm-Encrypt"`
RLevel redundancy.Level `map:"Swarm-Redundancy-Level"`
Act bool `map:"Swarm-Act"`
HistoryAddress *swarm.Address `map:"Swarm-Act-History-Address"`
}{}
if response := s.mapStructure(r.Header, &headers); response != nil {
response("invalid header params", logger, w)
Expand Down Expand Up @@ -100,7 +102,7 @@ func (s *Service) bytesUploadHandler(w http.ResponseWriter, r *http.Request) {
}

p := requestPipelineFn(putter, headers.Encrypt, headers.RLevel)
address, err := p(ctx, r.Body)
reference, err := p(ctx, r.Body)
if err != nil {
logger.Debug("split write all failed", "error", err)
logger.Error(nil, "split write all failed")
Expand All @@ -114,9 +116,18 @@ func (s *Service) bytesUploadHandler(w http.ResponseWriter, r *http.Request) {
return
}

span.SetTag("root_address", address)
encryptedReference := reference
if headers.Act {
encryptedReference, err = s.actEncryptionHandler(r.Context(), logger, w, putter, reference, headers.HistoryAddress)
if err != nil {
jsonhttp.InternalServerError(w, errActUpload)
return
}
}
// TODO: what should be the root_address ? (eref vs ref)
span.SetTag("root_address", reference)

err = putter.Done(address)
err = putter.Done(reference)
if err != nil {
logger.Debug("done split failed", "error", err)
logger.Error(nil, "done split failed")
Expand All @@ -133,7 +144,7 @@ func (s *Service) bytesUploadHandler(w http.ResponseWriter, r *http.Request) {

w.Header().Set("Access-Control-Expose-Headers", SwarmTagHeader)
jsonhttp.Created(w, bytesPostResponse{
Reference: address,
Reference: encryptedReference,
})
}

Expand All @@ -149,11 +160,16 @@ func (s *Service) bytesGetHandler(w http.ResponseWriter, r *http.Request) {
return
}

address := paths.Address
if v := getAddressFromContext(r.Context()); !v.Equal(swarm.ZeroAddress) {
address = v
}

additionalHeaders := http.Header{
ContentTypeHeader: {"application/octet-stream"},
}

s.downloadHandler(logger, w, r, paths.Address, additionalHeaders, true, false)
s.downloadHandler(logger, w, r, address, additionalHeaders, true, false)
}

func (s *Service) bytesHeadHandler(w http.ResponseWriter, r *http.Request) {
Expand All @@ -167,11 +183,16 @@ func (s *Service) bytesHeadHandler(w http.ResponseWriter, r *http.Request) {
return
}

address := paths.Address
if v := getAddressFromContext(r.Context()); !v.Equal(swarm.ZeroAddress) {
address = v
}

getter := s.storer.Download(true)

ch, err := getter.Get(r.Context(), paths.Address)
ch, err := getter.Get(r.Context(), address)
if err != nil {
logger.Debug("get root chunk failed", "chunk_address", paths.Address, "error", err)
logger.Debug("get root chunk failed", "chunk_address", address, "error", err)
logger.Error(nil, "get rook chunk failed")
w.WriteHeader(http.StatusNotFound)
return
Expand Down
54 changes: 39 additions & 15 deletions pkg/api/bzz.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,14 +63,16 @@ func (s *Service) bzzUploadHandler(w http.ResponseWriter, r *http.Request) {
defer span.Finish()

headers := struct {
ContentType string `map:"Content-Type,mimeMediaType" validate:"required"`
BatchID []byte `map:"Swarm-Postage-Batch-Id" validate:"required"`
SwarmTag uint64 `map:"Swarm-Tag"`
Pin bool `map:"Swarm-Pin"`
Deferred *bool `map:"Swarm-Deferred-Upload"`
Encrypt bool `map:"Swarm-Encrypt"`
IsDir bool `map:"Swarm-Collection"`
RLevel redundancy.Level `map:"Swarm-Redundancy-Level"`
ContentType string `map:"Content-Type,mimeMediaType" validate:"required"`
BatchID []byte `map:"Swarm-Postage-Batch-Id" validate:"required"`
SwarmTag uint64 `map:"Swarm-Tag"`
Pin bool `map:"Swarm-Pin"`
Deferred *bool `map:"Swarm-Deferred-Upload"`
Encrypt bool `map:"Swarm-Encrypt"`
IsDir bool `map:"Swarm-Collection"`
RLevel redundancy.Level `map:"Swarm-Redundancy-Level"`
Act bool `map:"Swarm-Act"`
HistoryAddress *swarm.Address `map:"Swarm-Act-History-Address"`
}{}
if response := s.mapStructure(r.Header, &headers); response != nil {
response("invalid header params", logger, w)
Expand Down Expand Up @@ -132,10 +134,10 @@ func (s *Service) bzzUploadHandler(w http.ResponseWriter, r *http.Request) {
}

if headers.IsDir || headers.ContentType == multiPartFormData {
s.dirUploadHandler(ctx, logger, span, ow, r, putter, r.Header.Get(ContentTypeHeader), headers.Encrypt, tag, headers.RLevel)
s.dirUploadHandler(ctx, logger, span, ow, r, putter, r.Header.Get(ContentTypeHeader), headers.Encrypt, tag, headers.RLevel, headers.Act, headers.HistoryAddress)
return
}
s.fileUploadHandler(ctx, logger, span, ow, r, putter, headers.Encrypt, tag, headers.RLevel)
s.fileUploadHandler(ctx, logger, span, ow, r, putter, headers.Encrypt, tag, headers.RLevel, headers.Act, headers.HistoryAddress)
}

// fileUploadResponse is returned when an HTTP request to upload a file is successful
Expand All @@ -155,6 +157,8 @@ func (s *Service) fileUploadHandler(
encrypt bool,
tagID uint64,
rLevel redundancy.Level,
act bool,
historyAddress *swarm.Address,
) {
queries := struct {
FileName string `map:"name" validate:"startsnotwith=/"`
Expand Down Expand Up @@ -260,6 +264,15 @@ func (s *Service) fileUploadHandler(
}
logger.Debug("store", "manifest_reference", manifestReference)

encryptedReference := manifestReference
if act {
encryptedReference, err = s.actEncryptionHandler(r.Context(), logger, w, putter, manifestReference, historyAddress)
if err != nil {
jsonhttp.InternalServerError(w, errActUpload)
return
}
}

err = putter.Done(manifestReference)
if err != nil {
logger.Debug("done split failed", "error", err)
Expand All @@ -268,18 +281,19 @@ func (s *Service) fileUploadHandler(
ext.LogError(span, err, olog.String("action", "putter.Done"))
return
}

// TODO: what should be the root_address ? (eref vs ref)
span.LogFields(olog.Bool("success", true))
span.SetTag("root_address", manifestReference)

if tagID != 0 {
w.Header().Set(SwarmTagHeader, fmt.Sprint(tagID))
span.SetTag("tagID", tagID)
}
w.Header().Set(ETagHeader, fmt.Sprintf("%q", manifestReference.String()))
w.Header().Set(ETagHeader, fmt.Sprintf("%q", encryptedReference.String()))
w.Header().Set("Access-Control-Expose-Headers", SwarmTagHeader)
// TODO: do we need to return reference as well ?
jsonhttp.Created(w, bzzUploadResponse{
Reference: manifestReference,
Reference: encryptedReference,
})
}

Expand All @@ -295,11 +309,16 @@ func (s *Service) bzzDownloadHandler(w http.ResponseWriter, r *http.Request) {
return
}

address := paths.Address
if v := getAddressFromContext(r.Context()); !v.Equal(swarm.ZeroAddress) {
address = v
}

if strings.HasSuffix(paths.Path, "/") {
paths.Path = strings.TrimRight(paths.Path, "/") + "/" // NOTE: leave one slash if there was some.
}

s.serveReference(logger, paths.Address, paths.Path, w, r, false)
s.serveReference(logger, address, paths.Path, w, r, false)
}

func (s *Service) bzzHeadHandler(w http.ResponseWriter, r *http.Request) {
Expand All @@ -314,11 +333,16 @@ func (s *Service) bzzHeadHandler(w http.ResponseWriter, r *http.Request) {
return
}

address := paths.Address
if v := getAddressFromContext(r.Context()); !v.Equal(swarm.ZeroAddress) {
address = v
}

if strings.HasSuffix(paths.Path, "/") {
paths.Path = strings.TrimRight(paths.Path, "/") + "/" // NOTE: leave one slash if there was some.
}

s.serveReference(logger, paths.Address, paths.Path, w, r, true)
s.serveReference(logger, address, paths.Path, w, r, true)
}

func (s *Service) serveReference(logger log.Logger, address swarm.Address, pathVar string, w http.ResponseWriter, r *http.Request, headerOnly bool) {
Expand Down
Loading